#include <string.h>
#include <inttypes.h>
#include <libusb.h>
-#include "config.h"
#include "libsigrok.h"
#include "libsigrok-internal.h"
#include "fx2lafw.h"
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.
{
libusb_device **devlist;
struct libusb_device_descriptor des;
- struct drv_context *drvc;
struct dev_context *devc;
+ struct drv_context *drvc = fdi->priv;
struct version_info vi;
int ret, skip, i;
uint8_t revid;
- drvc = fdi->priv;
devc = sdi->priv;
if (sdi->status == SR_ST_ACTIVE)
return SR_ERR;
skip = 0;
- const int device_count = libusb_get_device_list(drvc->usb_context, &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);
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;
}
*/
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;
}
* API callbacks
*/
-static int hw_init(void)
+static int hw_init(struct sr_context *sr_ctx)
{
struct drv_context *drvc;
if (!(drvc = g_try_malloc0(sizeof(struct drv_context)))) {
sr_err("fx2lafw: driver context malloc failed.");
- return SR_ERR;
- }
-
- if (libusb_init(&drvc->usb_context) != 0) {
- g_free(drvc);
- sr_warn("fx2lafw: Failed to initialize libusb.");
- return SR_ERR;
+ return SR_ERR_MALLOC;
}
+ drvc->sr_ctx = sr_ctx;
fdi->priv = drvc;
return SR_OK;
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. */
/* Find all fx2lafw compatible devices and upload firmware to them. */
devices = NULL;
- libusb_get_device_list(drvc->usb_context, &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;
}
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);
}
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);
break;
default:
- sr_err("fx2lafw: Unable to claim interface: %d.", ret);
+ sr_err("fx2lafw: Unable to claim interface: %s.",
+ libusb_error_name(ret));
break;
}
ret = clear_instances();
- if (drvc->usb_context)
- libusb_exit(drvc->usb_context);
- drvc->usb_context = NULL;
-
g_free(drvc);
fdi->priv = NULL;
static int receive_data(int fd, int revents, void *cb_data)
{
- struct drv_context *drvc;
struct timeval tv;
+ struct drv_context *drvc = fdi->priv;
- /* Avoid compiler warnings. */
(void)fd;
(void)revents;
(void)cb_data;
- drvc = fdi->priv;
tv.tv_sec = tv.tv_usec = 0;
- libusb_handle_events_timeout(drvc->usb_context, &tv);
+ libusb_handle_events_timeout(drvc->sr_ctx->libusb_ctx, &tv);
return TRUE;
}
static void finish_acquisition(struct dev_context *devc)
{
- struct drv_context *drvc;
struct sr_datafeed_packet packet;
+ struct drv_context *drvc = fdi->priv;
int i;
- drvc = fdi->priv;
/* Terminate session */
packet.type = SR_DF_END;
/* Remove fds from polling */
const struct libusb_pollfd **const lupfd =
- libusb_get_pollfds(drvc->usb_context);
+ 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()! */
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)
struct sr_datafeed_packet packet;
struct sr_datafeed_header header;
struct sr_datafeed_meta_logic meta;
- struct drv_context *drvc;
struct dev_context *devc;
+ struct drv_context *drvc = fdi->priv;
struct libusb_transfer *transfer;
const struct libusb_pollfd **lupfd;
unsigned int i;
int ret;
unsigned char *buf;
- drvc = fdi->priv;
devc = sdi->priv;
if (devc->submitted_transfers != 0)
return SR_ERR;
const size_t size = get_buffer_size(devc);
devc->transfers = g_try_malloc0(sizeof(*devc->transfers) * num_transfers);
- if (!devc->transfers)
- return SR_ERR;
+ if (!devc->transfers) {
+ sr_err("fx2lafw: USB transfers malloc failed.");
+ return SR_ERR_MALLOC;
+ }
devc->num_transfers = num_transfers;
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);
devc->submitted_transfers++;
}
- lupfd = libusb_get_pollfds(drvc->usb_context);
+ 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);
}
/* 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);