See patch.

This is _not_ tested (other than that it compiles).


Uwe.
-- 
http://www.hermann-uwe.de  | http://www.holsham-traders.de
http://www.crazy-hacks.org | http://www.unmaintained-free-software.org
Add new common function 'write_loop' which handles most of the
near-duplicated implementations in every single file.

Signed-off-by: Uwe Hermann <[EMAIL PROTECTED]>

Index: sst39sf020.c
===================================================================
--- sst39sf020.c	(Revision 2748)
+++ sst39sf020.c	(Arbeitskopie)
@@ -47,23 +47,7 @@
 
 int write_39sf020(struct flashchip *flash, uint8_t *buf)
 {
-	int i;
-	int total_size = flash->total_size * 1024;
-	int page_size = flash->page_size;
-	volatile uint8_t *bios = flash->virtual_memory;
+	write_loop(flash, buf, erase_chip_jedec, NULL, write_sector_jedec);
 
-	erase_chip_jedec(flash);
-
-	printf("Programming Page: ");
-	for (i = 0; i < total_size / page_size; i++) {
-		/* write to the sector */
-		printf("%04d at address: 0x%08x", i, i * page_size);
-		write_sector_jedec(bios, buf + i * page_size,
-				   bios + i * page_size, page_size);
-		printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
-		fflush(stdout);
-	}
-	printf("\n");
-
 	return 0;
 }
