[flashrom] [commit] r1506 - trunk

repository service svn at flashrom.org
Sat Feb 25 00:49:30 CET 2012


Author: hailfinger
Date: Sat Feb 25 00:49:30 2012
New Revision: 1506
URL: http://flashrom.org/trac/flashrom/changeset/1506

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

Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006 at gmx.net>
Acked-by: Stefan Tauner <stefan.tauner at student.tuwien.ac.at>

Modified:
   trunk/sfdp.c

Modified: trunk/sfdp.c
==============================================================================
--- trunk/sfdp.c	Wed Feb 22 01:14:14 2012	(r1505)
+++ trunk/sfdp.c	Sat Feb 25 00:49:30 2012	(r1506)
@@ -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);




More information about the flashrom mailing list