X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=hardware%2Fcommon%2Fscpi_usbtmc_libusb.c;h=c814ba167945135377dae85fab6490078a68ae44;hb=1458018224d98bfc080c571e2145f816afbcac39;hp=9d96bcca7f2220aedfff5533e586833abfa37524;hpb=52f6951c4e15900d4c617d886d8f8298706c9684;p=libsigrok.git diff --git a/hardware/common/scpi_usbtmc_libusb.c b/hardware/common/scpi_usbtmc_libusb.c index 9d96bcca..c814ba16 100644 --- a/hardware/common/scpi_usbtmc_libusb.c +++ b/hardware/common/scpi_usbtmc_libusb.c @@ -43,6 +43,7 @@ struct scpi_usbtmc_libusb { int response_length; int response_bytes_read; int remaining_length; + int rigol_ds1000; }; /* Some USBTMC-specific enums, as defined in the USBTMC standard. */ @@ -109,16 +110,16 @@ static GSList *scpi_usbtmc_libusb_scan(struct drv_context *drvc) return NULL; } for (i = 0; devlist[i]; i++) { - if ((ret = libusb_get_device_descriptor(devlist[i], &des))) { + if ((ret = libusb_get_device_descriptor(devlist[i], &des)) < 0) { sr_err("Failed to get device descriptor: %s.", libusb_error_name(ret)); continue; } for (confidx = 0; confidx < des.bNumConfigurations; confidx++) { - if (libusb_get_config_descriptor(devlist[i], confidx, &confdes) != 0) { - sr_err("Failed to get configuration descriptor: %s.", - libusb_error_name(ret)); + if ((ret = libusb_get_config_descriptor(devlist[i], confidx, &confdes)) < 0) { + sr_dbg("Failed to get configuration descriptor: %s, " + "ignoring device.", libusb_error_name(ret)); break; } for (intfidx = 0; intfidx < confdes->bNumInterfaces; intfidx++) { @@ -193,16 +194,16 @@ static int scpi_usbtmc_libusb_open(void *priv) return SR_ERR; dev = libusb_get_device(usb->devhdl); - if ((ret = libusb_get_device_descriptor(dev, &des))) { + if ((ret = libusb_get_device_descriptor(dev, &des)) < 0) { sr_err("Failed to get device descriptor: %s.", libusb_error_name(ret)); return SR_ERR; } for (confidx = 0; confidx < des.bNumConfigurations; confidx++) { - if (libusb_get_config_descriptor(dev, confidx, &confdes) != 0) { - sr_err("Failed to get configuration descriptor: %s.", - libusb_error_name(ret)); + if ((ret = libusb_get_config_descriptor(dev, confidx, &confdes)) < 0) { + sr_dbg("Failed to get configuration descriptor: %s, " + "ignoring device.", libusb_error_name(ret)); continue; } for (intfidx = 0; intfidx < confdes->bNumInterfaces; intfidx++) { @@ -234,6 +235,8 @@ static int scpi_usbtmc_libusb_open(void *priv) } } found = 1; + uscpi->rigol_ds1000 = des.idVendor == 0x1ab1 && + des.idProduct == 0x0588; } libusb_free_config_descriptor(confdes); if (found) @@ -255,18 +258,19 @@ static int scpi_usbtmc_libusb_open(void *priv) uscpi->detached_kernel_driver = 1; } - if ((ret = libusb_set_configuration(usb->devhdl, config))) { + if ((ret = libusb_set_configuration(usb->devhdl, config)) < 0) { sr_err("Failed to set configuration: %s.", libusb_error_name(ret)); return SR_ERR; } - if ((ret = libusb_claim_interface(usb->devhdl, uscpi->interface))) { + if ((ret = libusb_claim_interface(usb->devhdl, uscpi->interface)) < 0) { sr_err("Failed to claim interface: %s.", libusb_error_name(ret)); return SR_ERR; } + if (!uscpi->rigol_ds1000) { if ((ret = libusb_clear_halt(usb->devhdl, uscpi->bulk_in_ep)) < 0) { sr_err("Failed to clear halt/stall condition for EP %d: %s.", uscpi->bulk_in_ep, libusb_error_name(ret)); @@ -282,6 +286,7 @@ static int scpi_usbtmc_libusb_open(void *priv) uscpi->interrupt_ep, libusb_error_name(ret)); return SR_ERR; } + } /* Get capabilities. */ ret = libusb_control_transfer(usb->devhdl, @@ -385,7 +390,7 @@ static int scpi_usbtmc_bulkout(struct scpi_usbtmc_libusb *uscpi, ret = libusb_bulk_transfer(usb->devhdl, uscpi->bulk_out_ep, uscpi->buffer, padded_size, &transferred, TRANSFER_TIMEOUT); - if (ret) { + if (ret < 0) { sr_err("USBTMC bulk out transfer error: %s.", libusb_error_name(ret)); return SR_ERR; @@ -409,7 +414,7 @@ static int scpi_usbtmc_bulkin_start(struct scpi_usbtmc_libusb *uscpi, ret = libusb_bulk_transfer(usb->devhdl, uscpi->bulk_in_ep, data, size, &transferred, TRANSFER_TIMEOUT); - if (ret) { + if (ret < 0) { sr_err("USBTMC bulk in transfer error: %s.", libusb_error_name(ret)); return SR_ERR; @@ -437,7 +442,7 @@ static int scpi_usbtmc_bulkin_continue(struct scpi_usbtmc_libusb *uscpi, ret = libusb_bulk_transfer(usb->devhdl, uscpi->bulk_in_ep, data, size, &transferred, TRANSFER_TIMEOUT); - if (ret) { + if (ret < 0) { sr_err("USBTMC bulk in transfer error: %s.", libusb_error_name(ret)); return SR_ERR; @@ -524,6 +529,7 @@ static int scpi_usbtmc_libusb_close(void *priv) if (!usb->devhdl) return SR_ERR; + if (!uscpi->rigol_ds1000) { if ((ret = libusb_clear_halt(usb->devhdl, uscpi->bulk_in_ep)) < 0) sr_err("Failed to clear halt/stall condition for EP %d: %s.", uscpi->bulk_in_ep, libusb_error_name(ret)); @@ -533,6 +539,7 @@ static int scpi_usbtmc_libusb_close(void *priv) if ((ret = libusb_clear_halt(usb->devhdl, uscpi->interrupt_ep)) < 0) sr_err("Failed to clear halt/stall condition for EP %d: %s.", uscpi->interrupt_ep, libusb_error_name(ret)); + } if ((ret = libusb_release_interface(usb->devhdl, uscpi->interface)) < 0) sr_err("Failed to release interface: %s.",