Index: sst28sf040.c
===================================================================
--- sst28sf040.c	(Revision 2748)
+++ sst28sf040.c	(Arbeitskopie)
@@ -142,26 +142,11 @@
 
 int write_28sf040(struct flashchip *flash, uint8_t *buf)
 {
-	int i;
-	int total_size = flash->total_size * 1024;
-	int page_size = flash->page_size;
 	volatile uint8_t *bios = flash->virtual_memory;
 
 	unprotect_28sf040(bios);
-
-	printf("Programming Page: ");
-	for (i = 0; i < total_size / page_size; i++) {
-		/* erase the page before programming */
-		erase_sector_28sf040(bios, i * page_size);
-
-		/* write to the sector */
-		printf("%04d at address: 0x%08x", i, i * page_size);
-		write_sector_28sf040(bios, buf + i * page_size,
-				     bios + i * page_size, page_size);
-		printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
-	}
-	printf("\n");
-
+	write_loop(flash, buf, NULL, erase_sector_28sf040,
+		   write_sector_28sf040);
 	protect_28sf040(bios);
 
 	return 0;
Index: flash.h
===================================================================
--- flash.h	(Revision 2748)
+++ flash.h	(Arbeitskopie)
@@ -170,6 +170,11 @@
 
 /* flashrom.c */
 int map_flash_registers(struct flashchip *flash);
+int write_loop(struct flashchip *flash, uint8_t *buf,
+	       int (*erasechipfn)(struct flashchip *flash),
+	       int (*erasefn)(volatile uint8_t *bios, unsigned long address),
+	       int (*writefn)(volatile uint8_t *bios, uint8_t *src, 
+			      volatile uint8_t *dst, unsigned int page_size));
 
 /* layout.c */
 int show_id(uint8_t *bios, int size);
@@ -201,7 +206,7 @@
 extern int probe_jedec(struct flashchip *flash);
 extern int erase_chip_jedec(struct flashchip *flash);
 extern int write_jedec(struct flashchip *flash, uint8_t *buf);
-extern int erase_sector_jedec(volatile uint8_t *bios, unsigned int page);
+extern int erase_sector_jedec(volatile uint8_t *bios, unsigned long page);
 extern int erase_block_jedec(volatile uint8_t *bios, unsigned int page);
 extern int write_sector_jedec(volatile uint8_t *bios, uint8_t *src,
 			      volatile uint8_t *dst, unsigned int page_size);
Index: am29f040b.c
===================================================================
--- am29f040b.c	(Revision 2748)
+++ am29f040b.c	(Arbeitskopie)
@@ -113,23 +113,8 @@
 
 int write_29f040b(struct flashchip *flash, uint8_t *buf)
 {
-	int i;
-	int total_size = flash->total_size * 1024;
-	int page_size = flash->page_size;
-	volatile uint8_t *bios = flash->virtual_memory;
+	write_loop(flash, buf, NULL, erase_sector_29f040b,
+		   write_sector_29f040b);
 
-	printf("Programming page ");
-	for (i = 0; i < total_size / page_size; i++) {
-		/* erase the page before programming */
-		erase_sector_29f040b(bios, i * page_size);
-
-		/* write to the sector */
-		printf("%04d at address: ", i);
-		write_sector_29f040b(bios, buf + i * page_size,
-				     bios + i * page_size, page_size);
-		printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
-	}
-	printf("\n");
-
 	return 0;
 }
Index: sst_fwhub.c
===================================================================
--- sst_fwhub.c	(Revision 2748)
+++ sst_fwhub.c	(Arbeitskopie)
@@ -72,30 +72,7 @@
 
 int write_sst_fwhub(struct flashchip *flash, uint8_t *buf)
 {
-	int i;
-	int total_size = flash->total_size * 1024;
-	int page_size = flash->page_size;
-	volatile uint8_t *bios = flash->virtual_memory;
+	write_loop(flash, buf, erase_sst_fwhub, NULL, write_sector_jedec);
 
-	// FIXME: We want block wide erase instead of ironing the whole chip
-	erase_sst_fwhub(flash);
-
-	// dumb check if erase was successful.
-	for (i = 0; i < total_size; i++) {
-		if (bios[i] != 0xff) {
-			printf("ERASE FAILED\n");
-			return -1;
-		}
-	}
-
-	printf("Programming Page: ");
-	for (i = 0; i < total_size / page_size; i++) {
-		printf("%04d at address: 0x%08x", i, i * page_size);
-		write_sector_jedec(bios, buf + i * page_size,
-				   bios + i * page_size, page_size);
-		printf("\b\b\b\b\b\b\b\b\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 2748)
+++ jedec.c	(Arbeitskopie)
@@ -115,7 +115,7 @@
 	return 0;
 }
 
-int erase_sector_jedec(volatile uint8_t *bios, unsigned int page)
+int erase_sector_jedec(volatile uint8_t *bios, unsigned long page)
 {
 	/*  Issue the Sector Erase command   */
 	*(volatile uint8_t *)(bios + 0x5555) = 0xAA;
@@ -186,7 +186,7 @@
 }
 
 int write_page_write_jedec(volatile uint8_t *bios, uint8_t *src,
-			   volatile uint8_t *dst, int page_size)
+			   volatile uint8_t *dst, unsigned int page_size)
 {
 	int i, tried = 0, start_index = 0, ok;
 	volatile uint8_t *d = dst;
@@ -277,29 +277,8 @@
 
 int write_jedec(struct flashchip *flash, uint8_t *buf)
 {
-	int i;
-	int total_size = flash->total_size * 1024;
-	int page_size = flash->page_size;
-	volatile uint8_t *bios = flash->virtual_memory;
+	write_loop(flash, buf, erase_chip_jedec, NULL, write_page_write_jedec);
+	protect_jedec(flash->virtual_memory);
 
-	erase_chip_jedec(flash);
-	// dumb check if erase was successful.
-	for (i = 0; i < total_size; i++) {
-		if (bios[i] != (uint8_t) 0xff) {
-			printf("ERASE FAILED\n");
-			return -1;
-		}
-	}
-
-	printf("Programming Page: ");
-	for (i = 0; i < total_size / page_size; i++) {
-		printf("%04d at address: 0x%08x", i, i * page_size);
-		write_page_write_jedec(bios, buf + i * page_size,
-				       bios + i * page_size, page_size);
-		printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
-	}
-	printf("\n");
-	protect_jedec(bios);
-
 	return 0;
 }
Index: flashrom.c
===================================================================
--- flashrom.c	(Revision 2748)
+++ flashrom.c	(Arbeitskopie)
@@ -194,6 +194,52 @@
 	return 0;
 }
 
+
+#define CR "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"
+
+int write_loop(struct flashchip *flash, uint8_t *buf,
+	       int (*erasechipfn)(struct flashchip *flash),
+	       int (*erasefn)(volatile uint8_t *bios, unsigned long address),
+	       int (*writefn)(volatile uint8_t *bios, uint8_t *src,
+			      volatile uint8_t *dst, unsigned int page_size))
+{
+	int i;
+	int total_size = flash->total_size * 1024;
+	int page_size = flash->page_size;
+	volatile uint8_t *bios = flash->virtual_memory;
+
+	/* Erase the whole chip before programming. */
+	if (erasechipfn != NULL)
+		erasechipfn(flash);
+
+	/* Verify that the erase really worked. */
+	for (i = 0; i < total_size; i++) {
+		if (bios[i] != 0xff) {
+			printf("ERASE FAILED\n");
+			return -1;
+		}
+	}
+
+	printf("Programming page/block/sector: ");
+	for (i = 0; i < total_size / page_size; i++) {
+		/* Erase the page/block/sector before programming. */
+		if (erasefn != NULL)
+			erasefn(bios, i * page_size);
+
+		printf("%04d at address: 0x%08x", i, i * page_size);
+
+		/* Write the page/block/sector. */
+		writefn(bios, buf + i * page_size,
+			bios + i * page_size, page_size);
+
+		printf(CR);
+		fflush(stdout);
+	}
+	printf("\n");
+
+	return 0;
+}
+
 void usage(const char *name)
 {
 	printf("usage: %s [-rwvEVfh] [-c chipname] [-s exclude_start]\n", name);
Index: sst49lfxxxc.c
===================================================================
--- sst49lfxxxc.c	(Revision 2748)
+++ sst49lfxxxc.c	(Arbeitskopie)
@@ -170,26 +170,11 @@
 
 int write_49lfxxxc(struct flashchip *flash, uint8_t *buf)
 {
-	int i;
-	int total_size = flash->total_size * 1024;
-	int page_size = flash->page_size;
-	volatile uint8_t *bios = flash->virtual_memory;
+	write_lockbits_49lfxxxc(flash->virtual_registers,
+				flash->total_size * 1024, 0);
+	write_loop(flash, buf, NULL, erase_sector_49lfxxxc,
+		   write_sector_49lfxxxc);
+	*(flash->virtual_memory) = RESET;
 
-	write_lockbits_49lfxxxc(flash->virtual_registers, total_size, 0);
-	printf("Programming Page: ");
-	for (i = 0; i < total_size / page_size; i++) {
-		/* erase the page before programming */
-		erase_sector_49lfxxxc(bios, i * page_size);
-
-		/* write to the sector */
-		printf("%04d at address: 0x%08x", i, i * page_size);
-		write_sector_49lfxxxc(bios, buf + i * page_size,
-				      bios + i * page_size, page_size);
-		printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
-	}
-	printf("\n");
-
-	*bios = RESET;
-
 	return 0;
 }
Index: 82802ab.c
===================================================================
--- 82802ab.c	(Revision 2748)
+++ 82802ab.c	(Arbeitskopie)
@@ -144,8 +144,8 @@
 	return 0;
 }
 
-void write_page_82802ab(volatile uint8_t *bios, uint8_t *src,
-			volatile uint8_t *dst, int page_size)
+int write_page_82802ab(volatile uint8_t *bios, uint8_t *src,
+			volatile uint8_t *dst, unsigned int page_size)
 {
 	int i;
 
@@ -155,29 +155,14 @@
 		*dst++ = *src++;
 		wait_82802ab(bios);
 	}
+
+	return 0;
 }
 
 int write_82802ab(struct flashchip *flash, uint8_t *buf)
 {
-	int i;
-	int total_size = flash->total_size * 1024;
-	int page_size = flash->page_size;
-	volatile uint8_t *bios = flash->virtual_memory;
+	write_loop(flash, buf, erase_82802ab, NULL, write_page_82802ab);
+	protect_jedec(flash->virtual_memory);
 
-	erase_82802ab(flash);
-	if (*bios != 0xff) {
-		printf("ERASE FAILED\n");
-		return -1;
-	}
-	printf("Programming Page: ");
-	for (i = 0; i < total_size / page_size; i++) {
-		printf("%04d at address: 0x%08x", i, i * page_size);
-		write_page_82802ab(bios, buf + i * page_size,
-				   bios + i * page_size, page_size);
-		printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
-	}
-	printf("\n");
-	protect_jedec(bios);
-
 	return 0;
 }
Index: sharplhf00l04.c
===================================================================
--- sharplhf00l04.c	(Revision 2748)
+++ sharplhf00l04.c	(Arbeitskopie)
@@ -146,8 +146,8 @@
 	return 0;
 }
 
