diff options
| -rw-r--r-- | flash.h | 6 | ||||
| -rw-r--r-- | ft2232_spi.c | 1 | ||||
| -rw-r--r-- | it87spi.c | 6 | ||||
| -rw-r--r-- | sb600spi.c | 5 | ||||
| -rw-r--r-- | spi.c | 86 | ||||
| -rw-r--r-- | wbsio_spi.c | 5 | 
6 files changed, 63 insertions, 46 deletions
@@ -446,9 +446,9 @@ int spi_chip_write_256(struct flashchip *flash, uint8_t *buf);  int spi_chip_read(struct flashchip *flash, uint8_t *buf, int start, int len);  uint8_t spi_read_status_register(void);  int spi_disable_blockprotect(void); -void spi_byte_program(int address, uint8_t byte); -int spi_nbyte_program(int address, uint8_t *bytes, int len); -int spi_nbyte_read(int address, uint8_t *bytes, int len); +int spi_byte_program(int addr, uint8_t byte); +int spi_nbyte_program(int addr, uint8_t *bytes, int len); +int spi_nbyte_read(int addr, uint8_t *bytes, int len);  int spi_read_chunked(struct flashchip *flash, uint8_t *buf, int start, int len, int chunksize);  int spi_aai_write(struct flashchip *flash, uint8_t *buf);  uint32_t spi_get_valid_read_addr(void); diff --git a/ft2232_spi.c b/ft2232_spi.c index ea7a8107..8e6e836c 100644 --- a/ft2232_spi.c +++ b/ft2232_spi.c @@ -276,7 +276,6 @@ int ft2232_spi_write_256(struct flashchip *flash, uint8_t *buf)  		else  			l = total_size - i; -		spi_write_enable();  		if ((r = spi_nbyte_program(i, &buf[i], l))) {  			fprintf(stderr, "%s: write fail %d\n", __FUNCTION__, r);  			// spi_write_disable();  chip does this for us @@ -232,6 +232,7 @@ static int it8716f_spi_page_program(struct flashchip *flash, int block, uint8_t  	result = spi_write_enable();  	if (result)  		return result; +	/* FIXME: The command below seems to be redundant or wrong. */  	OUTB(0x06, it8716f_flashport + 1);  	OUTB(((2 + (fast_spi ? 1 : 0)) << 4), it8716f_flashport);  	for (i = 0; i < 256; i++) { @@ -262,10 +263,7 @@ int it8716f_spi_chip_write_1(struct flashchip *flash, uint8_t *buf)  	spi_disable_blockprotect();  	for (i = 0; i < total_size; i++) { -		result = spi_write_enable(); -		if (result) -			return result; -		spi_byte_program(i, buf[i]); +		result = spi_byte_program(i, buf[i]);  		while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP)  			programmer_delay(10);  	} @@ -73,10 +73,7 @@ int sb600_spi_write_1(struct flashchip *flash, uint8_t *buf)  	printf("Programming flash");  	for (i = 0; i < total_size; i++, buf++) {  		spi_disable_blockprotect(); -		result = spi_write_enable(); -		if (result) -			return result; -		spi_byte_program(i, *buf); +		result = spi_byte_program(i, *buf);  		/* wait program complete. */  		if (i % 0x8000 == 0)  			printf("."); @@ -154,21 +154,7 @@ int spi_write_enable(void)  	result = spi_send_command(sizeof(cmd), 0, cmd, NULL);  	if (result) -		printf_debug("%s failed", __func__); -	if (result == SPI_INVALID_OPCODE) { -		switch (spi_controller) { -		case SPI_CONTROLLER_ICH7: -		case SPI_CONTROLLER_ICH9: -		case SPI_CONTROLLER_VIA: -			printf_debug(" due to SPI master limitation, ignoring" -				     " and hoping it will be run as PREOP\n"); -			return 0; -		default: -			break; -		} -	} -	if (result) -		printf_debug("\n"); +		printf_debug("%s failed\n", __func__);  	return result;  } @@ -736,39 +722,80 @@ int spi_write_status_register(int status)  	return spi_send_command(sizeof(cmd), 0, cmd, NULL);  } -void spi_byte_program(int address, uint8_t byte) +int spi_byte_program(int addr, uint8_t byte)  { -	const unsigned char cmd[JEDEC_BYTE_PROGRAM_OUTSIZE] = { -		JEDEC_BYTE_PROGRAM, -		(address >> 16) & 0xff, -		(address >> 8) & 0xff, -		(address >> 0) & 0xff, -		byte -	}; +	int result; +	struct spi_command spicommands[] = { +	{ +		.writecnt	= JEDEC_WREN_OUTSIZE, +		.writearr	= (const unsigned char[]){ JEDEC_WREN }, +		.readcnt	= 0, +		.readarr	= NULL, +	}, { +		.writecnt	= JEDEC_BYTE_PROGRAM_OUTSIZE, +		.writearr	= (const unsigned char[]){ JEDEC_BYTE_PROGRAM, (addr >> 16) & 0xff, (addr >> 8) & 0xff, (addr & 0xff), byte }, +		.readcnt	= 0, +		.readarr	= NULL, +	}, { +		.writecnt	= 0, +		.writearr	= NULL, +		.readcnt	= 0, +		.readarr	= NULL, +	}}; -	/* Send Byte-Program */ -	spi_send_command(sizeof(cmd), 0, cmd, NULL); +	result = spi_send_multicommand(spicommands); +	if (result) { +		printf_debug("%s failed during command execution\n", __func__); +		return result; +	} +	return result;  }  int spi_nbyte_program(int address, uint8_t *bytes, int len)  { +	int result; +	/* FIXME: Switch to malloc based on len unless that kills speed. */  	unsigned char cmd[JEDEC_BYTE_PROGRAM_OUTSIZE - 1 + 256] = {  		JEDEC_BYTE_PROGRAM,  		(address >> 16) & 0xff,  		(address >> 8) & 0xff,  		(address >> 0) & 0xff,  	}; +	struct spi_command spicommands[] = { +	{ +		.writecnt	= JEDEC_WREN_OUTSIZE, +		.writearr	= (const unsigned char[]){ JEDEC_WREN }, +		.readcnt	= 0, +		.readarr	= NULL, +	}, { +		.writecnt	= JEDEC_BYTE_PROGRAM_OUTSIZE - 1 + len, +		.writearr	= cmd, +		.readcnt	= 0, +		.readarr	= NULL, +	}, { +		.writecnt	= 0, +		.writearr	= NULL, +		.readcnt	= 0, +		.readarr	= NULL, +	}}; +	if (!len) { +		printf_debug ("%s called for zero-length write\n", __func__); +		return 1; +	}  	if (len > 256) { -		printf_debug ("%s called for too long a write\n", -		     __FUNCTION__); +		printf_debug ("%s called for too long a write\n", __func__);  		return 1;  	}  	memcpy(&cmd[4], bytes, len); -	/* Send Byte-Program */ -	return spi_send_command(4 + len, 0, cmd, NULL); +	result = spi_send_multicommand(spicommands); +	if (result) { +		printf_debug("%s failed during command execution\n", __func__); +		return result; +	} +	return result;  }  int spi_disable_blockprotect(void) @@ -883,7 +910,6 @@ int spi_chip_write_1(struct flashchip *flash, uint8_t *buf)  	spi_disable_blockprotect();  	for (i = 0; i < total_size; i++) { -		spi_write_enable();  		spi_byte_program(i, buf[i]);  		while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP)  			programmer_delay(10); diff --git a/wbsio_spi.c b/wbsio_spi.c index cbdddd2e..7876198f 100644 --- a/wbsio_spi.c +++ b/wbsio_spi.c @@ -200,11 +200,8 @@ int wbsio_spi_write_1(struct flashchip *flash, uint8_t *buf)  		fprintf(stderr, "ERASE FAILED!\n");  		return -1;  	} -	result = spi_write_enable(); -	if (result) -		return result;  	for (pos = 0; pos < size; pos++) { -		spi_byte_program(pos, buf[pos]); +		result = spi_byte_program(pos, buf[pos]);  		while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP)  			programmer_delay(10);  	}  | 
