[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