diff --git a/am29f040b.c b/am29f040b.c index cde4b96ef9d0a612da6c3599b0c2424090af488e..46a5ef4b206d20235dd5fddefe03f32812f5ad74 100644 --- a/am29f040b.c +++ b/am29f040b.c @@ -20,6 +20,8 @@ #include "flash.h" +/* FIMXE: check that the 2 second delay is really needed. + Use erase_sector_jedec if not? */ static int erase_sector_29f040b(struct flashchip *flash, unsigned long address) { int page_size = flash->page_size; @@ -44,6 +46,7 @@ static int erase_sector_29f040b(struct flashchip *flash, unsigned long address) return 0; } +/* FIXME: use write_sector_jedec? */ static int write_sector_29f040b(chipaddr bios, uint8_t *src, chipaddr dst, unsigned int page_size) { @@ -91,6 +94,7 @@ int probe_29f040b(struct flashchip *flash) return 0; } +/* FIXME: use erase_chip_jedec? */ int erase_29f040b(struct flashchip *flash) { int total_size = flash->total_size * 1024; diff --git a/en29f002a.c b/en29f002a.c index 14fccabbcbdb2f726c5b4c7036229d4d68e1022a..020df32919abb4afbca0a1b4691cb76a2c837efc 100644 --- a/en29f002a.c +++ b/en29f002a.c @@ -87,39 +87,3 @@ int probe_en29f002a(struct flashchip *flash) return 0; } - -/* The EN29F002 chip needs repeated single byte writing, no block writing. */ -int write_en29f002a(struct flashchip *flash, uint8_t *buf) -{ - int i; - int total_size = flash->total_size * 1024; - chipaddr bios = flash->virtual_memory; - chipaddr dst = bios; - - //chip_writeb(0xF0, bios); - programmer_delay(10); - if (erase_chip_jedec(flash)) { - fprintf(stderr, "ERASE FAILED!\n"); - return -1; - } - - printf("Programming page: "); - for (i = 0; i < total_size; i++) { - /* write to the sector */ - if ((i & 0xfff) == 0) - printf("address: 0x%08lx", (unsigned long)i); - chip_writeb(0xAA, bios + 0x5555); - chip_writeb(0x55, bios + 0x2AAA); - chip_writeb(0xA0, bios + 0x5555); - chip_writeb(*buf++, dst++); - - /* wait for Toggle bit ready */ - toggle_ready_jedec(dst); - - if ((i & 0xfff) == 0) - printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"); - } - - printf("\n"); - return 0; -} diff --git a/flash.h b/flash.h index 1a1d8f851dcc32c68e33a942343676e98a0320f2..4178d47d7eaa66cefd1853a3697bf8fbca015893 100644 --- a/flash.h +++ b/flash.h @@ -653,6 +653,7 @@ int write_byte_program_jedec(chipaddr bios, uint8_t *src, int probe_jedec(struct flashchip *flash); int erase_chip_jedec(struct flashchip *flash); int write_jedec(struct flashchip *flash, uint8_t *buf); +int write_jedec_1(struct flashchip *flash, uint8_t *buf); int erase_sector_jedec(struct flashchip *flash, unsigned int page, unsigned int pagesize); int erase_block_jedec(struct flashchip *flash, unsigned int page, unsigned int blocksize); int write_sector_jedec(chipaddr bios, uint8_t *src, diff --git a/flashchips.c b/flashchips.c index 8618c46c8391bd3a961620b7dfebc7eab2e608ac..5e74ccf1705193aab19f2e5a56d3b39013253a45 100644 --- a/flashchips.c +++ b/flashchips.c @@ -81,7 +81,7 @@ struct flashchip flashchips[] = { .probe = probe_jedec, .probe_timing = TIMING_ZERO, .erase = erase_chip_jedec, - .write = write_en29f002a, + .write = write_jedec_1, .read = read_memmapped, }, @@ -93,11 +93,11 @@ struct flashchip flashchips[] = { .model_id = AM_29F002BT, .total_size = 256, .page_size = 256, - .tested = TEST_OK_PREW, + .tested = TEST_OK_PRE, .probe = probe_jedec, .probe_timing = TIMING_ZERO, .erase = erase_chip_jedec, - .write = write_en29f002a, + .write = write_jedec_1, .read = read_memmapped, }, @@ -739,7 +739,7 @@ struct flashchip flashchips[] = { .probe = probe_29f002, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */ .erase = erase_29f002, - .write = write_29f002, + .write = write_jedec_1, .read = read_memmapped, }, @@ -751,11 +751,11 @@ struct flashchip flashchips[] = { .model_id = AMIC_A29002T, .total_size = 256, .page_size = 64 * 1024, - .tested = TEST_OK_PREW, + .tested = TEST_OK_PRE, .probe = probe_29f002, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */ .erase = erase_29f002, - .write = write_29f002, + .write = write_jedec_1, .read = read_memmapped, }, @@ -1075,7 +1075,7 @@ struct flashchip flashchips[] = { .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ .erase = erase_chip_jedec, - .write = write_en29f002a, + .write = write_jedec_1, .read = read_memmapped, }, @@ -1087,11 +1087,11 @@ struct flashchip flashchips[] = { .model_id = EN_29F002T, .total_size = 256, .page_size = 256, - .tested = TEST_OK_PREW, + .tested = TEST_OK_PRE, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ .erase = erase_chip_jedec, - .write = write_en29f002a, + .write = write_jedec_1, .read = read_memmapped, }, @@ -1518,11 +1518,11 @@ struct flashchip flashchips[] = { .model_id = MX_29F001B, .total_size = 128, .page_size = 32 * 1024, - .tested = TEST_OK_PREW, + .tested = TEST_OK_PRE, .probe = probe_29f002, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */ .erase = erase_29f002, - .write = write_29f002, + .write = write_jedec_1, .read = read_memmapped, }, @@ -1534,11 +1534,11 @@ struct flashchip flashchips[] = { .model_id = MX_29F001T, .total_size = 128, .page_size = 32 * 1024, - .tested = TEST_OK_PREW, + .tested = TEST_OK_PRE, .probe = probe_29f002, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */ .erase = erase_29f002, - .write = write_29f002, + .write = write_jedec_1, .read = read_memmapped, }, @@ -1554,7 +1554,7 @@ struct flashchip flashchips[] = { .probe = probe_29f002, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */ .erase = erase_29f002, - .write = write_29f002, + .write = write_jedec_1, .read = read_memmapped, }, @@ -1566,11 +1566,11 @@ struct flashchip flashchips[] = { .model_id = MX_29F002T, .total_size = 256, .page_size = 64 * 1024, - .tested = TEST_OK_PREW, + .tested = TEST_OK_PRE, .probe = probe_29f002, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */ .erase = erase_29f002, - .write = write_29f002, + .write = write_jedec_1, .read = read_memmapped, }, @@ -1586,7 +1586,7 @@ struct flashchip flashchips[] = { .probe = probe_29f002, .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */ .erase = erase_29f002, - .write = write_29f002, + .write = write_jedec_1, .read = read_memmapped, }, diff --git a/jedec.c b/jedec.c index 0a5eda0cab4e6343863ff6605b8754f5d02fadc2..83a0b83807cb0d8682db2623fcf3c6465f976431 100644 --- a/jedec.c +++ b/jedec.c @@ -353,3 +353,30 @@ int write_jedec(struct flashchip *flash, uint8_t *buf) return failed; } + +int write_jedec_1(struct flashchip *flash, uint8_t * buf) +{ + int i; + chipaddr bios = flash->virtual_memory; + chipaddr dst = bios; + + programmer_delay(10); + if (erase_flash(flash)) { + fprintf(stderr, "ERASE FAILED!\n"); + return -1; + } + + printf("Programming page: "); + for (i = 0; i < flash->total_size; i++) { + if ((i & 0x3) == 0) + printf("address: 0x%08lx", (unsigned long)i * 1024); + + write_sector_jedec(bios, buf + i * 1024, dst + i * 1024, 1024); + + if ((i & 0x3) == 0) + printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"); + } + + printf("\n"); + return 0; +} diff --git a/m29f002.c b/m29f002.c index 00cbbc1409f469e15dab9ce3d5765e46ffadfc96..01a7a509b504e8ce592da17dee1671dfd401098f 100644 --- a/m29f002.c +++ b/m29f002.c @@ -45,6 +45,7 @@ static int rewrite_block(struct flashchip *flash, uint8_t *src, chipaddr dst = bios + start; /* erase */ + /* FIXME: use erase_sector_jedec? */ chip_writeb(0xaa, bios + 0x555); chip_writeb(0x55, bios + 0xaaa); chip_writeb(0x80, bios + 0x555); @@ -59,6 +60,7 @@ static int rewrite_block(struct flashchip *flash, uint8_t *src, } /* program */ + /* FIXME: use write_sector_jedec? */ while (size--) { chip_writeb(0xaa, bios + 0x555); chip_writeb(0x55, bios + 0xaaa); diff --git a/m29f400bt.c b/m29f400bt.c index 5c36db9679c208b62ce21082733d943e14263314..c327f44c1c93a3d3e835272522acf381c92d8a3b 100644 --- a/m29f400bt.c +++ b/m29f400bt.c @@ -20,6 +20,12 @@ #include "flash.h" +/* WARNING! + This chip uses the standard JEDEC Addresses in 16-bit mode as word + addresses. In byte mode, 0xAAA has to be used instead of 0x555 and + 0x555 instead of 0x2AA. Do *not* blindly replace with standard JEDEC + functions. */ + void write_page_m29f400bt(chipaddr bios, uint8_t *src, chipaddr dst, int page_size) { diff --git a/mx29f002.c b/mx29f002.c index f170360c1d8eadebafd96534963df2886624234c..7838c3d3c3eb67187ed2a80d5b76a276e0cb7f69 100644 --- a/mx29f002.c +++ b/mx29f002.c @@ -43,6 +43,9 @@ int probe_29f002(struct flashchip *flash) return 0; } +/* FIXME: Use erase_chip_jedec? + * erase_29f002 uses shorter addresses, sends F0 (exit ID mode) and + * and has a bigger delay before polling the toggle bit */ int erase_29f002(struct flashchip *flash) { chipaddr bios = flash->virtual_memory; @@ -64,37 +67,3 @@ int erase_29f002(struct flashchip *flash) } return 0; } - -int write_29f002(struct flashchip *flash, uint8_t *buf) -{ - int i; - int total_size = flash->total_size * 1024; - chipaddr bios = flash->virtual_memory; - chipaddr dst = bios; - - chip_writeb(0xF0, bios); - programmer_delay(10); - if (erase_29f002(flash)) { - fprintf(stderr, "ERASE FAILED!\n"); - return -1; - } - printf("Programming page: "); - for (i = 0; i < total_size; i++) { - /* write to the sector */ - if ((i & 0xfff) == 0) - printf("address: 0x%08lx", (unsigned long)i); - chip_writeb(0xAA, bios + 0x5555); - chip_writeb(0x55, bios + 0x2AAA); - chip_writeb(0xA0, bios + 0x5555); - chip_writeb(*buf++, dst++); - - /* wait for Toggle bit ready */ - toggle_ready_jedec(dst); - - if ((i & 0xfff) == 0) - printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"); - } - printf("\n"); - - return 0; -} diff --git a/pm29f002.c b/pm29f002.c index a01df88de52268c8f2fc69bfd087d865c726bbc3..bf78d13ba8859b04fd1bda650291dd7494f50bc4 100644 --- a/pm29f002.c +++ b/pm29f002.c @@ -20,18 +20,20 @@ #include "flash.h" +/* if write_sector_jedec is used, + this is write_jedec_1 */ int write_pm29f002(struct flashchip *flash, uint8_t *buf) { int i, total_size = flash->total_size * 1024; chipaddr bios = flash->virtual_memory; chipaddr dst = bios; - /* Pm29F002T/B use the same erase method... */ - if (erase_29f040b(flash)) { + if (erase_flash(flash)) { fprintf(stderr, "ERASE FAILED!\n"); return -1; } + /* FIXME: use write_sector_jedec? */ printf("Programming page: "); for (i = 0; i < total_size; i++) { if ((i & 0xfff) == 0)