[flashrom] [PATCH 1/3] dediprog: Fix dediprog_device_init()

David Hendricks dhendrix at chromium.org
Sun Aug 2 03:07:16 CEST 2015


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 the function 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 at 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




More information about the flashrom mailing list