X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=hardware%2Ffx2lafw%2Ffx2lafw.c;h=b3df9731fbc6e294c608285578c67878b39df95f;hb=f086b83011b1282f62f0058872f333aef4bf9daa;hp=368b0245c0086f3abc39657483065ecfddccd320;hpb=dc9dbe949a2c195ec0c5afff34bec3cc03a5613b;p=libsigrok.git diff --git a/hardware/fx2lafw/fx2lafw.c b/hardware/fx2lafw/fx2lafw.c index 368b0245..b3df9731 100644 --- a/hardware/fx2lafw/fx2lafw.c +++ b/hardware/fx2lafw/fx2lafw.c @@ -23,7 +23,6 @@ #include #include #include -#include "config.h" #include "libsigrok.h" #include "libsigrok-internal.h" #include "fx2lafw.h" @@ -144,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,13 +193,11 @@ static int fx2lafw_dev_open(struct sr_dev_inst *sdi) { libusb_device **devlist; struct libusb_device_descriptor des; - struct drv_context *drvc; struct dev_context *devc; struct version_info vi; int ret, skip, i; uint8_t revid; - drvc = fdi->priv; devc = sdi->priv; if (sdi->status == SR_ST_ACTIVE) @@ -209,7 +205,7 @@ static int fx2lafw_dev_open(struct sr_dev_inst *sdi) 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(NULL, &devlist); if (device_count < 0) { sr_err("fx2lafw: Failed to retrieve device list (%d)", device_count); @@ -297,20 +293,22 @@ static int fx2lafw_dev_open(struct sr_dev_inst *sdi) return SR_OK; } -static int configure_probes(struct dev_context *devc, GSList *probes) +static int configure_probes(const struct sr_dev_inst *sdi) { + struct dev_context *devc; struct sr_probe *probe; GSList *l; int probe_bit, stage, i; char *tc; + devc = sdi->priv; for (i = 0; i < NUM_TRIGGER_STAGES; i++) { devc->trigger_mask[i] = 0; devc->trigger_value[i] = 0; } stage = -1; - for (l = probes; l; l = l->next) { + for (l = sdi->probes; l; l = l->next) { probe = (struct sr_probe *)l->data; if (probe->enabled == FALSE) continue; @@ -385,6 +383,7 @@ static int clear_instances(void) continue; } hw_dev_close(sdi); + sr_usb_dev_inst_free(devc->usb); sdi = l->data; sr_dev_inst_free(sdi); } @@ -406,10 +405,10 @@ static int hw_init(void) if (!(drvc = g_try_malloc0(sizeof(struct drv_context)))) { sr_err("fx2lafw: driver context malloc failed."); - return SR_ERR; + return SR_ERR_MALLOC; } - if (libusb_init(&drvc->usb_context) != 0) { + if (libusb_init(NULL) != 0) { g_free(drvc); sr_warn("fx2lafw: Failed to initialize libusb."); return SR_ERR; @@ -432,8 +431,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,7 +440,7 @@ static GSList *hw_scan(GSList *options) /* Find all fx2lafw compatible devices and upload firmware to them. */ devices = NULL; - libusb_get_device_list(drvc->usb_context, &devlist); + libusb_get_device_list(NULL, &devlist); for (i = 0; devlist[i]; i++) { if ((ret = libusb_get_device_descriptor( @@ -508,6 +507,15 @@ static GSList *hw_scan(GSList *options) return devices; } +static GSList *hw_dev_list(void) +{ + struct drv_context *drvc; + + drvc = fdi->priv; + + return drvc->instances; +} + static int hw_dev_open(struct sr_dev_inst *sdi) { struct dev_context *devc; @@ -602,12 +610,9 @@ static int hw_cleanup(void) if (!(drvc = fdi->priv)) return SR_OK; - drvc = fdi->priv; ret = clear_instances(); - if (drvc->usb_context) - libusb_exit(drvc->usb_context); - drvc->usb_context = NULL; + libusb_exit(NULL); g_free(drvc); fdi->priv = NULL; @@ -667,8 +672,6 @@ static int hw_dev_config_set(const struct sr_dev_inst *sdi, int hwcap, if (hwcap == SR_HWCAP_SAMPLERATE) { devc->cur_samplerate = *(const uint64_t *)value; ret = SR_OK; - } else if (hwcap == SR_HWCAP_PROBECONFIG) { - ret = configure_probes(devc, (GSList *) value); } else if (hwcap == SR_HWCAP_LIMIT_SAMPLES) { devc->limit_samples = *(const uint64_t *)value; ret = SR_OK; @@ -681,17 +684,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 drv_context *drvc; struct timeval tv; - /* 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(NULL, &tv); return TRUE; } @@ -710,11 +710,9 @@ static void abort_acquisition(struct dev_context *devc) static void finish_acquisition(struct dev_context *devc) { - struct drv_context *drvc; struct sr_datafeed_packet packet; int i; - drvc = fdi->priv; /* Terminate session */ packet.type = SR_DF_END; @@ -722,7 +720,7 @@ static void finish_acquisition(struct dev_context *devc) /* Remove fds from polling */ const struct libusb_pollfd **const lupfd = - libusb_get_pollfds(drvc->usb_context); + libusb_get_pollfds(NULL); for (i = 0; lupfd[i]; i++) sr_source_remove(lupfd[i]->fd); free(lupfd); /* NOT g_free()! */ @@ -947,7 +945,6 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi, 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 libusb_transfer *transfer; const struct libusb_pollfd **lupfd; @@ -955,11 +952,15 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi, int ret; unsigned char *buf; - drvc = fdi->priv; devc = sdi->priv; if (devc->submitted_transfers != 0) return SR_ERR; + if (configure_probes(sdi) != SR_OK) { + sr_err("fx2lafw: failed to configured probes"); + return SR_ERR; + } + devc->session_dev_id = cb_data; devc->num_samples = 0; devc->empty_transfer_count = 0; @@ -969,8 +970,10 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi, 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; @@ -993,7 +996,7 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi, devc->submitted_transfers++; } - lupfd = libusb_get_pollfds(drvc->usb_context); + lupfd = libusb_get_pollfds(NULL); for (i = 0; lupfd[i]; i++) sr_source_add(lupfd[i]->fd, lupfd[i]->events, timeout, receive_data, NULL); @@ -1022,11 +1025,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); @@ -1041,6 +1041,8 @@ SR_PRIV struct sr_dev_driver fx2lafw_driver_info = { .init = hw_init, .cleanup = hw_cleanup, .scan = hw_scan, + .dev_list = hw_dev_list, + .dev_clear = clear_instances, .dev_open = hw_dev_open, .dev_close = hw_dev_close, .info_get = hw_info_get,