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