[flashrom] [PATCH] SPI autoerase before write
cmd_
cemede at gmail.com
Mon Aug 10 04:24:42 CEST 2009
Working for me with SB750 and SST25VF080B on a DFI JR 790GX-M3H5, automatic
erase > write > verify OK
Acked-by: Carlos Arnau Perez <cemede at gmail.com>
2009/8/10 Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006 at gmx.net>
> Some SPI chip drivers and the generic 1-byte SPI chip write functions
> didn't include the automatic erase present in other chip drivers. Since
> the majority is definitely auto-erase, change the remaining
> explicit-erase cases to be auto-erase as well.
>
> Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006 at gmx.net>
>
> Index: flashrom-spi_autoerase_before_write/flash.h
> ===================================================================
> --- flashrom-spi_autoerase_before_write/flash.h (revision 672)
> +++ flashrom-spi_autoerase_before_write/flash.h (working copy)
> @@ -505,7 +505,6 @@
> int it8716f_spi_send_command(unsigned int writecnt, unsigned int readcnt,
> const unsigned char *writearr, unsigned char
> *readarr);
> int it8716f_spi_chip_read(struct flashchip *flash, uint8_t *buf, int
> start, int len);
> -int it8716f_spi_chip_write_1(struct flashchip *flash, uint8_t *buf);
> int it8716f_spi_chip_write_256(struct flashchip *flash, uint8_t *buf);
>
> /* sb600spi.c */
> Index: flashrom-spi_autoerase_before_write/it87spi.c
> ===================================================================
> --- flashrom-spi_autoerase_before_write/it87spi.c (revision 672)
> +++ flashrom-spi_autoerase_before_write/it87spi.c (working copy)
> @@ -248,32 +248,6 @@
> }
>
> /*
> - * Program chip using firmware cycle byte programming. (SLOW!)
> - * This is for chips which can only handle one byte writes
> - * and for chips where memory mapped programming is impossible due to
> - * size constraints in IT87* (over 512 kB)
> - */
> -int it8716f_spi_chip_write_1(struct flashchip *flash, uint8_t *buf)
> -{
> - int total_size = 1024 * flash->total_size;
> - int i;
> - int result;
> -
> - fast_spi = 0;
> -
> - spi_disable_blockprotect();
> - for (i = 0; i < total_size; i++) {
> - result = spi_byte_program(i, buf[i]);
> - while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP)
> - programmer_delay(10);
> - }
> - /* resume normal ops... */
> - OUTB(0x20, it8716f_flashport);
> -
> - return 0;
> -}
> -
> -/*
> * IT8716F only allows maximum of 512 kb SPI mapped to LPC memory cycles
> * Need to read this big flash using firmware cycles 3 byte at a time.
> */
> @@ -301,8 +275,16 @@
> * mapped access.
> */
> if ((programmer == PROGRAMMER_IT87SPI) || (total_size > 512 * 1024))
> {
> - it8716f_spi_chip_write_1(flash, buf);
> + spi_chip_write_1(flash, buf);
> } else {
> + spi_disable_blockprotect();
> + /* Erase first */
> + printf("Erasing flash before programming... ");
> + if (flash->erase(flash)) {
> + fprintf(stderr, "ERASE FAILED!\n");
> + return -1;
> + }
> + printf("done.\n");
> for (i = 0; i < total_size / 256; i++) {
> it8716f_spi_page_program(flash, i, buf);
> }
> Index: flashrom-spi_autoerase_before_write/spi.c
> ===================================================================
> --- flashrom-spi_autoerase_before_write/spi.c (revision 672)
> +++ flashrom-spi_autoerase_before_write/spi.c (working copy)
> @@ -963,6 +963,13 @@
> int i;
>
> spi_disable_blockprotect();
> + /* Erase first */
> + printf("Erasing flash before programming... ");
> + if (flash->erase(flash)) {
> + fprintf(stderr, "ERASE FAILED!\n");
> + return -1;
> + }
> + printf("done.\n");
> for (i = 0; i < total_size; i++) {
> spi_byte_program(i, buf[i]);
> while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP)
> Index: flashrom-spi_autoerase_before_write/ft2232_spi.c
> ===================================================================
> --- flashrom-spi_autoerase_before_write/ft2232_spi.c (revision 672)
> +++ flashrom-spi_autoerase_before_write/ft2232_spi.c (working copy)
> @@ -271,6 +271,14 @@
> int total_size = 1024 * flash->total_size;
> int i;
>
> + spi_disable_blockprotect();
> + /* Erase first */
> + printf("Erasing flash before programming... ");
> + if (flash->erase(flash)) {
> + fprintf(stderr, "ERASE FAILED!\n");
> + return -1;
> + }
> + printf("done.\n");
> printf_debug("total_size is %d\n", total_size);
> for (i = 0; i < total_size; i += 256) {
> int l, r;
> @@ -281,14 +289,12 @@
>
> 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
> return 1;
> }
>
> while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP)
> /* loop */;
> }
> - // spi_write_disable(); chip does this for us
>
> return 0;
> }
> Index: flashrom-spi_autoerase_before_write/wbsio_spi.c
> ===================================================================
> --- flashrom-spi_autoerase_before_write/wbsio_spi.c (revision 672)
> +++ flashrom-spi_autoerase_before_write/wbsio_spi.c (working copy)
> @@ -183,29 +183,17 @@
> return 1;
> }
>
> - read_memmapped(flash, buf, start, len);
> - return 0;
> + return read_memmapped(flash, buf, start, len);
> }
>
> int wbsio_spi_write_1(struct flashchip *flash, uint8_t *buf)
> {
> - int pos, size = flash->total_size * 1024;
> - int result;
> + int size = flash->total_size * 1024;
>
> - if (flash->total_size > 1024) {
> + if (size > 1024 * 1024) {
> fprintf(stderr, "%s: Winbond saved on 4 register bits so max
> chip size is 1024 KB!\n", __func__);
> return 1;
> }
>
> - if (flash->erase(flash)) {
> - fprintf(stderr, "ERASE FAILED!\n");
> - return -1;
> - }
> - for (pos = 0; pos < size; pos++) {
> - result = spi_byte_program(pos, buf[pos]);
> - while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP)
> - programmer_delay(10);
> - }
> - spi_write_disable();
> - return 0;
> + return spi_chip_write_1(flash, buf);
> }
> Index: flashrom-spi_autoerase_before_write/sb600spi.c
> ===================================================================
> --- flashrom-spi_autoerase_before_write/sb600spi.c (revision 672)
> +++ flashrom-spi_autoerase_before_write/sb600spi.c (working copy)
> @@ -45,12 +45,14 @@
> return spi_read_chunked(flash, buf, start, len, 8);
> }
>
> +/* FIXME: SB600 can write 5 bytes per transaction. */
> int sb600_spi_write_1(struct flashchip *flash, uint8_t *buf)
> {
> int rc = 0, i;
> int total_size = flash->total_size * 1024;
> int result;
>
> + spi_disable_blockprotect();
> /* Erase first */
> printf("Erasing flash before programming... ");
> if (flash->erase(flash)) {
> @@ -61,7 +63,6 @@
>
> printf("Programming flash");
> for (i = 0; i < total_size; i++, buf++) {
> - spi_disable_blockprotect();
> result = spi_byte_program(i, *buf);
> /* wait program complete. */
> if (i % 0x8000 == 0)
>
>
> --
> http://www.hailfinger.org/
>
>
> _______________________________________________
> flashrom mailing list
> flashrom at flashrom.org
> http://www.flashrom.org/mailman/listinfo/flashrom
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.flashrom.org/pipermail/flashrom/attachments/20090810/579ba56c/attachment.html>
More information about the flashrom
mailing list