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 during init.
Tested with SF100 V:5.1.5 and SF600 V:7.1.4 (with subsequent patches) Signed-off-by: David Hendricks dhendrix@chromium.org
Index: dediprog.c =================================================================== --- dediprog.c (revision 1896) +++ dediprog.c (working copy) @@ -75,6 +75,7 @@ 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, @@ -579,13 +580,15 @@ 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, + 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()); @@ -595,6 +598,7 @@ msg_perr("Unexpected response to init!\n"); return 1; } + return 0; }
@@ -853,11 +857,15 @@ 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) 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; + }
/* Set all possible LEDs as soon as possible to indicate activity. * Because knowing the firmware version is required to set the LEDs correctly we need to this after