diff options
author | Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net> | 2012-02-24 23:49:30 +0000 |
---|---|---|
committer | Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net> | 2012-02-24 23:49:30 +0000 |
commit | 8bc5b350d463e88d87f5188e5acc3ace9f54a100 (patch) | |
tree | ccb1ebf8977afe134ce46e22a94a399c1a0cfec0 | |
parent | 3cfdcf9b5e7b64f2a5995490bcd2ad97c8bccb51 (diff) | |
download | flashrom-8bc5b350d463e88d87f5188e5acc3ace9f54a100.zip flashrom-8bc5b350d463e88d87f5188e5acc3ace9f54a100.tar.gz |
SFDP: Fetch parameter table in a more portable way
SFDP parameter table reads expect a dummy byte between written data
(opcode+address) and read data on the SPI bus. Read that dummy byte
instead of writing it to be compatible with all programmer drivers.
Reduce SFDP parameter table read chunk size from 8 to 2 to handle
programmers with small readcount limits.
Corresponding to flashrom svn r1506.
Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
Acked-by: Stefan Tauner <stefan.tauner@alumni.tuwien.ac.at>
-rw-r--r-- | sfdp.c | 23 |
1 files changed, 16 insertions, 7 deletions
@@ -19,6 +19,7 @@ #include <stdint.h> #include <stdlib.h> +#include <string.h> #include "flash.h" #include "spi.h" #include "chipdrivers.h" @@ -26,31 +27,39 @@ static int spi_sfdp_read_sfdp_chunk(struct flashctx *flash, uint32_t address, uint8_t *buf, int len) { int i, ret; + uint8_t *newbuf; const unsigned char cmd[JEDEC_SFDP_OUTSIZE] = { JEDEC_SFDP, (address >> 16) & 0xff, (address >> 8) & 0xff, (address >> 0) & 0xff, /* FIXME: the following dummy byte explodes on some programmers. - * One possible workaround would be to read the dummy byte + * One workaround is to read the dummy byte * instead and discard its value. */ 0 }; msg_cspew("%s: addr=0x%x, len=%d, data:\n", __func__, address, len); - ret = spi_send_command(flash, sizeof(cmd), len, cmd, buf); + newbuf = malloc(len + 1); + if (!newbuf) + return SPI_PROGRAMMER_ERROR; + ret = spi_send_command(flash, sizeof(cmd) - 1, len + 1, cmd, newbuf); + memmove(buf, newbuf + 1, len); + free(newbuf); + if (ret) + return ret; for (i = 0; i < len; i++) msg_cspew(" 0x%02x", buf[i]); msg_cspew("\n"); - return ret; + return 0; } static int spi_sfdp_read_sfdp(struct flashctx *flash, uint32_t address, uint8_t *buf, int len) { - /* FIXME: this is wrong. There are different upper bounds for the number - * of bytes to read on the various programmers (even depending on the - * rest of the structure of the transaction).*/ - int maxstep = 8; + /* FIXME: There are different upper bounds for the number of bytes to + * read on the various programmers (even depending on the rest of the + * structure of the transaction). 2 is a safe bet. */ + int maxstep = 2; int ret = 0; while (len > 0) { int step = min(len, maxstep); |