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;