X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Ffx2lafw%2Fapi.c;h=024680364209804725fa5fd45e8aba2b4a7903aa;hb=232a975fe2268c9d7cf9681770e966ecea8a0376;hp=e4749f4ebe4cfa72da1f89519efa61c48e8135e5;hpb=3e91de2bd679e253570df91e4010f2a7c403f8c1;p=libsigrok.git diff --git a/src/hardware/fx2lafw/api.c b/src/hardware/fx2lafw/api.c index e4749f4e..02468036 100644 --- a/src/hardware/fx2lafw/api.c +++ b/src/hardware/fx2lafw/api.c @@ -30,7 +30,7 @@ static const struct fx2lafw_profile supported_fx2[] = { */ { 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 @@ -103,17 +103,17 @@ static const struct fx2lafw_profile supported_fx2[] = { * sigrok FX2 based 8-channel logic analyzer */ { 0x1d50, 0x608c, "sigrok", "FX2 LA (8ch)", NULL, - FIRMWARE_DIR "/fx2lafw-sigrok-fx2-8ch.fw", + "fx2lafw-sigrok-fx2-8ch.fw", 0, NULL, NULL}, /* * sigrok FX2 based 16-channel logic analyzer */ { 0x1d50, 0x608d, "sigrok", "FX2 LA (16ch)", NULL, - FIRMWARE_DIR "/fx2lafw-sigrok-fx2-16ch.fw", + "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[] = { @@ -138,6 +138,10 @@ static const char *channel_names[] = { "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, @@ -204,7 +208,8 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) 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]; @@ -309,10 +314,16 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) /* 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; @@ -374,7 +385,7 @@ static int dev_open(struct sr_dev_inst *sdi) 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; @@ -567,11 +578,7 @@ static int config_set(uint32_t key, GVariant *data, const struct sr_dev_inst *sd 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; @@ -712,11 +719,25 @@ static int start_transfers(const struct sr_dev_inst *sdi) 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); @@ -733,9 +754,11 @@ static int dslogic_trigger_request(const struct sr_dev_inst *sdi) 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; @@ -759,6 +782,15 @@ static int dslogic_trigger_request(const struct sr_dev_inst *sdi) 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; } @@ -800,8 +832,15 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data) 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;