-void write_page_lhf00l04(volatile uint8_t *bios, uint8_t *src,
-			 volatile uint8_t *dst, int page_size)
+int write_page_lhf00l04(volatile uint8_t *bios, uint8_t *src,
+			 volatile uint8_t *dst, unsigned int page_size)
 {
 	int i;
 
@@ -157,29 +157,14 @@
 		*dst++ = *src++;
 		wait_lhf00l04(bios);
 	}
+
+	return 0;
 }
 
 int write_lhf00l04(struct flashchip *flash, uint8_t *buf)
 {
-	int i;
-	int total_size = flash->total_size * 1024;
-	int page_size = flash->page_size;
-	volatile uint8_t *bios = flash->virtual_memory;
+	write_loop(flash, buf, erase_lhf00l04, NULL, write_page_lhf00l04);
+	protect_jedec(flash->virtual_memory);
 
-	erase_lhf00l04(flash);
-	if (*bios != 0xff) {
-		printf("ERASE FAILED\n");
-		return -1;
-	}
-	printf("Programming Page: ");
-	for (i = 0; i < total_size / page_size; i++) {
-		printf("%04d at address: 0x%08x", i, i * page_size);
-		write_page_lhf00l04(bios, buf + i * page_size,
-				    bios + i * page_size, page_size);
-		printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
-	}
-	printf("\n");
-	protect_jedec(bios);
-
 	return 0;
 }
