summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--am29f040b.c4
-rw-r--r--en29f002a.c36
-rw-r--r--flash.h1
-rw-r--r--flashchips.c34
-rw-r--r--jedec.c27
-rw-r--r--m29f002.c2
-rw-r--r--m29f400bt.c6
-rw-r--r--mx29f002.c37
-rw-r--r--pm29f002.c6
9 files changed, 64 insertions, 89 deletions
diff --git a/am29f040b.c b/am29f040b.c
index cde4b96..46a5ef4 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 14fccab..020df32 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 1a1d8f8..4178d47 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 8618c46..5e74ccf 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 0a5eda0..83a0b83 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 00cbbc1..01a7a50 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 5c36db9..c327f44 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 f170360..7838c3d 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 a01df88..bf78d13 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)
OpenPOWER on IntegriCloud