]> sigrok.org Git - libsigrok.git/blob - src/hardware/hantek-dso/api.c
Removal of sdi->index, step 4: fix trivial sr_dev_inst_new() calls
[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                                 devc = sdi->priv;
346                                 sdi->inst_type = SR_INST_USB;
347                                 sdi->conn = sr_usb_dev_inst_new(
348                                                 libusb_get_bus_number(devlist[i]),
349                                                 libusb_get_device_address(devlist[i]), NULL);
350                                 break;
351                         }
352                 }
353                 if (!prof)
354                         /* not a supported VID/PID */
355                         continue;
356         }
357         libusb_free_device_list(devlist, 1);
358
359         return devices;
360 }
361
362 static GSList *dev_list(void)
363 {
364         return ((struct drv_context *)(di->priv))->instances;
365 }
366
367 static int dev_open(struct sr_dev_inst *sdi)
368 {
369         struct dev_context *devc;
370         struct sr_usb_dev_inst *usb;
371         int64_t timediff_us, timediff_ms;
372         int err;
373
374         devc = sdi->priv;
375         usb = sdi->conn;
376
377         /*
378          * If the firmware was recently uploaded, wait up to MAX_RENUM_DELAY_MS
379          * for the FX2 to renumerate.
380          */
381         err = SR_ERR;
382         if (devc->fw_updated > 0) {
383                 sr_info("Waiting for device to reset.");
384                 /* Takes >= 300ms for the FX2 to be gone from the USB bus. */
385                 g_usleep(300 * 1000);
386                 timediff_ms = 0;
387                 while (timediff_ms < MAX_RENUM_DELAY_MS) {
388                         if ((err = dso_open(sdi)) == SR_OK)
389                                 break;
390                         g_usleep(100 * 1000);
391                         timediff_us = g_get_monotonic_time() - devc->fw_updated;
392                         timediff_ms = timediff_us / 1000;
393                         sr_spew("Waited %" PRIi64 " ms.", timediff_ms);
394                 }
395                 sr_info("Device came back after %d ms.", timediff_ms);
396         } else {
397                 err = dso_open(sdi);
398         }
399
400         if (err != SR_OK) {
401                 sr_err("Unable to open device.");
402                 return SR_ERR;
403         }
404
405         err = libusb_claim_interface(usb->devhdl, USB_INTERFACE);
406         if (err != 0) {
407                 sr_err("Unable to claim interface: %s.",
408                            libusb_error_name(err));
409                 return SR_ERR;
410         }
411
412         return SR_OK;
413 }
414
415 static int dev_close(struct sr_dev_inst *sdi)
416 {
417         dso_close(sdi);
418
419         return SR_OK;
420 }
421
422 static int cleanup(void)
423 {
424         return dev_clear();
425 }
426
427 static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi,
428                 const struct sr_channel_group *cg)
429 {
430         struct sr_usb_dev_inst *usb;
431         char str[128];
432
433         (void)cg;
434
435         switch (key) {
436         case SR_CONF_CONN:
437                 if (!sdi || !sdi->conn)
438                         return SR_ERR_ARG;
439                 usb = sdi->conn;
440                 if (usb->address == 255)
441                         /* Device still needs to re-enumerate after firmware
442                          * upload, so we don't know its (future) address. */
443                         return SR_ERR;
444                 snprintf(str, 128, "%d.%d", usb->bus, usb->address);
445                 *data = g_variant_new_string(str);
446                 break;
447         case SR_CONF_NUM_TIMEBASE:
448                 *data = g_variant_new_int32(NUM_TIMEBASE);
449                 break;
450         case SR_CONF_NUM_VDIV:
451                 *data = g_variant_new_int32(NUM_VDIV);
452                 break;
453         default:
454                 return SR_ERR_NA;
455         }
456
457         return SR_OK;
458 }
459
460 static int config_set(uint32_t key, GVariant *data, const struct sr_dev_inst *sdi,
461                 const struct sr_channel_group *cg)
462 {
463         struct dev_context *devc;
464         double tmp_double;
465         uint64_t tmp_u64, p, q;
466         int tmp_int, ret;
467         unsigned int i;
468         const char *tmp_str;
469         char **targets;
470
471         (void)cg;
472
473         if (sdi->status != SR_ST_ACTIVE)
474                 return SR_ERR_DEV_CLOSED;
475
476         ret = SR_OK;
477         devc = sdi->priv;
478         switch (key) {
479         case SR_CONF_LIMIT_FRAMES:
480                 devc->limit_frames = g_variant_get_uint64(data);
481                 break;
482         case SR_CONF_TRIGGER_SLOPE:
483                 tmp_str = g_variant_get_string(data, NULL);
484                 if (!tmp_str || !(tmp_str[0] == 'f' || tmp_str[0] == 'r'))
485                         return SR_ERR_ARG;
486                 devc->triggerslope = (tmp_str[0] == 'r')
487                         ? SLOPE_POSITIVE : SLOPE_NEGATIVE;
488                 break;
489         case SR_CONF_HORIZ_TRIGGERPOS:
490                 tmp_double = g_variant_get_double(data);
491                 if (tmp_double < 0.0 || tmp_double > 1.0) {
492                         sr_err("Trigger position should be between 0.0 and 1.0.");
493                         ret = SR_ERR_ARG;
494                 } else
495                         devc->triggerposition = tmp_double;
496                 break;
497         case SR_CONF_BUFFERSIZE:
498                 tmp_u64 = g_variant_get_uint64(data);
499                 for (i = 0; i < 2; i++) {
500                         if (devc->profile->buffersizes[i] == tmp_u64) {
501                                 devc->framesize = tmp_u64;
502                                 break;
503                         }
504                 }
505                 if (i == 2)
506                         ret = SR_ERR_ARG;
507                 break;
508         case SR_CONF_TIMEBASE:
509                 g_variant_get(data, "(tt)", &p, &q);
510                 tmp_int = -1;
511                 for (i = 0; i < ARRAY_SIZE(timebases); i++) {
512                         if (timebases[i][0] == p && timebases[i][1] == q) {
513                                 tmp_int = i;
514                                 break;
515                         }
516                 }
517                 if (tmp_int >= 0)
518                         devc->timebase = tmp_int;
519                 else
520                         ret = SR_ERR_ARG;
521                 break;
522         case SR_CONF_TRIGGER_SOURCE:
523                 tmp_str = g_variant_get_string(data, NULL);
524                 for (i = 0; trigger_sources[i]; i++) {
525                         if (!strcmp(tmp_str, trigger_sources[i])) {
526                                 devc->triggersource = g_strdup(tmp_str);
527                                 break;
528                         }
529                 }
530                 if (trigger_sources[i] == 0)
531                         ret = SR_ERR_ARG;
532                 break;
533         case SR_CONF_FILTER:
534                 tmp_str = g_variant_get_string(data, NULL);
535                 devc->filter_ch1 = devc->filter_ch2 = devc->filter_trigger = 0;
536                 targets = g_strsplit(tmp_str, ",", 0);
537                 for (i = 0; targets[i]; i++) {
538                         if (targets[i] == '\0')
539                                 /* Empty filter string can be used to clear them all. */
540                                 ;
541                         else if (!strcmp(targets[i], "CH1"))
542                                 devc->filter_ch1 = TRUE;
543                         else if (!strcmp(targets[i], "CH2"))
544                                 devc->filter_ch2 = TRUE;
545                         else if (!strcmp(targets[i], "TRIGGER"))
546                                 devc->filter_trigger = TRUE;
547                         else {
548                                 sr_err("Invalid filter target %s.", targets[i]);
549                                 ret = SR_ERR_ARG;
550                         }
551                 }
552                 g_strfreev(targets);
553                 break;
554         case SR_CONF_VDIV:
555                 /* TODO: Not supporting vdiv per channel yet. */
556                 g_variant_get(data, "(tt)", &p, &q);
557                 tmp_int = -1;
558                 for (i = 0; i < ARRAY_SIZE(vdivs); i++) {
559                         if (vdivs[i][0] == p && vdivs[i][1] == q) {
560                                 tmp_int = i;
561                                 break;
562                         }
563                 }
564                 if (tmp_int >= 0) {
565                         devc->voltage_ch1 = tmp_int;
566                         devc->voltage_ch2 = tmp_int;
567                 } else
568                         ret = SR_ERR_ARG;
569                 break;
570         case SR_CONF_COUPLING:
571                 tmp_str = g_variant_get_string(data, NULL);
572                 /* TODO: Not supporting coupling per channel yet. */
573                 for (i = 0; coupling[i]; i++) {
574                         if (!strcmp(tmp_str, coupling[i])) {
575                                 devc->coupling_ch1 = i;
576                                 devc->coupling_ch2 = i;
577                                 break;
578                         }
579                 }
580                 if (coupling[i] == 0)
581                         ret = SR_ERR_ARG;
582                 break;
583         default:
584                 ret = SR_ERR_NA;
585                 break;
586         }
587
588         return ret;
589 }
590
591 static int config_list(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi,
592                 const struct sr_channel_group *cg)
593 {
594         struct dev_context *devc;
595         GVariant *tuple, *rational[2];
596         GVariantBuilder gvb;
597         unsigned int i;
598
599         (void)cg;
600
601         switch (key) {
602         case SR_CONF_SCAN_OPTIONS:
603                 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32,
604                                 scanopts, ARRAY_SIZE(scanopts), sizeof(uint32_t));
605                 break;
606         case SR_CONF_DEVICE_OPTIONS:
607                 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32,
608                                 devopts, ARRAY_SIZE(devopts), sizeof(uint32_t));
609                 break;
610         case SR_CONF_BUFFERSIZE:
611                 if (!sdi)
612                         return SR_ERR_ARG;
613                 devc = sdi->priv;
614                 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT64,
615                                 devc->profile->buffersizes, 2, sizeof(uint64_t));
616                 break;
617         case SR_CONF_COUPLING:
618                 *data = g_variant_new_strv(coupling, ARRAY_SIZE(coupling));
619                 break;
620         case SR_CONF_VDIV:
621                 g_variant_builder_init(&gvb, G_VARIANT_TYPE_ARRAY);
622                 for (i = 0; i < ARRAY_SIZE(vdivs); i++) {
623                         rational[0] = g_variant_new_uint64(vdivs[i][0]);
624                         rational[1] = g_variant_new_uint64(vdivs[i][1]);
625                         tuple = g_variant_new_tuple(rational, 2);
626                         g_variant_builder_add_value(&gvb, tuple);
627                 }
628                 *data = g_variant_builder_end(&gvb);
629                 break;
630         case SR_CONF_FILTER:
631                 *data = g_variant_new_strv(filter_targets,
632                                 ARRAY_SIZE(filter_targets));
633                 break;
634         case SR_CONF_TIMEBASE:
635                 g_variant_builder_init(&gvb, G_VARIANT_TYPE_ARRAY);
636                 for (i = 0; i < ARRAY_SIZE(timebases); i++) {
637                         rational[0] = g_variant_new_uint64(timebases[i][0]);
638                         rational[1] = g_variant_new_uint64(timebases[i][1]);
639                         tuple = g_variant_new_tuple(rational, 2);
640                         g_variant_builder_add_value(&gvb, tuple);
641                 }
642                 *data = g_variant_builder_end(&gvb);
643                 break;
644         case SR_CONF_TRIGGER_SOURCE:
645                 *data = g_variant_new_strv(trigger_sources,
646                                 ARRAY_SIZE(trigger_sources));
647                 break;
648         default:
649                 return SR_ERR_NA;
650         }
651
652         return SR_OK;
653 }
654
655 static void send_chunk(struct sr_dev_inst *sdi, unsigned char *buf,
656                 int num_samples)
657 {
658         struct sr_datafeed_packet packet;
659         struct sr_datafeed_analog analog;
660         struct dev_context *devc;
661         float ch1, ch2, range;
662         int num_channels, data_offset, i;
663
664         devc = sdi->priv;
665         num_channels = (devc->ch1_enabled && devc->ch2_enabled) ? 2 : 1;
666         packet.type = SR_DF_ANALOG;
667         packet.payload = &analog;
668         /* TODO: support for 5xxx series 9-bit samples */
669         analog.channels = devc->enabled_channels;
670         analog.num_samples = num_samples;
671         analog.mq = SR_MQ_VOLTAGE;
672         analog.unit = SR_UNIT_VOLT;
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 };