Hmmm, on second thoughts my other 2 patches were basically just
rebasing the other patches to add new protocol support and add basic
SF600 support. No need to re-hash them. Just apply this along with the
other two patches and SF600 should work (reads, not writes).
On Sat, Aug 1, 2015 at 6:07 PM, David Hendricks <dhendrix(a)chromium.org> wrote:
> 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(a)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