]> sigrok.org Git - libsigrok.git/blob - src/hardware/hantek-dso/api.c
hantek-dso: Properly zero out MQ flags.
[libsigrok.git] / src / hardware / hantek-dso / api.c
1 /*
2  * This file is part of the libsigrok project.
3  *
4  * Copyright (C) 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 <stdio.h>
21 #include <stdint.h>
22 #include <stdlib.h>
23 #include <sys/types.h>
24 #include <sys/stat.h>
25 #include <fcntl.h>
26 #include <unistd.h>
27 #include <string.h>
28 #include <sys/time.h>
29 #include <inttypes.h>
30 #include <glib.h>
31 #include <libusb.h>
32 #include "libsigrok.h"
33 #include "libsigrok-internal.h"
34 #include "dso.h"
35
36 /* Max time in ms before we want to check on USB events */
37 /* TODO tune this properly */
38 #define TICK 1
39
40 #define NUM_TIMEBASE  10
41 #define NUM_VDIV      8
42
43 static const uint32_t scanopts[] = {
44         SR_CONF_CONN,
45 };
46
47 static const uint32_t devopts[] = {
48         SR_CONF_OSCILLOSCOPE,
49         SR_CONF_CONTINUOUS,
50         SR_CONF_CONN | SR_CONF_GET,
51         SR_CONF_LIMIT_FRAMES | SR_CONF_SET,
52         SR_CONF_TIMEBASE | SR_CONF_SET | SR_CONF_LIST,
53         SR_CONF_BUFFERSIZE | SR_CONF_SET | SR_CONF_LIST,
54         SR_CONF_TRIGGER_SOURCE | SR_CONF_SET | SR_CONF_LIST,
55         SR_CONF_TRIGGER_SLOPE | SR_CONF_SET,
56         SR_CONF_HORIZ_TRIGGERPOS | SR_CONF_SET,
57         SR_CONF_FILTER | SR_CONF_SET | SR_CONF_LIST,
58         SR_CONF_VDIV | SR_CONF_SET | SR_CONF_LIST,
59         SR_CONF_COUPLING | SR_CONF_SET | SR_CONF_LIST,
60         SR_CONF_NUM_TIMEBASE | SR_CONF_GET,
61         SR_CONF_NUM_VDIV | SR_CONF_GET,
62 };
63
64 static const char *channel_names[] = {
65         "CH1", "CH2",
66         NULL,
67 };
68
69 static const uint64_t buffersizes_32k[] = {
70         10240, 32768,
71 };
72 static const uint64_t buffersizes_512k[] = {
73         10240, 524288,
74 };
75 static const uint64_t buffersizes_14k[] = {
76         10240, 14336,
77 };
78
79 static const struct dso_profile dev_profiles[] = {
80         {       0x04b4, 0x2090, 0x04b5, 0x2090,
81                 "Hantek", "DSO-2090",
82                 buffersizes_32k,
83                 FIRMWARE_DIR "/hantek-dso-2090.fw" },
84         {       0x04b4, 0x2150, 0x04b5, 0x2150,
85                 "Hantek", "DSO-2150",
86                 buffersizes_32k,
87                 FIRMWARE_DIR "/hantek-dso-2150.fw" },
88         {       0x04b4, 0x2250, 0x04b5, 0x2250,
89                 "Hantek", "DSO-2250",
90                 buffersizes_512k,
91                 FIRMWARE_DIR "/hantek-dso-2250.fw" },
92         {       0x04b4, 0x5200, 0x04b5, 0x5200,
93                 "Hantek", "DSO-5200",
94                 buffersizes_14k,
95                 FIRMWARE_DIR "/hantek-dso-5200.fw" },
96         {       0x04b4, 0x520a, 0x04b5, 0x520a,
97                 "Hantek", "DSO-5200A",
98                 buffersizes_512k,
99                 FIRMWARE_DIR "/hantek-dso-5200A.fw" },
100         { 0, 0, 0, 0, 0, 0, 0, 0 },
101 };
102
103 static const uint64_t timebases[][2] = {
104         /* microseconds */
105         { 10, 1000000 },
106         { 20, 1000000 },
107         { 40, 1000000 },
108         { 100, 1000000 },
109         { 200, 1000000 },
110         { 400, 1000000 },
111         /* milliseconds */
112         { 1, 1000 },
113         { 2, 1000 },
114         { 4, 1000 },
115         { 10, 1000 },
116         { 20, 1000 },
117         { 40, 1000 },
118         { 100, 1000 },
119         { 200, 1000 },
120         { 400, 1000 },
121 };
122
123 static const uint64_t vdivs[][2] = {
124         /* millivolts */
125         { 10, 1000 },
126         { 20, 1000 },
127         { 50, 1000 },
128         { 100, 1000 },
129         { 200, 1000 },
130         { 500, 1000 },
131         /* volts */
132         { 1, 1 },
133         { 2, 1 },
134         { 5, 1 },
135 };
136
137 static const char *trigger_sources[] = {
138         "CH1",
139         "CH2",
140         "EXT",
141         /* TODO: forced */
142 };
143
144 static const char *filter_targets[] = {
145         "CH1",
146         "CH2",
147         /* TODO: "TRIGGER", */
148 };
149
150 static const char *coupling[] = {
151         "AC",
152         "DC",
153         "GND",
154 };
155
156 SR_PRIV struct sr_dev_driver hantek_dso_driver_info;
157 static struct sr_dev_driver *di = &hantek_dso_driver_info;
158
159 static int dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data);
160
161 static struct sr_dev_inst *dso_dev_new(const struct dso_profile *prof)
162 {
163         struct sr_dev_inst *sdi;
164         struct sr_channel *ch;
165         struct drv_context *drvc;
166         struct dev_context *devc;
167         int i;
168
169         sdi = sr_dev_inst_new(SR_ST_INITIALIZING,
170                 prof->vendor, prof->model, NULL);
171         if (!sdi)
172                 return NULL;
173         sdi->driver = di;
174
175         /*
176          * Add only the real channels -- EXT isn't a source of data, only
177          * a trigger source internal to the device.
178          */
179         for (i = 0; channel_names[i]; i++) {
180                 if (!(ch = sr_channel_new(i, SR_CHANNEL_ANALOG, TRUE,
181                                 channel_names[i])))
182                         return NULL;
183                 sdi->channels = g_slist_append(sdi->channels, ch);
184         }
185
186         if (!(devc = g_try_malloc0(sizeof(struct dev_context)))) {
187                 sr_err("Device context malloc failed.");
188                 return NULL;
189         }
190
191         devc->profile = prof;
192         devc->dev_state = IDLE;
193         devc->timebase = DEFAULT_TIMEBASE;
194         devc->ch1_enabled = TRUE;
195         devc->ch2_enabled = TRUE;
196         devc->voltage_ch1 = DEFAULT_VOLTAGE;
197         devc->voltage_ch2 = DEFAULT_VOLTAGE;
198         devc->coupling_ch1 = DEFAULT_COUPLING;
199         devc->coupling_ch2 = DEFAULT_COUPLING;
200         devc->voffset_ch1 = DEFAULT_VERT_OFFSET;
201         devc->voffset_ch2 = DEFAULT_VERT_OFFSET;
202         devc->voffset_trigger = DEFAULT_VERT_TRIGGERPOS;
203         devc->framesize = DEFAULT_FRAMESIZE;
204         devc->triggerslope = SLOPE_POSITIVE;
205         devc->triggersource = g_strdup(DEFAULT_TRIGGER_SOURCE);
206         devc->triggerposition = DEFAULT_HORIZ_TRIGGERPOS;
207         sdi->priv = devc;
208         drvc = di->priv;
209         drvc->instances = g_slist_append(drvc->instances, sdi);
210
211         return sdi;
212 }
213
214 static int configure_channels(const struct sr_dev_inst *sdi)
215 {
216         struct dev_context *devc;
217         struct sr_channel *ch;
218         const GSList *l;
219         int p;
220
221         devc = sdi->priv;
222
223         g_slist_free(devc->enabled_channels);
224         devc->ch1_enabled = devc->ch2_enabled = FALSE;
225         for (l = sdi->channels, p = 0; l; l = l->next, p++) {
226                 ch = l->data;
227                 if (p == 0)
228                         devc->ch1_enabled = ch->enabled;
229                 else
230                         devc->ch2_enabled = ch->enabled;
231                 if (ch->enabled)
232                         devc->enabled_channels = g_slist_append(devc->enabled_channels, ch);
233         }
234
235         return SR_OK;
236 }
237
238 static void clear_dev_context(void *priv)
239 {
240         struct dev_context *devc;
241
242         devc = priv;
243         g_free(devc->triggersource);
244         g_slist_free(devc->enabled_channels);
245
246 }
247
248 static int dev_clear(void)
249 {
250         return std_dev_clear(di, clear_dev_context);
251 }
252
253 static int init(struct sr_context *sr_ctx)
254 {
255         return std_init(sr_ctx, di, LOG_PREFIX);
256 }
257
258 static GSList *scan(GSList *options)
259 {
260         struct drv_context *drvc;
261         struct dev_context *devc;
262         struct sr_dev_inst *sdi;
263         struct sr_usb_dev_inst *usb;
264         struct sr_config *src;
265         const struct dso_profile *prof;
266         GSList *l, *devices, *conn_devices;
267         struct libusb_device_descriptor des;
268         libusb_device **devlist;
269         int ret, i, j;
270         const char *conn;
271         char connection_id[64];
272
273         drvc = di->priv;
274
275         devices = 0;
276
277         conn = NULL;
278         for (l = options; l; l = l->next) {
279                 src = l->data;
280                 if (src->key == SR_CONF_CONN) {
281                         conn = g_variant_get_string(src->data, NULL);
282                         break;
283                 }
284         }
285         if (conn)
286                 conn_devices = sr_usb_find(drvc->sr_ctx->libusb_ctx, conn);
287         else
288                 conn_devices = NULL;
289
290         /* Find all Hantek DSO devices and upload firmware to all of them. */
291         libusb_get_device_list(drvc->sr_ctx->libusb_ctx, &devlist);
292         for (i = 0; devlist[i]; i++) {
293                 if (conn) {
294                         usb = NULL;
295                         for (l = conn_devices; l; l = l->next) {
296                                 usb = l->data;
297                                 if (usb->bus == libusb_get_bus_number(devlist[i])
298                                         && usb->address == libusb_get_device_address(devlist[i]))
299                                         break;
300                         }
301                         if (!l)
302                                 /* This device matched none of the ones that
303                                  * matched the conn specification. */
304                                 continue;
305                 }
306
307                 if ((ret = libusb_get_device_descriptor(devlist[i], &des))) {
308                         sr_err("Failed to get device descriptor: %s.",
309                                         libusb_error_name(ret));
310                         continue;
311                 }
312
313                 usb_get_port_path(devlist[i], connection_id, sizeof(connection_id));
314
315                 prof = NULL;
316                 for (j = 0; dev_profiles[j].orig_vid; j++) {
317                         if (des.idVendor == dev_profiles[j].orig_vid
318                                 && des.idProduct == dev_profiles[j].orig_pid) {
319                                 /* Device matches the pre-firmware profile. */
320                                 prof = &dev_profiles[j];
321                                 sr_dbg("Found a %s %s.", prof->vendor, prof->model);
322                                 sdi = dso_dev_new(prof);
323                                 sdi->connection_id = g_strdup(connection_id);
324                                 devices = g_slist_append(devices, sdi);
325                                 devc = sdi->priv;
326                                 if (ezusb_upload_firmware(devlist[i], USB_CONFIGURATION,
327                                                 prof->firmware) == SR_OK)
328                                         /* Remember when the firmware on this device was updated */
329                                         devc->fw_updated = g_get_monotonic_time();
330                                 else
331                                         sr_err("Firmware upload failed");
332                                 /* Dummy USB address of 0xff will get overwritten later. */
333                                 sdi->conn = sr_usb_dev_inst_new(
334                                                 libusb_get_bus_number(devlist[i]), 0xff, NULL);
335                                 break;
336                         } else if (des.idVendor == dev_profiles[j].fw_vid
337                                 && des.idProduct == dev_profiles[j].fw_pid) {
338                                 /* Device matches the post-firmware profile. */
339                                 prof = &dev_profiles[j];
340                                 sr_dbg("Found a %s %s.", prof->vendor, prof->model);
341                                 sdi = dso_dev_new(prof);
342                                 sdi->connection_id = g_strdup(connection_id);
343                                 sdi->status = SR_ST_INACTIVE;
344                                 devices = g_slist_append(devices, sdi);
345                                 sdi->inst_type = SR_INST_USB;
346                                 sdi->conn = sr_usb_dev_inst_new(
347                                                 libusb_get_bus_number(devlist[i]),
348                                                 libusb_get_device_address(devlist[i]), NULL);
349                                 break;
350                         }
351                 }
352                 if (!prof)
353                         /* not a supported VID/PID */
354                         continue;
355         }
356         libusb_free_device_list(devlist, 1);
357
358         return devices;
359 }
360
361 static GSList *dev_list(void)
362 {
363         return ((struct drv_context *)(di->priv))->instances;
364 }
365
366 static int dev_open(struct sr_dev_inst *sdi)
367 {
368         struct dev_context *devc;
369         struct sr_usb_dev_inst *usb;
370         int64_t timediff_us, timediff_ms;
371         int err;
372
373         devc = sdi->priv;
374         usb = sdi->conn;
375
376         /*
377          * If the firmware was recently uploaded, wait up to MAX_RENUM_DELAY_MS
378          * for the FX2 to renumerate.
379          */
380         err = SR_ERR;
381         if (devc->fw_updated > 0) {
382                 sr_info("Waiting for device to reset.");
383                 /* Takes >= 300ms for the FX2 to be gone from the USB bus. */
384                 g_usleep(300 * 1000);
385                 timediff_ms = 0;
386                 while (timediff_ms < MAX_RENUM_DELAY_MS) {
387                         if ((err = dso_open(sdi)) == SR_OK)
388                                 break;
389                         g_usleep(100 * 1000);
390                         timediff_us = g_get_monotonic_time() - devc->fw_updated;
391                         timediff_ms = timediff_us / 1000;
392                         sr_spew("Waited %" PRIi64 " ms.", timediff_ms);
393                 }
394                 sr_info("Device came back after %d ms.", timediff_ms);
395         } else {
396                 err = dso_open(sdi);
397         }
398
399         if (err != SR_OK) {
400                 sr_err("Unable to open device.");
401                 return SR_ERR;
402         }
403
404         err = libusb_claim_interface(usb->devhdl, USB_INTERFACE);
405         if (err != 0) {
406                 sr_err("Unable to claim interface: %s.",
407                            libusb_error_name(err));
408                 return SR_ERR;
409         }
410
411         return SR_OK;
412 }
413
414 static int dev_close(struct sr_dev_inst *sdi)
415 {
416         dso_close(sdi);
417
418         return SR_OK;
419 }
420
421 static int cleanup(void)
422 {
423         return dev_clear();
424 }
425
426 static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi,
427                 const struct sr_channel_group *cg)
428 {
429         struct sr_usb_dev_inst *usb;
430         char str[128];
431
432         (void)cg;
433
434         switch (key) {
435         case SR_CONF_CONN:
436                 if (!sdi || !sdi->conn)
437                         return SR_ERR_ARG;
438                 usb = sdi->conn;
439                 if (usb->address == 255)
440                         /* Device still needs to re-enumerate after firmware
441                          * upload, so we don't know its (future) address. */
442                         return SR_ERR;
443                 snprintf(str, 128, "%d.%d", usb->bus, usb->address);
444                 *data = g_variant_new_string(str);
445                 break;
446         case SR_CONF_NUM_TIMEBASE:
447                 *data = g_variant_new_int32(NUM_TIMEBASE);
448                 break;
449         case SR_CONF_NUM_VDIV:
450                 *data = g_variant_new_int32(NUM_VDIV);
451                 break;
452         default:
453                 return SR_ERR_NA;
454         }
455
456         return SR_OK;
457 }
458
459 static int config_set(uint32_t key, GVariant *data, const struct sr_dev_inst *sdi,
460                 const struct sr_channel_group *cg)
461 {
462         struct dev_context *devc;
463         double tmp_double;
464         uint64_t tmp_u64, p, q;
465         int tmp_int, ret;
466         unsigned int i;
467         const char *tmp_str;
468         char **targets;
469
470         (void)cg;
471
472         if (sdi->status != SR_ST_ACTIVE)
473                 return SR_ERR_DEV_CLOSED;
474
475         ret = SR_OK;
476         devc = sdi->priv;
477         switch (key) {
478         case SR_CONF_LIMIT_FRAMES:
479                 devc->limit_frames = g_variant_get_uint64(data);
480                 break;
481         case SR_CONF_TRIGGER_SLOPE:
482                 tmp_str = g_variant_get_string(data, NULL);
483                 if (!tmp_str || !(tmp_str[0] == 'f' || tmp_str[0] == 'r'))
484                         return SR_ERR_ARG;
485                 devc->triggerslope = (tmp_str[0] == 'r')
486                         ? SLOPE_POSITIVE : SLOPE_NEGATIVE;
487                 break;
488         case SR_CONF_HORIZ_TRIGGERPOS:
489                 tmp_double = g_variant_get_double(data);
490                 if (tmp_double < 0.0 || tmp_double > 1.0) {
491                         sr_err("Trigger position should be between 0.0 and 1.0.");
492                         ret = SR_ERR_ARG;
493                 } else
494                         devc->triggerposition = tmp_double;
495                 break;
496         case SR_CONF_BUFFERSIZE:
497                 tmp_u64 = g_variant_get_uint64(data);
498                 for (i = 0; i < 2; i++) {
499                         if (devc->profile->buffersizes[i] == tmp_u64) {
500                                 devc->framesize = tmp_u64;
501                                 break;
502                         }
503                 }
504                 if (i == 2)
505                         ret = SR_ERR_ARG;
506                 break;
507         case SR_CONF_TIMEBASE:
508                 g_variant_get(data, "(tt)", &p, &q);
509                 tmp_int = -1;
510                 for (i = 0; i < ARRAY_SIZE(timebases); i++) {
511                         if (timebases[i][0] == p && timebases[i][1] == q) {
512                                 tmp_int = i;
513                                 break;
514                         }
515                 }
516                 if (tmp_int >= 0)
517                         devc->timebase = tmp_int;
518                 else
519                         ret = SR_ERR_ARG;
520                 break;
521         case SR_CONF_TRIGGER_SOURCE:
522                 tmp_str = g_variant_get_string(data, NULL);
523                 for (i = 0; trigger_sources[i]; i++) {
524                         if (!strcmp(tmp_str, trigger_sources[i])) {
525                                 devc->triggersource = g_strdup(tmp_str);
526                                 break;
527                         }
528                 }
529                 if (trigger_sources[i] == 0)
530                         ret = SR_ERR_ARG;
531                 break;
532         case SR_CONF_FILTER:
533                 tmp_str = g_variant_get_string(data, NULL);
534                 devc->filter_ch1 = devc->filter_ch2 = devc->filter_trigger = 0;
535                 targets = g_strsplit(tmp_str, ",", 0);
536                 for (i = 0; targets[i]; i++) {
537                         if (targets[i] == '\0')
538                                 /* Empty filter string can be used to clear them all. */
539                                 ;
540                         else if (!strcmp(targets[i], "CH1"))
541                                 devc->filter_ch1 = TRUE;
542                         else if (!strcmp(targets[i], "CH2"))
543                                 devc->filter_ch2 = TRUE;
544                         else if (!strcmp(targets[i], "TRIGGER"))
545                                 devc->filter_trigger = TRUE;
546                         else {
547                                 sr_err("Invalid filter target %s.", targets[i]);
548                                 ret = SR_ERR_ARG;
549                         }
550                 }
551                 g_strfreev(targets);
552                 break;
553         case SR_CONF_VDIV:
554                 /* TODO: Not supporting vdiv per channel yet. */
555                 g_variant_get(data, "(tt)", &p, &q);
556                 tmp_int = -1;
557                 for (i = 0; i < ARRAY_SIZE(vdivs); i++) {
558                         if (vdivs[i][0] == p && vdivs[i][1] == q) {
559                                 tmp_int = i;
560                                 break;
561                         }
562                 }
563                 if (tmp_int >= 0) {
564                         devc->voltage_ch1 = tmp_int;
565                         devc->voltage_ch2 = tmp_int;
566                 } else
567                         ret = SR_ERR_ARG;
568                 break;
569         case SR_CONF_COUPLING:
570                 tmp_str = g_variant_get_string(data, NULL);
571                 /* TODO: Not supporting coupling per channel yet. */
572                 for (i = 0; coupling[i]; i++) {
573                         if (!strcmp(tmp_str, coupling[i])) {
574                                 devc->coupling_ch1 = i;
575                                 devc->coupling_ch2 = i;
576                                 break;
577                         }
578                 }
579                 if (coupling[i] == 0)
580                         ret = SR_ERR_ARG;
581                 break;
582         default:
583                 ret = SR_ERR_NA;
584                 break;
585         }
586
587         return ret;
588 }
589
590 static int config_list(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi,
591                 const struct sr_channel_group *cg)
592 {
593         struct dev_context *devc;
594         GVariant *tuple, *rational[2];
595         GVariantBuilder gvb;
596         unsigned int i;
597
598         (void)cg;
599
600         switch (key) {
601         case SR_CONF_SCAN_OPTIONS:
602                 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32,
603                                 scanopts, ARRAY_SIZE(scanopts), sizeof(uint32_t));
604                 break;
605         case SR_CONF_DEVICE_OPTIONS:
606                 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32,
607                                 devopts, ARRAY_SIZE(devopts), sizeof(uint32_t));
608                 break;
609         case SR_CONF_BUFFERSIZE:
610                 if (!sdi)
611                         return SR_ERR_ARG;
612                 devc = sdi->priv;
613                 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT64,
614                                 devc->profile->buffersizes, 2, sizeof(uint64_t));
615                 break;
616         case SR_CONF_COUPLING:
617                 *data = g_variant_new_strv(coupling, ARRAY_SIZE(coupling));
618                 break;
619         case SR_CONF_VDIV:
620                 g_variant_builder_init(&gvb, G_VARIANT_TYPE_ARRAY);
621                 for (i = 0; i < ARRAY_SIZE(vdivs); i++) {
622                         rational[0] = g_variant_new_uint64(vdivs[i][0]);
623                         rational[1] = g_variant_new_uint64(vdivs[i][1]);
624                         tuple = g_variant_new_tuple(rational, 2);
625                         g_variant_builder_add_value(&gvb, tuple);
626                 }
627                 *data = g_variant_builder_end(&gvb);
628                 break;
629         case SR_CONF_FILTER:
630                 *data = g_variant_new_strv(filter_targets,
631                                 ARRAY_SIZE(filter_targets));
632                 break;
633         case SR_CONF_TIMEBASE:
634                 g_variant_builder_init(&gvb, G_VARIANT_TYPE_ARRAY);
635                 for (i = 0; i < ARRAY_SIZE(timebases); i++) {
636                         rational[0] = g_variant_new_uint64(timebases[i][0]);
637                         rational[1] = g_variant_new_uint64(timebases[i][1]);
638                         tuple = g_variant_new_tuple(rational, 2);
639                         g_variant_builder_add_value(&gvb, tuple);
640                 }
641                 *data = g_variant_builder_end(&gvb);
642                 break;
643         case SR_CONF_TRIGGER_SOURCE:
644                 *data = g_variant_new_strv(trigger_sources,
645                                 ARRAY_SIZE(trigger_sources));
646                 break;
647         default:
648                 return SR_ERR_NA;
649         }
650
651         return SR_OK;
652 }
653
654 static void send_chunk(struct sr_dev_inst *sdi, unsigned char *buf,
655                 int num_samples)
656 {
657         struct sr_datafeed_packet packet;
658         struct sr_datafeed_analog analog;
659         struct dev_context *devc;
660         float ch1, ch2, range;
661         int num_channels, data_offset, i;
662
663         devc = sdi->priv;
664         num_channels = (devc->ch1_enabled && devc->ch2_enabled) ? 2 : 1;
665         packet.type = SR_DF_ANALOG;
666         packet.payload = &analog;
667         /* TODO: support for 5xxx series 9-bit samples */
668         analog.channels = devc->enabled_channels;
669         analog.num_samples = num_samples;
670         analog.mq = SR_MQ_VOLTAGE;
671         analog.unit = SR_UNIT_VOLT;
672         analog.mqflags = 0;
673         /* TODO: Check malloc return value. */
674         analog.data = g_try_malloc(analog.num_samples * sizeof(float) * num_channels);
675         data_offset = 0;
676         for (i = 0; i < analog.num_samples; i++) {
677                 /*
678                  * The device always sends data for both channels. If a channel
679                  * is disabled, it contains a copy of the enabled channel's
680                  * data. However, we only send the requested channels to
681                  * the bus.
682                  *
683                  * Voltage values are encoded as a value 0-255 (0-512 on the
684                  * DSO-5200*), where the value is a point in the range
685                  * represented by the vdiv setting. There are 8 vertical divs,
686                  * so e.g. 500mV/div represents 4V peak-to-peak where 0 = -2V
687                  * and 255 = +2V.
688                  */
689                 /* TODO: Support for DSO-5xxx series 9-bit samples. */
690                 if (devc->ch1_enabled) {
691                         range = ((float)vdivs[devc->voltage_ch1][0] / vdivs[devc->voltage_ch1][1]) * 8;
692                         ch1 = range / 255 * *(buf + i * 2 + 1);
693                         /* Value is centered around 0V. */
694                         ch1 -= range / 2;
695                         analog.data[data_offset++] = ch1;
696                 }
697                 if (devc->ch2_enabled) {
698                         range = ((float)vdivs[devc->voltage_ch2][0] / vdivs[devc->voltage_ch2][1]) * 8;
699                         ch2 = range / 255 * *(buf + i * 2);
700                         ch2 -= range / 2;
701                         analog.data[data_offset++] = ch2;
702                 }
703         }
704         sr_session_send(devc->cb_data, &packet);
705 }
706
707 /*
708  * Called by libusb (as triggered by handle_event()) when a transfer comes in.
709  * Only channel data comes in asynchronously, and all transfers for this are
710  * queued up beforehand, so this just needs to chuck the incoming data onto
711  * the libsigrok session bus.
712  */
713 static void receive_transfer(struct libusb_transfer *transfer)
714 {
715         struct sr_datafeed_packet packet;
716         struct sr_dev_inst *sdi;
717         struct dev_context *devc;
718         int num_samples, pre;
719
720         sdi = transfer->user_data;
721         devc = sdi->priv;
722         sr_spew("receive_transfer(): status %d received %d bytes.",
723                    transfer->status, transfer->actual_length);
724
725         if (transfer->actual_length == 0)
726                 /* Nothing to send to the bus. */
727                 return;
728
729         num_samples = transfer->actual_length / 2;
730
731         sr_spew("Got %d-%d/%d samples in frame.", devc->samp_received + 1,
732                    devc->samp_received + num_samples, devc->framesize);
733
734         /*
735          * The device always sends a full frame, but the beginning of the frame
736          * doesn't represent the trigger point. The offset at which the trigger
737          * happened came in with the capture state, so we need to start sending
738          * from there up the session bus. The samples in the frame buffer
739          * before that trigger point came after the end of the device's frame
740          * buffer was reached, and it wrapped around to overwrite up until the
741          * trigger point.
742          */
743         if (devc->samp_received < devc->trigger_offset) {
744                 /* Trigger point not yet reached. */
745                 if (devc->samp_received + num_samples < devc->trigger_offset) {
746                         /* The entire chunk is before the trigger point. */
747                         memcpy(devc->framebuf + devc->samp_buffered * 2,
748                                         transfer->buffer, num_samples * 2);
749                         devc->samp_buffered += num_samples;
750                 } else {
751                         /*
752                          * This chunk hits or overruns the trigger point.
753                          * Store the part before the trigger fired, and
754                          * send the rest up to the session bus.
755                          */
756                         pre = devc->trigger_offset - devc->samp_received;
757                         memcpy(devc->framebuf + devc->samp_buffered * 2,
758                                         transfer->buffer, pre * 2);
759                         devc->samp_buffered += pre;
760
761                         /* The rest of this chunk starts with the trigger point. */
762                         sr_dbg("Reached trigger point, %d samples buffered.",
763                                    devc->samp_buffered);
764
765                         /* Avoid the corner case where the chunk ended at
766                          * exactly the trigger point. */
767                         if (num_samples > pre)
768                                 send_chunk(sdi, transfer->buffer + pre * 2,
769                                                 num_samples - pre);
770                 }
771         } else {
772                 /* Already past the trigger point, just send it all out. */
773                 send_chunk(sdi, transfer->buffer,
774                                 num_samples);
775         }
776
777         devc->samp_received += num_samples;
778
779         /* Everything in this transfer was either copied to the buffer or
780          * sent to the session bus. */
781         g_free(transfer->buffer);
782         libusb_free_transfer(transfer);
783
784         if (devc->samp_received >= devc->framesize) {
785                 /* That was the last chunk in this frame. Send the buffered
786                  * pre-trigger samples out now, in one big chunk. */
787                 sr_dbg("End of frame, sending %d pre-trigger buffered samples.",
788                            devc->samp_buffered);
789                 send_chunk(sdi, devc->framebuf, devc->samp_buffered);
790
791                 /* Mark the end of this frame. */
792                 packet.type = SR_DF_FRAME_END;
793                 sr_session_send(devc->cb_data, &packet);
794
795                 if (devc->limit_frames && ++devc->num_frames == devc->limit_frames) {
796                         /* Terminate session */
797                         devc->dev_state = STOPPING;
798                 } else {
799                         devc->dev_state = NEW_CAPTURE;
800                 }
801         }
802 }
803
804 static int handle_event(int fd, int revents, void *cb_data)
805 {
806         const struct sr_dev_inst *sdi;
807         struct sr_datafeed_packet packet;
808         struct timeval tv;
809         struct dev_context *devc;
810         struct drv_context *drvc = di->priv;
811         int num_channels;
812         uint32_t trigger_offset;
813         uint8_t capturestate;
814
815         (void)fd;
816         (void)revents;
817
818         sdi = cb_data;
819         devc = sdi->priv;
820         if (devc->dev_state == STOPPING) {
821                 /* We've been told to wind up the acquisition. */
822                 sr_dbg("Stopping acquisition.");
823                 /*
824                  * TODO: Doesn't really cancel pending transfers so they might
825                  * come in after SR_DF_END is sent.
826                  */
827                 usb_source_remove(sdi->session, drvc->sr_ctx);
828
829                 packet.type = SR_DF_END;
830                 sr_session_send(sdi, &packet);
831
832                 devc->dev_state = IDLE;
833
834                 return TRUE;
835         }
836
837         /* Always handle pending libusb events. */
838         tv.tv_sec = tv.tv_usec = 0;
839         libusb_handle_events_timeout(drvc->sr_ctx->libusb_ctx, &tv);
840
841         /* TODO: ugh */
842         if (devc->dev_state == NEW_CAPTURE) {
843                 if (dso_capture_start(sdi) != SR_OK)
844                         return TRUE;
845                 if (dso_enable_trigger(sdi) != SR_OK)
846                         return TRUE;
847 //              if (dso_force_trigger(sdi) != SR_OK)
848 //                      return TRUE;
849                 sr_dbg("Successfully requested next chunk.");
850                 devc->dev_state = CAPTURE;
851                 return TRUE;
852         }
853         if (devc->dev_state != CAPTURE)
854                 return TRUE;
855
856         if ((dso_get_capturestate(sdi, &capturestate, &trigger_offset)) != SR_OK)
857                 return TRUE;
858
859         sr_dbg("Capturestate %d.", capturestate);
860         sr_dbg("Trigger offset 0x%.6x.", trigger_offset);
861         switch (capturestate) {
862         case CAPTURE_EMPTY:
863                 if (++devc->capture_empty_count >= MAX_CAPTURE_EMPTY) {
864                         devc->capture_empty_count = 0;
865                         if (dso_capture_start(sdi) != SR_OK)
866                                 break;
867                         if (dso_enable_trigger(sdi) != SR_OK)
868                                 break;
869 //                      if (dso_force_trigger(sdi) != SR_OK)
870 //                              break;
871                         sr_dbg("Successfully requested next chunk.");
872                 }
873                 break;
874         case CAPTURE_FILLING:
875                 /* No data yet. */
876                 break;
877         case CAPTURE_READY_8BIT:
878                 /* Remember where in the captured frame the trigger is. */
879                 devc->trigger_offset = trigger_offset;
880
881                 num_channels = (devc->ch1_enabled && devc->ch2_enabled) ? 2 : 1;
882                 /* TODO: Check malloc return value. */
883                 devc->framebuf = g_try_malloc(devc->framesize * num_channels * 2);
884                 devc->samp_buffered = devc->samp_received = 0;
885
886                 /* Tell the scope to send us the first frame. */
887                 if (dso_get_channeldata(sdi, receive_transfer) != SR_OK)
888                         break;
889
890                 /*
891                  * Don't hit the state machine again until we're done fetching
892                  * the data we just told the scope to send.
893                  */
894                 devc->dev_state = FETCH_DATA;
895
896                 /* Tell the frontend a new frame is on the way. */
897                 packet.type = SR_DF_FRAME_BEGIN;
898                 sr_session_send(sdi, &packet);
899                 break;
900         case CAPTURE_READY_9BIT:
901                 /* TODO */
902                 sr_err("Not yet supported.");
903                 break;
904         case CAPTURE_TIMEOUT:
905                 /* Doesn't matter, we'll try again next time. */
906                 break;
907         default:
908                 sr_dbg("Unknown capture state: %d.", capturestate);
909                 break;
910         }
911
912         return TRUE;
913 }
914
915 static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data)
916 {
917         struct dev_context *devc;
918         struct drv_context *drvc = di->priv;
919
920         if (sdi->status != SR_ST_ACTIVE)
921                 return SR_ERR_DEV_CLOSED;
922
923         devc = sdi->priv;
924         devc->cb_data = cb_data;
925
926         if (configure_channels(sdi) != SR_OK) {
927                 sr_err("Failed to configure channels.");
928                 return SR_ERR;
929         }
930
931         if (dso_init(sdi) != SR_OK)
932                 return SR_ERR;
933
934         if (dso_capture_start(sdi) != SR_OK)
935                 return SR_ERR;
936
937         devc->dev_state = CAPTURE;
938         usb_source_add(sdi->session, drvc->sr_ctx, TICK, handle_event, (void *)sdi);
939
940         /* Send header packet to the session bus. */
941         std_session_send_df_header(cb_data, LOG_PREFIX);
942
943         return SR_OK;
944 }
945
946 static int dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data)
947 {
948         struct dev_context *devc;
949
950         (void)cb_data;
951
952         if (sdi->status != SR_ST_ACTIVE)
953                 return SR_ERR;
954
955         devc = sdi->priv;
956         devc->dev_state = STOPPING;
957
958         return SR_OK;
959 }
960
961 SR_PRIV struct sr_dev_driver hantek_dso_driver_info = {
962         .name = "hantek-dso",
963         .longname = "Hantek DSO",
964         .api_version = 1,
965         .init = init,
966         .cleanup = cleanup,
967         .scan = scan,
968         .dev_list = dev_list,
969         .dev_clear = dev_clear,
970         .config_get = config_get,
971         .config_set = config_set,
972         .config_list = config_list,
973         .dev_open = dev_open,
974         .dev_close = dev_close,
975         .dev_acquisition_start = dev_acquisition_start,
976         .dev_acquisition_stop = dev_acquisition_stop,
977         .priv = NULL,
978 };