[flashrom] [PATCH] dediprog: fix SPI clock setting.

Stefan Tauner stefan.tauner at student.tuwien.ac.at
Mon May 6 19:30:17 CEST 2013


Avoid setting SPI speed on firmware versions < 5.0.0 and note this
limitation in the man page.
Use the index stored for a given speed in the translation array instead
of the index of the element in that array.

Signed-off-by: Patrick Georgi <patrick.georgi at secunet.com>
Signed-off-by: Stefan Tauner <stefan.tauner at student.tuwien.ac.at>
---
IMHO the speed setting was broken ever since. Has anyone every checked
the resulting frequency on the bus?

I am not entirely sure why the translation table was introduced in the
first place although dediprog's indices could be "stored" in the array
offset, but mixing the two approaches is of course not a good idea.

Nico, can you please verify that this patch is what you actually meant to do?

 dediprog.c |   13 ++++++++-----
 flashrom.8 |    3 ++-
 2 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/dediprog.c b/dediprog.c
index ab5388b..77ca195 100644
--- a/dediprog.c
+++ b/dediprog.c
@@ -184,12 +184,15 @@ static const struct dediprog_spispeeds spispeeds[] = {
  */
 static int dediprog_set_spi_speed(unsigned int spispeed_idx)
 {
-	int ret;
+	if (dediprog_firmwareversion < FIRMWARE_VERSION(5, 0, 0)) {
+		msg_pwarn("Skipping to set SPI speed because firmware is too old.\n");
+		return 0;
+	}
 
 	msg_pdbg("SPI speed is %sHz\n", spispeeds[spispeed_idx].name);
 
-	ret = usb_control_msg(dediprog_handle, 0x42, 0x61, spispeeds[spispeed_idx].speed, 0xff,
-			      NULL, 0x0, DEFAULT_TIMEOUT);
+	int ret = usb_control_msg(dediprog_handle, 0x42, 0x61, spispeeds[spispeed_idx].speed, 0xff,
+				  NULL, 0x0, DEFAULT_TIMEOUT);
 	if (ret != 0x0) {
 		msg_perr("Command Set SPI Speed 0x%x failed!\n", spispeeds[spispeed_idx].speed);
 		return 1;
@@ -801,12 +804,12 @@ int dediprog_init(void)
 	if (spispeed) {
 		for (i = 0; spispeeds[i].name; ++i) {
 			if (!strcasecmp(spispeeds[i].name, spispeed)) {
-				spispeed_idx = i;
+				spispeed_idx = spispeeds[i].speed;
 				break;
 			}
 		}
 		if (!spispeeds[i].name) {
-			msg_perr("Error: Invalid 'spispeed' value.\n");
+			msg_perr("Error: Invalid spispeed value: '%s'.\n", spispeed);
 			free(spispeed);
 			return 1;
 		}
diff --git a/flashrom.8 b/flashrom.8
index c7a6c69..4e6ab55 100644
--- a/flashrom.8
+++ b/flashrom.8
@@ -683,7 +683,8 @@ Usage example to select the second device:
 .sp
 An optional
 .B spispeed
-parameter specifies the frequency of the SPI bus. Syntax is
+parameter specifies the frequency of the SPI bus. The firmware on the device needs to be 5.0.0 or newer.
+Syntax is
 .sp
 .B "  flashrom \-p dediprog:spispeed=frequency"
 .sp
-- 
Kind regards, Stefan Tauner





More information about the flashrom mailing list