Index: sst49lf040.c
===================================================================
--- sst49lf040.c	(Revision 2748)
+++ sst49lf040.c	(Arbeitskopie)
@@ -46,28 +46,10 @@
 
 int write_49lf040(struct flashchip *flash, uint8_t *buf)
 {
-	int i;
-	int total_size = flash->total_size * 1024;
-	int page_size = flash->page_size;
-	volatile uint8_t *bios = flash->virtual_memory;
+	/* Chip erase only works in parallel programming mode for the 49lf040.
+	 * Use sector-erase instead.
+	 */
+	write_loop(flash, buf, NULL, erase_sector_jedec, write_sector_jedec);
 
-	printf("Programming Page: ");
-	for (i = 0; i < total_size / page_size; i++) {
-		/* erase the page before programming
-		 * Chip erase only works in parallel programming mode
-		 * for the 49lf040. Use sector-erase instead */
-		erase_sector_jedec(bios, i * page_size);
-
-		/* write to the sector */
-		printf("%04d at address: 0x%08x ", i, i * page_size);
-
-		write_sector_jedec(bios, buf + i * page_size,
-				   bios + i * page_size, page_size);
-
-		printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
-		fflush(stdout);
-	}
-	printf("\n");
-
 	return 0;
 }

Attachment: signature.asc
Description: Digital signature

-- 
linuxbios mailing list
[email protected]
http://www.linuxbios.org/mailman/listinfo/linuxbios

Reply via email to