diff --git a/82802ab.c b/82802ab.c index 8aa189d4d6ee48d477bd9db06a6485adfa6190ea..d7194c147a2524e64f63ee2d7695e5fbb9fd9084 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 3a90d6b0de6bfcd1b7e6a919d9007bec451b401f..8cbafe2b5d3727d941b12f2d0db196d77010bf04 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 7fccd538b03ce554c7b7212f2cce25a7630bccc3..bfa98538c732d348e99b5b0b2969339181551369 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 96e83a8e16b9d654584b4bb7e95fb0f1ab7d222e..580657f960341c8c46f8bebbd1cd6e6556133471 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);