[flashrom] [PATCH 2/3] dediprog: use command 0x0B (set voltage) only on older SF100s.

Stefan Tauner stefan.tauner at alumni.tuwien.ac.at
Sun Jan 24 23:50:19 CET 2016


As per e-mail with Dediprog, command 0x0B (which is not listed in the
command spec) is used to set voltage level on older Dediprogs. SF100
V6.0.0 and newer as well as all SF600 programmers do not support it.

This patch renames dediprog_device_init() to something more
appropriate  and adds comments for clarity, and only runs it
conditionally if we cannot query the devicestring initially.

Based on ChromiumOS'
Change-Id: I42de7d28401d7ad5be8fcf8a8c165e2614a45960

Signed-off-by: David Hendricks <dhendrix at chromium.org>
Signed-off-by: Stefan Tauner <stefan.tauner at alumni.tuwien.ac.at>
---
 dediprog.c | 30 +++++++++++++++++-------------
 1 file changed, 17 insertions(+), 13 deletions(-)

What does it really do...? :/

diff --git a/dediprog.c b/dediprog.c
index 8c7e21a..60f4d4f 100644
--- a/dediprog.c
+++ b/dediprog.c
@@ -82,6 +82,7 @@ enum dediprog_cmds {
 	CMD_READ_PROG_INFO	= 0x08,
 	CMD_SET_VCC		= 0x09,
 	CMD_SET_STANDALONE	= 0x0A,
+	CMD_SET_VOLTAGE		= 0x0B,	/* Only in firmware older than 6.0.0 */
 	CMD_GET_BUTTON		= 0x11,
 	CMD_GET_UID		= 0x12,
 	CMD_SET_CS		= 0x14,
@@ -628,22 +629,22 @@ static int dediprog_check_devicestring(void)
 	return 0;
 }
 
-static int dediprog_device_init(void)
+/* Only use dediprog_set_voltage on SF100 programmers with firmware older
+ * than V6.0.0. Newer programmers (including all SF600s) do not support it. */
+static int dediprog_set_voltage(void)
 {
-	int ret;
-	char buf[0x1];
-
-	memset(buf, 0, sizeof(buf));
-	ret = usb_control_msg(dediprog_handle, REQTYPE_OTHER_IN, 0x0B, 0x0, 0x0,
+	char buf[1] = {0};
+	int ret = usb_control_msg(dediprog_handle, REQTYPE_OTHER_IN, CMD_SET_VOLTAGE, 0x0, 0x0,
 			      buf, 0x1, DEFAULT_TIMEOUT);
 	if (ret < 0) {
-		msg_perr("Command A failed (%s)!\n", usb_strerror());
+		msg_perr("Command Set Voltage failed (%s)!\n", usb_strerror());
 		return 1;
 	}
-	if ((ret != 0x1) || (buf[0] != 0x6f)) {
+	if ((ret != 1) || (buf[0] != 0x6f)) {
 		msg_perr("Unexpected response to init!\n");
 		return 1;
 	}
+
 	return 0;
 }
 
@@ -914,11 +915,14 @@ int dediprog_init(void)
 	if (register_shutdown(dediprog_shutdown, NULL))
 		return 1;
 
-	/* Perform basic setup. */
-	if (dediprog_device_init())
-		return 1;
-	if (dediprog_check_devicestring())
-		return 1;
+	/* Try reading the devicestring. If that fails and the device is old (FW < 6.0.0, which we can not know)
+	 * then we need to try the "set voltage" command and then attempt to read the devicestring again. */
+	if (dediprog_check_devicestring()) {
+		if (dediprog_set_voltage())
+			return 1;
+		if (dediprog_check_devicestring())
+			return 1;
+	}
 
 	/* SF100 only has 1 endpoint for in/out, SF600 uses two separate endpoints instead. */
 	dediprog_in_endpoint = 2;
-- 
Kind regards, Stefan Tauner





More information about the flashrom mailing list