summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--82802ab.c30
-rw-r--r--stm50flw0x0x.c45
-rw-r--r--w39v040c.c22
-rw-r--r--w39v080fa.c25
4 files changed, 21 insertions, 101 deletions
diff --git a/82802ab.c b/82802ab.c
index 8aa189d..d7194c1 100644
--- a/82802ab.c
+++ b/82802ab.c
@@ -47,14 +47,11 @@ int probe_82802ab(struct flashchip *flash)
chipaddr bios = flash->virtual_memory;
uint8_t id1, id2;
-#if 0
- chip_writeb(0xAA, bios + 0x5555);
- chip_writeb(0x55, bios + 0x2AAA);
- chip_writeb(0x90, bios + 0x5555);
-#endif
-
- chip_writeb(0xff, bios);
+ /* Reset to get a clean state */
+ chip_writeb(0xFF, bios);
programmer_delay(10);
+
+ /* Enter ID mode */
chip_writeb(0x90, bios);
programmer_delay(10);
@@ -62,9 +59,7 @@ int probe_82802ab(struct flashchip *flash)
id2 = chip_readb(bios + 0x01);
/* Leave ID mode */
- chip_writeb(0xAA, bios + 0x5555);
- chip_writeb(0x55, bios + 0x2AAA);
- chip_writeb(0xF0, bios + 0x5555);
+ chip_writeb(0xFF, bios);
programmer_delay(10);
@@ -81,7 +76,6 @@ int probe_82802ab(struct flashchip *flash)
uint8_t wait_82802ab(chipaddr bios)
{
uint8_t status;
- uint8_t id1, id2;
chip_writeb(0x70, bios);
if ((chip_readb(bios) & 0x80) == 0) { // it's busy
@@ -90,18 +84,8 @@ uint8_t wait_82802ab(chipaddr bios)
status = chip_readb(bios);
- // put another command to get out of status register mode
-
- chip_writeb(0x90, bios);
- programmer_delay(10);
-
- id1 = chip_readb(bios);
- id2 = chip_readb(bios + 0x01);
-
- // this is needed to jam it out of "read id" mode
- chip_writeb(0xAA, bios + 0x5555);
- chip_writeb(0x55, bios + 0x2AAA);
- chip_writeb(0xF0, bios + 0x5555);
+ /* Reset to get a clean state */
+ chip_writeb(0xFF, bios);
return status;
}
diff --git a/stm50flw0x0x.c b/stm50flw0x0x.c
index 3a90d6b..8cbafe2 100644
--- a/stm50flw0x0x.c
+++ b/stm50flw0x0x.c
@@ -42,49 +42,10 @@ void protect_stm50flw0x0x(chipaddr bios)
int probe_stm50flw0x0x(struct flashchip *flash)
{
- chipaddr bios = flash->virtual_memory;
- uint8_t id1, id2;
- uint32_t largeid1, largeid2;
-
- /* Issue JEDEC Product ID Entry command */
- chip_writeb(0xAA, bios + 0x5555);
- programmer_delay(10);
- chip_writeb(0x55, bios + 0x2AAA);
- programmer_delay(10);
- chip_writeb(0x90, bios + 0x5555);
- programmer_delay(40);
-
- /* Read product ID */
- id1 = chip_readb(bios);
- id2 = chip_readb(bios + 0x01);
- largeid1 = id1;
- largeid2 = id2;
-
- /* Check if it is a continuation ID, this should be a while loop. */
- if (id1 == 0x7F) {
- largeid1 <<= 8;
- id1 = chip_readb(bios + 0x100);
- largeid1 |= id1;
- }
- if (id2 == 0x7F) {
- largeid2 <<= 8;
- id2 = chip_readb(bios + 0x101);
- largeid2 |= id2;
- }
-
- /* Issue JEDEC Product ID Exit command */
- chip_writeb(0xAA, bios + 0x5555);
- programmer_delay(10);
- chip_writeb(0x55, bios + 0x2AAA);
- programmer_delay(10);
- chip_writeb(0xF0, bios + 0x5555);
- programmer_delay(40);
-
- printf_debug("%s: id1 0x%02x, id2 0x%02x\n", __func__, largeid1,
- largeid2);
+ int result = probe_jedec(flash);
- if (largeid1 != flash->manufacture_id || largeid2 != flash->model_id)
- return 0;
+ if (!result)
+ return result;
map_flash_registers(flash);
diff --git a/w39v040c.c b/w39v040c.c
index 7fccd53..bfa9853 100644
--- a/w39v040c.c
+++ b/w39v040c.c
@@ -23,7 +23,11 @@
int probe_w39v040c(struct flashchip *flash)
{
chipaddr bios = flash->virtual_memory;
- uint8_t id1, id2, lock;
+ int result = probe_jedec(flash);
+ uint8_t lock;
+
+ if (!result)
+ return result;
chip_writeb(0xAA, bios + 0x5555);
programmer_delay(10);
@@ -32,8 +36,6 @@ int probe_w39v040c(struct flashchip *flash)
chip_writeb(0x90, bios + 0x5555);
programmer_delay(10);
- id1 = chip_readb(bios);
- id2 = chip_readb(bios + 1);
lock = chip_readb(bios + 0xfff2);
chip_writeb(0xAA, bios + 0x5555);
@@ -43,17 +45,9 @@ int probe_w39v040c(struct flashchip *flash)
chip_writeb(0xF0, bios + 0x5555);
programmer_delay(40);
- printf_debug("%s: id1 0x%02x, id2 0x%02x", __func__, id1, id2);
- if (!oddparity(id1))
- printf_debug(", id1 parity violation");
- printf_debug("\n");
- if (flash->manufacture_id == id1 && flash->model_id == id2) {
- printf("%s: Boot block #TBL is %slocked, rest of chip #WP is %slocked.\n",
- __func__, lock & 0x4 ? "" : "un", lock & 0x8 ? "" : "un");
- return 1;
- }
-
- return 0;
+ printf("%s: Boot block #TBL is %slocked, rest of chip #WP is %slocked.\n",
+ __func__, lock & 0x4 ? "" : "un", lock & 0x8 ? "" : "un");
+ return 1;
}
int erase_w39v040c(struct flashchip *flash)
diff --git a/w39v080fa.c b/w39v080fa.c
index 96e83a8..580657f 100644
--- a/w39v080fa.c
+++ b/w39v080fa.c
@@ -22,29 +22,10 @@
int probe_winbond_fwhub(struct flashchip *flash)
{
- chipaddr bios = flash->virtual_memory;
- uint8_t id1, id2;
-
- /* Product Identification Entry */
- chip_writeb(0xAA, bios + 0x5555);
- chip_writeb(0x55, bios + 0x2AAA);
- chip_writeb(0x90, bios + 0x5555);
- programmer_delay(10);
-
- /* Read product ID */
- id1 = chip_readb(bios);
- id2 = chip_readb(bios + 0x01);
+ int result = probe_jedec(flash);
- /* Product Identifixation Exit */
- chip_writeb(0xAA, bios + 0x5555);
- chip_writeb(0x55, bios + 0x2AAA);
- chip_writeb(0xF0, bios + 0x5555);
- programmer_delay(10);
-
- printf_debug("%s: id1 0x%x, id2 0x%x\n", __func__, id1, id2);
-
- if (id1 != flash->manufacture_id || id2 != flash->model_id)
- return 0;
+ if (!result)
+ return result;
map_flash_registers(flash);
OpenPOWER on IntegriCloud