Author: hailfinger Date: Wed Oct 20 23:13:19 2010 New Revision: 1216 URL: http://flashrom.org/trac/flashrom/changeset/1216
Log: Add a reset to probe_jedec before we read the Chip's IDs.
Previous probes might have had too short delays for entering ID mode, so the chip may still be in the process of entering the ID mode. Due to that, an additional delay before the reset makes sense. Add FEATURE_RESET_MASK to deal cleanly with those feature bits.
Maciej Pijanka tested the patch and it fixes probing for him with some old Atmel chips.
Signed-off-by: Sean Nelson audiohacked@gmail.com Signed-off-by: Carl-Daniel Hailfinger c-d.hailfinger.devel.2006@gmx.net Acked-by: Anders Juel Jensen andersjjensen@gmail.com Tested-by: Maciej Pijanka maciej.pijanka@gmail.com Acked-by: Sean Nelson audiohacked@gmail.com
Modified: trunk/flash.h trunk/jedec.c
Modified: trunk/flash.h ============================================================================== --- trunk/flash.h Wed Oct 20 00:06:20 2010 (r1215) +++ trunk/flash.h Wed Oct 20 23:13:19 2010 (r1216) @@ -83,6 +83,7 @@ #define FEATURE_LONG_RESET (0 << 4) #define FEATURE_SHORT_RESET (1 << 4) #define FEATURE_EITHER_RESET FEATURE_LONG_RESET +#define FEATURE_RESET_MASK (FEATURE_LONG_RESET | FEATURE_SHORT_RESET) #define FEATURE_ADDR_FULL (0 << 2) #define FEATURE_ADDR_MASK (3 << 2) #define FEATURE_ADDR_2AA (1 << 2)
Modified: trunk/jedec.c ============================================================================== --- trunk/jedec.c Wed Oct 20 00:06:20 2010 (r1215) +++ trunk/jedec.c Wed Oct 20 23:13:19 2010 (r1216) @@ -142,6 +142,26 @@ return 0; }
+ /* Earlier probes might have been too fast for the chip to enter ID + * mode completely. Allow the chip to finish this before seeing a + * reset command. + */ + if (probe_timing_enter) + programmer_delay(probe_timing_enter); + /* Reset chip to a clean slate */ + if ((flash->feature_bits & FEATURE_RESET_MASK) == FEATURE_LONG_RESET) + { + chip_writeb(0xAA, bios + (0x5555 & mask)); + if (probe_timing_exit) + programmer_delay(10); + chip_writeb(0x55, bios + (0x2AAA & mask)); + if (probe_timing_exit) + programmer_delay(10); + } + chip_writeb(0xF0, bios + (0x5555 & mask)); + if (probe_timing_exit) + programmer_delay(probe_timing_exit); + /* Issue JEDEC Product ID Entry command */ chip_writeb(0xAA, bios + (0x5555 & mask)); if (probe_timing_enter) @@ -172,7 +192,7 @@ }
/* Issue JEDEC Product ID Exit command */ - if ((flash->feature_bits & FEATURE_SHORT_RESET) == FEATURE_LONG_RESET) + if ((flash->feature_bits & FEATURE_RESET_MASK) == FEATURE_LONG_RESET) { chip_writeb(0xAA, bios + (0x5555 & mask)); if (probe_timing_exit)