diff options
| -rw-r--r-- | flash_rom.c | 16 | ||||
| -rw-r--r-- | jedec.c | 62 | ||||
| -rw-r--r-- | pm49fl004.c | 34 | ||||
| -rw-r--r-- | sst39sf020.c | 8 | ||||
| -rw-r--r-- | sst_fwhub.c | 55 | ||||
| -rw-r--r-- | w49f002u.c | 21 | 
6 files changed, 49 insertions, 147 deletions
| diff --git a/flash_rom.c b/flash_rom.c index bf338ccb..35a9f509 100644 --- a/flash_rom.c +++ b/flash_rom.c @@ -194,7 +194,8 @@ int main(int argc, char *argv[])  	FILE *image;  	struct flashchip *flash;  	int opt; -	int read_it = 0, write_it = 0, verify_it = 0, verbose = 0; +	int read_it = 0, write_it = 0, erase_it = 0, verify_it = 0, +		verbose = 0;  	char *filename = NULL; @@ -211,7 +212,7 @@ int main(int argc, char *argv[])  	setbuf(stdout, NULL); -	while ((opt = getopt(argc, argv, "rwvVc:s:e:")) != EOF) { +	while ((opt = getopt(argc, argv, "rwvVEc:s:e:")) != EOF) {  		switch (opt) {  		case 'r':  			read_it = 1; @@ -228,6 +229,9 @@ int main(int argc, char *argv[])  		case 'V':  			verbose = 1;  			break; +		case 'E': +			erase_it = 1; +			break;  		case 's':  			tempstr = strdup(optarg);  			sscanf(tempstr,"%x",&exclude_start_position); @@ -266,14 +270,18 @@ int main(int argc, char *argv[])  	}  	printf("Part is %s\n", flash->name); -	if (!filename) { +	if (!filename && !erase_it) {  		printf("OK, only ENABLING flash write, but NOT FLASHING\n");  		return 0;  	}  	size = flash->total_size * 1024;  	buf = (char *) calloc(size, sizeof(char)); -	if (read_it) { +	if (erase_it) { +		printf("Erasing flash chip\n"); +		flash->erase(flash); +		exit(0);		 +	} else if (read_it) {  		if ((image = fopen(filename, "w")) == NULL) {  			perror(filename);  			exit(1); @@ -62,26 +62,19 @@ int probe_jedec(struct flashchip *flash)  int erase_sector_jedec(volatile unsigned char *bios, unsigned int page)  { -	volatile unsigned char *Temp; -  	/*  Issue the Sector Erase command   */ -	Temp = bios + 0x5555;	/* set up address to be BASE:5555h      */ -	*Temp = 0xAA;		/* write data 0xAA to the address       */ +	*(volatile char *) (bios + 0x5555) = 0xAA;  	myusec_delay(10); -	Temp = bios + 0x2AAA;	/* set up address to be BASE:2AAAh      */ -	*Temp = 0x55;		/* write data 0x55 to the address       */ +	*(volatile char *) (bios + 0x2AAA) = 0x55;  	myusec_delay(10); -	Temp = bios + 0x5555;	/* set up address to be BASE:5555h      */ -	*Temp = 0x80;		/* write data 0x80 to the address       */ +	*(volatile char *) (bios + 0x5555) = 0x80;  	myusec_delay(10); -	Temp = bios + 0x5555;	/* set up address to be BASE:5555h      */ -	*Temp = 0xAA;		/* write data 0xAA to the address       */ + +	*(volatile char *) (bios + 0x5555) = 0xAA;  	myusec_delay(10); -	Temp = bios + 0x2AAA;	/* set up address to be BASE:2AAAh      */ -	*Temp = 0x55;		/* write data 0x55 to the address       */ +	*(volatile char *) (bios + 0x2AAA) = 0x55;  	myusec_delay(10); -	Temp = bios + page;	/* set up address to be the current sector */ -	*Temp = 0x30;		/* write data 0x30 to the address       */ +	*(volatile char *) (bios + page)   = 0x30;  	myusec_delay(10);  	/* wait for Toggle bit ready         */ @@ -92,26 +85,19 @@ int erase_sector_jedec(volatile unsigned char *bios, unsigned int page)  int erase_block_jedec(volatile unsigned char *bios, unsigned int block)  { -	volatile unsigned char *Temp; -  	/*  Issue the Sector Erase command   */ -	Temp = bios + 0x5555;	/* set up address to be BASE:5555h      */ -	*Temp = 0xAA;		/* write data 0xAA to the address       */ +	*(volatile char *) (bios + 0x5555) = 0xAA;  	myusec_delay(10); -	Temp = bios + 0x2AAA;	/* set up address to be BASE:2AAAh      */ -	*Temp = 0x55;		/* write data 0x55 to the address       */ +	*(volatile char *) (bios + 0x2AAA) = 0x55;  	myusec_delay(10); -	Temp = bios + 0x5555;	/* set up address to be BASE:5555h      */ -	*Temp = 0x80;		/* write data 0x80 to the address       */ +	*(volatile char *) (bios + 0x5555) = 0x80;  	myusec_delay(10); -	Temp = bios + 0x5555;	/* set up address to be BASE:5555h      */ -	*Temp = 0xAA;		/* write data 0xAA to the address       */ + +	*(volatile char *) (bios + 0x5555) = 0xAA;  	myusec_delay(10); -	Temp = bios + 0x2AAA;	/* set up address to be BASE:2AAAh      */ -	*Temp = 0x55;		/* write data 0x55 to the address       */ +	*(volatile char *) (bios + 0x2AAA) = 0x55;  	myusec_delay(10); -	Temp = bios + block;	/* set up address to be the current sector */ -	*Temp = 0x50;		/* write data 0x30 to the address       */ +	*(volatile char *) (bios + block)  = 0x50;  	myusec_delay(10);  	/* wait for Toggle bit ready         */ @@ -123,26 +109,20 @@ int erase_block_jedec(volatile unsigned char *bios, unsigned int block)  int erase_chip_jedec(struct flashchip *flash)  {  	volatile unsigned char *bios = flash->virt_addr; -	volatile unsigned char *Temp;  	/*  Issue the JEDEC Chip Erase command   */ -	Temp = bios + 0x5555;	/* set up address to be BASE:5555h      */ -	*Temp = 0xAA;		/* write data 0xAA to the address       */ +	*(volatile char *) (bios + 0x5555) = 0xAA;  	myusec_delay(10); -	Temp = bios + 0x2AAA;	/* set up address to be BASE:2AAAh      */ -	*Temp = 0x55;		/* write data 0x55 to the address       */ +	*(volatile char *) (bios + 0x2AAA) = 0x55;  	myusec_delay(10); -	Temp = bios + 0x5555;	/* set up address to be BASE:5555h      */ -	*Temp = 0x80;		/* write data 0x80 to the address       */ +	*(volatile char *) (bios + 0x5555) = 0x80;  	myusec_delay(10); -	Temp = bios + 0x5555;	/* set up address to be BASE:5555h      */ -	*Temp = 0xAA;		/* write data 0xAA to the address       */ + +	*(volatile char *) (bios + 0x5555) = 0xAA;  	myusec_delay(10); -	Temp = bios + 0x2AAA;	/* set up address to be BASE:2AAAh      */ -	*Temp = 0x55;		/* write data 0x55 to the address       */ +	*(volatile char *) (bios + 0x2AAA) = 0x55;  	myusec_delay(10); -	Temp = bios + 0x5555;	/* set up address to be BASEy:5555h     */ -	*Temp = 0x10;		/* write data 0x10 to the address       */ +	*(volatile char *) (bios + 0x5555) = 0x10;  	myusec_delay(10);  	toggle_ready_jedec(bios); diff --git a/pm49fl004.c b/pm49fl004.c index a3f42faf..afcd55a0 100644 --- a/pm49fl004.c +++ b/pm49fl004.c @@ -27,43 +27,13 @@  #include "jedec.h"  #include "pm49fl004.h" -static __inline__ int erase_block_49fl004(volatile unsigned char *bios, -					  unsigned long address) -{ -	volatile unsigned char *Temp; - -	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 = 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 + address;	/* set up address to be C000:5555h      */ -	*Temp = 0x50;		/* write data 0x50 to the address       */ - -	/* wait for Toggle bit ready         */ -	toggle_ready_jedec(bios); - -	return (0); -} - -  extern int exclude_start_page, exclude_end_page;  int write_49fl004(struct flashchip *flash, unsigned char *buf)  {  	int i;  	int total_size = flash->total_size * 1024, page_size = -	    flash->page_size; +		flash->page_size;  	volatile char *bios = flash->virt_addr;  	printf("Programming Page: "); @@ -72,7 +42,7 @@ int write_49fl004(struct flashchip *flash, unsigned char *buf)  			continue;  		/* erase the page before programming */ -		erase_block_49fl004(bios, i * page_size); +		erase_block_jedec(bios, i * page_size);  		/* write to the sector */  		printf("%04d at address: 0x%08x", i, i * page_size); diff --git a/sst39sf020.c b/sst39sf020.c index 401247a6..97e87a1c 100644 --- a/sst39sf020.c +++ b/sst39sf020.c @@ -51,22 +51,18 @@ int write_39sf020(struct flashchip *flash, unsigned char *buf)  {  	int i;  	int total_size = flash->total_size * 1024, page_size = -	    flash->page_size; +		flash->page_size;  	volatile char *bios = flash->virt_addr;  	erase_chip_jedec(flash);  	printf("Programming Page: ");  	for (i = 0; i < total_size / page_size; i++) { -		/* erase the page before programming */ -		//erase_sector_39sf020(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"); +		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"); diff --git a/sst_fwhub.c b/sst_fwhub.c index d9dd4670..c064ed66 100644 --- a/sst_fwhub.c +++ b/sst_fwhub.c @@ -47,38 +47,14 @@ void print_sst_fwhub_status(unsigned char status)  }  /* probe_jedec works fine for probing */ -  int probe_sst_fwhub(struct flashchip *flash)  { -	volatile unsigned char *bios = flash->virt_addr; -	unsigned char id1, id2; +	volatile unsigned char *bios;  	size_t size = flash->total_size * 1024; -	/* Issue JEDEC Product ID Entry command */ -	*(volatile char *) (bios + 0x5555) = 0xAA; -	myusec_delay(10); -	*(volatile char *) (bios + 0x2AAA) = 0x55; -	myusec_delay(10); -	*(volatile char *) (bios + 0x5555) = 0x90; -	myusec_delay(10); - -	/* Read product ID */ -	id1 = *(volatile unsigned char *) bios; -	id2 = *(volatile unsigned char *) (bios + 0x01); - -	/* Issue JEDEC Product ID Exit command */ -	*(volatile char *) (bios + 0x5555) = 0xAA; -	myusec_delay(10); -	*(volatile char *) (bios + 0x2AAA) = 0x55; -	myusec_delay(10); -	*(volatile char *) (bios + 0x5555) = 0xF0; -	myusec_delay(10); -	printf("%s: id1 0x%x, id2 0x%x\n", __FUNCTION__, id1, id2); -	if (id1 != flash->manufacture_id || id2 != flash->model_id) +	if (probe_jedec(flash) == 0)  		return 0; -	myusec_delay(10); -  	bios = mmap(0, size, PROT_WRITE | PROT_READ, MAP_SHARED,  		    flash->fd_mem, (off_t) (0xFFFFFFFF - 0x400000 - size + 1));  	if (bios == MAP_FAILED) { @@ -91,23 +67,15 @@ int probe_sst_fwhub(struct flashchip *flash)  	return 1;  } -unsigned char wait_sst_fwhub(volatile unsigned char *bios) -{ -	toggle_ready_jedec(bios); -	return 0; -} -  int erase_sst_fwhub_block(struct flashchip *flash, int offset)  {  	volatile unsigned char *wrprotect = flash->virt_addr_2 + offset + 2; -	unsigned char status; -	//printf("Erase at %p\n", bios);  	// clear write protect  	*(wrprotect) = 0;  	erase_block_jedec(flash->virt_addr, offset); -	status = wait_sst_fwhub(flash->virt_addr); +	toggle_ready_jedec(flash->virt_addr);  	return (0);  } @@ -122,19 +90,6 @@ int erase_sst_fwhub(struct flashchip *flash)  	return (0);  } -void write_page_sst_fwhub(volatile char *bios, char *src, -			  volatile char *dst, int page_size) -{ -	int i; - -	for (i = 0; i < page_size; i++) { -		/* transfer data from source to destination */ -		write_byte_program_jedec(bios, src, dst); -		src++; -		dst++; -	} -} -  int write_sst_fwhub(struct flashchip *flash, unsigned char *buf)  {  	int i; @@ -150,8 +105,8 @@ int write_sst_fwhub(struct flashchip *flash, unsigned char *buf)  	printf("Programming Page: ");  	for (i = 0; i < total_size / page_size; i++) {  		printf("%04d at address: 0x%08x", i, i * page_size); -		write_page_sst_fwhub(bios, buf + i * page_size, -				     bios + i * page_size, 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"); @@ -35,27 +35,20 @@  int write_49f002(struct flashchip *flash, unsigned char *buf)  {  	int i; -	int total_size = flash->total_size * 1024; +	int total_size = flash->total_size * 1024, page_size = +		flash->page_size;  	volatile char *bios = flash->virt_addr; -	volatile char *dst = bios;  	erase_chip_jedec(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("%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"); | 
