1
0
mirror of https://review.coreboot.org/flashrom.git synced 2025-06-30 21:52:36 +02:00

Speed up Bus Pirate by exploiting the FTDI FIFO

If we violate the raw SPI communication protocol requirements of the Bus
Pirate (namely, waiting for the completion of one command before sending
the next one), we can reduce the number of round trips by a factor of 3.
The FT2232 chip present in the Bus Pirate has a big enough buffer (at
least 128 bytes IIRC) to avoid overflows in the tiny buffer of the Bus
Pirate PIC.

Thanks to Daniel Flinkmann for sponsoring development of this patch.

Corresponding to flashrom svn r1120.

Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
Tested-by: Daniel Flinkmann <DFlinkmann@gmx.de>
Acked-by: Daniel Flinkmann <dflinkmann@gmx.de>
This commit is contained in:
Carl-Daniel Hailfinger
2010-07-29 16:24:09 +00:00
parent 6529b9fdc2
commit 04e18bea9f

View File

@ -260,8 +260,8 @@ int buspirate_spi_send_command(unsigned int writecnt, unsigned int readcnt,
if (writecnt > 16 || readcnt > 16 || (readcnt + writecnt) > 16)
return SPI_INVALID_LENGTH;
/* +2 is pretty arbitrary. */
buf = realloc(buf, writecnt + readcnt + 2);
/* 3 bytes extra for CS#, len, CS#. */
buf = realloc(buf, writecnt + readcnt + 3);
if (!buf) {
msg_perr("Out of memory!\n");
exit(1); // -1
@ -269,39 +269,41 @@ int buspirate_spi_send_command(unsigned int writecnt, unsigned int readcnt,
/* Assert CS# */
buf[i++] = 0x02;
ret = buspirate_sendrecv(buf, 1, 1);
if (ret)
buf[i++] = 0x10 | (writecnt + readcnt - 1);
memcpy(buf + i, writearr, writecnt);
i += writecnt;
memset(buf + i, 0, readcnt);
i += readcnt;
/* De-assert CS# */
buf[i++] = 0x03;
ret = buspirate_sendrecv(buf, i, i);
if (ret) {
msg_perr("Bus Pirate communication error!\n");
return SPI_GENERIC_ERROR;
}
if (buf[0] != 0x01) {
msg_perr("Protocol error while lowering CS#!\n");
return SPI_GENERIC_ERROR;
}
i = 0;
buf[i++] = 0x10 | (writecnt + readcnt - 1);
memcpy(buf + i, writearr, writecnt);
i += writecnt;
memset(buf + i, 0, readcnt);
ret = buspirate_sendrecv(buf, i + readcnt, i + readcnt);
if (ret)
return SPI_GENERIC_ERROR;
if (buf[0] != 0x01) {
if (buf[1] != 0x01) {
msg_perr("Protocol error while reading/writing SPI!\n");
return SPI_GENERIC_ERROR;
}
memcpy(readarr, buf + i, readcnt);
i = 0;
/* De-assert CS# */
buf[i++] = 0x03;
ret = buspirate_sendrecv(buf, 1, 1);
if (ret)
return SPI_GENERIC_ERROR;
if (buf[0] != 0x01) {
if (buf[i - 1] != 0x01) {
msg_perr("Protocol error while raising CS#!\n");
return SPI_GENERIC_ERROR;
}
/* Skip CS#, length, writearr. */
memcpy(readarr, buf + 2 + writecnt, readcnt);
return ret;
}