From cec287936c8e00039f634cbfeb2cc64b457f2da0 Mon Sep 17 00:00:00 2001 From: Ollie Lho Date: Wed, 17 Mar 2004 23:03:37 +0000 Subject: Use standard product ID exit method for w49f002u Corresponding to flashrom svn r7 and coreboot v2 svn r1433. --- flash_rom.c | 2 +- sst49lf040.c | 45 ++++------------------------------ udelay.c | 4 +-- w49f002u.c | 80 +++++++++++++++++++++++++----------------------------------- 4 files changed, 40 insertions(+), 91 deletions(-) diff --git a/flash_rom.c b/flash_rom.c index 9274291..b8ffeb0 100644 --- a/flash_rom.c +++ b/flash_rom.c @@ -116,7 +116,7 @@ struct flashchip * probe_flash(struct flashchip * flash) } bios = mmap (0, size, PROT_WRITE | PROT_READ, MAP_SHARED, //fd_mem, (off_t) (0x100000000-size)); - fd_mem, (off_t) (0x0-size)); + fd_mem, (off_t) (0xffffffff-size+1)); if (bios == MAP_FAILED) { perror("Error MMAP /dev/mem"); exit(1); diff --git a/sst49lf040.c b/sst49lf040.c index 9899e44..5f2503d 100644 --- a/sst49lf040.c +++ b/sst49lf040.c @@ -23,8 +23,6 @@ * * $Id$ */ - - #include #include "flash.h" #include "jedec.h" @@ -37,35 +35,7 @@ #define RESET 0xFF #define READ_ID 0x90 -static __inline__ void protect_49lf040 (volatile char * bios) -{ - /* ask compiler not to optimize this */ - volatile unsigned char tmp; - - tmp = *(volatile unsigned char *) (bios + 0x1823); - tmp = *(volatile unsigned char *) (bios + 0x1820); - tmp = *(volatile unsigned char *) (bios + 0x1822); - tmp = *(volatile unsigned char *) (bios + 0x0418); - tmp = *(volatile unsigned char *) (bios + 0x041B); - tmp = *(volatile unsigned char *) (bios + 0x0419); - tmp = *(volatile unsigned char *) (bios + 0x040A); -} - -static __inline__ void unprotect_49lf040 (volatile char * bios) -{ - /* ask compiler not to optimize this */ - volatile unsigned char tmp; - - tmp = *(volatile unsigned char *) (bios + 0x1823); - tmp = *(volatile unsigned char *) (bios + 0x1820); - tmp = *(volatile unsigned char *) (bios + 0x1822); - tmp = *(volatile unsigned char *) (bios + 0x0418); - tmp = *(volatile unsigned char *) (bios + 0x041B); - tmp = *(volatile unsigned char *) (bios + 0x0419); - tmp = *(volatile unsigned char *) (bios + 0x041A); -} - -int erase_sector_49lf040 (volatile char * bios, unsigned int page) +static int erase_sector_49lf040 (volatile char * bios, unsigned int page) { /* Chip erase function does not exist for LPC mode on 49lf040. * Erase sector-by-sector instead. */ @@ -99,9 +69,9 @@ int erase_sector_49lf040 (volatile char * bios, unsigned int page) } static __inline__ int write_sector_49lf040(volatile char * bios, - unsigned char * src, - volatile unsigned char * dst, - unsigned int page_size) + unsigned char * src, + volatile unsigned char * dst, + unsigned int page_size) { int i; volatile char *Temp; @@ -146,7 +116,6 @@ int probe_49lf040 (struct flashchip * flash) *(volatile char *) (bios + 0x2AAA) = 0x55; myusec_delay(10); *(volatile char *) (bios + 0x5555) = 0x90; - myusec_delay(10); id1 = *(volatile unsigned char *) bios; @@ -165,6 +134,7 @@ int probe_49lf040 (struct flashchip * flash) return 0; } + /* Chip erase only works in parallel programming mode for the 49lf040. * Use sector-erase instead */ int erase_49lf040 (struct flashchip * flash) @@ -190,7 +160,6 @@ int erase_49lf040 (struct flashchip * flash) myusec_delay(10); Temp = bios + 0x5555; /* set up address to be C000:5555h */ *Temp = 0x10; /* write data 0x55 to the address */ - myusec_delay(50000); return(0); @@ -202,8 +171,6 @@ int write_49lf040 (struct flashchip * flash, unsigned char * buf) int total_size = flash->total_size * 1024, page_size = flash->page_size; volatile char * bios = flash->virt_addr; -// unprotect_49lf040 (bios); -// erase_49lf040(flash); /* Must be done sector-by-sector in LPC mode */ printf ("Programming Page: "); for (i = 0; i < total_size/page_size; i++) { /* erase the page before programming */ @@ -218,7 +185,5 @@ int write_49lf040 (struct flashchip * flash, unsigned char * buf) } printf("\n"); -// protect_49lf040 (bios); - return(0); } diff --git a/udelay.c b/udelay.c index 9674bbe..a6597e5 100644 --- a/udelay.c +++ b/udelay.c @@ -7,7 +7,7 @@ unsigned long micro = 1; void myusec_delay(int time) { volatile unsigned long i; - for(i = 0; i < time * micro; i++) + for (i = 0; i < time * micro; i++) ; } @@ -38,6 +38,4 @@ void myusec_calibrate_delay() micro = count / timeusec; fprintf(stderr, "%ldM loops per second\n", (unsigned long)micro); - - } diff --git a/w49f002u.c b/w49f002u.c index b7c57eb..4d5d16b 100644 --- a/w49f002u.c +++ b/w49f002u.c @@ -22,7 +22,7 @@ * Reference: * W49F002U data sheet * - * $Id + * $Id$ */ #include @@ -35,14 +35,16 @@ int probe_49f002 (struct flashchip * flash) volatile char * bios = flash->virt_addr; unsigned char id1, id2; - *(bios + 0x5555) = 0xAA; - *(bios + 0x2AAA) = 0x55; - *(bios + 0x5555) = 0x90; + *(volatile char *) (bios + 0x5555) = 0xAA; + *(volatile char *) (bios + 0x2AAA) = 0x55; + *(volatile char *) (bios + 0x5555) = 0x90; id1 = *(volatile unsigned char *) bios; id2 = *(volatile unsigned char *) (bios + 0x01); - - *bios = 0xF0; + + *(volatile char *) (bios + 0x5555) = 0xAA; + *(volatile char *) (bios + 0x2AAA) = 0x55; + *(volatile char *) (bios + 0x5555) = 0xF0; myusec_delay(10); @@ -68,52 +70,36 @@ int erase_49f002 (struct flashchip * flash) myusec_delay(100); toggle_ready_jedec(bios); - // while ((*bios & 0x40) != 0x40) - //; - -#if 0 - toggle_ready_jedec(bios); - *(bios + 0x0ffff) = 0x30; - *(bios + 0x1ffff) = 0x30; - *(bios + 0x2ffff) = 0x30; - *(bios + 0x37fff) = 0x30; - *(bios + 0x39fff) = 0x30; - *(bios + 0x3bfff) = 0x30; -#endif - return(0); } int write_49f002 (struct flashchip * flash, unsigned char * buf) { - int i; - int total_size = flash->total_size * 1024; - volatile char * bios = flash->virt_addr; - volatile char * dst = bios; - - *bios = 0xF0; - myusec_delay(10); - erase_49f002(flash); - //*bios = 0xF0; -#if 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); - *(bios + 0x5555) = 0xAA; - *(bios + 0x2AAA) = 0x55; - *(bios + 0x5555) = 0xA0; - *dst++ = *buf++; - - /* wait for Toggle bit ready */ - toggle_ready_jedec(dst); + int i; + int total_size = flash->total_size * 1024; + volatile char * bios = flash->virt_addr; + volatile char * dst = bios; - if ((i & 0xfff) == 0) - printf ("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"); - } -#endif - printf("\n"); + myusec_delay(10); + erase_49f002(flash); + + 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); + *(bios + 0x5555) = 0xAA; + *(bios + 0x2AAA) = 0x55; + *(bios + 0x5555) = 0xA0; + *dst++ = *buf++; + + /* 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); + return(0); } -- cgit v1.1