[LinuxBIOS] flashrom: patch for jedec.c

Giampiero Giancipoli gianci at email.it
Wed Nov 15 09:37:36 CET 2006


Hi to all,

I used flashrom to flash the BIOS on a AxiomTek SBC84500, which mounts a
Winbond W29C020C. All is recognized fine, but the flashing fails.

# flashrom -v -w axiom.bin 
No LinuxBIOS table found.
Enabling flash write on CS5530...OK
W29C020C found at physical address: 0xfffc0000
Flash part is S29C51002T (256 KB)
Flash image seems to be a legacy BIOS. Disabling checks.
Programming Page: 2047 at address: 0x0003ff80 
Verifying flash - FAILED.

Trying fo find out the cause of the failure I eventually found a grave
error in jedec.c, at write_page_write_jedec(). The code:

      if (*src == 0xFF)
             continue;
       *dst++ = *src++;

is, of course, wrong. It should be

       if (*src != 0xFF ) 
               *dst = *src;
       dst++;
       src++;

I include a patch which fixes this error. But this is not enough.
Sector writes sometimes fail, so included a check/rewrite code 
similar to write_byte_program_jedec(). Maybe this is not the best way
to do the task, but at least for me works :)

Furthermore, the patch adds support for the SyncMos S29C51002T 256K
flash. Tested successfully on a Boser HS-2603. It is high probable that
the same configuration would work with all the chips of the same family.

# flashrom -v -w boser.bin 
No LinuxBIOS table found.
Enabling flash write on CS5530...OK
S29C51002T found at physical address: 0xfffc0000
Flash part is S29C51002T (256 KB)
Flash image seems to be a legacy BIOS. Disabling checks.
Programming Page: 2047 at address: 0x0003ff80 
Verifying flash - VERIFIED         

That's all.
Ciao.
-------------- next part --------------
Index: jedec.c
===================================================================
--- jedec.c	(revision 2497)
+++ jedec.c	(working copy)
@@ -134,23 +134,48 @@
 int write_page_write_jedec(volatile uint8_t *bios, uint8_t *src,
 			   volatile uint8_t *dst, int page_size)
 {
-	int i;
+	int i, tried = 0, start_index = 0, ok;
+	volatile uint8_t *d = dst;
+	uint8_t *s = src;
 
+retry:
 	/* Issue JEDEC Data Unprotect comand */
 	*(volatile uint8_t *) (bios + 0x5555) = 0xAA;
 	*(volatile uint8_t *) (bios + 0x2AAA) = 0x55;
 	*(volatile uint8_t *) (bios + 0x5555) = 0xA0;
 
 	/* transfer data from source to destination */
-	for (i = 0; i < page_size; i++) {
+	for (i = start_index; i < page_size; i++) {
 		/* If the data is 0xFF, don't program it */
-		if (*src == 0xFF)
-			continue;
-		*dst++ = *src++;
+		if (*src != 0xFF ) 
+			*dst = *src;
+		dst++;
+		src++;
 	}
 
 	toggle_ready_jedec(dst - 1);
 
+	dst = d;
+	src = s;
+	ok = 1;
+	for (i = 0; i < page_size; i++) {
+		if (*src != 0xFF) 
+			if ( *dst != *src ) 
+			{
+				ok = 0;
+				break;
+			}
+		dst++;
+		src++;
+	}
+		
+	if (!ok && tried++ < 0x10) {
+		start_index = i;
+ 		goto retry;
+ 	}
+	if (!ok) {
+		fprintf( stderr, " page %d failed!\n", (d-bios)/page_size );
+	}
 	return 0;
 }
 
Index: flashchips.c
===================================================================
--- flashchips.c	(revision 2497)
+++ flashchips.c	(working copy)
@@ -114,6 +114,8 @@
 #endif
 	{"LHF00L04",	SHARP_ID,		SHARP_LHF00L04,		NULL, 1024, 64 * 1024,
 	 probe_lhf00l04, erase_lhf00l04,	write_lhf00l04,	NULL},
+	{"S29C51002T", 	SM_ID, 	S29C51002T,	NULL, 256, 128,
+	 probe_jedec,	erase_chip_jedec, write_49f002, NULL},
 	{NULL,}
 };
 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://www.coreboot.org/pipermail/coreboot/attachments/20061115/edb227df/attachment.sig>


More information about the coreboot mailing list