[flashrom] Migrate towards common JEDEC functions

Michael Karcher flashrom at mkarcher.dialup.fu-berlin.de
Thu Nov 26 18:05:38 CET 2009


Use common jedec functionality where appropriate. The deleted function
in en29f002a.c is reintroduced as write_by_byte_jedec in jedec.c as it
contains no chip-specific instructions. It is not yet used in other
chip drivers, as key addresses (0x2AAA/0x5555) are often specified with
less bits. After crosschecking datasheets, most of the fixmes can
probably be resolved as indicated in them, causing significant code
reduction.

Similar analysis should be performed for the read id stuff.

Signed-off-by: flashrom at mkarcher.dialup.fu-berlin.de

Index: flash.h
===================================================================
--- flash.h	(Revision 784)
+++ flash.h	(Arbeitskopie)
@@ -653,6 +653,7 @@
 int probe_jedec(struct flashchip *flash);
 int erase_chip_jedec(struct flashchip *flash);
 int write_jedec(struct flashchip *flash, uint8_t *buf);
+int write_by_byte_jedec(struct flashchip *flash, uint8_t *buf);
 int erase_sector_jedec(struct flashchip *flash, unsigned int page, unsigned int pagesize);
 int erase_block_jedec(struct flashchip *flash, unsigned int page, unsigned int blocksize);
 int write_sector_jedec(chipaddr bios, uint8_t *src,
Index: en29f002a.c
===================================================================
--- en29f002a.c	(Revision 784)
+++ en29f002a.c	(Arbeitskopie)
@@ -87,39 +87,3 @@
 
 	return 0;
 }
-
-/* The EN29F002 chip needs repeated single byte writing, no block writing. */
-int write_en29f002a(struct flashchip *flash, uint8_t *buf)
-{
-	int i;
-	int total_size = flash->total_size * 1024;
-	chipaddr bios = flash->virtual_memory;
-	chipaddr dst = bios;
-
-	//chip_writeb(0xF0, bios);
-	programmer_delay(10);
-	if (erase_chip_jedec(flash)) {
-		fprintf(stderr, "ERASE FAILED!\n");
-		return -1;
-	}
-
-	printf("Programming page: ");
-	for (i = 0; i < total_size; i++) {
-		/* write to the sector */
-		if ((i & 0xfff) == 0)
-			printf("address: 0x%08lx", (unsigned long)i);
-		chip_writeb(0xAA, bios + 0x5555);
-		chip_writeb(0x55, bios + 0x2AAA);
-		chip_writeb(0xA0, bios + 0x5555);
-		chip_writeb(*buf++, dst++);
-
-		/* wait for Toggle bit ready */
-		toggle_ready_jedec(dst);
-
-		if ((i & 0xfff) == 0)
-			printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
-	}
-
-	printf("\n");
-	return 0;
-}
Index: jedec.c
===================================================================
--- jedec.c	(Revision 784)
+++ jedec.c	(Arbeitskopie)
@@ -353,3 +353,31 @@
 
 	return failed;
 }
+
+int write_by_byte_jedec(struct flashchip *flash, uint8_t * buf)
+{
+	int i;
+	int total_size = flash->total_size * 1024;
+	chipaddr bios = flash->virtual_memory;
+	chipaddr dst = bios;
+
+	programmer_delay(10);
+	if (erase_chip_jedec(flash)) {
+		fprintf(stderr, "ERASE FAILED!\n");
+		return -1;
+	}
+
+	printf("Programming page: ");
+	for (i = 0; i < flash->total_size; i++) {
+		if ((i & 0x3) == 0)
+			printf("address: 0x%08lx", (unsigned long)i * 1024);
+
+                write_sector_jedec(bios, buf + i * 1024, dst + i * 1024)
+
+		if ((i & 0x3) == 0)
+			printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
+	}
+
+	printf("\n");
+	return 0;
+}
Index: pm29f002.c
===================================================================
--- pm29f002.c	(Revision 784)
+++ pm29f002.c	(Arbeitskopie)
@@ -20,18 +20,22 @@
 
 #include "flash.h"
 
+/* if erase_chip_jedec/write_sector_jedec is used,
+   this is write_by_byte_jedec */
 int write_pm29f002(struct flashchip *flash, uint8_t *buf)
 {
 	int i, total_size = flash->total_size * 1024;
 	chipaddr bios = flash->virtual_memory;
 	chipaddr dst = bios;
 
-	/* Pm29F002T/B use the same erase method... */
+	/* Pm29F002T/B use the same erase method...
+	   FIXME: use erase_chip_jedec? */
 	if (erase_29f040b(flash)) {
 		fprintf(stderr, "ERASE FAILED!\n");
 		return -1;
 	}
 
+	/* FIXME: use write_sector_jedec? */
 	printf("Programming page: ");
 	for (i = 0; i < total_size; i++) {
 		if ((i & 0xfff) == 0)
Index: flashchips.c
===================================================================
--- flashchips.c	(Revision 784)
+++ flashchips.c	(Arbeitskopie)
@@ -81,7 +81,7 @@
 		.probe		= probe_jedec,
 		.probe_timing	= TIMING_ZERO,
 		.erase		= erase_chip_jedec,
-		.write		= write_en29f002a,
+		.write		= write_by_byte_jedec,
 		.read		= read_memmapped,
 	},
 
@@ -97,7 +97,7 @@
 		.probe		= probe_jedec,
 		.probe_timing	= TIMING_ZERO,
 		.erase		= erase_chip_jedec,
-		.write		= write_en29f002a,
+		.write		= write_by_byte_jedec,
 		.read		= read_memmapped,
 	},
 
