*/
{ 0x08a9, 0x0014, "CWAV", "USBee AX", NULL,
"fx2lafw-cwav-usbeeax.fw",
- 0, NULL, NULL},
+ DEV_CAPS_AX_ANALOG, NULL, NULL},
/*
* CWAV USBee DX
* XZL-Studio DX
"fx2lafw-sigrok-fx2-16ch.fw",
DEV_CAPS_16BIT, NULL, NULL },
- { 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+ ALL_ZERO
};
static const uint32_t drvopts[] = {
"8", "9", "10", "11", "12", "13", "14", "15",
};
+static const char *ax_channel_names[] = {
+ "A0",
+};
+
static const int32_t soft_trigger_matches[] = {
SR_TRIGGER_ZERO,
SR_TRIGGER_ONE,
struct libusb_device_descriptor des;
libusb_device **devlist;
struct libusb_device_handle *hdl;
- int num_logic_channels, ret, i, j;
+ int ret, i, j;
+ int num_logic_channels = 0, num_analog_channels = 0;
const char *conn;
char manufacturer[64], product[64], serial_num[64], connection_id[64];
/* Fill in channellist according to this device's profile. */
num_logic_channels = prof->dev_caps & DEV_CAPS_16BIT ? 16 : 8;
+ num_analog_channels = prof->dev_caps & DEV_CAPS_AX_ANALOG ? 1 : 0;
+
for (j = 0; j < num_logic_channels; j++)
sr_channel_new(sdi, j, SR_CHANNEL_LOGIC, TRUE,
channel_names[j]);
+ for (j = 0; j < num_analog_channels; j++)
+ sr_channel_new(sdi, j, SR_CHANNEL_ANALOG, TRUE,
+ ax_channel_names[j]);
+
devc = fx2lafw_dev_new();
devc->profile = prof;
devc->sample_wide = (prof->dev_caps & DEV_CAPS_16BIT) != 0;
struct sr_dev_driver *di = sdi->driver;
struct sr_usb_dev_inst *usb;
struct dev_context *devc;
- char *fpga_firmware = NULL;
+ const char *fpga_firmware = NULL;
int ret;
int64_t timediff_us, timediff_ms;
break;
case SR_CONF_CAPTURE_RATIO:
devc->capture_ratio = g_variant_get_uint64(data);
- if (devc->capture_ratio > 100) {
- devc->capture_ratio = 0;
- ret = SR_ERR;
- } else
- ret = SR_OK;
+ ret = (devc->capture_ratio > 100) ? SR_ERR : SR_OK;
break;
default:
ret = SR_ERR_NA;
static void LIBUSB_CALL dslogic_trigger_receive(struct libusb_transfer *transfer)
{
const struct sr_dev_inst *sdi;
+ struct sr_datafeed_packet packet;
struct dslogic_trigger_pos *tpos;
+ struct dev_context *devc;
sdi = transfer->user_data;
-
- if (transfer->status == LIBUSB_TRANSFER_COMPLETED
+ devc = sdi->priv;
+ if (transfer->status == LIBUSB_TRANSFER_CANCELLED) {
+ sr_dbg("Trigger transfer canceled.");
+ /* Terminate session. */
+ packet.type = SR_DF_END;
+ sr_session_send(sdi, &packet);
+ usb_source_remove(sdi->session, devc->ctx);
+ devc->num_transfers = 0;
+ g_free(devc->transfers);
+ if (devc->stl) {
+ soft_trigger_logic_free(devc->stl);
+ devc->stl = NULL;
+ }
+ } else if (transfer->status == LIBUSB_TRANSFER_COMPLETED
&& transfer->actual_length == sizeof(struct dslogic_trigger_pos)) {
tpos = (struct dslogic_trigger_pos *)transfer->buffer;
sr_dbg("tpos real_pos %.8x ram_saddr %.8x", tpos->real_pos, tpos->ram_saddr);
struct sr_usb_dev_inst *usb;
struct libusb_transfer *transfer;
struct dslogic_trigger_pos *tpos;
+ struct dev_context *devc;
int ret;
usb = sdi->conn;
+ devc = sdi->priv;
if ((ret = dslogic_stop_acquisition(sdi)) != SR_OK)
return ret;
return SR_ERR;
}
+ devc->transfers = g_try_malloc0(sizeof(*devc->transfers));
+ if (!devc->transfers) {
+ sr_err("USB trigger_pos transfer malloc failed.");
+ return SR_ERR_MALLOC;
+ }
+ devc->num_transfers = 1;
+ devc->submitted_transfers++;
+ devc->transfers[0] = transfer;
+
return ret;
}
static int dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data)
{
+ struct dev_context *devc;
+
(void)cb_data;
+ devc = sdi->priv;
+
+ if (devc->dslogic)
+ dslogic_stop_acquisition(sdi);
+
fx2lafw_abort_acquisition(sdi->priv);
return SR_OK;