diff options
| -rw-r--r-- | flash_rom.c | 2 | ||||
| -rw-r--r-- | sst49lf040.c | 45 | ||||
| -rw-r--r-- | udelay.c | 4 | ||||
| -rw-r--r-- | w49f002u.c | 80 | 
4 files changed, 40 insertions, 91 deletions
| diff --git a/flash_rom.c b/flash_rom.c index 9274291a..b8ffeb06 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 9899e44f..5f2503d2 100644 --- a/sst49lf040.c +++ b/sst49lf040.c @@ -23,8 +23,6 @@   *   * $Id$   */ -			  -  #include <stdio.h>  #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);  } @@ -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); - -  } @@ -22,7 +22,7 @@   * Reference:   *	W49F002U data sheet   * - * $Id + * $Id$   */  #include <stdio.h> @@ -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);  } | 
