]> sigrok.org Git - libsigrok.git/blob - hardware/zeroplus-logic-cube/api.c
build: Portability fixes.
[libsigrok.git] / hardware / zeroplus-logic-cube / api.c
1 /*
2  * This file is part of the libsigrok project.
3  *
4  * Copyright (C) 2010-2012 Bert Vermeulen <bert@biot.com>
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #include "protocol.h"
21
22 #define VENDOR_NAME                     "ZEROPLUS"
23 #define USB_INTERFACE                   0
24 #define USB_CONFIGURATION               1
25 #define NUM_TRIGGER_STAGES              4
26 #define PACKET_SIZE                     2048    /* ?? */
27
28 //#define ZP_EXPERIMENTAL
29
30 struct zp_model {
31         uint16_t vid;
32         uint16_t pid;
33         char *model_name;
34         unsigned int channels;
35         unsigned int sample_depth;      /* In Ksamples/channel */
36         unsigned int max_sampling_freq;
37 };
38
39 /*
40  * Note -- 16032, 16064 and 16128 *usually* -- but not always -- have the
41  * same 128K sample depth.
42  */
43 static const struct zp_model zeroplus_models[] = {
44         {0x0c12, 0x7002, "LAP-16128U",    16, 128,  200},
45         {0x0c12, 0x7009, "LAP-C(16064)",  16, 64,   100},
46         {0x0c12, 0x700a, "LAP-C(16128)",  16, 128,  200},
47         {0x0c12, 0x700b, "LAP-C(32128)",  32, 128,  200},
48         {0x0c12, 0x700c, "LAP-C(321000)", 32, 1024, 200},
49         {0x0c12, 0x700d, "LAP-C(322000)", 32, 2048, 200},
50         {0x0c12, 0x700e, "LAP-C(16032)",  16, 32,   100},
51         {0x0c12, 0x7016, "LAP-C(162000)", 16, 2048, 200},
52         { 0, 0, 0, 0, 0, 0 }
53 };
54
55 static const int32_t hwcaps[] = {
56         SR_CONF_LOGIC_ANALYZER,
57         SR_CONF_SAMPLERATE,
58         SR_CONF_TRIGGER_MATCH,
59         SR_CONF_CAPTURE_RATIO,
60         SR_CONF_VOLTAGE_THRESHOLD,
61         SR_CONF_LIMIT_SAMPLES,
62 };
63
64 static const int32_t trigger_matches[] = {
65         SR_TRIGGER_ZERO,
66         SR_TRIGGER_ONE,
67 };
68
69 /*
70  * ZEROPLUS LAP-C (16032) numbers the 16 channels A0-A7 and B0-B7.
71  * We currently ignore other untested/unsupported devices here.
72  */
73 static const char *channel_names[] = {
74         "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7",
75         "B0", "B1", "B2", "B3", "B4", "B5", "B6", "B7",
76         "C0", "C1", "C2", "C3", "C4", "C5", "C6", "C7",
77         "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
78         NULL,
79 };
80
81 SR_PRIV struct sr_dev_driver zeroplus_logic_cube_driver_info;
82 static struct sr_dev_driver *di = &zeroplus_logic_cube_driver_info;
83
84 /*
85  * The hardware supports more samplerates than these, but these are the
86  * options hardcoded into the vendor's Windows GUI.
87  */
88
89 static const uint64_t samplerates_100[] = {
90         SR_HZ(100),
91         SR_HZ(500),
92         SR_KHZ(1),
93         SR_KHZ(5),
94         SR_KHZ(25),
95         SR_KHZ(50),
96         SR_KHZ(100),
97         SR_KHZ(200),
98         SR_KHZ(400),
99         SR_KHZ(800),
100         SR_MHZ(1),
101         SR_MHZ(10),
102         SR_MHZ(25),
103         SR_MHZ(50),
104         SR_MHZ(80),
105         SR_MHZ(100),
106 };
107
108 const uint64_t samplerates_200[] = {
109         SR_HZ(100),
110         SR_HZ(500),
111         SR_KHZ(1),
112         SR_KHZ(5),
113         SR_KHZ(25),
114         SR_KHZ(50),
115         SR_KHZ(100),
116         SR_KHZ(200),
117         SR_KHZ(400),
118         SR_KHZ(800),
119         SR_MHZ(1),
120         SR_MHZ(10),
121         SR_MHZ(25),
122         SR_MHZ(50),
123         SR_MHZ(80),
124         SR_MHZ(100),
125         SR_MHZ(150),
126         SR_MHZ(200),
127 };
128
129 static int dev_close(struct sr_dev_inst *sdi);
130
131 SR_PRIV int zp_set_samplerate(struct dev_context *devc, uint64_t samplerate)
132 {
133         int i;
134
135         for (i = 0; ARRAY_SIZE(samplerates_200); i++)
136                 if (samplerate == samplerates_200[i])
137                         break;
138
139         if (i == ARRAY_SIZE(samplerates_200) || samplerate > devc->max_samplerate) {
140                 sr_err("Unsupported samplerate: %" PRIu64 "Hz.", samplerate);
141                 return SR_ERR_ARG;
142         }
143
144         sr_info("Setting samplerate to %" PRIu64 "Hz.", samplerate);
145
146         if (samplerate >= SR_MHZ(1))
147                 analyzer_set_freq(samplerate / SR_MHZ(1), FREQ_SCALE_MHZ);
148         else if (samplerate >= SR_KHZ(1))
149                 analyzer_set_freq(samplerate / SR_KHZ(1), FREQ_SCALE_KHZ);
150         else
151                 analyzer_set_freq(samplerate, FREQ_SCALE_HZ);
152
153         devc->cur_samplerate = samplerate;
154
155         return SR_OK;
156 }
157
158 static int init(struct sr_context *sr_ctx)
159 {
160         return std_init(sr_ctx, di, LOG_PREFIX);
161 }
162
163 static GSList *scan(GSList *options)
164 {
165         struct sr_dev_inst *sdi;
166         struct sr_channel *ch;
167         struct drv_context *drvc;
168         struct dev_context *devc;
169         const struct zp_model *prof;
170         struct libusb_device_descriptor des;
171         libusb_device **devlist;
172         GSList *devices;
173         int ret, devcnt, i, j;
174
175         (void)options;
176
177         drvc = di->priv;
178
179         devices = NULL;
180
181         /* Find all ZEROPLUS analyzers and add them to device list. */
182         devcnt = 0;
183         libusb_get_device_list(drvc->sr_ctx->libusb_ctx, &devlist); /* TODO: Errors. */
184
185         for (i = 0; devlist[i]; i++) {
186                 ret = libusb_get_device_descriptor(devlist[i], &des);
187                 if (ret != 0) {
188                         sr_err("Failed to get device descriptor: %s.",
189                                libusb_error_name(ret));
190                         continue;
191                 }
192
193                 prof = NULL;
194                 for (j = 0; j < zeroplus_models[j].vid; j++) {
195                         if (des.idVendor == zeroplus_models[j].vid &&
196                                 des.idProduct == zeroplus_models[j].pid) {
197                                 prof = &zeroplus_models[j];
198                         }
199                 }
200                 /* Skip if the device was not found. */
201                 if (!prof)
202                         continue;
203                 sr_info("Found ZEROPLUS %s.", prof->model_name);
204
205                 /* Register the device with libsigrok. */
206                 if (!(sdi = sr_dev_inst_new(devcnt, SR_ST_INACTIVE,
207                                 VENDOR_NAME, prof->model_name, NULL))) {
208                         sr_err("%s: sr_dev_inst_new failed", __func__);
209                         return NULL;
210                 }
211                 sdi->driver = di;
212
213                 /* Allocate memory for our private driver context. */
214                 if (!(devc = g_try_malloc0(sizeof(struct dev_context)))) {
215                         sr_err("Device context malloc failed.");
216                         return NULL;
217                 }
218
219                 sdi->priv = devc;
220                 devc->prof = prof;
221                 devc->num_channels = prof->channels;
222 #ifdef ZP_EXPERIMENTAL
223                 devc->max_sample_depth = 128 * 1024;
224                 devc->max_samplerate = 200;
225 #else
226                 devc->max_sample_depth = prof->sample_depth * 1024;
227                 devc->max_samplerate = prof->max_sampling_freq;
228 #endif
229                 devc->max_samplerate *= SR_MHZ(1);
230                 devc->memory_size = MEMORY_SIZE_8K;
231                 // memset(devc->trigger_buffer, 0, NUM_TRIGGER_STAGES);
232
233                 /* Fill in channellist according to this device's profile. */
234                 for (j = 0; j < devc->num_channels; j++) {
235                         if (!(ch = sr_channel_new(j, SR_CHANNEL_LOGIC, TRUE,
236                                         channel_names[j])))
237                                 return NULL;
238                         sdi->channels = g_slist_append(sdi->channels, ch);
239                 }
240
241                 devices = g_slist_append(devices, sdi);
242                 drvc->instances = g_slist_append(drvc->instances, sdi);
243                 sdi->inst_type = SR_INST_USB;
244                 sdi->conn = sr_usb_dev_inst_new(
245                         libusb_get_bus_number(devlist[i]),
246                         libusb_get_device_address(devlist[i]), NULL);
247                 devcnt++;
248
249         }
250         libusb_free_device_list(devlist, 1);
251
252         return devices;
253 }
254
255 static GSList *dev_list(void)
256 {
257         return ((struct drv_context *)(di->priv))->instances;
258 }
259
260 static int dev_open(struct sr_dev_inst *sdi)
261 {
262         struct dev_context *devc;
263         struct drv_context *drvc;
264         struct sr_usb_dev_inst *usb;
265         libusb_device **devlist, *dev;
266         struct libusb_device_descriptor des;
267         int device_count, ret, i;
268
269         drvc = di->priv;
270         usb = sdi->conn;
271
272         if (!(devc = sdi->priv)) {
273                 sr_err("%s: sdi->priv was NULL", __func__);
274                 return SR_ERR_ARG;
275         }
276
277         device_count = libusb_get_device_list(drvc->sr_ctx->libusb_ctx,
278                                               &devlist);
279         if (device_count < 0) {
280                 sr_err("Failed to retrieve device list.");
281                 return SR_ERR;
282         }
283
284         dev = NULL;
285         for (i = 0; i < device_count; i++) {
286                 if ((ret = libusb_get_device_descriptor(devlist[i], &des))) {
287                         sr_err("Failed to get device descriptor: %s.",
288                                libusb_error_name(ret));
289                         continue;
290                 }
291                 if (libusb_get_bus_number(devlist[i]) == usb->bus
292                     && libusb_get_device_address(devlist[i]) == usb->address) {
293                         dev = devlist[i];
294                         break;
295                 }
296         }
297         if (!dev) {
298                 sr_err("Device on bus %d address %d disappeared!",
299                        usb->bus, usb->address);
300                 return SR_ERR;
301         }
302
303         if (!(ret = libusb_open(dev, &(usb->devhdl)))) {
304                 sdi->status = SR_ST_ACTIVE;
305                 sr_info("Opened device %d on %d.%d interface %d.",
306                         sdi->index, usb->bus, usb->address, USB_INTERFACE);
307         } else {
308                 sr_err("Failed to open device: %s.", libusb_error_name(ret));
309                 return SR_ERR;
310         }
311
312         ret = libusb_set_configuration(usb->devhdl, USB_CONFIGURATION);
313         if (ret < 0) {
314                 sr_err("Unable to set USB configuration %d: %s.",
315                        USB_CONFIGURATION, libusb_error_name(ret));
316                 return SR_ERR;
317         }
318
319         ret = libusb_claim_interface(usb->devhdl, USB_INTERFACE);
320         if (ret != 0) {
321                 sr_err("Unable to claim interface: %s.",
322                        libusb_error_name(ret));
323                 return SR_ERR;
324         }
325
326         /* Set default configuration after power on. */
327         if (analyzer_read_status(usb->devhdl) == 0)
328                 analyzer_configure(usb->devhdl);
329
330         analyzer_reset(usb->devhdl);
331         analyzer_initialize(usb->devhdl);
332
333         //analyzer_set_memory_size(MEMORY_SIZE_512K);
334         // analyzer_set_freq(g_freq, g_freq_scale);
335         analyzer_set_trigger_count(1);
336         // analyzer_set_ramsize_trigger_address((((100 - g_pre_trigger)
337         // * get_memory_size(g_memory_size)) / 100) >> 2);
338
339 #if 0
340         if (g_double_mode == 1)
341                 analyzer_set_compression(COMPRESSION_DOUBLE);
342         else if (g_compression == 1)
343                 analyzer_set_compression(COMPRESSION_ENABLE);
344         else
345 #endif
346         analyzer_set_compression(COMPRESSION_NONE);
347
348         if (devc->cur_samplerate == 0) {
349                 /* Samplerate hasn't been set. Default to 1MHz. */
350                 analyzer_set_freq(1, FREQ_SCALE_MHZ);
351                 devc->cur_samplerate = SR_MHZ(1);
352         }
353
354         if (devc->cur_threshold == 0)
355                 set_voltage_threshold(devc, 1.5);
356
357         return SR_OK;
358 }
359
360 static int dev_close(struct sr_dev_inst *sdi)
361 {
362         struct sr_usb_dev_inst *usb;
363
364         usb = sdi->conn;
365
366         if (!usb->devhdl)
367                 return SR_ERR;
368
369         sr_info("Closing device %d on %d.%d interface %d.", sdi->index,
370                 usb->bus, usb->address, USB_INTERFACE);
371         libusb_release_interface(usb->devhdl, USB_INTERFACE);
372         libusb_reset_device(usb->devhdl);
373         libusb_close(usb->devhdl);
374         usb->devhdl = NULL;
375         sdi->status = SR_ST_INACTIVE;
376
377         return SR_OK;
378 }
379
380 static int cleanup(void)
381 {
382         return std_dev_clear(di, NULL);
383 }
384
385 static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi,
386                 const struct sr_channel_group *cg)
387 {
388         struct dev_context *devc;
389
390         (void)cg;
391
392         switch (id) {
393         case SR_CONF_SAMPLERATE:
394                 if (sdi) {
395                         devc = sdi->priv;
396                         *data = g_variant_new_uint64(devc->cur_samplerate);
397                         sr_spew("Returning samplerate: %" PRIu64 "Hz.",
398                                 devc->cur_samplerate);
399                 } else
400                         return SR_ERR_ARG;
401                 break;
402         case SR_CONF_CAPTURE_RATIO:
403                 if (sdi) {
404                         devc = sdi->priv;
405                         *data = g_variant_new_uint64(devc->capture_ratio);
406                 } else
407                         return SR_ERR_ARG;
408                 break;
409         case SR_CONF_VOLTAGE_THRESHOLD:
410                 if (sdi) {
411                         GVariant *range[2];
412                         devc = sdi->priv;
413                         range[0] = g_variant_new_double(devc->cur_threshold);
414                         range[1] = g_variant_new_double(devc->cur_threshold);
415                         *data = g_variant_new_tuple(range, 2);
416                 } else
417                         return SR_ERR_ARG;
418                 break;
419         default:
420                 return SR_ERR_NA;
421         }
422
423         return SR_OK;
424 }
425
426 static int config_set(int id, GVariant *data, const struct sr_dev_inst *sdi,
427                 const struct sr_channel_group *cg)
428 {
429         struct dev_context *devc;
430         gdouble low, high;
431
432         (void)cg;
433
434         if (sdi->status != SR_ST_ACTIVE)
435                 return SR_ERR_DEV_CLOSED;
436
437         if (!(devc = sdi->priv)) {
438                 sr_err("%s: sdi->priv was NULL", __func__);
439                 return SR_ERR_ARG;
440         }
441
442         switch (id) {
443         case SR_CONF_SAMPLERATE:
444                 return zp_set_samplerate(devc, g_variant_get_uint64(data));
445         case SR_CONF_LIMIT_SAMPLES:
446                 return set_limit_samples(devc, g_variant_get_uint64(data));
447         case SR_CONF_CAPTURE_RATIO:
448                 return set_capture_ratio(devc, g_variant_get_uint64(data));
449         case SR_CONF_VOLTAGE_THRESHOLD:
450                 g_variant_get(data, "(dd)", &low, &high);
451                 return set_voltage_threshold(devc, (low + high) / 2.0);
452         default:
453                 return SR_ERR_NA;
454         }
455
456         return SR_OK;
457 }
458
459 static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi,
460                 const struct sr_channel_group *cg)
461 {
462         struct dev_context *devc;
463         GVariant *gvar, *grange[2];
464         GVariantBuilder gvb;
465         double v;
466         GVariant *range[2];
467
468         (void)cg;
469
470         switch (key) {
471         case SR_CONF_DEVICE_OPTIONS:
472                 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_INT32,
473                                 hwcaps, ARRAY_SIZE(hwcaps), sizeof(int32_t));
474                 break;
475         case SR_CONF_SAMPLERATE:
476                 devc = sdi->priv;
477                 g_variant_builder_init(&gvb, G_VARIANT_TYPE("a{sv}"));
478                 if (devc->prof->max_sampling_freq == 100) {
479                         gvar = g_variant_new_fixed_array(G_VARIANT_TYPE("t"),
480                                         samplerates_100, ARRAY_SIZE(samplerates_100),
481                                         sizeof(uint64_t));
482                 } else if (devc->prof->max_sampling_freq == 200) {
483                         gvar = g_variant_new_fixed_array(G_VARIANT_TYPE("t"),
484                                         samplerates_200, ARRAY_SIZE(samplerates_200),
485                                         sizeof(uint64_t));
486                 } else {
487                         sr_err("Internal error: Unknown max. samplerate: %d.",
488                                devc->prof->max_sampling_freq);
489                         return SR_ERR_ARG;
490                 }
491                 g_variant_builder_add(&gvb, "{sv}", "samplerates", gvar);
492                 *data = g_variant_builder_end(&gvb);
493                 break;
494         case SR_CONF_TRIGGER_MATCH:
495                 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_INT32,
496                                 trigger_matches, ARRAY_SIZE(trigger_matches),
497                                 sizeof(int32_t));
498                 break;
499         case SR_CONF_VOLTAGE_THRESHOLD:
500                 g_variant_builder_init(&gvb, G_VARIANT_TYPE_ARRAY);
501                 for (v = -6.0; v <= 6.0; v += 0.1) {
502                         range[0] = g_variant_new_double(v);
503                         range[1] = g_variant_new_double(v);
504                         gvar = g_variant_new_tuple(range, 2);
505                         g_variant_builder_add_value(&gvb, gvar);
506                 }
507                 *data = g_variant_builder_end(&gvb);
508                 break;
509         case SR_CONF_LIMIT_SAMPLES:
510                 if (!sdi)
511                         return SR_ERR_ARG;
512                 devc = sdi->priv;
513                 grange[0] = g_variant_new_uint64(0);
514                 grange[1] = g_variant_new_uint64(devc->max_sample_depth);
515                 *data = g_variant_new_tuple(grange, 2);
516                 break;
517         default:
518                 return SR_ERR_NA;
519         }
520
521         return SR_OK;
522 }
523
524 static int dev_acquisition_start(const struct sr_dev_inst *sdi,
525                 void *cb_data)
526 {
527         struct dev_context *devc;
528         struct sr_usb_dev_inst *usb;
529         struct sr_datafeed_packet packet;
530         struct sr_datafeed_logic logic;
531         unsigned int samples_read;
532         int res;
533         unsigned int packet_num, n;
534         unsigned char *buf;
535         unsigned int status;
536         unsigned int stop_address;
537         unsigned int now_address;
538         unsigned int trigger_address;
539         unsigned int trigger_offset;
540         unsigned int triggerbar;
541         unsigned int ramsize_trigger;
542         unsigned int memory_size;
543         unsigned int valid_samples;
544         unsigned int discard;
545         int trigger_now;
546
547         if (sdi->status != SR_ST_ACTIVE)
548                 return SR_ERR_DEV_CLOSED;
549
550         if (!(devc = sdi->priv)) {
551                 sr_err("%s: sdi->priv was NULL", __func__);
552                 return SR_ERR_ARG;
553         }
554
555         if (analyzer_add_triggers(sdi) != SR_OK) {
556                 sr_err("Failed to configure triggers.");
557                 return SR_ERR;
558         }
559
560         usb = sdi->conn;
561
562         set_triggerbar(devc);
563
564         /* Push configured settings to device. */
565         analyzer_configure(usb->devhdl);
566
567         analyzer_start(usb->devhdl);
568         sr_info("Waiting for data.");
569         analyzer_wait_data(usb->devhdl);
570
571         status = analyzer_read_status(usb->devhdl);
572         stop_address = analyzer_get_stop_address(usb->devhdl);
573         now_address = analyzer_get_now_address(usb->devhdl);
574         trigger_address = analyzer_get_trigger_address(usb->devhdl);
575
576         triggerbar = analyzer_get_triggerbar_address();
577         ramsize_trigger = analyzer_get_ramsize_trigger_address();
578
579         n = get_memory_size(devc->memory_size);
580         memory_size = n / 4;
581
582         sr_info("Status = 0x%x.", status);
583         sr_info("Stop address       = 0x%x.", stop_address);
584         sr_info("Now address        = 0x%x.", now_address);
585         sr_info("Trigger address    = 0x%x.", trigger_address);
586         sr_info("Triggerbar address = 0x%x.", triggerbar);
587         sr_info("Ramsize trigger    = 0x%x.", ramsize_trigger);
588         sr_info("Memory size        = 0x%x.", memory_size);
589
590         /* Send header packet to the session bus. */
591         std_session_send_df_header(cb_data, LOG_PREFIX);
592
593         /* Check for empty capture */
594         if ((status & STATUS_READY) && !stop_address) {
595                 packet.type = SR_DF_END;
596                 sr_session_send(cb_data, &packet);
597                 return SR_OK;
598         }
599
600         if (!(buf = g_try_malloc(PACKET_SIZE))) {
601                 sr_err("Packet buffer malloc failed.");
602                 return SR_ERR_MALLOC;
603         }
604
605         /* Check if the trigger is in the samples we are throwing away */
606         trigger_now = now_address == trigger_address ||
607                 ((now_address + 1) % memory_size) == trigger_address;
608
609         /*
610          * STATUS_READY doesn't clear until now_address advances past
611          * addr 0, but for our logic, clear it in that case
612          */
613         if (!now_address)
614                 status &= ~STATUS_READY;
615
616         analyzer_read_start(usb->devhdl);
617
618         /* Calculate how much data to discard */
619         discard = 0;
620         if (status & STATUS_READY) {
621                 /*
622                  * We haven't wrapped around, we need to throw away data from
623                  * our current position to the end of the buffer.
624                  * Additionally, the first two samples captured are always
625                  * bogus.
626                  */
627                 discard += memory_size - now_address + 2;
628                 now_address = 2;
629         }
630
631         /* If we have more samples than we need, discard them */
632         valid_samples = (stop_address - now_address) % memory_size;
633         if (valid_samples > ramsize_trigger + triggerbar) {
634                 discard += valid_samples - (ramsize_trigger + triggerbar);
635                 now_address += valid_samples - (ramsize_trigger + triggerbar);
636         }
637
638         sr_info("Need to discard %d samples.", discard);
639
640         /* Calculate how far in the trigger is */
641         if (trigger_now)
642                 trigger_offset = 0;
643         else
644                 trigger_offset = (trigger_address - now_address) % memory_size;
645
646         /* Recalculate the number of samples available */
647         valid_samples = (stop_address - now_address) % memory_size;
648
649         /* Send the incoming transfer to the session bus. */
650         samples_read = 0;
651         for (packet_num = 0; packet_num < n / PACKET_SIZE; packet_num++) {
652                 unsigned int len;
653                 unsigned int buf_offset;
654
655                 res = analyzer_read_data(usb->devhdl, buf, PACKET_SIZE);
656                 sr_info("Tried to read %d bytes, actually read %d bytes.",
657                         PACKET_SIZE, res);
658
659                 if (discard >= PACKET_SIZE / 4) {
660                         discard -= PACKET_SIZE / 4;
661                         continue;
662                 }
663
664                 len = PACKET_SIZE - discard * 4;
665                 buf_offset = discard * 4;
666                 discard = 0;
667
668                 /* Check if we've read all the samples */
669                 if (samples_read + len / 4 >= valid_samples)
670                         len = (valid_samples - samples_read) * 4;
671                 if (!len)
672                         break;
673
674                 if (samples_read < trigger_offset &&
675                     samples_read + len / 4 > trigger_offset) {
676                         /* Send out samples remaining before trigger */
677                         packet.type = SR_DF_LOGIC;
678                         packet.payload = &logic;
679                         logic.length = (trigger_offset - samples_read) * 4;
680                         logic.unitsize = 4;
681                         logic.data = buf + buf_offset;
682                         sr_session_send(cb_data, &packet);
683                         len -= logic.length;
684                         samples_read += logic.length / 4;
685                         buf_offset += logic.length;
686                 }
687
688                 if (samples_read == trigger_offset) {
689                         /* Send out trigger */
690                         packet.type = SR_DF_TRIGGER;
691                         packet.payload = NULL;
692                         sr_session_send(cb_data, &packet);
693                 }
694
695                 /* Send out data (or data after trigger) */
696                 packet.type = SR_DF_LOGIC;
697                 packet.payload = &logic;
698                 logic.length = len;
699                 logic.unitsize = 4;
700                 logic.data = buf + buf_offset;
701                 sr_session_send(cb_data, &packet);
702                 samples_read += len / 4;
703         }
704         analyzer_read_stop(usb->devhdl);
705         g_free(buf);
706
707         packet.type = SR_DF_END;
708         sr_session_send(cb_data, &packet);
709
710         return SR_OK;
711 }
712
713 /* TODO: This stops acquisition on ALL devices, ignoring dev_index. */
714 static int dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data)
715 {
716         struct dev_context *devc;
717         struct sr_usb_dev_inst *usb;
718         struct sr_datafeed_packet packet;
719
720         packet.type = SR_DF_END;
721         sr_session_send(cb_data, &packet);
722
723         if (!(devc = sdi->priv)) {
724                 sr_err("%s: sdi->priv was NULL", __func__);
725                 return SR_ERR_BUG;
726         }
727
728         usb = sdi->conn;
729         analyzer_reset(usb->devhdl);
730         /* TODO: Need to cancel and free any queued up transfers. */
731
732         return SR_OK;
733 }
734
735 SR_PRIV struct sr_dev_driver zeroplus_logic_cube_driver_info = {
736         .name = "zeroplus-logic-cube",
737         .longname = "ZEROPLUS Logic Cube LAP-C series",
738         .api_version = 1,
739         .init = init,
740         .cleanup = cleanup,
741         .scan = scan,
742         .dev_list = dev_list,
743         .dev_clear = NULL,
744         .config_get = config_get,
745         .config_set = config_set,
746         .config_list = config_list,
747         .dev_open = dev_open,
748         .dev_close = dev_close,
749         .dev_acquisition_start = dev_acquisition_start,
750         .dev_acquisition_stop = dev_acquisition_stop,
751         .priv = NULL,
752 };