]> sigrok.org Git - libsigrok.git/blame - src/hardware/kingst-la2016/api.c
kingst-la2016: move USB bulk transfer handling to helper routines
[libsigrok.git] / src / hardware / kingst-la2016 / api.c
CommitLineData
f2cd2deb
FS
1/*
2 * This file is part of the libsigrok project.
3 *
7047acc8 4 * Copyright (C) 2022 Gerhard Sittig <gerhard.sittig@gmx.net>
f2cd2deb
FS
5 * Copyright (C) 2020 Florian Schmidt <schmidt_florian@gmx.de>
6 * Copyright (C) 2013 Marcus Comstedt <marcus@mc.pp.se>
7 * Copyright (C) 2013 Bert Vermeulen <bert@biot.com>
8 * Copyright (C) 2012 Joel Holdsworth <joel@airwebreathe.org.uk>
9 *
10 * This program is free software: you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation, either version 3 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program. If not, see <http://www.gnu.org/licenses/>.
22 */
23
96dc954e
GS
24/*
25 * This driver implementation initially was derived from the
26 * src/hardware/saleae-logic16/ source code.
27 */
f2cd2deb
FS
28
29#include <config.h>
a7740b06 30
a7740b06 31#include <libsigrok/libsigrok.h>
f2cd2deb 32#include <string.h>
a7740b06 33
f2cd2deb
FS
34#include "libsigrok-internal.h"
35#include "protocol.h"
36
37static const uint32_t scanopts[] = {
38 SR_CONF_CONN,
39};
40
41static const uint32_t drvopts[] = {
42 SR_CONF_LOGIC_ANALYZER,
331277e0 43 SR_CONF_SIGNAL_GENERATOR,
f2cd2deb
FS
44};
45
46static const uint32_t devopts[] = {
47 /* TODO: SR_CONF_CONTINUOUS, */
48 SR_CONF_CONN | SR_CONF_GET,
49 SR_CONF_SAMPLERATE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
a38f0f5e
GS
50 SR_CONF_LIMIT_SAMPLES | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
51 SR_CONF_LIMIT_MSEC | SR_CONF_GET | SR_CONF_SET,
9270f8f4 52#if WITH_THRESHOLD_DEVCFG
f2cd2deb 53 SR_CONF_VOLTAGE_THRESHOLD | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
9270f8f4 54#endif
f2cd2deb
FS
55 SR_CONF_TRIGGER_MATCH | SR_CONF_LIST,
56 SR_CONF_CAPTURE_RATIO | SR_CONF_GET | SR_CONF_SET,
57};
58
9270f8f4
GS
59static const uint32_t devopts_cg_logic[] = {
60#if !WITH_THRESHOLD_DEVCFG
61 SR_CONF_VOLTAGE_THRESHOLD | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
62#endif
63};
64
331277e0
GS
65static const uint32_t devopts_cg_pwm[] = {
66 SR_CONF_ENABLED | SR_CONF_GET | SR_CONF_SET,
67 SR_CONF_OUTPUT_FREQUENCY | SR_CONF_GET | SR_CONF_SET,
68 SR_CONF_DUTY_CYCLE | SR_CONF_GET | SR_CONF_SET,
69};
70
f2cd2deb
FS
71static const int32_t trigger_matches[] = {
72 SR_TRIGGER_ZERO,
73 SR_TRIGGER_ONE,
74 SR_TRIGGER_RISING,
75 SR_TRIGGER_FALLING,
76};
77
d466f61c 78static const char *channel_names_logic[] = {
da25c287
GS
79 "CH0", "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7",
80 "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15",
d466f61c
GS
81 "CH16", "CH17", "CH18", "CH19", "CH20", "CH21", "CH22", "CH23",
82 "CH24", "CH25", "CH26", "CH27", "CH28", "CH29", "CH30", "CH31",
f2cd2deb
FS
83};
84
331277e0
GS
85static const char *channel_names_pwm[] = {
86 "PWM1", "PWM2",
87};
88
ea436ba7 89/*
330853ba 90 * The hardware uses a 100/200/500MHz base clock (model dependent) and
ea436ba7
GS
91 * a 16bit divider (common across all models). The range from 10kHz to
92 * 100/200/500MHz should be applicable to all devices. High rates may
93 * suffer from coarse resolution (e.g. in the "500MHz div 2" case) and
330853ba
GS
94 * may not provide the desired 1/2/5 steps. Fortunately this exclusively
95 * affects the 500MHz model where 250MHz is used instead of 200MHz and
96 * the 166MHz and 125MHz rates are not presented to users. Deep memory
97 * of these models and hardware compression reduce the necessity to let
98 * users pick from a huge list of possible rates.
99 *
ea436ba7
GS
100 */
101
330853ba
GS
102static const uint64_t rates_500mhz[] = {
103 SR_KHZ(10),
104 SR_KHZ(20),
105 SR_KHZ(50),
106 SR_KHZ(100),
107 SR_KHZ(200),
108 SR_KHZ(500),
109 SR_MHZ(1),
110 SR_MHZ(2),
111 SR_MHZ(5),
112 SR_MHZ(10),
113 SR_MHZ(20),
114 SR_MHZ(50),
115 SR_MHZ(100),
116 SR_MHZ(250),
117 SR_MHZ(500),
118};
119
120static const uint64_t rates_200mhz[] = {
ea436ba7 121 SR_KHZ(10),
f2cd2deb
FS
122 SR_KHZ(20),
123 SR_KHZ(50),
124 SR_KHZ(100),
125 SR_KHZ(200),
126 SR_KHZ(500),
127 SR_MHZ(1),
128 SR_MHZ(2),
f2cd2deb 129 SR_MHZ(5),
f2cd2deb
FS
130 SR_MHZ(10),
131 SR_MHZ(20),
132 SR_MHZ(50),
133 SR_MHZ(100),
134 SR_MHZ(200),
135};
136
330853ba 137static const uint64_t rates_100mhz[] = {
ea436ba7 138 SR_KHZ(10),
8b172e78
KG
139 SR_KHZ(20),
140 SR_KHZ(50),
141 SR_KHZ(100),
142 SR_KHZ(200),
143 SR_KHZ(500),
144 SR_MHZ(1),
145 SR_MHZ(2),
8b172e78 146 SR_MHZ(5),
8b172e78
KG
147 SR_MHZ(10),
148 SR_MHZ(20),
149 SR_MHZ(50),
150 SR_MHZ(100),
151};
152
9270f8f4
GS
153/*
154 * Only list a few discrete voltages, to form a useful set which covers
155 * most logic families. Too many choices can make some applications use
156 * a slider again. Which may lack a scale for the current value, and
157 * leave users without feedback what the currently used value might be.
158 */
159static const double threshold_ranges[][2] = {
160 { 0.4, 0.4, },
161 { 0.6, 0.6, },
162 { 0.9, 0.9, },
163 { 1.2, 1.2, },
164 { 1.4, 1.4, }, /* Default, 1.4V, index 4. */
165 { 2.0, 2.0, },
166 { 2.5, 2.5, },
167 { 4.0, 4.0, },
168};
169#define LOGIC_THRESHOLD_IDX_DFLT 4
170
171static double threshold_voltage(const struct sr_dev_inst *sdi, double *high)
172{
173 struct dev_context *devc;
174 size_t idx;
175 double voltage;
176
177 devc = sdi->priv;
178 idx = devc->threshold_voltage_idx;
179 voltage = threshold_ranges[idx][0];
180 if (high)
181 *high = threshold_ranges[idx][1];
182
183 return voltage;
184}
185
d466f61c
GS
186/* Convenience. Release an allocated devc from error paths. */
187static void kingst_la2016_free_devc(struct dev_context *devc)
188{
189 if (!devc)
190 return;
191 g_free(devc->mcu_firmware);
192 g_free(devc->fpga_bitstream);
193 g_free(devc);
194}
195
196/* Convenience. Release an allocated sdi from error paths. */
197static void kingst_la2016_free_sdi(struct sr_dev_inst *sdi)
198{
199 if (!sdi)
200 return;
201 g_free(sdi->vendor);
202 g_free(sdi->model);
203 g_free(sdi->version);
204 g_free(sdi->serial_num);
205 g_free(sdi->connection_id);
206 sr_usb_dev_inst_free(sdi->conn);
207 kingst_la2016_free_devc(sdi->priv);
208}
209
210/* Convenience. Open a USB device (including claiming an interface). */
211static int la2016_open_usb(struct sr_usb_dev_inst *usb,
212 libusb_device *dev, gboolean show_message)
213{
214 int ret;
215
216 ret = libusb_open(dev, &usb->devhdl);
217 if (ret != 0) {
218 if (show_message) {
219 sr_err("Cannot open device: %s.",
220 libusb_error_name(ret));
221 }
222 return SR_ERR_IO;
223 }
224
225 if (usb->address == 0xff) {
226 /*
227 * First encounter after firmware upload.
228 * Grab current address after enumeration.
229 */
230 usb->address = libusb_get_device_address(dev);
231 }
232
233 ret = libusb_claim_interface(usb->devhdl, USB_INTERFACE);
234 if (ret == LIBUSB_ERROR_BUSY) {
235 sr_err("Cannot claim USB interface. Another program or driver using it?");
236 return SR_ERR_IO;
237 } else if (ret == LIBUSB_ERROR_NO_DEVICE) {
238 sr_err("Device has been disconnected.");
239 return SR_ERR_IO;
240 } else if (ret != 0) {
241 sr_err("Cannot claim USB interface: %s.",
242 libusb_error_name(ret));
243 return SR_ERR_IO;
244 }
245
246 return SR_OK;
247}
248
249/* Convenience. Close an opened USB device (and release the interface). */
250static void la2016_close_usb(struct sr_usb_dev_inst *usb)
251{
252
253 if (!usb)
254 return;
255
256 if (usb->devhdl) {
257 libusb_release_interface(usb->devhdl, USB_INTERFACE);
258 libusb_close(usb->devhdl);
259 usb->devhdl = NULL;
260 }
261}
262
263/* Communicate to an USB device to identify the Kingst LA model. */
264static int la2016_identify_read(struct sr_dev_inst *sdi,
265 struct sr_usb_dev_inst *usb, libusb_device *dev,
266 gboolean show_message)
267{
268 int ret;
269
270 ret = la2016_open_usb(usb, dev, show_message);
271 if (ret != SR_OK) {
272 if (show_message)
273 sr_err("Cannot communicate to MCU firmware.");
274 return ret;
275 }
6d53e949
GS
276
277 /*
278 * Also complete the hardware configuration (FPGA bitstream)
279 * when MCU firmware communication became operational. Either
280 * failure is considered fatal when probing for the device.
281 */
d466f61c 282 ret = la2016_identify_device(sdi, show_message);
6d53e949
GS
283 if (ret == SR_OK) {
284 ret = la2016_init_hardware(sdi);
285 }
286
d466f61c
GS
287 la2016_close_usb(usb);
288
289 return ret;
290}
291
292/* Find given conn_id in another USB enum. Identify Kingst LA model. */
293static int la2016_identify_enum(struct sr_dev_inst *sdi)
294{
295 struct sr_dev_driver *di;
296 struct drv_context *drvc;
297 struct sr_context *ctx;
298 libusb_device **devlist, *dev;
299 struct libusb_device_descriptor des;
300 int ret, id_ret;
301 size_t device_count, dev_idx;
302 char conn_id[64];
303
304 di = sdi->driver;
305 drvc = di->context;
306 ctx = drvc->sr_ctx;;
307
308 ret = libusb_get_device_list(ctx->libusb_ctx, &devlist);
309 if (ret < 0)
310 return SR_ERR_IO;
311 device_count = ret;
312 if (!device_count)
313 return SR_ERR_IO;
314 id_ret = SR_ERR_IO;
315 for (dev_idx = 0; dev_idx < device_count; dev_idx++) {
316 dev = devlist[dev_idx];
317 libusb_get_device_descriptor(dev, &des);
318 if (des.idVendor != LA2016_VID || des.idProduct != LA2016_PID)
319 continue;
320 if (des.iProduct != LA2016_IPRODUCT_INDEX)
321 continue;
322 ret = usb_get_port_path(dev, conn_id, sizeof(conn_id));
323 if (ret < 0)
324 continue;
325 if (strcmp(sdi->connection_id, conn_id) != 0)
326 continue;
327 id_ret = la2016_identify_read(sdi, sdi->conn, dev, FALSE);
328 break;
329 }
330 libusb_free_device_list(devlist, 1);
331
332 return id_ret;
333}
334
335/* Wait for a device to re-appear after firmware upload. */
336static int la2016_identify_wait(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 sr_info("Waiting for device to reset after firmware upload.");
345 now = g_get_monotonic_time();
346 reset_done = devc->fw_uploaded + RENUM_GONE_DELAY_MS * 1000;
347 if (now < reset_done)
348 g_usleep(reset_done - now);
349 do {
350 now = g_get_monotonic_time();
351 elapsed_ms = (now - devc->fw_uploaded) / 1000;
352 sr_spew("Waited %" PRIu64 "ms.", elapsed_ms);
353 ret = la2016_identify_enum(sdi);
354 if (ret == SR_OK) {
355 devc->fw_uploaded = 0;
356 break;
357 }
358 g_usleep(RENUM_POLL_INTERVAL_MS * 1000);
359 } while (elapsed_ms < RENUM_CHECK_PERIOD_MS);
360 if (ret != SR_OK) {
361 sr_err("Device failed to re-enumerate.");
362 return ret;
363 }
364 sr_info("Device came back after %" PRIi64 "ms.", elapsed_ms);
365
366 return SR_OK;
367}
368
369/*
370 * Open given conn_id from another USB enum. Used by dev_open(). Similar
371 * to, and should be kept in sync with la2016_identify_enum().
372 */
373static int la2016_open_enum(struct sr_dev_inst *sdi)
374{
375 struct sr_dev_driver *di;
376 struct drv_context *drvc;
377 struct sr_context *ctx;
378 libusb_device **devlist, *dev;
379 struct libusb_device_descriptor des;
380 int ret, open_ret;
381 size_t device_count, dev_idx;
382 char conn_id[64];
383
384 di = sdi->driver;
385 drvc = di->context;
386 ctx = drvc->sr_ctx;;
387
388 ret = libusb_get_device_list(ctx->libusb_ctx, &devlist);
389 if (ret < 0)
390 return SR_ERR_IO;
391 device_count = ret;
392 if (!device_count)
393 return SR_ERR_IO;
394 open_ret = SR_ERR_IO;
395 for (dev_idx = 0; dev_idx < device_count; dev_idx++) {
396 dev = devlist[dev_idx];
397 libusb_get_device_descriptor(dev, &des);
398 if (des.idVendor != LA2016_VID || des.idProduct != LA2016_PID)
399 continue;
400 if (des.iProduct != LA2016_IPRODUCT_INDEX)
401 continue;
402 ret = usb_get_port_path(dev, conn_id, sizeof(conn_id));
403 if (ret < 0)
404 continue;
405 if (strcmp(sdi->connection_id, conn_id) != 0)
406 continue;
407 open_ret = la2016_open_usb(sdi->conn, dev, TRUE);
408 break;
409 }
410 libusb_free_device_list(devlist, 1);
411
412 return open_ret;
413}
414
f2cd2deb
FS
415static GSList *scan(struct sr_dev_driver *di, GSList *options)
416{
417 struct drv_context *drvc;
520a20e9 418 struct sr_context *ctx;
f2cd2deb
FS
419 struct dev_context *devc;
420 struct sr_dev_inst *sdi;
421 struct sr_usb_dev_inst *usb;
422 struct sr_config *src;
423 GSList *l;
d466f61c 424 GSList *devices, *found_devices, *renum_devices;
f2cd2deb
FS
425 GSList *conn_devices;
426 struct libusb_device_descriptor des;
520a20e9
GS
427 libusb_device **devlist, *dev;
428 size_t dev_count, dev_idx, ch_idx;
429 uint8_t bus, addr;
d466f61c 430 uint16_t pid;
f2cd2deb 431 const char *conn;
520a20e9 432 char conn_id[64];
520a20e9 433 int ret;
d466f61c 434 size_t ch_off, ch_max;
331277e0
GS
435 struct sr_channel *ch;
436 struct sr_channel_group *cg;
f2cd2deb
FS
437
438 drvc = di->context;
520a20e9 439 ctx = drvc->sr_ctx;;
f2cd2deb
FS
440
441 conn = NULL;
d466f61c 442 conn_devices = NULL;
f2cd2deb
FS
443 for (l = options; l; l = l->next) {
444 src = l->data;
445 switch (src->key) {
446 case SR_CONF_CONN:
447 conn = g_variant_get_string(src->data, NULL);
448 break;
449 }
450 }
451 if (conn)
520a20e9 452 conn_devices = sr_usb_find(ctx->libusb_ctx, conn);
d466f61c
GS
453 if (conn && !conn_devices) {
454 sr_err("Cannot find the specified connection '%s'.", conn);
455 return NULL;
456 }
f2cd2deb 457
d466f61c
GS
458 /*
459 * Find all LA2016 devices, optionally upload firmware to them.
460 * Defer completion of sdi/devc creation until all (selected)
461 * devices were found in a usable state, and their models got
462 * identified which affect their feature set. It appears that
463 * we cannot communicate to the device within the same USB enum
464 * cycle, needs another USB enumeration after firmware upload.
465 */
f2cd2deb 466 devices = NULL;
d466f61c
GS
467 found_devices = NULL;
468 renum_devices = NULL;
520a20e9
GS
469 ret = libusb_get_device_list(ctx->libusb_ctx, &devlist);
470 if (ret < 0) {
471 sr_err("Cannot get device list: %s.", libusb_error_name(ret));
472 return devices;
473 }
474 dev_count = ret;
475 for (dev_idx = 0; dev_idx < dev_count; dev_idx++) {
476 dev = devlist[dev_idx];
477 bus = libusb_get_bus_number(dev);
478 addr = libusb_get_device_address(dev);
d466f61c
GS
479
480 /* Filter by connection when externally specified. */
481 for (l = conn_devices; l; l = l->next) {
482 usb = l->data;
483 if (usb->bus == bus && usb->address == addr)
484 break;
485 }
486 if (conn_devices && !l) {
487 sr_spew("Bus %hhu, addr %hhu do not match specified filter.",
488 bus, addr);
489 continue;
f2cd2deb
FS
490 }
491
d466f61c 492 /* Check USB VID:PID. Get the connection string. */
520a20e9 493 libusb_get_device_descriptor(dev, &des);
d466f61c
GS
494 if (des.idVendor != LA2016_VID || des.idProduct != LA2016_PID)
495 continue;
496 pid = des.idProduct;
520a20e9
GS
497 ret = usb_get_port_path(dev, conn_id, sizeof(conn_id));
498 if (ret < 0)
f2cd2deb 499 continue;
d466f61c
GS
500 sr_dbg("USB enum found %04x:%04x at path %s, %d.%d.",
501 des.idVendor, des.idProduct, conn_id, bus, addr);
502 usb = sr_usb_dev_inst_new(bus, addr, NULL);
f2cd2deb 503
520a20e9 504 sdi = g_malloc0(sizeof(*sdi));
d466f61c 505 sdi->driver = di;
f2cd2deb 506 sdi->status = SR_ST_INITIALIZING;
d466f61c 507 sdi->inst_type = SR_INST_USB;
520a20e9 508 sdi->connection_id = g_strdup(conn_id);
d466f61c 509 sdi->conn = usb;
f2cd2deb 510
d466f61c
GS
511 devc = g_malloc0(sizeof(*devc));
512 sdi->priv = devc;
f2cd2deb 513
d466f61c
GS
514 /*
515 * Load MCU firmware if it is currently missing. Which
516 * makes the device disappear and renumerate in USB.
517 * We need to come back another time to communicate to
518 * this device.
519 */
520 devc->fw_uploaded = 0;
91aa0f04 521 devc->usb_pid = pid;
d466f61c
GS
522 if (des.iProduct != LA2016_IPRODUCT_INDEX) {
523 sr_info("Uploading MCU firmware to '%s'.", conn_id);
91aa0f04 524 ret = la2016_upload_firmware(sdi, ctx, dev, FALSE);
520a20e9 525 if (ret != SR_OK) {
91f73872 526 sr_err("MCU firmware upload failed.");
d466f61c 527 kingst_la2016_free_sdi(sdi);
f2cd2deb
FS
528 continue;
529 }
d466f61c
GS
530 devc->fw_uploaded = g_get_monotonic_time();
531 usb->address = 0xff;
532 renum_devices = g_slist_append(renum_devices, sdi);
533 continue;
91aa0f04
GS
534 } else {
535 ret = la2016_upload_firmware(sdi, NULL, NULL, TRUE);
536 if (ret != SR_OK) {
537 sr_err("MCU firmware filename check failed.");
538 kingst_la2016_free_sdi(sdi);
539 continue;
540 }
f2cd2deb
FS
541 }
542
d466f61c
GS
543 /*
544 * Communicate to the MCU firmware to access EEPROM data
545 * which lets us identify the device type. Then stop, to
546 * share remaining sdi/devc creation with those devices
547 * which had their MCU firmware uploaded above and which
548 * get revisited later.
549 */
550 ret = la2016_identify_read(sdi, usb, dev, TRUE);
551 if (ret != SR_OK || !devc->model) {
552 sr_err("Unknown or unsupported device type.");
553 kingst_la2016_free_sdi(sdi);
554 continue;
555 }
556 found_devices = g_slist_append(found_devices, sdi);
557 }
558 libusb_free_device_list(devlist, 1);
559 g_slist_free_full(conn_devices, sr_usb_dev_inst_free_cb);
f2cd2deb 560
d466f61c
GS
561 /*
562 * Wait for devices to re-appear after firmware upload. Append
563 * the yet unidentified device to the list of found devices, or
564 * release the previously allocated sdi/devc.
565 */
566 for (l = renum_devices; l; l = l->next) {
567 sdi = l->data;
568 devc = sdi->priv;
569 ret = la2016_identify_wait(sdi);
570 if (ret != SR_OK || !devc->model) {
571 sr_dbg("Skipping unusable '%s'.", sdi->connection_id);
572 kingst_la2016_free_sdi(sdi);
573 continue;
520a20e9 574 }
d466f61c
GS
575 found_devices = g_slist_append(found_devices, sdi);
576 }
577 g_slist_free(renum_devices);
f2cd2deb 578
d466f61c
GS
579 /*
580 * All found devices got identified, their type is known here.
581 * Complete the sdi/devc creation. Assign default settings
582 * because the vendor firmware would not let us read back the
583 * previously written configuration.
584 */
585 for (l = found_devices; l; l = l->next) {
586 sdi = l->data;
587 devc = sdi->priv;
588
589 sdi->vendor = g_strdup("Kingst");
590 sdi->model = g_strdup(devc->model->name);
591 ch_off = 0;
592
331277e0 593 /* Create the "Logic" channel group. */
d466f61c
GS
594 ch_max = ARRAY_SIZE(channel_names_logic);
595 if (ch_max > devc->model->channel_count)
596 ch_max = devc->model->channel_count;
331277e0
GS
597 cg = sr_channel_group_new(sdi, "Logic", NULL);
598 devc->cg_logic = cg;
d466f61c 599 for (ch_idx = 0; ch_idx < ch_max; ch_idx++) {
331277e0 600 ch = sr_channel_new(sdi, ch_off,
d466f61c
GS
601 SR_CHANNEL_LOGIC, TRUE,
602 channel_names_logic[ch_idx]);
603 ch_off++;
331277e0
GS
604 cg->channels = g_slist_append(cg->channels, ch);
605 }
606
607 /* Create the "PWMx" channel groups. */
608 ch_max = ARRAY_SIZE(channel_names_pwm);
609 for (ch_idx = 0; ch_idx < ch_max; ch_idx++) {
610 const char *name;
611 name = channel_names_pwm[ch_idx];
612 cg = sr_channel_group_new(sdi, name, NULL);
613 if (!devc->cg_pwm)
614 devc->cg_pwm = cg;
615 ch = sr_channel_new(sdi, ch_off,
616 SR_CHANNEL_ANALOG, FALSE, name);
617 ch_off++;
618 cg->channels = g_slist_append(cg->channels, ch);
d466f61c 619 }
f2cd2deb 620
08a49848
GS
621 /*
622 * Ideally we'd get the previous configuration from the
623 * hardware, but this device is write-only. So we have
624 * to assign a fixed set of initial configuration values.
625 */
a38f0f5e 626 sr_sw_limits_init(&devc->sw_limits);
d8fbfcd9
GS
627 devc->sw_limits.limit_samples = 0;
628 devc->capture_ratio = 50;
edc0b015 629 devc->samplerate = devc->model->samplerate;
9270f8f4 630 devc->threshold_voltage_idx = LOGIC_THRESHOLD_IDX_DFLT;
08a49848
GS
631 if (ARRAY_SIZE(devc->pwm_setting) >= 1) {
632 devc->pwm_setting[0].enabled = FALSE;
633 devc->pwm_setting[0].freq = SR_KHZ(1);
634 devc->pwm_setting[0].duty = 50;
635 }
636 if (ARRAY_SIZE(devc->pwm_setting) >= 2) {
637 devc->pwm_setting[1].enabled = FALSE;
638 devc->pwm_setting[1].freq = SR_KHZ(100);
639 devc->pwm_setting[1].duty = 50;
640 }
f2cd2deb
FS
641
642 sdi->status = SR_ST_INACTIVE;
d466f61c 643 devices = g_slist_append(devices, sdi);
f2cd2deb 644 }
d466f61c 645 g_slist_free(found_devices);
f2cd2deb
FS
646
647 return std_scan_complete(di, devices);
648}
649
f2cd2deb
FS
650static int dev_open(struct sr_dev_inst *sdi)
651{
08a49848 652 struct dev_context *devc;
f2cd2deb 653 int ret;
08a49848
GS
654 size_t ch;
655
656 devc = sdi->priv;
f2cd2deb 657
d466f61c 658 ret = la2016_open_enum(sdi);
f2cd2deb 659 if (ret != SR_OK) {
91f73872 660 sr_err("Cannot open device.");
520a20e9 661 return ret;
f2cd2deb
FS
662 }
663
08a49848
GS
664 /* Send most recent PWM configuration to the device. */
665 for (ch = 0; ch < ARRAY_SIZE(devc->pwm_setting); ch++) {
666 ret = la2016_write_pwm_config(sdi, ch);
667 if (ret != SR_OK)
668 return ret;
6d53e949
GS
669 }
670
f2cd2deb
FS
671 return SR_OK;
672}
673
674static int dev_close(struct sr_dev_inst *sdi)
675{
676 struct sr_usb_dev_inst *usb;
677
678 usb = sdi->conn;
679
680 if (!usb->devhdl)
681 return SR_ERR_BUG;
682
1291ea43
GS
683 la2016_release_resources(sdi);
684
66a24ab5
GS
685 if (WITH_DEINIT_IN_CLOSE)
686 la2016_deinit_hardware(sdi);
f2cd2deb
FS
687
688 sr_info("Closing device on %d.%d (logical) / %s (physical) interface %d.",
689 usb->bus, usb->address, sdi->connection_id, USB_INTERFACE);
d466f61c 690 la2016_close_usb(sdi->conn);
f2cd2deb
FS
691
692 return SR_OK;
693}
694
331277e0
GS
695/* Config API helper. Get type and index of a channel group. */
696static int get_cg_index(const struct sr_dev_inst *sdi,
697 const struct sr_channel_group *cg,
698 int *type, size_t *logic, size_t *analog)
699{
700 struct dev_context *devc;
701 GSList *l;
702 size_t idx;
703
704 /* Preset return values. */
705 if (type)
706 *type = 0;
707 if (logic)
708 *logic = 0;
709 if (analog)
710 *analog = 0;
711
712 /* Start categorizing the received cg. */
713 if (!sdi)
714 return SR_ERR_ARG;
715 devc = sdi->priv;
716 if (!cg)
717 return SR_OK;
718 l = sdi->channel_groups;
719
720 /* First sdi->channelgroups item is "Logic". */
721 if (!l)
722 return SR_ERR_BUG;
723 if (cg == l->data) {
724 if (type)
725 *type = SR_CHANNEL_LOGIC;
726 if (logic)
727 *logic = 0;
728 return SR_OK;
729 }
730 l = l->next;
731
732 /* Next sdi->channelgroups items are "PWMx". */
733 idx = 0;
734 while (l && l->data != cg) {
735 idx++;
736 l = l->next;
737 }
738 if (l && idx < ARRAY_SIZE(devc->pwm_setting)) {
739 if (type)
740 *type = SR_CHANNEL_ANALOG;
741 if (analog)
742 *analog = idx;
743 return SR_OK;
744 }
745
746 return SR_ERR_ARG;
747}
748
955ab604
GS
749static int config_get(uint32_t key, GVariant **data,
750 const struct sr_dev_inst *sdi, const struct sr_channel_group *cg)
f2cd2deb
FS
751{
752 struct dev_context *devc;
331277e0
GS
753 int ret, cg_type;
754 size_t logic_idx, analog_idx;
755 struct pwm_setting *pwm;
f2cd2deb 756 struct sr_usb_dev_inst *usb;
9270f8f4 757 double voltage, rounded;
f2cd2deb 758
9270f8f4
GS
759 (void)rounded;
760 (void)voltage;
761
f2cd2deb
FS
762 if (!sdi)
763 return SR_ERR_ARG;
764 devc = sdi->priv;
765
331277e0
GS
766 /* Check for types (and index) of channel groups. */
767 ret = get_cg_index(sdi, cg, &cg_type, &logic_idx, &analog_idx);
768 if (cg && ret != SR_OK)
769 return SR_ERR_ARG;
770
771 /* Handle requests for the "Logic" channel group. */
772 if (cg && cg_type == SR_CHANNEL_LOGIC) {
9270f8f4
GS
773 switch (key) {
774#if !WITH_THRESHOLD_DEVCFG
9270f8f4
GS
775 case SR_CONF_VOLTAGE_THRESHOLD:
776 voltage = threshold_voltage(sdi, NULL);
777 *data = std_gvar_tuple_double(voltage, voltage);
778 break;
9270f8f4
GS
779#endif /* WITH_THRESHOLD_DEVCFG */
780 default:
781 return SR_ERR_NA;
782 }
783 return SR_OK;
331277e0
GS
784 }
785
786 /* Handle requests for the "PWMx" channel groups. */
787 if (cg && cg_type == SR_CHANNEL_ANALOG) {
788 pwm = &devc->pwm_setting[analog_idx];
789 switch (key) {
790 case SR_CONF_ENABLED:
791 *data = g_variant_new_boolean(pwm->enabled);
792 break;
793 case SR_CONF_OUTPUT_FREQUENCY:
794 *data = g_variant_new_double(pwm->freq);
795 break;
796 case SR_CONF_DUTY_CYCLE:
797 *data = g_variant_new_double(pwm->duty);
798 break;
799 default:
800 return SR_ERR_NA;
801 }
802 return SR_OK;
803 }
804
f2cd2deb
FS
805 switch (key) {
806 case SR_CONF_CONN:
f2cd2deb 807 usb = sdi->conn;
f2cd2deb
FS
808 *data = g_variant_new_printf("%d.%d", usb->bus, usb->address);
809 break;
810 case SR_CONF_SAMPLERATE:
edc0b015 811 *data = g_variant_new_uint64(devc->samplerate);
f2cd2deb
FS
812 break;
813 case SR_CONF_LIMIT_SAMPLES:
a38f0f5e
GS
814 case SR_CONF_LIMIT_MSEC:
815 return sr_sw_limits_config_get(&devc->sw_limits, key, data);
f2cd2deb
FS
816 case SR_CONF_CAPTURE_RATIO:
817 *data = g_variant_new_uint64(devc->capture_ratio);
818 break;
9270f8f4 819#if WITH_THRESHOLD_DEVCFG
9270f8f4
GS
820 case SR_CONF_VOLTAGE_THRESHOLD:
821 voltage = threshold_voltage(sdi, NULL);
822 *data = std_gvar_tuple_double(voltage, voltage);
823 break;
9270f8f4 824#endif /* WITH_THRESHOLD_DEVCFG */
f2cd2deb
FS
825 default:
826 return SR_ERR_NA;
827 }
828
829 return SR_OK;
830}
831
955ab604
GS
832static int config_set(uint32_t key, GVariant *data,
833 const struct sr_dev_inst *sdi, const struct sr_channel_group *cg)
f2cd2deb
FS
834{
835 struct dev_context *devc;
331277e0
GS
836 int ret, cg_type;
837 size_t logic_idx, analog_idx;
838 struct pwm_setting *pwm;
c35baf6e 839 double value_f;
f2cd2deb
FS
840 int idx;
841
f2cd2deb
FS
842 devc = sdi->priv;
843
331277e0
GS
844 /* Check for types (and index) of channel groups. */
845 ret = get_cg_index(sdi, cg, &cg_type, &logic_idx, &analog_idx);
846 if (cg && ret != SR_OK)
847 return SR_ERR_ARG;
848
849 /* Handle requests for the "Logic" channel group. */
850 if (cg && cg_type == SR_CHANNEL_LOGIC) {
9270f8f4
GS
851 switch (key) {
852#if !WITH_THRESHOLD_DEVCFG
9270f8f4
GS
853 case SR_CONF_LOGIC_THRESHOLD:
854 idx = std_double_tuple_idx(data,
855 ARRAY_AND_SIZE(threshold_ranges));
856 if (idx < 0)
857 return SR_ERR_ARG;
858 devc->threshold_voltage_idx = idx;
859 break;
9270f8f4
GS
860#endif /* WITH_THRESHOLD_DEVCFG */
861 default:
862 return SR_ERR_NA;
863 }
864 return SR_OK;
331277e0
GS
865 }
866
867 /* Handle requests for the "PWMx" channel groups. */
868 if (cg && cg_type == SR_CHANNEL_ANALOG) {
869 pwm = &devc->pwm_setting[analog_idx];
870 switch (key) {
871 case SR_CONF_ENABLED:
872 pwm->enabled = g_variant_get_boolean(data);
873 ret = la2016_write_pwm_config(sdi, analog_idx);
874 if (ret != SR_OK)
875 return ret;
876 break;
877 case SR_CONF_OUTPUT_FREQUENCY:
c35baf6e
GS
878 value_f = g_variant_get_double(data);
879 if (value_f <= 0.0 || value_f > MAX_PWM_FREQ)
880 return SR_ERR_ARG;
881 pwm->freq = value_f;
331277e0
GS
882 ret = la2016_write_pwm_config(sdi, analog_idx);
883 if (ret != SR_OK)
884 return ret;
885 break;
886 case SR_CONF_DUTY_CYCLE:
c35baf6e
GS
887 value_f = g_variant_get_double(data);
888 if (value_f <= 0.0 || value_f > 100.0)
889 return SR_ERR_ARG;
890 pwm->duty = value_f;
331277e0
GS
891 ret = la2016_write_pwm_config(sdi, analog_idx);
892 if (ret != SR_OK)
893 return ret;
894 break;
895 default:
896 return SR_ERR_NA;
897 }
898 return SR_OK;
899 }
900
f2cd2deb
FS
901 switch (key) {
902 case SR_CONF_SAMPLERATE:
edc0b015 903 devc->samplerate = g_variant_get_uint64(data);
f2cd2deb
FS
904 break;
905 case SR_CONF_LIMIT_SAMPLES:
a38f0f5e
GS
906 case SR_CONF_LIMIT_MSEC:
907 return sr_sw_limits_config_set(&devc->sw_limits, key, data);
f2cd2deb
FS
908 case SR_CONF_CAPTURE_RATIO:
909 devc->capture_ratio = g_variant_get_uint64(data);
910 break;
9270f8f4 911#if WITH_THRESHOLD_DEVCFG
9270f8f4
GS
912 case SR_CONF_VOLTAGE_THRESHOLD:
913 idx = std_double_tuple_idx(data,
914 ARRAY_AND_SIZE(threshold_ranges));
915 if (idx < 0)
916 return SR_ERR_ARG;
917 devc->threshold_voltage_idx = idx;
918 break;
9270f8f4 919#endif /* WITH_THRESHOLD_DEVCFG */
f2cd2deb
FS
920 default:
921 return SR_ERR_NA;
922 }
923
924 return SR_OK;
925}
926
955ab604
GS
927static int config_list(uint32_t key, GVariant **data,
928 const struct sr_dev_inst *sdi, const struct sr_channel_group *cg)
f2cd2deb 929{
8b172e78 930 struct dev_context *devc;
331277e0
GS
931 int ret, cg_type;
932 size_t logic_idx, analog_idx;
8b172e78 933
a38f0f5e
GS
934 devc = sdi ? sdi->priv : NULL;
935
331277e0
GS
936 /* Check for types (and index) of channel groups. */
937 ret = get_cg_index(sdi, cg, &cg_type, &logic_idx, &analog_idx);
938 if (cg && ret != SR_OK)
939 return SR_ERR_ARG;
940
941 /* Handle requests for the "Logic" channel group. */
942 if (cg && cg_type == SR_CHANNEL_LOGIC) {
9270f8f4
GS
943 switch (key) {
944 case SR_CONF_DEVICE_OPTIONS:
945 if (ARRAY_SIZE(devopts_cg_logic) == 0)
946 return SR_ERR_NA;
947 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32,
948 devopts_cg_logic, ARRAY_SIZE(devopts_cg_logic),
949 sizeof(devopts_cg_logic[0]));
950 break;
951#if !WITH_THRESHOLD_DEVCFG
9270f8f4
GS
952 case SR_CONF_VOLTAGE_THRESHOLD:
953 *data = std_gvar_thresholds(ARRAY_AND_SIZE(threshold_ranges));
954 break;
9270f8f4
GS
955#endif /* WITH_THRESHOLD_DEVCFG */
956 default:
957 return SR_ERR_NA;
958 }
959 return SR_OK;
331277e0
GS
960 }
961
962 /* Handle requests for the "PWMx" channel groups. */
963 if (cg && cg_type == SR_CHANNEL_ANALOG) {
964 switch (key) {
965 case SR_CONF_DEVICE_OPTIONS:
966 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32,
967 devopts_cg_pwm, ARRAY_SIZE(devopts_cg_pwm),
968 sizeof(devopts_cg_pwm[0]));
969 break;
970 default:
971 return SR_ERR_NA;
972 }
973 return SR_OK;
974 }
975
f2cd2deb
FS
976 switch (key) {
977 case SR_CONF_SCAN_OPTIONS:
978 case SR_CONF_DEVICE_OPTIONS:
411ad77c
GS
979 return STD_CONFIG_LIST(key, data, sdi, cg,
980 scanopts, drvopts, devopts);
f2cd2deb 981 case SR_CONF_SAMPLERATE:
fb28e72d
MW
982 if (!sdi)
983 return SR_ERR_ARG;
d466f61c 984 if (devc->model->samplerate == SR_MHZ(500))
330853ba 985 *data = std_gvar_samplerates(ARRAY_AND_SIZE(rates_500mhz));
d466f61c 986 else if (devc->model->samplerate == SR_MHZ(200))
330853ba 987 *data = std_gvar_samplerates(ARRAY_AND_SIZE(rates_200mhz));
4276ca94 988 else if (devc->model->samplerate == SR_MHZ(100))
330853ba 989 *data = std_gvar_samplerates(ARRAY_AND_SIZE(rates_100mhz));
4276ca94
GS
990 else
991 return SR_ERR_BUG;
f2cd2deb
FS
992 break;
993 case SR_CONF_LIMIT_SAMPLES:
d8fbfcd9 994 *data = std_gvar_tuple_u64(0, LA2016_NUM_SAMPLES_MAX);
f2cd2deb 995 break;
9270f8f4 996#if WITH_THRESHOLD_DEVCFG
9270f8f4
GS
997 case SR_CONF_VOLTAGE_THRESHOLD:
998 *data = std_gvar_thresholds(ARRAY_AND_SIZE(threshold_ranges));
999 break;
9270f8f4 1000#endif /* WITH_THRESHOLD_DEVCFG */
f2cd2deb
FS
1001 case SR_CONF_TRIGGER_MATCH:
1002 *data = std_gvar_array_i32(ARRAY_AND_SIZE(trigger_matches));
1003 break;
f2cd2deb
FS
1004 default:
1005 return SR_ERR_NA;
1006 }
1007
1008 return SR_OK;
1009}
1010
f2cd2deb
FS
1011static int dev_acquisition_start(const struct sr_dev_inst *sdi)
1012{
1013 struct sr_dev_driver *di;
1014 struct drv_context *drvc;
520a20e9 1015 struct sr_context *ctx;
f2cd2deb 1016 struct dev_context *devc;
4276ca94 1017 size_t unitsize;
9270f8f4 1018 double voltage;
f2cd2deb
FS
1019 int ret;
1020
1021 di = sdi->driver;
1022 drvc = di->context;
520a20e9 1023 ctx = drvc->sr_ctx;;
f2cd2deb
FS
1024 devc = sdi->priv;
1025
a38f0f5e 1026 if (!devc->feed_queue) {
4276ca94
GS
1027 if (devc->model->channel_count == 32)
1028 unitsize = sizeof(uint32_t);
1029 else if (devc->model->channel_count == 16)
1030 unitsize = sizeof(uint16_t);
1031 else
1032 return SR_ERR_ARG;
a38f0f5e 1033 devc->feed_queue = feed_queue_logic_alloc(sdi,
4276ca94 1034 LA2016_CONVBUFFER_SIZE, unitsize);
a38f0f5e
GS
1035 if (!devc->feed_queue) {
1036 sr_err("Cannot allocate buffer for session feed.");
1037 return SR_ERR_MALLOC;
1038 }
038e65c1
GS
1039 devc->packets_per_chunk = TRANSFER_PACKET_LENGTH;
1040 devc->packets_per_chunk--;
1041 devc->packets_per_chunk /= unitsize + sizeof(uint8_t);
f2cd2deb
FS
1042 }
1043
a38f0f5e
GS
1044 sr_sw_limits_acquisition_start(&devc->sw_limits);
1045
9270f8f4
GS
1046 voltage = threshold_voltage(sdi, NULL);
1047 ret = la2016_setup_acquisition(sdi, voltage);
411ad77c 1048 if (ret != SR_OK) {
a38f0f5e
GS
1049 feed_queue_logic_free(devc->feed_queue);
1050 devc->feed_queue = NULL;
f2cd2deb
FS
1051 return ret;
1052 }
1053
411ad77c
GS
1054 ret = la2016_start_acquisition(sdi);
1055 if (ret != SR_OK) {
3ebc1cb2 1056 la2016_abort_acquisition(sdi);
a38f0f5e
GS
1057 feed_queue_logic_free(devc->feed_queue);
1058 devc->feed_queue = NULL;
f2cd2deb
FS
1059 return ret;
1060 }
1061
cf057ac4 1062 devc->completion_seen = FALSE;
520a20e9 1063 usb_source_add(sdi->session, ctx, 50,
388438e4 1064 la2016_receive_data, (void *)sdi);
f2cd2deb
FS
1065
1066 std_session_send_df_header(sdi);
1067
1068 return SR_OK;
1069}
1070
1071static int dev_acquisition_stop(struct sr_dev_inst *sdi)
1072{
1073 int ret;
1074
1075 ret = la2016_abort_acquisition(sdi);
f2cd2deb
FS
1076
1077 return ret;
1078}
1079
1080static struct sr_dev_driver kingst_la2016_driver_info = {
1081 .name = "kingst-la2016",
1082 .longname = "Kingst LA2016",
1083 .api_version = 1,
1084 .init = std_init,
1085 .cleanup = std_cleanup,
1086 .scan = scan,
1087 .dev_list = std_dev_list,
1088 .dev_clear = std_dev_clear,
1089 .config_get = config_get,
1090 .config_set = config_set,
1091 .config_list = config_list,
1092 .dev_open = dev_open,
1093 .dev_close = dev_close,
1094 .dev_acquisition_start = dev_acquisition_start,
1095 .dev_acquisition_stop = dev_acquisition_stop,
1096 .context = NULL,
1097};
1098SR_REGISTER_DEV_DRIVER(kingst_la2016_driver_info);