X-Git-Url: https://sigrok.org/gitweb/?p=libsigrok.git;a=blobdiff_plain;f=hardware%2Fcommon%2Fscpi_usbtmc_libusb.c;h=c4470b5db6dee0d98b4983a8a79b2627bf9e5f08;hp=933ce83c084e720ead9b002fc369ee1c3d0299a9;hb=43cd4637285833706f8a404ca027bcf0ee75b9ae;hpb=9ad05e6cd28e5a4c7cc4f38d2dcb561a14bb5563 diff --git a/hardware/common/scpi_usbtmc_libusb.c b/hardware/common/scpi_usbtmc_libusb.c index 933ce83c..c4470b5d 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. */ @@ -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) @@ -267,6 +270,7 @@ static int scpi_usbtmc_libusb_open(void *priv) 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, @@ -311,18 +316,20 @@ static int scpi_usbtmc_libusb_open(void *priv) return SR_OK; } -static int scpi_usbtmc_libusb_source_add(void *priv, int events, int timeout, - sr_receive_data_callback_t cb, void *cb_data) +static int scpi_usbtmc_libusb_source_add(struct sr_session *session, + void *priv, int events, int timeout, sr_receive_data_callback cb, + void *cb_data) { struct scpi_usbtmc_libusb *uscpi = priv; (void)events; - return usb_source_add(uscpi->ctx, timeout, cb, cb_data); + return usb_source_add(session, uscpi->ctx, timeout, cb, cb_data); } -static int scpi_usbtmc_libusb_source_remove(void *priv) +static int scpi_usbtmc_libusb_source_remove(struct sr_session *session, + void *priv) { struct scpi_usbtmc_libusb *uscpi = priv; - return usb_source_remove(uscpi->ctx); + return usb_source_remove(session, uscpi->ctx); } static void usbtmc_bulk_out_header_write(void *header, uint8_t MsgID, @@ -524,6 +531,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 +541,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.",