From: Gerhard Sittig Date: Sun, 25 Jun 2017 10:24:13 +0000 (+0200) Subject: asix-sigma: Only open the USB device once (fails with newer libftdi) X-Git-Url: http://sigrok.org/gitweb/?p=libsigrok.git;a=commitdiff_plain;h=1f4f98e05cd6cd2f245cdc5e0776fe8af1e092c9 asix-sigma: Only open the USB device once (fails with newer libftdi) The asix-sigma driver was reported to fail in combination with newer libftdi versions, because the firmware upload routine opened again an already opened device, and then failed to claim the interface. Which was not fatal before with previous libftdi versions. Remove the redundant open call. Remove the local FTDI context variable, which brings the firmware upload routine in line with all other calls that communicate to the USB device. This fixes bug #471. Suggested-By: Marian Cingel --- diff --git a/src/hardware/asix-sigma/protocol.c b/src/hardware/asix-sigma/protocol.c index ee7ce022..4d1b1cce 100644 --- a/src/hardware/asix-sigma/protocol.c +++ b/src/hardware/asix-sigma/protocol.c @@ -446,7 +446,6 @@ static int upload_firmware(struct sr_context *ctx, unsigned char pins; size_t buf_size; const char *firmware; - struct ftdi_context *ftdic; /* Avoid downloading the same firmware multiple times. */ firmware = sigma_firmware_files[firmware_idx]; @@ -455,28 +454,18 @@ static int upload_firmware(struct sr_context *ctx, return SR_OK; } - /* Make sure it's an ASIX SIGMA. */ - ftdic = &devc->ftdic; - ret = ftdi_usb_open_desc(ftdic, USB_VENDOR, USB_PRODUCT, - USB_DESCRIPTION, NULL); - if (ret < 0) { - sr_err("ftdi_usb_open failed: %s", - ftdi_get_error_string(ftdic)); - return SR_ERR; - } - - ret = ftdi_set_bitmode(ftdic, 0xdf, BITMODE_BITBANG); + ret = ftdi_set_bitmode(&devc->ftdic, 0xdf, BITMODE_BITBANG); if (ret < 0) { sr_err("ftdi_set_bitmode failed: %s", - ftdi_get_error_string(ftdic)); + ftdi_get_error_string(&devc->ftdic)); return SR_ERR; } /* Four times the speed of sigmalogan - Works well. */ - ret = ftdi_set_baudrate(ftdic, 750 * 1000); + ret = ftdi_set_baudrate(&devc->ftdic, 750 * 1000); if (ret < 0) { sr_err("ftdi_set_baudrate failed: %s", - ftdi_get_error_string(ftdic)); + ftdi_get_error_string(&devc->ftdic)); return SR_ERR; } @@ -499,14 +488,14 @@ static int upload_firmware(struct sr_context *ctx, g_free(buf); - ret = ftdi_set_bitmode(ftdic, 0x00, BITMODE_RESET); + ret = ftdi_set_bitmode(&devc->ftdic, 0x00, BITMODE_RESET); if (ret < 0) { sr_err("ftdi_set_bitmode failed: %s", - ftdi_get_error_string(ftdic)); + ftdi_get_error_string(&devc->ftdic)); return SR_ERR; } - ftdi_usb_purge_buffers(ftdic); + ftdi_usb_purge_buffers(&devc->ftdic); /* Discard garbage. */ while (sigma_read(&pins, 1, devc) == 1)