]> sigrok.org Git - libsigrok.git/commitdiff
usbtmc: only reset Siglent (and Atten) devices in open
authorGerhard Sittig <redacted>
Sun, 11 Feb 2018 15:16:17 +0000 (16:16 +0100)
committerUwe Hermann <redacted>
Sun, 11 Feb 2018 23:13:49 +0000 (00:13 +0100)
Make the USB reset for USB TMC devices conditional. Check a whitelist,
which in this implementation exclusively contains the Siglent VID.

The whitelist's comment may need adjustment. The VID probably not only
applies to SDS devices, but could be used for SDG and others as well.
And lsusb output suggests the VID is used by Atten, too.

src/scpi/scpi_usbtmc_libusb.c

index 7e49a8a0f12b9aef7a195cb28e5da801b9c83329..a109703ea0318d81d43877cc2fa1364a625b1cab 100644 (file)
@@ -111,6 +111,12 @@ static struct usbtmc_blacklist blacklist_remote[] = {
        ALL_ZERO
 };
 
+/* Devices that shall get reset during open(). */
+static struct usbtmc_blacklist whitelist_usb_reset[] = {
+       { 0xf4ec, 0xffff }, /* All Siglent SDS devices */
+       ALL_ZERO
+};
+
 static GSList *scpi_usbtmc_libusb_scan(struct drv_context *drvc)
 {
        struct libusb_device **devlist;
@@ -291,6 +297,7 @@ static int scpi_usbtmc_libusb_open(struct sr_scpi_dev_inst *scpi)
        int confidx, intfidx, epidx, config = 0, current_config;
        uint8_t capabilities[24];
        int ret, found = 0;
+       int do_reset;
 
        if (usb->devhdl)
                return SR_OK;
@@ -371,7 +378,11 @@ static int scpi_usbtmc_libusb_open(struct sr_scpi_dev_inst *scpi)
                return SR_ERR;
        }
 
-       libusb_reset_device(usb->devhdl);
+       /* Optionally reset the USB device. */
+       do_reset = check_usbtmc_blacklist(whitelist_usb_reset,
+               des.idVendor, des.idProduct);
+       if (do_reset)
+               libusb_reset_device(usb->devhdl);
 
        /* Get capabilities. */
        ret = libusb_control_transfer(usb->devhdl, LIBUSB_ENDPOINT_IN |