[flashrom] [PATCH] Reduce probe code duplication, fix 82802AB
Carl-Daniel Hailfinger
c-d.hailfinger.devel.2006 at gmx.net
Mon Aug 10 15:36:49 CEST 2009
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.
Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006 at gmx.net>
Index: flashrom-call_probe_jedec/w39v040c.c
===================================================================
--- flashrom-call_probe_jedec/w39v040c.c (Revision 674)
+++ flashrom-call_probe_jedec/w39v040c.c (Arbeitskopie)
@@ -23,8 +23,12 @@
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);
chip_writeb(0x55, bios + 0x2AAA);
@@ -32,8 +36,6 @@
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 @@
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)
Index: flashrom-call_probe_jedec/stm50flw0x0x.c
===================================================================
--- flashrom-call_probe_jedec/stm50flw0x0x.c (Revision 674)
+++ flashrom-call_probe_jedec/stm50flw0x0x.c (Arbeitskopie)
@@ -42,50 +42,11 @@
int probe_stm50flw0x0x(struct flashchip *flash)
{
- chipaddr bios = flash->virtual_memory;
- uint8_t id1, id2;
- uint32_t largeid1, largeid2;
+ int result = probe_jedec(flash);
- /* 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);
+ if (!result)
+ return result;
- /* 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", __FUNCTION__, largeid1,
- largeid2);
-
- if (largeid1 != flash->manufacture_id || largeid2 != flash->model_id)
- return 0;
-
map_flash_registers(flash);
return 1;
Index: flashrom-call_probe_jedec/w39v080fa.c
===================================================================
--- flashrom-call_probe_jedec/w39v080fa.c (Revision 674)
+++ flashrom-call_probe_jedec/w39v080fa.c (Arbeitskopie)
@@ -22,30 +22,11 @@
int probe_winbond_fwhub(struct flashchip *flash)
{
- chipaddr bios = flash->virtual_memory;
- uint8_t id1, id2;
+ int result = probe_jedec(flash);
- /* Product Identification Entry */
- chip_writeb(0xAA, bios + 0x5555);
- chip_writeb(0x55, bios + 0x2AAA);
- chip_writeb(0x90, bios + 0x5555);
- programmer_delay(10);
+ if (!result)
+ return result;
- /* Read product ID */
- id1 = chip_readb(bios);
- id2 = chip_readb(bios + 0x01);
-
- /* 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", __FUNCTION__, id1, id2);
-
- if (id1 != flash->manufacture_id || id2 != flash->model_id)
- return 0;
-
map_flash_registers(flash);
return 1;
Index: flashrom-call_probe_jedec/82802ab.c
===================================================================
--- flashrom-call_probe_jedec/82802ab.c (Revision 674)
+++ flashrom-call_probe_jedec/82802ab.c (Arbeitskopie)
@@ -47,14 +47,11 @@
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 @@
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 @@
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,19 +84,9 @@
status = chip_readb(bios);
- // put another command to get out of status register mode
+ /* Reset to get a clean state */
+ chip_writeb(0xFF, bios);
- 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);
-
return status;
}
--
http://www.hailfinger.org/
More information about the flashrom
mailing list