X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=hardware%2Ffx2lafw%2Ffx2lafw.c;h=fb8bae8fb263cccf494f2323b465f20faa8aa692;hb=5b389efcfeff17b0f7466597706c898ad65eb6a9;hp=e74312fb77b8a745d770bd007f7fafed4c7e03d6;hpb=886a52b6fbffb0fd06849c928cf9fd31a0d4657b;p=libsigrok.git diff --git a/hardware/fx2lafw/fx2lafw.c b/hardware/fx2lafw/fx2lafw.c index e74312fb..fb8bae8f 100644 --- a/hardware/fx2lafw/fx2lafw.c +++ b/hardware/fx2lafw/fx2lafw.c @@ -143,8 +143,7 @@ static struct sr_dev_driver *fdi = &fx2lafw_driver_info; static int hw_dev_close(struct sr_dev_inst *sdi); static int hw_dev_config_set(const struct sr_dev_inst *sdi, int hwcap, const void *value); -static int hw_dev_acquisition_stop(const struct sr_dev_inst *sdi, - void *cb_data); +static int hw_dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data); /** * Check the USB configuration to determine if this is an fx2lafw device. @@ -195,6 +194,7 @@ static int fx2lafw_dev_open(struct sr_dev_inst *sdi) libusb_device **devlist; struct libusb_device_descriptor des; struct dev_context *devc; + struct drv_context *drvc = fdi->priv; struct version_info vi; int ret, skip, i; uint8_t revid; @@ -206,7 +206,8 @@ static int fx2lafw_dev_open(struct sr_dev_inst *sdi) return SR_ERR; skip = 0; - const int device_count = libusb_get_device_list(NULL, &devlist); + const int device_count = libusb_get_device_list( + drvc->sr_ctx->libusb_ctx, &devlist); if (device_count < 0) { sr_err("fx2lafw: Failed to retrieve device list (%d)", device_count); @@ -215,8 +216,8 @@ static int fx2lafw_dev_open(struct sr_dev_inst *sdi) for (i = 0; i < device_count; i++) { if ((ret = libusb_get_device_descriptor(devlist[i], &des))) { - sr_err("fx2lafw: Failed to get device descriptor: %d.", - ret); + sr_err("fx2lafw: Failed to get device descriptor: %s.", + libusb_error_name(ret)); continue; } @@ -249,7 +250,8 @@ static int fx2lafw_dev_open(struct sr_dev_inst *sdi) */ devc->usb->address = libusb_get_device_address(devlist[i]); } else { - sr_err("fx2lafw: Failed to open device: %d.", ret); + sr_err("fx2lafw: Failed to open device: %s.", + libusb_error_name(ret)); break; } @@ -400,7 +402,7 @@ static int clear_instances(void) * API callbacks */ -static int hw_init(void) +static int hw_init(struct sr_context *sr_ctx) { struct drv_context *drvc; @@ -409,12 +411,7 @@ static int hw_init(void) return SR_ERR_MALLOC; } - if (libusb_init(NULL) != 0) { - g_free(drvc); - sr_warn("fx2lafw: Failed to initialize libusb."); - return SR_ERR; - } - + drvc->sr_ctx = sr_ctx; fdi->priv = drvc; return SR_OK; @@ -432,8 +429,8 @@ static GSList *hw_scan(GSList *options) libusb_device **devlist; int devcnt, num_logic_probes, ret, i, j; - /* Avoid compiler warnings. */ (void)options; + drvc = fdi->priv; /* This scan always invalidates any previous scans. */ @@ -441,12 +438,13 @@ static GSList *hw_scan(GSList *options) /* Find all fx2lafw compatible devices and upload firmware to them. */ devices = NULL; - libusb_get_device_list(NULL, &devlist); + libusb_get_device_list(drvc->sr_ctx->libusb_ctx, &devlist); for (i = 0; devlist[i]; i++) { if ((ret = libusb_get_device_descriptor( devlist[i], &des)) != 0) { - sr_warn("fx2lafw: Failed to get device descriptor: %d.", ret); + sr_warn("fx2lafw: Failed to get device descriptor: %s.", + libusb_error_name(ret)); continue; } @@ -544,7 +542,6 @@ static int hw_dev_open(struct sr_dev_inst *sdi) timediff_ms = timediff_us / 1000; sr_spew("fx2lafw: waited %" PRIi64 " ms", timediff_ms); } - sr_info("fx2lafw: Device came back after %d ms.", timediff_ms); } else { ret = fx2lafw_dev_open(sdi); } @@ -552,7 +549,11 @@ static int hw_dev_open(struct sr_dev_inst *sdi) if (ret != SR_OK) { sr_err("fx2lafw: Unable to open device."); return SR_ERR; + } else { + sr_info("fx2lafw: Device came back after %d ms.", + timediff_ms); } + devc = sdi->priv; ret = libusb_claim_interface(devc->usb->devhdl, USB_INTERFACE); @@ -568,7 +569,8 @@ static int hw_dev_open(struct sr_dev_inst *sdi) break; default: - sr_err("fx2lafw: Unable to claim interface: %d.", ret); + sr_err("fx2lafw: Unable to claim interface: %s.", + libusb_error_name(ret)); break; } @@ -613,8 +615,6 @@ static int hw_cleanup(void) ret = clear_instances(); - libusb_exit(NULL); - g_free(drvc); fdi->priv = NULL; @@ -686,14 +686,14 @@ static int hw_dev_config_set(const struct sr_dev_inst *sdi, int hwcap, static int receive_data(int fd, int revents, void *cb_data) { struct timeval tv; + struct drv_context *drvc = fdi->priv; - /* Avoid compiler warnings. */ (void)fd; (void)revents; (void)cb_data; tv.tv_sec = tv.tv_usec = 0; - libusb_handle_events_timeout(NULL, &tv); + libusb_handle_events_timeout(drvc->sr_ctx->libusb_ctx, &tv); return TRUE; } @@ -713,6 +713,7 @@ static void abort_acquisition(struct dev_context *devc) static void finish_acquisition(struct dev_context *devc) { struct sr_datafeed_packet packet; + struct drv_context *drvc = fdi->priv; int i; @@ -722,7 +723,7 @@ static void finish_acquisition(struct dev_context *devc) /* Remove fds from polling */ const struct libusb_pollfd **const lupfd = - libusb_get_pollfds(NULL); + libusb_get_pollfds(drvc->sr_ctx->libusb_ctx); for (i = 0; lupfd[i]; i++) sr_source_remove(lupfd[i]->fd); free(lupfd); /* NOT g_free()! */ @@ -755,12 +756,15 @@ static void free_transfer(struct libusb_transfer *transfer) static void resubmit_transfer(struct libusb_transfer *transfer) { - if (libusb_submit_transfer(transfer) != 0) { - free_transfer(transfer); - /* TODO: Stop session? */ - /* TODO: Better error message. */ - sr_err("fx2lafw: %s: libusb_submit_transfer error.", __func__); - } + int ret = libusb_submit_transfer(transfer); + + if (LIBUSB_SUCCESS == ret) + return; + + free_transfer(transfer); + /* TODO: Stop session? */ + + sr_err("fx2lafw: %s: %s", __func__, libusb_error_name(ret)); } static void receive_transfer(struct libusb_transfer *transfer) @@ -948,6 +952,7 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi, struct sr_datafeed_header header; struct sr_datafeed_meta_logic meta; struct dev_context *devc; + struct drv_context *drvc = fdi->priv; struct libusb_transfer *transfer; const struct libusb_pollfd **lupfd; unsigned int i; @@ -988,7 +993,9 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi, libusb_fill_bulk_transfer(transfer, devc->usb->devhdl, 2 | LIBUSB_ENDPOINT_IN, buf, size, receive_transfer, devc, timeout); - if (libusb_submit_transfer(transfer) != 0) { + if ((ret = libusb_submit_transfer(transfer)) != 0) { + sr_err("fx2lafw: %s: libusb_submit_transfer: %s.", + __func__, libusb_error_name(ret)); libusb_free_transfer(transfer); g_free(buf); abort_acquisition(devc); @@ -998,7 +1005,7 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi, devc->submitted_transfers++; } - lupfd = libusb_get_pollfds(NULL); + lupfd = libusb_get_pollfds(drvc->sr_ctx->libusb_ctx); for (i = 0; lupfd[i]; i++) sr_source_add(lupfd[i]->fd, lupfd[i]->events, timeout, receive_data, NULL); @@ -1027,11 +1034,8 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi, } /* TODO: This stops acquisition on ALL devices, ignoring dev_index. */ -static int hw_dev_acquisition_stop(const struct sr_dev_inst *sdi, - void *cb_data) +static int hw_dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data) { - - /* Avoid compiler warnings. */ (void)cb_data; abort_acquisition(sdi->priv);