*/
{ 0x08a9, 0x0014, "CWAV", "USBee AX", NULL,
FIRMWARE_DIR "/fx2lafw-cwav-usbeeax.fw",
- 0 },
+ 0, NULL, NULL},
/*
* CWAV USBee DX
* XZL-Studio DX
*/
{ 0x08a9, 0x0015, "CWAV", "USBee DX", NULL,
FIRMWARE_DIR "/fx2lafw-cwav-usbeedx.fw",
- DEV_CAPS_16BIT },
+ DEV_CAPS_16BIT, NULL, NULL },
/*
* CWAV USBee SX
*/
{ 0x08a9, 0x0009, "CWAV", "USBee SX", NULL,
FIRMWARE_DIR "/fx2lafw-cwav-usbeesx.fw",
- 0 },
+ 0, NULL, NULL},
/*
* Saleae Logic
*/
{ 0x0925, 0x3881, "Saleae", "Logic", NULL,
FIRMWARE_DIR "/fx2lafw-saleae-logic.fw",
- 0 },
+ 0, NULL, NULL},
/*
* Default Cypress FX2 without EEPROM, e.g.:
*/
{ 0x04B4, 0x8613, "Cypress", "FX2", NULL,
FIRMWARE_DIR "/fx2lafw-cypress-fx2.fw",
- DEV_CAPS_16BIT },
+ DEV_CAPS_16BIT, NULL, NULL },
/*
* Braintechnology USB-LPS
*/
{ 0x16d0, 0x0498, "Braintechnology", "USB-LPS", NULL,
FIRMWARE_DIR "/fx2lafw-braintechnology-usb-lps.fw",
- DEV_CAPS_16BIT },
+ DEV_CAPS_16BIT, NULL, NULL },
- { 0, 0, 0, 0, 0, 0, 0 }
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};
static const int32_t hwopts[] = {
SR_CONF_CONTINUOUS,
};
-static const char *probe_names[] = {
+static const char *channel_names[] = {
"0", "1", "2", "3", "4", "5", "6", "7",
"8", "9", "10", "11", "12", "13", "14", "15",
NULL,
SR_PRIV struct sr_dev_driver fx2lafw_driver_info;
static struct sr_dev_driver *di = &fx2lafw_driver_info;
-static int dev_clear(void)
-{
- return std_dev_clear(di, NULL);
-}
-
static int init(struct sr_context *sr_ctx)
{
return std_init(sr_ctx, di, LOG_PREFIX);
struct dev_context *devc;
struct sr_dev_inst *sdi;
struct sr_usb_dev_inst *usb;
- struct sr_probe *probe;
+ struct sr_channel *ch;
struct sr_config *src;
const struct fx2lafw_profile *prof;
GSList *l, *devices, *conn_devices;
struct libusb_device_descriptor des;
libusb_device **devlist;
- int devcnt, num_logic_probes, ret, i, j;
+ struct libusb_device_handle *hdl;
+ int devcnt, num_logic_channels, ret, i, j;
const char *conn;
+ char manufacturer[64], product[64];
drvc = di->priv;
continue;
}
+ if ((ret = libusb_open(devlist[i], &hdl)) < 0)
+ continue;
+
+ if (des.iManufacturer == 0) {
+ manufacturer[0] = '\0';
+ } else if ((ret = libusb_get_string_descriptor_ascii(hdl,
+ des.iManufacturer, (unsigned char *) manufacturer,
+ sizeof(manufacturer))) < 0) {
+ sr_warn("Failed to get manufacturer string descriptor: %s.",
+ libusb_error_name(ret));
+ continue;
+ }
+
+ if (des.iProduct == 0) {
+ product[0] = '\0';
+ } else if ((ret = libusb_get_string_descriptor_ascii(hdl,
+ des.iProduct, (unsigned char *) product,
+ sizeof(product))) < 0) {
+ sr_warn("Failed to get product string descriptor: %s.",
+ libusb_error_name(ret));
+ continue;
+ }
+
+ libusb_close(hdl);
+
prof = NULL;
for (j = 0; supported_fx2[j].vid; j++) {
if (des.idVendor == supported_fx2[j].vid &&
- des.idProduct == supported_fx2[j].pid) {
+ des.idProduct == supported_fx2[j].pid &&
+ (!supported_fx2[j].usb_manufacturer ||
+ !strcmp(manufacturer, supported_fx2[j].usb_manufacturer)) &&
+ (!supported_fx2[j].usb_manufacturer ||
+ !strcmp(product, supported_fx2[j].usb_product))) {
prof = &supported_fx2[j];
+ break;
}
}
return NULL;
sdi->driver = di;
- /* Fill in probelist according to this device's profile. */
- num_logic_probes = prof->dev_caps & DEV_CAPS_16BIT ? 16 : 8;
- for (j = 0; j < num_logic_probes; j++) {
- if (!(probe = sr_probe_new(j, SR_PROBE_LOGIC, TRUE,
- probe_names[j])))
+ /* Fill in channellist according to this device's profile. */
+ num_logic_channels = prof->dev_caps & DEV_CAPS_16BIT ? 16 : 8;
+ for (j = 0; j < num_logic_channels; j++) {
+ if (!(ch = sr_channel_new(j, SR_CHANNEL_LOGIC, TRUE,
+ channel_names[j])))
return NULL;
- sdi->probes = g_slist_append(sdi->probes, probe);
+ sdi->channels = g_slist_append(sdi->channels, ch);
}
devc = fx2lafw_dev_new();
sr_err("Firmware upload failed for "
"device %d.", devcnt);
sdi->inst_type = SR_INST_USB;
- sdi->conn = sr_usb_dev_inst_new (libusb_get_bus_number(devlist[i]),
+ sdi->conn = sr_usb_dev_inst_new(libusb_get_bus_number(devlist[i]),
0xff, NULL);
}
}
ret = libusb_claim_interface(usb->devhdl, USB_INTERFACE);
if (ret != 0) {
- switch(ret) {
+ switch (ret) {
case LIBUSB_ERROR_BUSY:
sr_err("Unable to claim USB interface. Another "
"program or driver has already claimed it.");
if (!(drvc = di->priv))
return SR_OK;
- ret = dev_clear();
+
+ ret = std_dev_clear(di, NULL);
g_free(drvc);
di->priv = NULL;
}
static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi,
- const struct sr_probe_group *probe_group)
+ const struct sr_channel_group *cg)
{
struct dev_context *devc;
struct sr_usb_dev_inst *usb;
char str[128];
- (void)probe_group;
+ (void)cg;
+
+ if (!sdi)
+ return SR_ERR_ARG;
+
+ devc = sdi->priv;
switch (id) {
case SR_CONF_CONN:
- if (!sdi || !sdi->conn)
+ if (!sdi->conn)
return SR_ERR_ARG;
usb = sdi->conn;
if (usb->address == 255)
snprintf(str, 128, "%d.%d", usb->bus, usb->address);
*data = g_variant_new_string(str);
break;
+ case SR_CONF_LIMIT_SAMPLES:
+ *data = g_variant_new_uint64(devc->limit_samples);
+ break;
case SR_CONF_SAMPLERATE:
- if (!sdi)
- return SR_ERR;
- devc = sdi->priv;
*data = g_variant_new_uint64(devc->cur_samplerate);
break;
default:
}
static int config_set(int id, GVariant *data, const struct sr_dev_inst *sdi,
- const struct sr_probe_group *probe_group)
+ const struct sr_channel_group *cg)
{
struct dev_context *devc;
int ret;
- (void)probe_group;
+ (void)cg;
+
+ if (!sdi)
+ return SR_ERR_ARG;
if (sdi->status != SR_ST_ACTIVE)
return SR_ERR;
devc = sdi->priv;
- if (id == SR_CONF_SAMPLERATE) {
- devc->cur_samplerate = g_variant_get_uint64(data);
- ret = SR_OK;
- } else if (id == SR_CONF_LIMIT_SAMPLES) {
- devc->limit_samples = g_variant_get_uint64(data);
- ret = SR_OK;
- } else {
- ret = SR_ERR_NA;
+ ret = SR_OK;
+
+ switch (id)
+ {
+ case SR_CONF_SAMPLERATE:
+ devc->cur_samplerate = g_variant_get_uint64(data);
+ break;
+ case SR_CONF_LIMIT_SAMPLES:
+ devc->limit_samples = g_variant_get_uint64(data);
+ break;
+ default:
+ ret = SR_ERR_NA;
}
return ret;
}
static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi,
- const struct sr_probe_group *probe_group)
+ const struct sr_channel_group *cg)
{
GVariant *gvar;
GVariantBuilder gvb;
(void)sdi;
- (void)probe_group;
+ (void)cg;
switch (key) {
case SR_CONF_SCAN_OPTIONS:
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;
usb = sdi->conn;
/* Configures devc->trigger_* and devc->sample_wide */
- if (fx2lafw_configure_probes(sdi) != SR_OK) {
- sr_err("Failed to configure probes.");
+ if (fx2lafw_configure_channels(sdi) != SR_OK) {
+ sr_err("Failed to configure channels.");
return SR_ERR;
}
devc->cb_data = cb_data;
- devc->num_samples = 0;
+ devc->sent_samples = 0;
+ devc->acq_aborted = FALSE;
devc->empty_transfer_count = 0;
timeout = fx2lafw_get_timeout(devc);
devc->submitted_transfers++;
}
- lupfd = libusb_get_pollfds(drvc->sr_ctx->libusb_ctx);
- for (i = 0; lupfd[i]; i++);
- if (!(devc->usbfd = g_try_malloc(sizeof(struct libusb_pollfd) * (i + 1))))
- return SR_ERR;
- for (i = 0; lupfd[i]; i++) {
- sr_source_add(lupfd[i]->fd, lupfd[i]->events,
- timeout, receive_data, NULL);
- 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, NULL);
/* Send header packet to the session bus. */
std_session_send_df_header(cb_data, LOG_PREFIX);
- if ((ret = fx2lafw_command_start_acquisition(usb->devhdl,
- devc->cur_samplerate, devc->sample_wide)) != SR_OK) {
+ if ((ret = fx2lafw_command_start_acquisition(sdi)) != SR_OK) {
fx2lafw_abort_acquisition(devc);
return ret;
}
.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,