X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=hardware%2Fsaleae-logic16%2Fapi.c;h=e399729e9b09d9d5a9dae883cc42ca744c0135f6;hb=7b4edcb654d6b36da4369bac3688ad77f6132766;hp=a12143a5c97365567664f55632e6ffcea3674c09;hpb=d0107565c1e61e7b705fb9c0c84c72490da57d8f;p=libsigrok.git diff --git a/hardware/saleae-logic16/api.c b/hardware/saleae-logic16/api.c index a12143a5..e399729e 100644 --- a/hardware/saleae-logic16/api.c +++ b/hardware/saleae-logic16/api.c @@ -308,6 +308,20 @@ static int logic16_dev_open(struct sr_dev_inst *sdi) break; } + ret = libusb_claim_interface(usb->devhdl, USB_INTERFACE); + if (ret == LIBUSB_ERROR_BUSY) { + sr_err("Unable to claim USB interface. Another " + "program or driver has already claimed it."); + break; + } else if (ret == LIBUSB_ERROR_NO_DEVICE) { + sr_err("Device has been disconnected."); + break; + } else if (ret != 0) { + sr_err("Unable to claim interface: %s.", + libusb_error_name(ret)); + break; + } + if ((ret = logic16_init_device(sdi)) != SR_OK) { sr_err("Failed to init device."); break; @@ -321,21 +335,25 @@ static int logic16_dev_open(struct sr_dev_inst *sdi) } libusb_free_device_list(devlist, 1); - if (sdi->status != SR_ST_ACTIVE) + if (sdi->status != SR_ST_ACTIVE) { + if (usb->devhdl) { + libusb_release_interface(usb->devhdl, USB_INTERFACE); + libusb_close(usb->devhdl); + usb->devhdl = NULL; + } return SR_ERR; + } return SR_OK; } static int dev_open(struct sr_dev_inst *sdi) { - struct sr_usb_dev_inst *usb; struct dev_context *devc; int ret; int64_t timediff_us, timediff_ms; devc = sdi->priv; - usb = sdi->conn; /* * If the firmware was recently uploaded, wait up to MAX_RENUM_DELAY_MS @@ -371,25 +389,6 @@ static int dev_open(struct sr_dev_inst *sdi) return SR_ERR; } - ret = libusb_claim_interface(usb->devhdl, USB_INTERFACE); - if (ret != 0) { - switch (ret) { - case LIBUSB_ERROR_BUSY: - sr_err("Unable to claim USB interface. Another " - "program or driver has already claimed it."); - break; - case LIBUSB_ERROR_NO_DEVICE: - sr_err("Device has been disconnected."); - break; - default: - sr_err("Unable to claim interface: %s.", - libusb_error_name(ret)); - break; - } - - return SR_ERR; - } - if (devc->cur_samplerate == 0) { /* Samplerate hasn't been set; default to the slowest one. */ devc->cur_samplerate = samplerates[0]; @@ -432,7 +431,8 @@ static int cleanup(void) return ret; } -static int config_get(int key, GVariant **data, const struct sr_dev_inst *sdi) +static int config_get(int key, GVariant **data, const struct sr_dev_inst *sdi, + const struct sr_probe_group *probe_group) { struct dev_context *devc; struct sr_usb_dev_inst *usb; @@ -441,6 +441,8 @@ static int config_get(int key, GVariant **data, const struct sr_dev_inst *sdi) int ret; unsigned int i; + (void)probe_group; + ret = SR_OK; switch (key) { case SR_CONF_CONN: @@ -483,13 +485,16 @@ static int config_get(int key, GVariant **data, const struct sr_dev_inst *sdi) return ret; } -static int config_set(int key, GVariant *data, const struct sr_dev_inst *sdi) +static int config_set(int key, GVariant *data, const struct sr_dev_inst *sdi, + const struct sr_probe_group *probe_group) { struct dev_context *devc; gdouble low, high; int ret; unsigned int i; + (void)probe_group; + if (sdi->status != SR_ST_ACTIVE) return SR_ERR_DEV_CLOSED; @@ -523,7 +528,8 @@ static int config_set(int key, GVariant *data, const struct sr_dev_inst *sdi) return ret; } -static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi) +static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi, + const struct sr_probe_group *probe_group) { GVariant *gvar, *range[2]; GVariantBuilder gvb; @@ -531,6 +537,7 @@ static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi) unsigned int i; (void)sdi; + (void)probe_group; ret = SR_OK; switch (key) {