]> sigrok.org Git - libsigrok.git/blob - src/hardware/kingst-la2016/api.c
kingst-la2016: rephrase USB renum code path after firmware upload
[libsigrok.git] / src / hardware / kingst-la2016 / api.c
1 /*
2  * This file is part of the libsigrok project.
3  *
4  * Copyright (C) 2020 Florian Schmidt <schmidt_florian@gmx.de>
5  * Copyright (C) 2013 Marcus Comstedt <marcus@mc.pp.se>
6  * Copyright (C) 2013 Bert Vermeulen <bert@biot.com>
7  * Copyright (C) 2012 Joel Holdsworth <joel@airwebreathe.org.uk>
8  *
9  * This program is free software: you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation, either version 3 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
21  */
22
23 /*
24  * This driver implementation initially was derived from the
25  * src/hardware/saleae-logic16/ source code.
26  */
27
28 #include <config.h>
29
30 #include <libsigrok/libsigrok.h>
31 #include <string.h>
32
33 #include "libsigrok-internal.h"
34 #include "protocol.h"
35
36 static const uint32_t scanopts[] = {
37         SR_CONF_CONN,
38 };
39
40 static const uint32_t drvopts[] = {
41         SR_CONF_LOGIC_ANALYZER,
42 };
43
44 static const uint32_t devopts[] = {
45         /* TODO: SR_CONF_CONTINUOUS, */
46         SR_CONF_CONN | SR_CONF_GET,
47         SR_CONF_SAMPLERATE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
48         SR_CONF_LIMIT_SAMPLES | SR_CONF_SET | SR_CONF_GET | SR_CONF_LIST,
49         SR_CONF_VOLTAGE_THRESHOLD | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
50         SR_CONF_LOGIC_THRESHOLD | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
51         SR_CONF_LOGIC_THRESHOLD_CUSTOM | SR_CONF_GET | SR_CONF_SET,
52         SR_CONF_TRIGGER_MATCH | SR_CONF_LIST,
53         SR_CONF_CAPTURE_RATIO | SR_CONF_GET | SR_CONF_SET,
54 };
55
56 static const int32_t trigger_matches[] = {
57         SR_TRIGGER_ZERO,
58         SR_TRIGGER_ONE,
59         SR_TRIGGER_RISING,
60         SR_TRIGGER_FALLING,
61 };
62
63 static const char *channel_names[] = {
64         "0", "1", "2", "3", "4", "5", "6", "7",
65         "8", "9", "10", "11", "12", "13", "14", "15",
66 };
67
68 static const uint64_t samplerates_la2016[] = {
69         SR_KHZ(20),
70         SR_KHZ(50),
71         SR_KHZ(100),
72         SR_KHZ(200),
73         SR_KHZ(500),
74         SR_MHZ(1),
75         SR_MHZ(2),
76         SR_MHZ(4),
77         SR_MHZ(5),
78         SR_MHZ(8),
79         SR_MHZ(10),
80         SR_MHZ(20),
81         SR_MHZ(50),
82         SR_MHZ(100),
83         SR_MHZ(200),
84 };
85
86 static const uint64_t samplerates_la1016[] = {
87         SR_KHZ(20),
88         SR_KHZ(50),
89         SR_KHZ(100),
90         SR_KHZ(200),
91         SR_KHZ(500),
92         SR_MHZ(1),
93         SR_MHZ(2),
94         SR_MHZ(4),
95         SR_MHZ(5),
96         SR_MHZ(8),
97         SR_MHZ(10),
98         SR_MHZ(20),
99         SR_MHZ(50),
100         SR_MHZ(100),
101 };
102
103 static const float logic_threshold_value[] = {
104         1.58,
105         2.5,
106         1.165,
107         1.5,
108         1.25,
109         0.9,
110         0.75,
111         0.60,
112         0.45,
113 };
114
115 static const char *logic_threshold[] = {
116         "TTL 5V",
117         "CMOS 5V",
118         "CMOS 3.3V",
119         "CMOS 3.0V",
120         "CMOS 2.5V",
121         "CMOS 1.8V",
122         "CMOS 1.5V",
123         "CMOS 1.2V",
124         "CMOS 0.9V",
125         "USER",
126 };
127
128 #define MAX_NUM_LOGIC_THRESHOLD_ENTRIES ARRAY_SIZE(logic_threshold)
129
130 static GSList *scan(struct sr_dev_driver *di, GSList *options)
131 {
132         struct drv_context *drvc;
133         struct dev_context *devc;
134         struct sr_dev_inst *sdi;
135         struct sr_usb_dev_inst *usb;
136         struct sr_config *src;
137         GSList *l;
138         GSList *devices;
139         GSList *conn_devices;
140         struct libusb_device_descriptor des;
141         libusb_device **devlist;
142         unsigned int i, j;
143         const char *conn;
144         char connection_id[64];
145         uint64_t fw_uploaded;
146         unsigned int dev_addr;
147
148         drvc = di->context;
149
150         conn = NULL;
151         for (l = options; l; l = l->next) {
152                 src = l->data;
153                 switch (src->key) {
154                 case SR_CONF_CONN:
155                         conn = g_variant_get_string(src->data, NULL);
156                         break;
157                 }
158         }
159         if (conn)
160                 conn_devices = sr_usb_find(drvc->sr_ctx->libusb_ctx, conn);
161         else
162                 conn_devices = NULL;
163
164         /* Find all LA2016 devices, optionally upload firmware to them. */
165         devices = NULL;
166         libusb_get_device_list(drvc->sr_ctx->libusb_ctx, &devlist);
167         for (i = 0; devlist[i]; i++) {
168                 if (conn) {
169                         usb = NULL;
170                         for (l = conn_devices; l; l = l->next) {
171                                 usb = l->data;
172                                 if (usb->bus == libusb_get_bus_number(devlist[i]) &&
173                                     usb->address == libusb_get_device_address(devlist[i]))
174                                         break;
175                         }
176                         if (!l) {
177                                 /*
178                                  * A connection parameter was specified and
179                                  * this device does not match the filter.
180                                  */
181                                 continue;
182                         }
183                 }
184
185                 libusb_get_device_descriptor(devlist[i], &des);
186
187                 if (usb_get_port_path(devlist[i], connection_id, sizeof(connection_id)) < 0)
188                         continue;
189
190                 if (des.idVendor != LA2016_VID || des.idProduct != LA2016_PID)
191                         continue;
192
193                 /* USB identification matches, a device was found. */
194                 sr_dbg("Found a LA2016 device.");
195                 sdi = g_malloc0(sizeof(struct sr_dev_inst));
196                 sdi->status = SR_ST_INITIALIZING;
197                 sdi->connection_id = g_strdup(connection_id);
198
199                 fw_uploaded = 0;
200                 dev_addr = libusb_get_device_address(devlist[i]);
201                 if (des.iProduct != 2) {
202                         sr_info("Device at '%s' has no firmware loaded.", connection_id);
203
204                         if (la2016_upload_firmware(drvc->sr_ctx, devlist[i], des.idProduct) != SR_OK) {
205                                 sr_err("MCU firmware upload failed.");
206                                 g_free(sdi->connection_id);
207                                 g_free(sdi);
208                                 continue;
209                         }
210                         fw_uploaded = g_get_monotonic_time();
211                         /* Will re-enumerate. Mark as "unknown address yet". */
212                         dev_addr = 0xff;
213                 }
214
215                 sdi->vendor = g_strdup("Kingst");
216                 sdi->model = g_strdup("LA2016");
217
218                 for (j = 0; j < ARRAY_SIZE(channel_names); j++)
219                         sr_channel_new(sdi, j, SR_CHANNEL_LOGIC, TRUE, channel_names[j]);
220
221                 devices = g_slist_append(devices, sdi);
222
223                 devc = g_malloc0(sizeof(struct dev_context));
224                 sdi->priv = devc;
225                 devc->fw_uploaded = fw_uploaded;
226                 devc->threshold_voltage_idx = 0;
227                 devc->threshold_voltage = logic_threshold_value[devc->threshold_voltage_idx];
228
229                 sdi->status = SR_ST_INACTIVE;
230                 sdi->inst_type = SR_INST_USB;
231
232                 sdi->conn = sr_usb_dev_inst_new(
233                         libusb_get_bus_number(devlist[i]),
234                         dev_addr, NULL);
235         }
236         libusb_free_device_list(devlist, 1);
237         g_slist_free_full(conn_devices, (GDestroyNotify)sr_usb_dev_inst_free);
238
239         return std_scan_complete(di, devices);
240 }
241
242 static int la2016_dev_open(struct sr_dev_inst *sdi)
243 {
244         struct sr_dev_driver *di;
245         libusb_device **devlist;
246         struct sr_usb_dev_inst *usb;
247         struct libusb_device_descriptor des;
248         struct drv_context *drvc;
249         int ret, i, device_count;
250         char connection_id[64];
251
252         di = sdi->driver;
253         drvc = di->context;
254         usb = sdi->conn;
255         ret = SR_ERR;
256
257         device_count = libusb_get_device_list(drvc->sr_ctx->libusb_ctx, &devlist);
258         if (device_count < 0) {
259                 sr_err("Failed to get device list: %s.", libusb_error_name(device_count));
260                 return SR_ERR;
261         }
262
263         for (i = 0; i < device_count; i++) {
264                 libusb_get_device_descriptor(devlist[i], &des);
265
266                 if (des.idVendor != LA2016_VID || des.idProduct != LA2016_PID || des.iProduct != 2)
267                         continue;
268
269                 if ((sdi->status == SR_ST_INITIALIZING) || (sdi->status == SR_ST_INACTIVE)) {
270                         /* Check physical USB bus/port address. */
271                         if (usb_get_port_path(devlist[i], connection_id, sizeof(connection_id)) < 0)
272                                 continue;
273
274                         if (strcmp(sdi->connection_id, connection_id)) {
275                                 /* Not the device we looked up before. */
276                                 continue;
277                         }
278                 }
279
280                 if (!(ret = libusb_open(devlist[i], &usb->devhdl))) {
281                         if (usb->address == 0xff) {
282                                 /*
283                                  * First encounter after firmware upload.
284                                  * Grab current address after enumeration.
285                                  */
286                                 usb->address = libusb_get_device_address(devlist[i]);
287                         }
288                 } else {
289                         sr_err("Failed to open device: %s.", libusb_error_name(ret));
290                         ret = SR_ERR;
291                         break;
292                 }
293
294                 ret = libusb_claim_interface(usb->devhdl, USB_INTERFACE);
295                 if (ret == LIBUSB_ERROR_BUSY) {
296                         sr_err("Cannot claim USB interface. Another program or driver using it?");
297                         ret = SR_ERR;
298                         break;
299                 } else if (ret == LIBUSB_ERROR_NO_DEVICE) {
300                         sr_err("Device has been disconnected.");
301                         ret = SR_ERR;
302                         break;
303                 } else if (ret != 0) {
304                         sr_err("Cannot claim USB interface: %s.", libusb_error_name(ret));
305                         ret = SR_ERR;
306                         break;
307                 }
308
309                 if ((ret = la2016_init_device(sdi)) != SR_OK) {
310                         sr_err("Cannot initialize device.");
311                         break;
312                 }
313
314                 sr_info("Opened device on %d.%d (logical) / %s (physical), interface %d.",
315                         usb->bus, usb->address, sdi->connection_id, USB_INTERFACE);
316
317                 ret = SR_OK;
318
319                 break;
320         }
321
322         libusb_free_device_list(devlist, 1);
323
324         if (ret != SR_OK) {
325                 if (usb->devhdl) {
326                         libusb_release_interface(usb->devhdl, USB_INTERFACE);
327                         libusb_close(usb->devhdl);
328                         usb->devhdl = NULL;
329                 }
330                 return SR_ERR;
331         }
332
333         return SR_OK;
334 }
335
336 static int dev_open(struct sr_dev_inst *sdi)
337 {
338         struct dev_context *devc;
339         uint64_t reset_done, now, elapsed_ms;
340         int ret;
341
342         devc = sdi->priv;
343
344         /*
345          * When the sigrok driver recently has uploaded MCU firmware,
346          * then wait for the FX2 to re-enumerate. Allow the USB device
347          * to vanish before it reappears. Timeouts are rough estimates
348          * after all, the imprecise time of the last check (potentially
349          * executes after the total check period) simplifies code paths
350          * with optional diagnostics. And increases the probability of
351          * successfully detecting "late/slow" devices.
352          */
353         if (devc->fw_uploaded) {
354                 sr_info("Waiting for device to reset after firmware upload.");
355                 now = g_get_monotonic_time();
356                 reset_done = devc->fw_uploaded + RENUM_GONE_DELAY_MS * 1000;
357                 if (now < reset_done)
358                         g_usleep(reset_done - now);
359                 do {
360                         now = g_get_monotonic_time();
361                         elapsed_ms = (now - devc->fw_uploaded) / 1000;
362                         sr_spew("Waited %" PRIu64 "ms.", elapsed_ms);
363                         ret = la2016_dev_open(sdi);
364                         if (ret == SR_OK) {
365                                 devc->fw_uploaded = 0;
366                                 break;
367                         }
368                         g_usleep(RENUM_POLL_INTERVAL_MS * 1000);
369                 } while (elapsed_ms < RENUM_CHECK_PERIOD_MS);
370                 if (ret != SR_OK) {
371                         sr_err("Device failed to re-enumerate.");
372                         return SR_ERR;
373                 }
374                 sr_info("Device came back after %" PRIi64 "ms.", elapsed_ms);
375         } else {
376                 ret = la2016_dev_open(sdi);
377         }
378
379         if (ret != SR_OK) {
380                 sr_err("Cannot open device.");
381                 return SR_ERR;
382         }
383
384         return SR_OK;
385 }
386
387 static int dev_close(struct sr_dev_inst *sdi)
388 {
389         struct sr_usb_dev_inst *usb;
390
391         usb = sdi->conn;
392
393         if (!usb->devhdl)
394                 return SR_ERR_BUG;
395
396         la2016_deinit_device(sdi);
397
398         sr_info("Closing device on %d.%d (logical) / %s (physical) interface %d.",
399                 usb->bus, usb->address, sdi->connection_id, USB_INTERFACE);
400         libusb_release_interface(usb->devhdl, USB_INTERFACE);
401         libusb_close(usb->devhdl);
402         usb->devhdl = NULL;
403
404         return SR_OK;
405 }
406
407 static int config_get(uint32_t key, GVariant **data,
408         const struct sr_dev_inst *sdi, const struct sr_channel_group *cg)
409 {
410         struct dev_context *devc;
411         struct sr_usb_dev_inst *usb;
412         double rounded;
413
414         (void)cg;
415
416         if (!sdi)
417                 return SR_ERR_ARG;
418         devc = sdi->priv;
419
420         switch (key) {
421         case SR_CONF_CONN:
422                 if (!sdi->conn)
423                         return SR_ERR_ARG;
424                 usb = sdi->conn;
425                 if (usb->address == 0xff) {
426                         /*
427                          * Device still needs to re-enumerate after firmware
428                          * upload, so we don't know its (future) address.
429                          */
430                         return SR_ERR;
431                 }
432                 *data = g_variant_new_printf("%d.%d", usb->bus, usb->address);
433                 break;
434         case SR_CONF_SAMPLERATE:
435                 *data = g_variant_new_uint64(devc->cur_samplerate);
436                 break;
437         case SR_CONF_LIMIT_SAMPLES:
438                 *data = g_variant_new_uint64(devc->limit_samples);
439                 break;
440         case SR_CONF_CAPTURE_RATIO:
441                 *data = g_variant_new_uint64(devc->capture_ratio);
442                 break;
443         case SR_CONF_VOLTAGE_THRESHOLD:
444                 rounded = (int)(devc->threshold_voltage / 0.1) * 0.1;
445                 *data = std_gvar_tuple_double(rounded, rounded + 0.1);
446                 return SR_OK;
447         case SR_CONF_LOGIC_THRESHOLD:
448                 *data = g_variant_new_string(logic_threshold[devc->threshold_voltage_idx]);
449                 break;
450         case SR_CONF_LOGIC_THRESHOLD_CUSTOM:
451                 *data = g_variant_new_double(devc->threshold_voltage);
452                 break;
453
454         default:
455                 return SR_ERR_NA;
456         }
457
458         return SR_OK;
459 }
460
461 static int config_set(uint32_t key, GVariant *data,
462         const struct sr_dev_inst *sdi, const struct sr_channel_group *cg)
463 {
464         struct dev_context *devc;
465         double low, high;
466         int idx;
467
468         (void)cg;
469
470         devc = sdi->priv;
471
472         switch (key) {
473         case SR_CONF_SAMPLERATE:
474                 devc->cur_samplerate = g_variant_get_uint64(data);
475                 break;
476         case SR_CONF_LIMIT_SAMPLES:
477                 devc->limit_samples = g_variant_get_uint64(data);
478                 break;
479         case SR_CONF_CAPTURE_RATIO:
480                 devc->capture_ratio = g_variant_get_uint64(data);
481                 break;
482         case SR_CONF_VOLTAGE_THRESHOLD:
483                 g_variant_get(data, "(dd)", &low, &high);
484                 devc->threshold_voltage = (low + high) / 2.0;
485                 devc->threshold_voltage_idx = MAX_NUM_LOGIC_THRESHOLD_ENTRIES - 1; /* USER */
486                 break;
487         case SR_CONF_LOGIC_THRESHOLD: {
488                 if ((idx = std_str_idx(data, logic_threshold, MAX_NUM_LOGIC_THRESHOLD_ENTRIES)) < 0)
489                         return SR_ERR_ARG;
490                 if (idx == MAX_NUM_LOGIC_THRESHOLD_ENTRIES - 1) {
491                         /* user threshold */
492                 } else {
493                         devc->threshold_voltage = logic_threshold_value[idx];
494                 }
495                 devc->threshold_voltage_idx = idx;
496                 break;
497         }
498         case SR_CONF_LOGIC_THRESHOLD_CUSTOM:
499                 devc->threshold_voltage = g_variant_get_double(data);
500                 break;
501         default:
502                 return SR_ERR_NA;
503         }
504
505         return SR_OK;
506 }
507
508 static int config_list(uint32_t key, GVariant **data,
509         const struct sr_dev_inst *sdi, const struct sr_channel_group *cg)
510 {
511         struct dev_context *devc;
512
513         switch (key) {
514         case SR_CONF_SCAN_OPTIONS:
515         case SR_CONF_DEVICE_OPTIONS:
516                 return STD_CONFIG_LIST(key, data, sdi, cg, scanopts, drvopts, devopts);
517         case SR_CONF_SAMPLERATE:
518                 if (!sdi)
519                         return SR_ERR_ARG;
520                 devc = sdi->priv;
521                 if (devc->max_samplerate == SR_MHZ(200)) {
522                         *data = std_gvar_samplerates(ARRAY_AND_SIZE(samplerates_la2016));
523                 } else {
524                         *data = std_gvar_samplerates(ARRAY_AND_SIZE(samplerates_la1016));
525                 }
526                 break;
527         case SR_CONF_LIMIT_SAMPLES:
528                 *data = std_gvar_tuple_u64(LA2016_NUM_SAMPLES_MIN, LA2016_NUM_SAMPLES_MAX);
529                 break;
530         case SR_CONF_VOLTAGE_THRESHOLD:
531                 *data = std_gvar_min_max_step_thresholds(
532                         LA2016_THR_VOLTAGE_MIN,
533                         LA2016_THR_VOLTAGE_MAX, 0.1);
534                 break;
535         case SR_CONF_TRIGGER_MATCH:
536                 *data = std_gvar_array_i32(ARRAY_AND_SIZE(trigger_matches));
537                 break;
538         case SR_CONF_LOGIC_THRESHOLD:
539                 *data = g_variant_new_strv(logic_threshold, MAX_NUM_LOGIC_THRESHOLD_ENTRIES);
540                 break;
541         default:
542                 return SR_ERR_NA;
543         }
544
545         return SR_OK;
546 }
547
548 static int configure_channels(const struct sr_dev_inst *sdi)
549 {
550         struct dev_context *devc;
551
552         devc = sdi->priv;
553         devc->cur_channels = 0;
554         devc->num_channels = 0;
555
556         for (GSList *l = sdi->channels; l; l = l->next) {
557                 struct sr_channel *ch = (struct sr_channel*)l->data;
558                 if (ch->enabled == FALSE)
559                         continue;
560                 devc->cur_channels |= 1 << ch->index;
561                 devc->num_channels++;
562         }
563
564         return SR_OK;
565 }
566
567 static int dev_acquisition_start(const struct sr_dev_inst *sdi)
568 {
569         struct sr_dev_driver *di;
570         struct drv_context *drvc;
571         struct dev_context *devc;
572         int ret;
573
574         di = sdi->driver;
575         drvc = di->context;
576         devc = sdi->priv;
577
578         if (configure_channels(sdi) != SR_OK) {
579                 sr_err("Cannot configure channels.");
580                 return SR_ERR;
581         }
582
583         devc->convbuffer_size = 4 * 1024 * 1024;
584         if (!(devc->convbuffer = g_try_malloc(devc->convbuffer_size))) {
585                 sr_err("Cannot allocate conversion buffer.");
586                 return SR_ERR_MALLOC;
587         }
588
589         if ((ret = la2016_setup_acquisition(sdi)) != SR_OK) {
590                 g_free(devc->convbuffer);
591                 devc->convbuffer = NULL;
592                 return ret;
593         }
594
595         devc->ctx = drvc->sr_ctx;
596
597         if ((ret = la2016_start_acquisition(sdi)) != SR_OK) {
598                 la2016_abort_acquisition(sdi);
599                 return ret;
600         }
601
602         devc->have_trigger = 0;
603         usb_source_add(sdi->session, drvc->sr_ctx, 50,
604                 la2016_receive_data, (void *)sdi);
605
606         std_session_send_df_header(sdi);
607
608         return SR_OK;
609 }
610
611 static int dev_acquisition_stop(struct sr_dev_inst *sdi)
612 {
613         int ret;
614
615         ret = la2016_abort_acquisition(sdi);
616
617         return ret;
618 }
619
620 static struct sr_dev_driver kingst_la2016_driver_info = {
621         .name = "kingst-la2016",
622         .longname = "Kingst LA2016",
623         .api_version = 1,
624         .init = std_init,
625         .cleanup = std_cleanup,
626         .scan = scan,
627         .dev_list = std_dev_list,
628         .dev_clear = std_dev_clear,
629         .config_get = config_get,
630         .config_set = config_set,
631         .config_list = config_list,
632         .dev_open = dev_open,
633         .dev_close = dev_close,
634         .dev_acquisition_start = dev_acquisition_start,
635         .dev_acquisition_stop = dev_acquisition_stop,
636         .context = NULL,
637 };
638 SR_REGISTER_DEV_DRIVER(kingst_la2016_driver_info);