Working for me with SB750 and SST25VF080B on a DFI JR 790GX-M3H5, automatic erase > write > verify OK<br><br>
<meta name="qrichtext" content="1"><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><style type="text/css">
p, li { white-space: pre-wrap; }
</style>
<p style="margin: 0px; text-indent: 0px;"><span style="color: rgb(0, 0, 0);">Acked-by: Carlos Arnau Perez <<a href="mailto:cemede@gmail.com">cemede@gmail.com</a>></span></p><br><br><div class="gmail_quote">2009/8/10 Carl-Daniel Hailfinger <span dir="ltr"><<a href="mailto:c-d.hailfinger.devel.2006@gmx.net">c-d.hailfinger.devel.2006@gmx.net</a>></span><br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Some SPI chip drivers and the generic 1-byte SPI chip write functions<br>
didn't include the automatic erase present in other chip drivers. Since<br>
the majority is definitely auto-erase, change the remaining<br>
explicit-erase cases to be auto-erase as well.<br>
<br>
Signed-off-by: Carl-Daniel Hailfinger <<a href="mailto:c-d.hailfinger.devel.2006@gmx.net">c-d.hailfinger.devel.2006@gmx.net</a>><br>
<br>
Index: flashrom-spi_autoerase_before_write/flash.h<br>
===================================================================<br>
--- flashrom-spi_autoerase_before_write/flash.h (revision 672)<br>
+++ flashrom-spi_autoerase_before_write/flash.h (working copy)<br>
@@ -505,7 +505,6 @@<br>
int it8716f_spi_send_command(unsigned int writecnt, unsigned int readcnt,<br>
const unsigned char *writearr, unsigned char *readarr);<br>
int it8716f_spi_chip_read(struct flashchip *flash, uint8_t *buf, int start, int len);<br>
-int it8716f_spi_chip_write_1(struct flashchip *flash, uint8_t *buf);<br>
int it8716f_spi_chip_write_256(struct flashchip *flash, uint8_t *buf);<br>
<br>
/* sb600spi.c */<br>
Index: flashrom-spi_autoerase_before_write/it87spi.c<br>
===================================================================<br>
--- flashrom-spi_autoerase_before_write/it87spi.c (revision 672)<br>
+++ flashrom-spi_autoerase_before_write/it87spi.c (working copy)<br>
@@ -248,32 +248,6 @@<br>
}<br>
<br>
/*<br>
- * Program chip using firmware cycle byte programming. (SLOW!)<br>
- * This is for chips which can only handle one byte writes<br>
- * and for chips where memory mapped programming is impossible due to<br>
- * size constraints in IT87* (over 512 kB)<br>
- */<br>
-int it8716f_spi_chip_write_1(struct flashchip *flash, uint8_t *buf)<br>
-{<br>
- int total_size = 1024 * flash->total_size;<br>
- int i;<br>
- int result;<br>
-<br>
- fast_spi = 0;<br>
-<br>
- spi_disable_blockprotect();<br>
- for (i = 0; i < total_size; i++) {<br>
- result = spi_byte_program(i, buf[i]);<br>
- while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP)<br>
- programmer_delay(10);<br>
- }<br>
- /* resume normal ops... */<br>
- OUTB(0x20, it8716f_flashport);<br>
-<br>
- return 0;<br>
-}<br>
-<br>
-/*<br>
* IT8716F only allows maximum of 512 kb SPI mapped to LPC memory cycles<br>
* Need to read this big flash using firmware cycles 3 byte at a time.<br>
*/<br>
@@ -301,8 +275,16 @@<br>
* mapped access.<br>
*/<br>
if ((programmer == PROGRAMMER_IT87SPI) || (total_size > 512 * 1024)) {<br>
- it8716f_spi_chip_write_1(flash, buf);<br>
+ spi_chip_write_1(flash, buf);<br>
} else {<br>
+ spi_disable_blockprotect();<br>
+ /* Erase first */<br>
+ printf("Erasing flash before programming... ");<br>
+ if (flash->erase(flash)) {<br>
+ fprintf(stderr, "ERASE FAILED!\n");<br>
+ return -1;<br>
+ }<br>
+ printf("done.\n");<br>
for (i = 0; i < total_size / 256; i++) {<br>
it8716f_spi_page_program(flash, i, buf);<br>
}<br>
Index: flashrom-spi_autoerase_before_write/spi.c<br>
===================================================================<br>
--- flashrom-spi_autoerase_before_write/spi.c (revision 672)<br>
+++ flashrom-spi_autoerase_before_write/spi.c (working copy)<br>
@@ -963,6 +963,13 @@<br>
int i;<br>
<br>
spi_disable_blockprotect();<br>
+ /* Erase first */<br>
+ printf("Erasing flash before programming... ");<br>
+ if (flash->erase(flash)) {<br>
+ fprintf(stderr, "ERASE FAILED!\n");<br>
+ return -1;<br>
+ }<br>
+ printf("done.\n");<br>
for (i = 0; i < total_size; i++) {<br>
spi_byte_program(i, buf[i]);<br>
while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP)<br>
Index: flashrom-spi_autoerase_before_write/ft2232_spi.c<br>
===================================================================<br>
--- flashrom-spi_autoerase_before_write/ft2232_spi.c (revision 672)<br>
+++ flashrom-spi_autoerase_before_write/ft2232_spi.c (working copy)<br>
@@ -271,6 +271,14 @@<br>
int total_size = 1024 * flash->total_size;<br>
int i;<br>
<br>
+ spi_disable_blockprotect();<br>
+ /* Erase first */<br>
+ printf("Erasing flash before programming... ");<br>
+ if (flash->erase(flash)) {<br>
+ fprintf(stderr, "ERASE FAILED!\n");<br>
+ return -1;<br>
+ }<br>
+ printf("done.\n");<br>
printf_debug("total_size is %d\n", total_size);<br>
for (i = 0; i < total_size; i += 256) {<br>
int l, r;<br>
@@ -281,14 +289,12 @@<br>
<br>
if ((r = spi_nbyte_program(i, &buf[i], l))) {<br>
fprintf(stderr, "%s: write fail %d\n", __FUNCTION__, r);<br>
- // spi_write_disable(); chip does this for us<br>
return 1;<br>
}<br>
<br>
while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP)<br>
/* loop */;<br>
}<br>
- // spi_write_disable(); chip does this for us<br>
<br>
return 0;<br>
}<br>
Index: flashrom-spi_autoerase_before_write/wbsio_spi.c<br>
===================================================================<br>
--- flashrom-spi_autoerase_before_write/wbsio_spi.c (revision 672)<br>
+++ flashrom-spi_autoerase_before_write/wbsio_spi.c (working copy)<br>
@@ -183,29 +183,17 @@<br>
return 1;<br>
}<br>
<br>
- read_memmapped(flash, buf, start, len);<br>
- return 0;<br>
+ return read_memmapped(flash, buf, start, len);<br>
}<br>
<br>
int wbsio_spi_write_1(struct flashchip *flash, uint8_t *buf)<br>
{<br>
- int pos, size = flash->total_size * 1024;<br>
- int result;<br>
+ int size = flash->total_size * 1024;<br>
<br>
- if (flash->total_size > 1024) {<br>
+ if (size > 1024 * 1024) {<br>
fprintf(stderr, "%s: Winbond saved on 4 register bits so max chip size is 1024 KB!\n", __func__);<br>
return 1;<br>
}<br>
<br>
- if (flash->erase(flash)) {<br>
- fprintf(stderr, "ERASE FAILED!\n");<br>
- return -1;<br>
- }<br>
- for (pos = 0; pos < size; pos++) {<br>
- result = spi_byte_program(pos, buf[pos]);<br>
- while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP)<br>
- programmer_delay(10);<br>
- }<br>
- spi_write_disable();<br>
- return 0;<br>
+ return spi_chip_write_1(flash, buf);<br>
}<br>
Index: flashrom-spi_autoerase_before_write/sb600spi.c<br>
===================================================================<br>
--- flashrom-spi_autoerase_before_write/sb600spi.c (revision 672)<br>
+++ flashrom-spi_autoerase_before_write/sb600spi.c (working copy)<br>
@@ -45,12 +45,14 @@<br>
return spi_read_chunked(flash, buf, start, len, 8);<br>
}<br>
<br>
+/* FIXME: SB600 can write 5 bytes per transaction. */<br>
int sb600_spi_write_1(struct flashchip *flash, uint8_t *buf)<br>
{<br>
int rc = 0, i;<br>
int total_size = flash->total_size * 1024;<br>
int result;<br>
<br>
+ spi_disable_blockprotect();<br>
/* Erase first */<br>
printf("Erasing flash before programming... ");<br>
if (flash->erase(flash)) {<br>
@@ -61,7 +63,6 @@<br>
<br>
printf("Programming flash");<br>
for (i = 0; i < total_size; i++, buf++) {<br>
- spi_disable_blockprotect();<br>
result = spi_byte_program(i, *buf);<br>
/* wait program complete. */<br>
if (i % 0x8000 == 0)<br>
<font color="#888888"><br>
<br>
--<br>
<a href="http://www.hailfinger.org/" target="_blank">http://www.hailfinger.org/</a><br>
<br>
<br>
_______________________________________________<br>
flashrom mailing list<br>
<a href="mailto:flashrom@flashrom.org">flashrom@flashrom.org</a><br>
<a href="http://www.flashrom.org/mailman/listinfo/flashrom" target="_blank">http://www.flashrom.org/mailman/listinfo/flashrom</a><br>
</font></blockquote></div><br>