FreeCalypso > hg > freecalypso-tools
comparison loadtools/flamdsec.c @ 994:ad3041e19884
fc-loadtool flash: implement PPB ops for Spansion PL-N
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 03 Dec 2023 06:16:30 +0000 |
parents | 84c9869a3659 |
children |
comparison
equal
deleted
inserted
replaced
993:84c9869a3659 | 994:ad3041e19884 |
---|---|
8 #include <stdio.h> | 8 #include <stdio.h> |
9 #include <stdint.h> | 9 #include <stdint.h> |
10 #include <stdlib.h> | 10 #include <stdlib.h> |
11 #include <string.h> | 11 #include <string.h> |
12 #include <strings.h> | 12 #include <strings.h> |
13 #include <time.h> | |
13 #include <unistd.h> | 14 #include <unistd.h> |
14 #include "flash.h" | 15 #include "flash.h" |
15 | 16 |
16 extern struct flash_bank_info flash_bank_info[2]; | 17 extern struct flash_bank_info flash_bank_info[2]; |
17 | 18 |
434 printf("\nPPB erase complete, total pulses: %u\n", pulsecnt); | 435 printf("\nPPB erase complete, total pulses: %u\n", pulsecnt); |
435 return(0); | 436 return(0); |
436 } | 437 } |
437 | 438 |
438 /* | 439 /* |
440 * Spansion PL-N PPB write functions, referenced from lock_info structures | |
441 * in fldevs.c device descriptions. | |
442 */ | |
443 | |
444 static | |
445 pln_ppb_write_op(oper_addr, write1, write2, expect_stat) | |
446 uint32_t oper_addr; | |
447 uint16_t write1, write2, expect_stat; | |
448 { | |
449 int rc; | |
450 uint16_t read_stat, prev_stat; | |
451 time_t start_time, curtime; | |
452 | |
453 rc = pln_special_mode_entry(oper_addr, 0xC0); | |
454 if (rc < 0) | |
455 return(rc); | |
456 if (do_w16(oper_addr, write1)) { | |
457 bad_w16: fprintf(stderr, | |
458 "unexpected response to w16 in PPB command sequence - aborting\n"); | |
459 return(-1); | |
460 } | |
461 if (do_w16(oper_addr, write2)) | |
462 goto bad_w16; | |
463 printf("Polling for completion status\n"); | |
464 usleep(10000); /* make sure we don't get state before op starts */ | |
465 start_time = time(0); | |
466 rc = do_r16(oper_addr, &read_stat); | |
467 if (rc < 0) | |
468 return(rc); | |
469 for (;;) { | |
470 prev_stat = read_stat; | |
471 rc = do_r16(oper_addr, &read_stat); | |
472 if (rc < 0) | |
473 return(rc); | |
474 if (read_stat == expect_stat && prev_stat == expect_stat) | |
475 break; | |
476 curtime = time(0); | |
477 if (curtime >= start_time + 10) { | |
478 fprintf(stderr, "operation timeout, aborting\n"); | |
479 return(-1); | |
480 } | |
481 } | |
482 printf("Operation completed successfully\n"); | |
483 return pln_special_mode_exit(oper_addr); | |
484 } | |
485 | |
486 pln_ppb_program_one(bi, sector_addr) | |
487 struct flash_bank_info *bi; | |
488 uint32_t sector_addr; | |
489 { | |
490 printf("Issuing PPB Program command\n"); | |
491 return pln_ppb_write_op(bi->base_addr + sector_addr, 0xA0, 0, 0); | |
492 } | |
493 | |
494 pln_ppb_erase_all(bi, raw_mode) | |
495 struct flash_bank_info *bi; | |
496 { | |
497 printf("Issuing All PPB Erase command\n"); | |
498 return pln_ppb_write_op(bi->base_addr, 0x80, 0x30, 1); | |
499 } | |
500 | |
501 /* | |
439 * Front end functions for PPB operation commands. | 502 * Front end functions for PPB operation commands. |
440 */ | 503 */ |
441 | 504 |
442 flashcmd_ppb_program(argc, argv, bank) | 505 flashcmd_ppb_program(argc, argv, bank) |
443 char **argv; | 506 char **argv; |