]> sigrok.org Git - libsigrok.git/blobdiff - src/hardware/fx2lafw/api.c
fx2lafw: Only run dslogic_stop_acquisition() on DSLogic.
[libsigrok.git] / src / hardware / fx2lafw / api.c
index fc6081b45fb697d1dd83792c8f03137da4040511..076c6a2e721e7da73ddce08fce17948868a4ef96 100644 (file)
@@ -99,7 +99,21 @@ static const struct fx2lafw_profile supported_fx2[] = {
                "fx2lafw-braintechnology-usb-lps.fw",
                DEV_CAPS_16BIT, NULL, NULL },
 
-       { 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+       /*
+        * sigrok FX2 based 8-channel logic analyzer
+        */
+       { 0x1d50, 0x608c, "sigrok", "FX2 LA (8ch)", NULL,
+               "fx2lafw-sigrok-fx2-8ch.fw",
+               0, NULL, NULL},
+
+       /*
+        * sigrok FX2 based 16-channel logic analyzer
+        */
+       { 0x1d50, 0x608d, "sigrok", "FX2 LA (16ch)", NULL,
+               "fx2lafw-sigrok-fx2-16ch.fw",
+               DEV_CAPS_16BIT, NULL, NULL },
+
+       ALL_ZERO
 };
 
 static const uint32_t drvopts[] = {
@@ -360,7 +374,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;
 
@@ -553,11 +567,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;
@@ -698,11 +708,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);
@@ -719,9 +743,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;
@@ -745,6 +771,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;
 }
 
@@ -786,8 +821,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;