diff options
| author | Ollie Lho <ollie@sis.com.tw> | 2004-12-07 03:15:51 +0000 | 
|---|---|---|
| committer | Ollie Lho <ollie@sis.com.tw> | 2004-12-07 03:15:51 +0000 | 
| commit | 98bea8aba5a1dad1abc2b1d191f873e1d45d5b50 (patch) | |
| tree | 9d6bd66ce4d93b8adabc83aeae4e1c94c94ff862 | |
| parent | ad8ffd2e7646b8d5a5c08cab9252f69f1156a6fe (diff) | |
| download | flashrom-98bea8aba5a1dad1abc2b1d191f873e1d45d5b50.tar.gz flashrom-98bea8aba5a1dad1abc2b1d191f873e1d45d5b50.tar.bz2 flashrom-98bea8aba5a1dad1abc2b1d191f873e1d45d5b50.zip | |
SST49LF00[2,3,4] should use the same driver as 49LF008
Corresponding to flashrom svn r27 and coreboot v2 svn r1812.
| -rw-r--r-- | flash_rom.c | 38 | ||||
| -rw-r--r-- | jedec.c | 37 | ||||
| -rw-r--r-- | sst_fwhub.c | 25 | 
3 files changed, 49 insertions, 51 deletions
| diff --git a/flash_rom.c b/flash_rom.c index d0d3b807..ff99cb0b 100644 --- a/flash_rom.c +++ b/flash_rom.c @@ -71,11 +71,11 @@ struct flashchip flashchips[] = {  	{"SST49LF080A",	SST_ID,		SST_49LF080A,	NULL, 1024, 4096,  	 probe_jedec,	erase_chip_jedec, write_49lf040,NULL},  	{"SST49LF002A",	SST_ID,		SST_49LF002A,	NULL, 256, 4096, -	 probe_jedec,	erase_chip_jedec, write_49lf040,NULL}, +	 probe_sst_fwhub, erase_sst_fwhub, write_sst_fwhub, NULL},  	{"SST49LF003A", SST_ID,		SST_49LF003A,	NULL, 384, 4096, -	 probe_jedec,	erase_chip_jedec, write_49lf040,NULL}, +	 probe_sst_fwhub, erase_sst_fwhub, write_sst_fwhub,NULL},  	{"SST49LF004A", SST_ID,		SST_49LF004A,	NULL, 512, 4096, -	 probe_jedec,	erase_chip_jedec, write_49lf040,NULL}, +	 probe_sst_fwhub, erase_sst_fwhub, write_sst_fwhub,NULL},  	{"SST49LF008A", SST_ID,		SST_49LF008A, 	NULL, 1024, 4096,  	 probe_sst_fwhub, erase_sst_fwhub, write_sst_fwhub, NULL},  #endif @@ -250,9 +250,9 @@ int main(int argc, char *argv[])  			sscanf(tempstr,"%x",&exclude_start_position);  			break;  		case 'e': -                        tempstr = strdup(optarg); -                        sscanf(tempstr,"%x",&exclude_end_position); -                        break; +			tempstr = strdup(optarg); +			sscanf(tempstr,"%x",&exclude_end_position); +			break;  		default:  			usage(argv[0]); @@ -260,7 +260,6 @@ int main(int argc, char *argv[])  		}  	} -  	if (read_it && write_it) {  		printf("-r and -w are mutually exclusive\n");  		usage(argv[0]); @@ -285,8 +284,7 @@ int main(int argc, char *argv[])  	printf("Part is %s\n", flash->name);  	if (!filename) { -		printf -		    ("OK, only ENABLING flash write, but NOT FLASHING\n"); +		printf("OK, only ENABLING flash write, but NOT FLASHING\n");  		return 0;  	}  	size = flash->total_size * 1024; @@ -303,8 +301,9 @@ int main(int argc, char *argv[])  		else  			flash->read(flash, buf); -	        if(exclude_end_position - exclude_start_position > 0)   -	                memset(buf+exclude_start_position, 0, exclude_end_position-exclude_start_position); +		if (exclude_end_position - exclude_start_position > 0) +			memset(buf+exclude_start_position, 0, +			       exclude_end_position-exclude_start_position);  		fwrite(buf, sizeof(char), size, image);  		fclose(image); @@ -318,15 +317,16 @@ int main(int argc, char *argv[])  		fclose(image);  	} -	if(exclude_end_position - exclude_start_position > 0)  -        	memcpy(buf+exclude_start_position, (const char *) flash->virt_addr+exclude_start_position,  -			exclude_end_position-exclude_start_position); -         +	if (exclude_end_position - exclude_start_position > 0) +	    memcpy(buf+exclude_start_position, +		       (const char *) flash->virt_addr+exclude_start_position,  +		       exclude_end_position-exclude_start_position); +          exclude_start_page = exclude_start_position/flash->page_size; -        if((exclude_start_position%flash->page_size) != 0) {  -                exclude_start_page++; -        }        -        exclude_end_page = exclude_end_position/flash->page_size; +	if ((exclude_start_position%flash->page_size) != 0) { +		exclude_start_page++; +	} +	exclude_end_page = exclude_end_position/flash->page_size;  	if (write_it || (!read_it && !verify_it)) {  		flash->write(flash, buf); @@ -89,6 +89,7 @@ int erase_sector_jedec(volatile unsigned char *bios, unsigned int page)  	return (0);  } +  int erase_block_jedec(volatile unsigned char *bios, unsigned int block)  {  	volatile unsigned char *Temp; @@ -149,43 +150,45 @@ int erase_chip_jedec(struct flashchip *flash)  	return (0);  } -void write_page_write_jedec(volatile unsigned char *bios, unsigned char *src, -			    volatile unsigned char *dst, int page_size) +int write_page_write_jedec(volatile unsigned char *bios, unsigned char *src, +			   volatile unsigned char *dst, int page_size)  {  	int i;  	/* Issue JEDEC Data Unprotect comand */ -	*(volatile char *) (bios + 0x5555) = 0xAA; -	*(volatile char *) (bios + 0x2AAA) = 0x55; -	*(volatile char *) (bios + 0x5555) = 0xA0; +	*(volatile unsigned char *) (bios + 0x5555) = 0xAA; +	*(volatile unsigned char *) (bios + 0x2AAA) = 0x55; +	*(volatile unsigned char *) (bios + 0x5555) = 0xA0; +	/* transfer data from source to destination */  	for (i = 0; i < page_size; i++) { -		/* transfer data from source to destination */ +		/* If the data is 0xFF, don't program it */ +		if (*src == 0xFF) +			continue;  		*dst++ = *src++;  	} -	usleep(100);  	toggle_ready_jedec(dst - 1); + +	return 0;  }  int write_byte_program_jedec(volatile unsigned char *bios, unsigned char *src,  			     volatile unsigned char *dst)  { -	volatile unsigned char *Temp; - -	/* transfer data from source to destination */ +	/* If the data is 0xFF, don't program it */  	if (*src == 0xFF) { -		/* If the data is 0xFF, don't program it */  		return 0;  	} +  	/* Issue JEDEC Byte Program command */ -	Temp = bios + 0x5555; -	*Temp = 0xAA; -	Temp = bios + 0x2AAA; -	*Temp = 0x55; -	Temp = bios + 0x5555; -	*Temp = 0xA0; +	*(volatile unsigned char *) (bios + 0x5555) = 0xAA; +	*(volatile unsigned char *) (bios + 0x2AAA) = 0x55; +	*(volatile unsigned char *) (bios + 0x5555) = 0xA0; + +	/* transfer data from source to destination */  	*dst = *src; +  	toggle_ready_jedec(bios);  	return 0; diff --git a/sst_fwhub.c b/sst_fwhub.c index 7ab6bdba..909e3941 100644 --- a/sst_fwhub.c +++ b/sst_fwhub.c @@ -75,19 +75,17 @@ int probe_sst_fwhub(struct flashchip *flash)  	printf("%s: id1 0x%x, id2 0x%x\n", __FUNCTION__, id1, id2);  	if (id1 != flash->manufacture_id || id2 != flash->model_id) -	  return 0; +		return 0;  	myusec_delay(10); - -  	// we need to mmap the write-protect space.   	bios = mmap(0, size, PROT_WRITE | PROT_READ, MAP_SHARED,  		    flash->fd_mem, (off_t) (0 - 0x400000 - size));  	if (bios == MAP_FAILED) { -	  // it's this part but we can't map it ... -	  perror("Error MMAP /dev/mem"); -	  exit(1); +		// it's this part but we can't map it ... +		perror("Error MMAP /dev/mem"); +		exit(1);  	}  	flash->virt_addr_2 = bios; @@ -96,9 +94,6 @@ int probe_sst_fwhub(struct flashchip *flash)  unsigned char wait_sst_fwhub(volatile unsigned char *bios)  { - - -  	toggle_ready_jedec(bios);  	return 0;  } @@ -138,16 +133,16 @@ 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) +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++; +		write_byte_program_jedec(bios, src, dst); +		src++; +		dst++;  	}  } @@ -168,7 +163,7 @@ int write_sst_fwhub(struct flashchip *flash, unsigned char *buf)  	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); +				     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");  	} | 
