X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=hardware%2Fsaleae-logic16%2Fapi.c;h=d0a63dc95cb2a9f8455ef56946e386807c27aa96;hb=660e398fe9f5fc608787f8fd75a9df8aac61026f;hp=248c24aeb79e2584a386840e7f82d6e145f7cf5a;hpb=87b537ced00b56ec7c8b3cfb9ea375a5501017d2;p=libsigrok.git diff --git a/hardware/saleae-logic16/api.c b/hardware/saleae-logic16/api.c index 248c24ae..d0a63dc9 100644 --- a/hardware/saleae-logic16/api.c +++ b/hardware/saleae-logic16/api.c @@ -30,7 +30,6 @@ #define LOGIC16_VID 0x21a9 #define LOGIC16_PID 0x1001 -#define NUM_PROBES 16 #define USB_INTERFACE 0 #define USB_CONFIGURATION 1 @@ -56,7 +55,7 @@ static const int32_t hwcaps[] = { SR_CONF_CONTINUOUS, }; -static const char *probe_names[NUM_PROBES + 1] = { +static const char *probe_names[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", NULL, @@ -241,11 +240,6 @@ static GSList *dev_list(void) return ((struct drv_context *)(di->priv))->instances; } -static int dev_clear(void) -{ - return std_dev_clear(di, NULL); -} - static int logic16_dev_open(struct sr_dev_inst *sdi) { libusb_device **devlist; @@ -309,6 +303,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; @@ -322,21 +330,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 @@ -372,25 +384,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]; @@ -426,14 +419,16 @@ static int cleanup(void) /* Can get called on an unused driver, doesn't matter. */ return SR_OK; - ret = dev_clear(); + + ret = std_dev_clear(di, NULL); g_free(drvc); di->priv = NULL; 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_channel_group *channel_group) { struct dev_context *devc; struct sr_usb_dev_inst *usb; @@ -442,6 +437,8 @@ static int config_get(int key, GVariant **data, const struct sr_dev_inst *sdi) int ret; unsigned int i; + (void)channel_group; + ret = SR_OK; switch (key) { case SR_CONF_CONN: @@ -484,13 +481,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_channel_group *channel_group) { struct dev_context *devc; gdouble low, high; int ret; unsigned int i; + (void)channel_group; + if (sdi->status != SR_ST_ACTIVE) return SR_ERR_DEV_CLOSED; @@ -524,7 +524,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_channel_group *channel_group) { GVariant *gvar, *range[2]; GVariantBuilder gvb; @@ -532,6 +533,7 @@ static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi) unsigned int i; (void)sdi; + (void)channel_group; ret = SR_OK; switch (key) { @@ -685,7 +687,6 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data) struct drv_context *drvc; struct sr_usb_dev_inst *usb; struct libusb_transfer *transfer; - const struct libusb_pollfd **lupfd; unsigned int i, timeout, num_transfers; int ret; unsigned char *buf; @@ -715,7 +716,6 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data) size = get_buffer_size(devc); convsize = (size / devc->num_channels + 2) * 16; devc->submitted_transfers = 0; - devc->usbfd = NULL; devc->convbuffer_size = convsize; if (!(devc->convbuffer = g_try_malloc(convsize))) { @@ -765,21 +765,9 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data) devc->submitted_transfers++; } - lupfd = libusb_get_pollfds(drvc->sr_ctx->libusb_ctx); - for (i = 0; lupfd[i]; i++); - devc->usbfd = g_try_malloc(sizeof(struct libusb_pollfd) * (i + 1)); - if (!devc->usbfd) { - abort_acquisition(devc); - free(lupfd); - return SR_ERR; - } - for (i = 0; lupfd[i]; i++) { - sr_source_add(lupfd[i]->fd, lupfd[i]->events, - timeout, receive_data, (void *)sdi); - devc->usbfd[i] = lupfd[i]->fd; - } - devc->usbfd[i] = -1; - free(lupfd); + devc->ctx = drvc->sr_ctx; + + usb_source_add(devc->ctx, timeout, receive_data, (void *)sdi); /* Send header packet to the session bus. */ std_session_send_df_header(cb_data, LOG_PREFIX); @@ -816,7 +804,7 @@ SR_PRIV struct sr_dev_driver saleae_logic16_driver_info = { .cleanup = cleanup, .scan = scan, .dev_list = dev_list, - .dev_clear = dev_clear, + .dev_clear = NULL, .config_get = config_get, .config_set = config_set, .config_list = config_list,