@@ -1075,7 +1075,7 @@
 		.probe		= probe_jedec,
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.erase		= erase_chip_jedec,
-		.write		= write_en29f002a,
+		.write		= write_by_byte_jedec,
 		.read		= read_memmapped,
 	},
 
@@ -1091,7 +1091,7 @@
 		.probe		= probe_jedec,
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.erase		= erase_chip_jedec,
-		.write		= write_en29f002a,
+		.write		= write_by_byte_jedec,
 		.read		= read_memmapped,
 	},
 
Index: m29f002.c
===================================================================
--- m29f002.c	(Revision 784)
+++ m29f002.c	(Arbeitskopie)
@@ -45,6 +45,7 @@
 	chipaddr dst = bios + start;
 
 	/* erase */
+	/* FIXME: use erase_sector_jedec? */
 	chip_writeb(0xaa, bios + 0x555);
 	chip_writeb(0x55, bios + 0xaaa);
 	chip_writeb(0x80, bios + 0x555);
@@ -59,6 +60,7 @@
 	}
 
 	/* program */
+	/* FIXME: use write_sector_jedec? */
 	while (size--) {
 		chip_writeb(0xaa, bios + 0x555);
 		chip_writeb(0x55, bios + 0xaaa);
Index: am29f040b.c
===================================================================
--- am29f040b.c	(Revision 784)
+++ am29f040b.c	(Arbeitskopie)
@@ -20,6 +20,8 @@
 
 #include "flash.h"
 
+/* FIMXE: check that the 2 second delay is really needed.
+          Use erase_sector_jedec if not? */
 static int erase_sector_29f040b(struct flashchip *flash, unsigned long address)
 {
 	int page_size = flash->page_size;
@@ -44,6 +46,7 @@
 	return 0;
 }
 
+/* FIXME: use write_sector_jedec? */
 static int write_sector_29f040b(chipaddr bios, uint8_t *src, chipaddr dst,
 				unsigned int page_size)
 {
@@ -91,6 +94,7 @@
 	return 0;
 }
 
+/* FIXME: use erase_chip_jedec */
 int erase_29f040b(struct flashchip *flash)
 {
 	int total_size = flash->total_size * 1024;
Index: mx29f002.c
===================================================================
--- mx29f002.c	(Revision 784)
+++ mx29f002.c	(Arbeitskopie)
@@ -43,6 +43,8 @@
 	return 0;
 }
 
+/* FIXME: Use erase_chip_jedec?
+ * (does not send 0xF0 (exit ID mode) and uses 0x5555/0x2AAA adresses) */
 int erase_29f002(struct flashchip *flash)
 {
 	chipaddr bios = flash->virtual_memory;
@@ -65,6 +67,8 @@
 	return 0;
 }
 
+/* FIXME: If erase_29f002 has been replaced by erase_chip_jedec, this
+          function is write_by_byte_jedec */
 int write_29f002(struct flashchip *flash, uint8_t *buf)
 {
 	int i;
@@ -83,14 +87,8 @@
 		/* write to the sector */
 		if ((i & 0xfff) == 0)
 			printf("address: 0x%08lx", (unsigned long)i);
-		chip_writeb(0xAA, bios + 0x5555);
-		chip_writeb(0x55, bios + 0x2AAA);
-		chip_writeb(0xA0, bios + 0x5555);
-		chip_writeb(*buf++, dst++);
+		write_byte_program_jedec(bios, buf++, dst++);
 
-		/* wait for Toggle bit ready */
-		toggle_ready_jedec(dst);
-
 		if ((i & 0xfff) == 0)
 			printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
 	}
Index: m29f400bt.c
===================================================================
--- m29f400bt.c	(Revision 784)
+++ m29f400bt.c	(Arbeitskopie)
@@ -20,6 +20,7 @@
 
 #include "flash.h"
 
+/* FIXME: use write_sector_jedec? */
 void write_page_m29f400bt(chipaddr bios, uint8_t *src,
 			  chipaddr dst, int page_size)
 {
@@ -74,6 +75,7 @@
 	return 0;
 }
 
+/* FIXME: Use erase_chip_jedec? */
 int erase_m29f400bt(struct flashchip *flash)
 {
 	chipaddr bios = flash->virtual_memory;
@@ -96,6 +98,7 @@
 	return 0;
 }
 
+/* FIXME: Use erase_sector_jedec? */
 int block_erase_m29f400bt(struct flashchip *flash, int start, int len)
 {
 	chipaddr bios = flash->virtual_memory;





More information about the flashrom mailing list