diff --git a/DSView/main.cpp b/DSView/main.cpp index 8485be26..dac39c93 100755 --- a/DSView/main.cpp +++ b/DSView/main.cpp @@ -38,6 +38,8 @@ #include "config.h" #include "pv/appcontrol.h" +//#include + void usage() { fprintf(stdout, @@ -54,6 +56,8 @@ void usage() int main(int argc, char *argv[]) { + // sr_test_usb_api();return 0; + int ret = 0; const char *open_file = NULL; diff --git a/libsigrok4DSL/hardware/DSL/dsl.c b/libsigrok4DSL/hardware/DSL/dsl.c index 01e2e01c..70c5da81 100755 --- a/libsigrok4DSL/hardware/DSL/dsl.c +++ b/libsigrok4DSL/hardware/DSL/dsl.c @@ -1779,6 +1779,7 @@ SR_PRIV int dsl_dev_open(struct sr_dev_driver *di, struct sr_dev_inst *sdi, gboo int ret; uint8_t hw_info; struct ctl_rd_cmd rd_cmd; + int fdError = 0; devc = sdi->priv; usb = sdi->conn; @@ -1799,7 +1800,7 @@ SR_PRIV int dsl_dev_open(struct sr_dev_driver *di, struct sr_dev_inst *sdi, gboo sr_err("%s: Unable to open device.", __func__); return SR_ERR; } - + ret = libusb_claim_interface(usb->devhdl, USB_INTERFACE); if (ret != 0) { switch(ret) { @@ -1810,13 +1811,27 @@ SR_PRIV int dsl_dev_open(struct sr_dev_driver *di, struct sr_dev_inst *sdi, gboo case LIBUSB_ERROR_NO_DEVICE: sr_err("%s: Device has been disconnected.", __func__); break; + case LIBUSB_ERROR_NOT_FOUND: + { + sr_err("%s: Unable to claim interface, try again: LIBUSB_ERROR_NOT_FOUND.", __func__); + ret = libusb_claim_interface(usb->devhdl, USB_INTERFACE); + fdError = 1; + } + break; default: - sr_err("%s: Unable to claim interface: %s.", + sr_err("%s: Unable to claim interface, try again: %s.", __func__, libusb_error_name(ret)); break; } - return SR_ERR; + if (ret != 0 && fdError == 1){ + sr_err("%s: Unable to claim interface, the second time: %s.", + __func__, libusb_error_name(ret)); + } + + if (ret != 0){ + return SR_ERR; + } } rd_cmd.header.dest = DSL_CTL_HW_STATUS; diff --git a/libsigrok4DSL/hardware/DSL/dslogic.c b/libsigrok4DSL/hardware/DSL/dslogic.c index 76419965..345f9db9 100755 --- a/libsigrok4DSL/hardware/DSL/dslogic.c +++ b/libsigrok4DSL/hardware/DSL/dslogic.c @@ -287,7 +287,9 @@ static GSList *scan(GSList *options) /* Find all DSLogic compatible devices and upload firmware to them. */ devices = NULL; - libusb_get_device_list(drvc->sr_ctx->libusb_ctx, &devlist); + int usbnum = libusb_get_device_list(drvc->sr_ctx->libusb_ctx, &devlist); + int stdnum = 0; + for (i = 0; devlist[i]; i++) { if (conn) { usb = NULL; @@ -314,6 +316,8 @@ static GSList *scan(GSList *options) (usb_speed != LIBUSB_SPEED_SUPER)) continue; + stdnum++; + prof = NULL; for (j = 0; supported_DSLogic[j].vid; j++) { if (des.idVendor == supported_DSLogic[j].vid && diff --git a/libsigrok4DSL/hwdriver.c b/libsigrok4DSL/hwdriver.c index 6af67d91..5be41d3d 100755 --- a/libsigrok4DSL/hwdriver.c +++ b/libsigrok4DSL/hwdriver.c @@ -27,6 +27,8 @@ #include #include "config.h" /* Needed for HAVE_LIBUSB_1_0 and others. */ +#include "hardware/DSL/dsl.h" + /* Message logging helpers with subsystem-specific prefix string. */ #define LOG_PREFIX "hwdriver: " #define sr_log(l, s, args...) sr_log(l, LOG_PREFIX s, ## args) @@ -475,3 +477,79 @@ SR_PRIV int sr_source_add(int fd, int events, int timeout, } /** @} */ + +/* +test usb device api +*/ +SR_API void sr_test_usb_api() +{ + libusb_context *ctx; + struct libusb_device_descriptor des; + int usb_speed; + int ret; + int i; + int num_devs; + libusb_device **devlist; + int stdnum = 0; + int j; + int bfind = 0; + int dlsnum = 0; + struct libusb_device_handle *devhandle; + + printf("\n"); + + ret = libusb_init(&ctx); + if (ret) { + printf("unable to initialize libusb: %i\n", ret); + return; + } + + num_devs = libusb_get_device_list(ctx, &devlist); + printf("usb dev num:%d\n", num_devs); + + for (i=0; i - + EnvironmentId