diff options
author | Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net> | 2009-09-05 01:16:30 +0000 |
---|---|---|
committer | Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net> | 2009-09-05 01:16:30 +0000 |
commit | f3ec3d0f16e7e42bf0ab5d85fc78d9d140bdb045 (patch) | |
tree | 2d17169c2f7f720fc40ac6184b15d46572d3086f /stm50flw0x0x.c | |
parent | b9e89f150c9d221c77ac2fe524996eef5b7b79ca (diff) | |
download | flashrom-f3ec3d0f16e7e42bf0ab5d85fc78d9d140bdb045.zip flashrom-f3ec3d0f16e7e42bf0ab5d85fc78d9d140bdb045.tar.gz |
Quite a few probe functions in flashrom are copies of probe_jedec with additional lock bit printing or other glue
Make them call probe_jedec instead. Use the correct reset sequence for 82802AB.
Detailed explanation: The reset sequence before ID reading was correct,
so ID always worked. But the reset sequence after ID reading was a copy-paste
leftover from probe_jedec and didn't have any effect. I dug up flash_and_burn
from the freebios-v1 tree and found out that 82802ab.c was indeed a copy
of jedec.c with lots of experimental unannotated #if 0 and #if 1. About the
wait_82802ab change: Before the patch, wait_82802ab entered read status mode,
switched to ID mode, then tried an incorrect and unsupported JEDEC command
to exit ID mode. Nobody ever saw that this failed because all subsequent
function calls had the correct reset sequence at the beginning. With the patch,
wait_82802ab enters read status mode, then switches back to read mode with
the official reset command.
Corresponding to flashrom svn r717.
Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
Acked-by: Stefan Reinauer <stepan@coresystems.de>
Diffstat (limited to 'stm50flw0x0x.c')
-rw-r--r-- | stm50flw0x0x.c | 45 |
1 files changed, 3 insertions, 42 deletions
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); |