summaryrefslogtreecommitdiffstats
path: root/dediprog.c
diff options
context:
space:
mode:
authorCarl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>2010-01-22 02:53:30 +0000
committerCarl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>2010-01-22 02:53:30 +0000
commit1714888c8c6bf41eae5521cb13fe53a69012790f (patch)
treed46c80bf96f1beaee264fd883fe713d564281e32 /dediprog.c
parent141b281bc790f8584d5c170e053c736c57163e36 (diff)
downloadflashrom-1714888c8c6bf41eae5521cb13fe53a69012790f.zip
flashrom-1714888c8c6bf41eae5521cb13fe53a69012790f.tar.gz
Add write support
Speed up reads by a factor of 4 by switching block size from 4 to 16. Add support for 4 byte RDID. Add USB error decoding via usb_strerror. Corresponding to flashrom svn r879. Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net> Acked-by: Stefan Reinauer <stepan@coresystems.de>
Diffstat (limited to 'dediprog.c')
-rw-r--r--dediprog.c26
1 files changed, 15 insertions, 11 deletions
diff --git a/dediprog.c b/dediprog.c
index 3020c00..b5037a1 100644
--- a/dediprog.c
+++ b/dediprog.c
@@ -145,8 +145,9 @@ int dediprog_set_spi_speed(uint16_t speed)
int dediprog_spi_read(struct flashchip *flash, uint8_t *buf, int start, int len)
{
- /* Maximum read length is 4 bytes for now. */
- return spi_read_chunked(flash, buf, start, len, 4);
+ msg_pspew("%s, start=0x%x, len=0x%x\n", __func__, start, len);
+ /* Chosen read length is 16 bytes for now. */
+ return spi_read_chunked(flash, buf, start, len, 16);
}
int dediprog_spi_send_command(unsigned int writecnt, unsigned int readcnt,
@@ -154,19 +155,22 @@ int dediprog_spi_send_command(unsigned int writecnt, unsigned int readcnt,
{
int ret;
+ msg_pspew("%s, writecnt=%i, readcnt=%i\n", __func__, writecnt, readcnt);
/* Paranoid, but I don't want to be blamed if anything explodes. */
- if ((writecnt != 1) && (writecnt != 4))
+ if (writecnt > 5) {
msg_perr("Untested writecnt=%i, aborting.\n", writecnt);
- if (readcnt > 4)
+ return 1;
+ }
+ /* 16 byte reads should work. */
+ if (readcnt > 16) {
msg_perr("Untested readcnt=%i, aborting.\n", readcnt);
- if ((readcnt == 0) && (writecnt != 1))
- msg_perr("Untested writecnt=%i, readcnt=%i combination, "
- "aborting.\n", writecnt, readcnt);
+ return 1;
+ }
ret = usb_control_msg(dediprog_handle, 0x42, 0x1, 0xff, readcnt ? 0x1 : 0x0, (char *)writearr, writecnt, DEFAULT_TIMEOUT);
if (ret != writecnt) {
- msg_perr("Command Send SPI failed, ret=%i, expected %i!\n",
- ret, writecnt);
+ msg_perr("Send SPI failed, expected %i, got %i %s!\n",
+ writecnt, ret, usb_strerror());
return 1;
}
if (!readcnt)
@@ -174,8 +178,8 @@ int dediprog_spi_send_command(unsigned int writecnt, unsigned int readcnt,
memset(readarr, 0, readcnt);
ret = usb_control_msg(dediprog_handle, 0xc2, 0x01, 0xbb8, 0x0000, (char *)readarr, readcnt, DEFAULT_TIMEOUT);
if (ret != readcnt) {
- msg_perr("Command Receive SPI failed, ret=%i, expected %i!\n",
- ret, readcnt);
+ msg_perr("Receive SPI failed, expected %i, got %i %s!\n",
+ readcnt, ret, usb_strerror());
return 1;
}
return 0;
OpenPOWER on IntegriCloud