diff --git a/flash_rom.c b/flash_rom.c index 171fe3e9d..24b07a798 100644 --- a/flash_rom.c +++ b/flash_rom.c @@ -48,7 +48,7 @@ struct flashchip flashchips[] = { {"SST28SF040A", SST_ID, SST_28SF040, NULL, 512, 256, probe_28sf040, erase_28sf040, write_28sf040}, {"SST39SF020A", SST_ID, SST_39SF020, NULL, 256, 4096, - probe_jedec, erase_jedec, write_39sf020}, + probe_39sf020, erase_39sf020, write_39sf020}, {"W29C020C", WINBOND_ID, W_29C020C, NULL, 256, 128, probe_jedec, erase_jedec, write_jedec}, {NULL,} diff --git a/sst39sf020.c b/sst39sf020.c index 3c310a775..49e695f89 100644 --- a/sst39sf020.c +++ b/sst39sf020.c @@ -72,13 +72,19 @@ static __inline__ erase_sector_39sf020 (volatile char * bios, unsigned long addr toggle_ready_jedec(bios); } -static __inline__ write_sector_39sf020(volatile char * bios, unsigned char * src, - volatile unsigned char * dst, unsigned int page_size) +static __inline__ write_sector_39sf020(volatile char * bios, + unsigned char * src, + volatile unsigned char * dst, + unsigned int page_size) { int i; volatile char *Temp; for (i = 0; i < page_size; i++) { + if (*dst != 0xff) { + printf("FATAL: dst %p not erased (val 0x%x\n", dst, *dst); + return; + } /* transfer data from source to destination */ if (*src == 0xFF) { dst++, src++; @@ -91,8 +97,11 @@ static __inline__ write_sector_39sf020(volatile char * bios, unsigned char * src *Temp = 0x55; Temp = bios + 0x5555; *Temp = 0xA0; - *dst++ = *src++; + *dst = *src; toggle_ready_jedec(bios); + if (*dst != *src) printf("BAD! dst 0x%x val 0x%x src 0x%x\n", + dst, *dst, *src); + dst++, src++; } } @@ -127,15 +136,29 @@ int probe_39sf020 (struct flashchip * flash) int erase_39sf020 (struct flashchip * flash) { - volatile char * bios = flash->virt_addr; - - unprotect_39sf020 (bios); - *bios = CHIP_ERASE; - *bios = CHIP_ERASE; - protect_39sf020 (bios); - + volatile unsigned char * bios = flash->virt_addr; + volatile unsigned char *Temp; + /* Issue the Sector Erase command to 39SF020 */ + printf(__FUNCTION__ " bios is %p\n", bios); + Temp = bios + 0x5555; /* set up address to be C000:5555h */ + *Temp = 0xAA; /* write data 0xAA to the address */ myusec_delay(10); - toggle_ready_jedec(bios); + Temp = bios + 0x2AAA; /* set up address to be C000:2AAAh */ + *Temp = 0x55; /* write data 0x55 to the address */ + myusec_delay(10); + Temp = bios + 0x5555; /* set up address to be C000:5555h */ + *Temp = 0x80; /* write data 0x80 to the address */ + myusec_delay(10); + Temp = bios + 0x5555; /* set up address to be C000:5555h */ + *Temp = 0xAA; /* write data 0xAA to the address */ + myusec_delay(10); + Temp = bios + 0x2AAA; /* set up address to be C000:2AAAh */ + *Temp = 0x55; /* write data 0x55 to the address */ + myusec_delay(10); + Temp = bios + 0x5555; /* set up address to be C000:5555h */ + *Temp = 0x10; /* write data 0x55 to the address */ + + myusec_delay(20000); } int write_39sf020 (struct flashchip * flash, char * buf) @@ -145,7 +168,7 @@ int write_39sf020 (struct flashchip * flash, char * buf) volatile char * bios = flash->virt_addr; // unprotect_39sf020 (bios); - + erase_39sf020(flash); printf ("Programming Page: "); for (i = 0; i < total_size/page_size; i++) { /* erase the page before programming */