[flashrom] [commit] r1120 - trunk

repository service svn at flashrom.org
Thu Jul 29 18:24:09 CEST 2010


Author: hailfinger
Date: Thu Jul 29 18:24:09 2010
New Revision: 1120
URL: http://flashrom.org/trac/coreboot/changeset/1120

Log:
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.

Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006 at gmx.net>
Tested-by: Daniel Flinkmann <DFlinkmann at gmx.de>
Acked-by: Daniel Flinkmann <dflinkmann at gmx.de>

Modified:
   trunk/buspirate_spi.c

Modified: trunk/buspirate_spi.c
==============================================================================
--- trunk/buspirate_spi.c	Thu Jul 29 17:54:53 2010	(r1119)
+++ trunk/buspirate_spi.c	Thu Jul 29 18:24:09 2010	(r1120)
@@ -260,8 +260,8 @@
 	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 @@
 
 	/* Assert CS# */
 	buf[i++] = 0x02;
-	ret = buspirate_sendrecv(buf, 1, 1);
-	if (ret)
-		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)
+
+	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 reading/writing SPI!\n");
+		msg_perr("Protocol error while lowering CS#!\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)
+	if (buf[1] != 0x01) {
+		msg_perr("Protocol error while reading/writing SPI!\n");
 		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;
 }
 




More information about the flashrom mailing list