]> sigrok.org Git - libsigrok.git/blobdiff - src/hardware/kingst-la2016/api.c
output/csv: use intermediate time_t var, silence compiler warning
[libsigrok.git] / src / hardware / kingst-la2016 / api.c
index 742f3e3ae6a0a3155e2516e32903894db4770c84..5a4ee6fa2ad48add223df0057ac6b1aefc4ebf9d 100644 (file)
@@ -198,15 +198,21 @@ static void kingst_la2016_free_devc(struct dev_context *devc)
 /* Convenience. Release an allocated sdi from error paths. */
 static void kingst_la2016_free_sdi(struct sr_dev_inst *sdi)
 {
+       struct sr_usb_dev_inst *usb;
+       struct dev_context *devc;
+
        if (!sdi)
                return;
-       g_free(sdi->vendor);
-       g_free(sdi->model);
-       g_free(sdi->version);
-       g_free(sdi->serial_num);
-       g_free(sdi->connection_id);
-       sr_usb_dev_inst_free(sdi->conn);
-       kingst_la2016_free_devc(sdi->priv);
+
+       usb = sdi->conn;
+       if (usb && usb->devhdl)
+               sr_usb_close(usb);
+       sr_usb_dev_inst_free(usb);
+
+       devc = sdi->priv;
+       kingst_la2016_free_devc(devc);
+
+       sr_dev_inst_free(sdi);
 }
 
 /* Convenience. Open a USB device (including claiming an interface). */
@@ -1035,7 +1041,7 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi)
        struct drv_context *drvc;
        struct sr_context *ctx;
        struct dev_context *devc;
-       size_t unitsize;
+       size_t unitsize, xfersize, repsize, seqsize;
        double voltage;
        int ret;
 
@@ -1045,21 +1051,35 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi)
        devc = sdi->priv;
 
        if (!devc->feed_queue) {
-               if (devc->model->channel_count == 32)
+               /*
+                * TODO
+                * Move this into protocol.c which concentrates the
+                * wire format. The api.c source should not bother.
+                */
+               if (devc->model->channel_count == 32) {
                        unitsize = sizeof(uint32_t);
-               else if (devc->model->channel_count == 16)
+                       repsize = sizeof(uint8_t);
+                       seqsize = 2 * sizeof(uint8_t);
+                       xfersize = 32;
+               } else if (devc->model->channel_count == 16) {
                        unitsize = sizeof(uint16_t);
-               else
+                       repsize = sizeof(uint8_t);
+                       seqsize = 1 * sizeof(uint8_t);
+                       xfersize = 16;
+               } else {
                        return SR_ERR_ARG;
+               }
                devc->feed_queue = feed_queue_logic_alloc(sdi,
                        LA2016_CONVBUFFER_SIZE, unitsize);
                if (!devc->feed_queue) {
                        sr_err("Cannot allocate buffer for session feed.");
                        return SR_ERR_MALLOC;
                }
-               devc->packets_per_chunk = TRANSFER_PACKET_LENGTH;
-               devc->packets_per_chunk--;
-               devc->packets_per_chunk /= unitsize + sizeof(uint8_t);
+               devc->transfer_size = xfersize;
+               devc->sequence_size = seqsize;
+               devc->packets_per_chunk = xfersize;
+               devc->packets_per_chunk -= seqsize;
+               devc->packets_per_chunk /= unitsize + repsize;
        }
 
        sr_sw_limits_acquisition_start(&devc->sw_limits);