FreeCalypso > hg > freecalypso-tools
diff loadtools/flashops.c @ 325:545e1718f5fb
fc-loadtool: support for 28F640W30B flash chip with partition quirks
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 20 Jan 2018 05:20:40 +0000 |
parents | e7502631a0f9 |
children | 0dd2c87c1b63 |
line wrap: on
line diff
--- a/loadtools/flashops.c Fri Dec 29 20:38:39 2017 +0000 +++ b/loadtools/flashops.c Sat Jan 20 05:20:40 2018 +0000 @@ -108,6 +108,21 @@ return(0); } +intel_w30_reset_cmd(bi) + struct flash_bank_info *bi; +{ + uint32_t part; + + for (part = 0; part < bi->geom->total_size; part += 0x80000) { + if (do_w16(bi->base_addr + part, 0xFF)) { + fprintf(stderr, + "unexpected response to w16 when resetting flash to read mode!\n"); + return(-1); + } + } + return(0); +} + intel_status_cmd(bi) struct flash_bank_info *bi; { @@ -129,6 +144,31 @@ return(0); } +intel_w30_status_cmd(bi) + struct flash_bank_info *bi; +{ + uint32_t part; + int stat; + uint16_t sr; + + for (part = 0; part < bi->geom->total_size; part += 0x80000) { + /* issue Read SR command */ + stat = do_w16(bi->base_addr + part, 0x70); + if (stat) { + fprintf(stderr, + "unexpected response to w16 for Read SR command\n"); + return(-1); + } + stat = do_r16(bi->base_addr + part, &sr); + if (stat) + return(stat); /* error msg already printed */ + sr &= 0xFF; + printf("Status Register for partition %08lX: %02X\n", + (u_long) part, sr); + } + return(0); +} + intel_sector_unlock(bi, sp) struct flash_bank_info *bi; struct sector_info *sp; @@ -205,6 +245,22 @@ return(0); } +intel_w30_clear_sr(bi) + struct flash_bank_info *bi; +{ + uint32_t part; + + printf("Clearing Intel flash SR\n"); + for (part = 0; part < bi->geom->total_size; part += 0x80000) { + if (do_w16(bi->base_addr + part, 0x50)) { + fprintf(stderr, + "unexpected response to w16 for Clear SR command\n"); + return(-1); + } + } + return(0); +} + struct flash_cmdset flash_cmdset_intel = { .cmdset_name = "Intel", .reset_cmd = intel_reset_cmd, @@ -216,3 +272,15 @@ .loadagent_program_cmd = "INFW", .needs_unlock = 1, }; + +struct flash_cmdset flash_cmdset_intel_w30 = { + .cmdset_name = "Intel", + .reset_cmd = intel_w30_reset_cmd, + .status_cmd = intel_w30_status_cmd, + .unlock_sector = intel_sector_unlock, + .erase_sector = intel_sector_erase, + .prep_for_program = intel_w30_clear_sr, + .loadagent_setbase_cmd = "INFB", + .loadagent_program_cmd = "INFW", + .needs_unlock = 1, +};