]> sigrok.org Git - libsigrok.git/blame - hardware/fx2lafw/fx2lafw.c
fx2lafw: use new init/scan API
[libsigrok.git] / hardware / fx2lafw / fx2lafw.c
CommitLineData
f302a082
JH
1/*
2 * This file is part of the sigrok project.
3 *
cf94c816 4 * Copyright (C) 2010-2012 Bert Vermeulen <bert@biot.com>
f302a082
JH
5 * Copyright (C) 2012 Joel Holdsworth <joel@airwebreathe.org.uk>
6 *
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 */
20
21#include <stdio.h>
22#include <stdlib.h>
6b73d9a5 23#include <string.h>
8b35f474 24#include <inttypes.h>
187b3582 25#include <libusb.h>
f302a082 26#include "config.h"
45c59c8b
BV
27#include "libsigrok.h"
28#include "libsigrok-internal.h"
f302a082 29#include "fx2lafw.h"
f6582cd7 30#include "command.h"
f302a082 31
4679d14d 32static const struct fx2lafw_profile supported_fx2[] = {
7ae2f9d5
UH
33 /*
34 * CWAV USBee AX
17b6c75a 35 * EE Electronics ESLA201A
9f05304e 36 * ARMFLY AX-Pro
17b6c75a 37 */
f8b07fc6 38 { 0x08a9, 0x0014, "CWAV", "USBee AX", NULL,
d1ddc7a9
JH
39 FIRMWARE_DIR "/fx2lafw-cwav-usbeeax.fw",
40 0 },
0e8d0e24
IF
41 /*
42 * CWAV USBee DX
43 * XZL-Studio DX
44 */
45 { 0x08a9, 0x0015, "CWAV", "USBee DX", NULL,
46 FIRMWARE_DIR "/fx2lafw-cwav-usbeedx.fw",
47 DEV_CAPS_16BIT },
93a9f3da 48
7ae2f9d5
UH
49 /*
50 * CWAV USBee SX
4502e869
JH
51 */
52 { 0x08a9, 0x0009, "CWAV", "USBee SX", NULL,
d1ddc7a9
JH
53 FIRMWARE_DIR "/fx2lafw-cwav-usbeesx.fw",
54 0 },
4502e869 55
7ae2f9d5
UH
56 /*
57 * Saleae Logic
93a9f3da
JH
58 * EE Electronics ESLA100
59 * Robomotic MiniLogic
1663e470 60 * Robomotic BugLogic 3
93a9f3da
JH
61 */
62 { 0x0925, 0x3881, "Saleae", "Logic", NULL,
d1ddc7a9
JH
63 FIRMWARE_DIR "/fx2lafw-saleae-logic.fw",
64 0 },
93a9f3da 65
f488762a 66 /*
1663e470
UH
67 * Default Cypress FX2 without EEPROM, e.g.:
68 * Lcsoft Mini Board
69 * Braintechnology USB Interface V2.x
f488762a
JH
70 */
71 { 0x04B4, 0x8613, "Cypress", "FX2", NULL,
d1ddc7a9
JH
72 FIRMWARE_DIR "/fx2lafw-cypress-fx2.fw",
73 DEV_CAPS_16BIT },
f488762a 74
1663e470
UH
75 /*
76 * Braintechnology USB-LPS
77 */
78 { 0x16d0, 0x0498, "Braintechnology", "USB-LPS", NULL,
d1ddc7a9
JH
79 FIRMWARE_DIR "/fx2lafw-braintechnology-usb-lps.fw",
80 DEV_CAPS_16BIT },
1663e470 81
f8b07fc6 82 { 0, 0, 0, 0, 0, 0, 0 }
187b3582
JH
83};
84
915f7cc8 85static const int hwcaps[] = {
8b35f474
JH
86 SR_HWCAP_LOGIC_ANALYZER,
87 SR_HWCAP_SAMPLERATE,
88
89 /* These are really implemented in the driver, not the hardware. */
90 SR_HWCAP_LIMIT_SAMPLES,
91 SR_HWCAP_CONTINUOUS,
772a0e61 92 0,
8b35f474
JH
93};
94
da686568
UH
95/*
96 * TODO: Different probe_names[] for each supported device.
97 */
98static const char *probe_names[] = {
7ae2f9d5
UH
99 "0",
100 "1",
101 "2",
102 "3",
103 "4",
104 "5",
105 "6",
106 "7",
d1ddc7a9
JH
107 "8",
108 "9",
109 "10",
110 "11",
111 "12",
112 "13",
113 "14",
114 "15",
772a0e61 115 NULL,
8b35f474
JH
116};
117
a533743d 118static const uint64_t supported_samplerates[] = {
79dc6498
JH
119 SR_KHZ(20),
120 SR_KHZ(25),
897c1a2e
JH
121 SR_KHZ(50),
122 SR_KHZ(100),
9304d576
JH
123 SR_KHZ(200),
124 SR_KHZ(250),
125 SR_KHZ(500),
8b35f474
JH
126 SR_MHZ(1),
127 SR_MHZ(2),
128 SR_MHZ(3),
129 SR_MHZ(4),
130 SR_MHZ(6),
131 SR_MHZ(8),
132 SR_MHZ(12),
133 SR_MHZ(16),
772a0e61 134 SR_MHZ(24),
934cde02 135 0,
8b35f474
JH
136};
137
a533743d 138static const struct sr_samplerates samplerates = {
590b9f9a
UH
139 0,
140 0,
141 0,
142 supported_samplerates,
8b35f474
JH
143};
144
cac0bbaa 145static GSList *dev_insts = NULL;
187b3582
JH
146static libusb_context *usb_context = NULL;
147
1b79df2f 148static int hw_dev_config_set(int dev_index, int hwcap, const void *value);
da686568 149static int hw_dev_acquisition_stop(int dev_index, void *cb_data);
610dbb70 150
b1eeb67e
JH
151/**
152 * Check the USB configuration to determine if this is an fx2lafw device.
153 *
f9a69557
UH
154 * @return TRUE if the device's configuration profile match fx2lafw
155 * configuration, FALSE otherwise.
b1eeb67e 156 */
f9a69557 157static gboolean check_conf_profile(libusb_device *dev)
b1eeb67e
JH
158{
159 struct libusb_device_descriptor des;
6b73d9a5
BV
160 struct libusb_device_handle *hdl;
161 gboolean ret;
162 unsigned char strdesc[64];
b1eeb67e 163
6b73d9a5
BV
164 hdl = NULL;
165 ret = FALSE;
b1eeb67e 166 while (!ret) {
da686568 167 /* Assume the FW has not been loaded, unless proven wrong. */
b1eeb67e
JH
168 if (libusb_get_device_descriptor(dev, &des) != 0)
169 break;
170
6b73d9a5 171 if (libusb_open(dev, &hdl) != 0)
b1eeb67e
JH
172 break;
173
6b73d9a5
BV
174 if (libusb_get_string_descriptor_ascii(hdl,
175 des.iManufacturer, strdesc, sizeof(strdesc)) < 0)
b1eeb67e 176 break;
6b73d9a5 177 if (strncmp((const char *)strdesc, "sigrok", 6))
b1eeb67e
JH
178 break;
179
6b73d9a5
BV
180 if (libusb_get_string_descriptor_ascii(hdl,
181 des.iProduct, strdesc, sizeof(strdesc)) < 0)
b1eeb67e 182 break;
6b73d9a5 183 if (strncmp((const char *)strdesc, "fx2lafw", 7))
b1eeb67e
JH
184 break;
185
b1eeb67e 186 /* If we made it here, it must be an fx2lafw. */
f9a69557 187 ret = TRUE;
b1eeb67e 188 }
6b73d9a5
BV
189 if (hdl)
190 libusb_close(hdl);
b1eeb67e
JH
191
192 return ret;
193}
194
da686568 195static int fx2lafw_dev_open(int dev_index)
43125c69
JH
196{
197 libusb_device **devlist;
198 struct libusb_device_descriptor des;
199 struct sr_dev_inst *sdi;
772a0e61 200 struct context *ctx;
13bf7ecc 201 struct version_info vi;
ebc34738 202 int ret, skip, i;
1e94408a 203 uint8_t revid;
43125c69
JH
204
205 if (!(sdi = sr_dev_inst_get(dev_insts, dev_index)))
206 return SR_ERR;
207 ctx = sdi->priv;
208
209 if (sdi->status == SR_ST_ACTIVE)
210 /* already in use */
211 return SR_ERR;
212
213 skip = 0;
6fbe5e60
JH
214 const int device_count = libusb_get_device_list(usb_context, &devlist);
215 if (device_count < 0) {
216 sr_err("fx2lafw: Failed to retrieve device list (%d)",
217 device_count);
218 return SR_ERR;
219 }
220
221 for (i = 0; i < device_count; i++) {
ebc34738 222 if ((ret = libusb_get_device_descriptor(devlist[i], &des))) {
7ae2f9d5
UH
223 sr_err("fx2lafw: Failed to get device descriptor: %d.",
224 ret);
43125c69
JH
225 continue;
226 }
227
74fcfb80
JH
228 if (des.idVendor != ctx->profile->vid
229 || des.idProduct != ctx->profile->pid)
43125c69
JH
230 continue;
231
232 if (sdi->status == SR_ST_INITIALIZING) {
233 if (skip != dev_index) {
234 /* Skip devices of this type that aren't the one we want. */
235 skip += 1;
236 continue;
237 }
238 } else if (sdi->status == SR_ST_INACTIVE) {
239 /*
240 * This device is fully enumerated, so we need to find
241 * this device by vendor, product, bus and address.
242 */
243 if (libusb_get_bus_number(devlist[i]) != ctx->usb->bus
244 || libusb_get_device_address(devlist[i]) != ctx->usb->address)
245 /* this is not the one */
246 continue;
247 }
248
ebc34738 249 if (!(ret = libusb_open(devlist[i], &ctx->usb->devhdl))) {
43125c69
JH
250 if (ctx->usb->address == 0xff)
251 /*
252 * first time we touch this device after firmware upload,
253 * so we don't know the address yet.
254 */
255 ctx->usb->address = libusb_get_device_address(devlist[i]);
43125c69 256 } else {
7ae2f9d5 257 sr_err("fx2lafw: Failed to open device: %d.", ret);
13bf7ecc
JH
258 break;
259 }
260
44dfd483
UH
261 ret = command_get_fw_version(ctx->usb->devhdl, &vi);
262 if (ret != SR_OK) {
13bf7ecc 263 sr_err("fx2lafw: Failed to retrieve "
44dfd483 264 "firmware version information.");
13bf7ecc 265 break;
43125c69
JH
266 }
267
1e94408a
UH
268 ret = command_get_revid_version(ctx->usb->devhdl, &revid);
269 if (ret != SR_OK) {
270 sr_err("fx2lafw: Failed to retrieve REVID.");
271 break;
272 }
273
0a8c0c32
UH
274 /*
275 * Changes in major version mean incompatible/API changes, so
276 * bail out if we encounter an incompatible version.
277 * Different minor versions are OK, they should be compatible.
278 */
279 if (vi.major != FX2LAFW_REQUIRED_VERSION_MAJOR) {
280 sr_err("fx2lafw: Expected firmware version %d.x, "
281 "got %d.%d.", FX2LAFW_REQUIRED_VERSION_MAJOR,
282 vi.major, vi.minor);
13bf7ecc
JH
283 break;
284 }
285
286 sdi->status = SR_ST_ACTIVE;
287 sr_info("fx2lafw: Opened device %d on %d.%d "
1e94408a 288 "interface %d, firmware %d.%d, REVID %d.",
13bf7ecc 289 sdi->index, ctx->usb->bus, ctx->usb->address,
1e94408a 290 USB_INTERFACE, vi.major, vi.minor, revid);
13bf7ecc 291
43125c69
JH
292 break;
293 }
294 libusb_free_device_list(devlist, 1);
295
296 if (sdi->status != SR_ST_ACTIVE)
297 return SR_ERR;
298
299 return SR_OK;
300}
301
f1898235
JH
302static void close_dev(struct sr_dev_inst *sdi)
303{
772a0e61 304 struct context *ctx;
f1898235
JH
305
306 ctx = sdi->priv;
307
308 if (ctx->usb->devhdl == NULL)
309 return;
310
7ae2f9d5
UH
311 sr_info("fx2lafw: Closing device %d on %d.%d interface %d.",
312 sdi->index, ctx->usb->bus, ctx->usb->address, USB_INTERFACE);
f1898235
JH
313 libusb_release_interface(ctx->usb->devhdl, USB_INTERFACE);
314 libusb_close(ctx->usb->devhdl);
315 ctx->usb->devhdl = NULL;
316 sdi->status = SR_ST_INACTIVE;
317}
318
6c6781b6
JH
319static int configure_probes(struct context *ctx, GSList *probes)
320{
321 struct sr_probe *probe;
322 GSList *l;
323 int probe_bit, stage, i;
324 char *tc;
325
326 for (i = 0; i < NUM_TRIGGER_STAGES; i++) {
327 ctx->trigger_mask[i] = 0;
328 ctx->trigger_value[i] = 0;
329 }
330
331 stage = -1;
332 for (l = probes; l; l = l->next) {
333 probe = (struct sr_probe *)l->data;
334 if (probe->enabled == FALSE)
335 continue;
d1ddc7a9
JH
336
337 if (probe->index > 8)
0a88ec3d 338 ctx->sample_wide = TRUE;
d1ddc7a9 339
6c6781b6
JH
340 probe_bit = 1 << (probe->index - 1);
341 if (!(probe->trigger))
342 continue;
343
344 stage = 0;
345 for (tc = probe->trigger; *tc; tc++) {
346 ctx->trigger_mask[stage] |= probe_bit;
347 if (*tc == '1')
348 ctx->trigger_value[stage] |= probe_bit;
349 stage++;
350 if (stage > NUM_TRIGGER_STAGES)
351 return SR_ERR;
352 }
353 }
354
355 if (stage == -1)
356 /*
357 * We didn't configure any triggers, make sure acquisition
358 * doesn't wait for any.
359 */
360 ctx->trigger_stage = TRIGGER_FIRED;
361 else
362 ctx->trigger_stage = 0;
363
364 return SR_OK;
365}
366
da686568 367static struct context *fx2lafw_dev_new(void)
187b3582 368{
772a0e61 369 struct context *ctx;
187b3582 370
772a0e61 371 if (!(ctx = g_try_malloc0(sizeof(struct context)))) {
7ae2f9d5 372 sr_err("fx2lafw: %s: ctx malloc failed.", __func__);
187b3582
JH
373 return NULL;
374 }
375
6c6781b6
JH
376 ctx->trigger_stage = TRIGGER_FIRED;
377
772a0e61 378 return ctx;
187b3582 379}
f302a082
JH
380
381/*
382 * API callbacks
383 */
384
40dda2c3 385static int hw_init(void)
61136ea6
BV
386{
387
388 if (libusb_init(&usb_context) != 0) {
389 sr_warn("fx2lafw: Failed to initialize libusb.");
390 return SR_ERR;
391 }
392
393 return SR_OK;
394}
395
3a7a22cb 396static GSList *hw_scan(GSList *options)
f302a082 397{
3a7a22cb 398 GSList *devices;
187b3582 399 struct libusb_device_descriptor des;
3a7a22cb 400 struct sr_dev_inst *sdi;
da686568 401 const struct fx2lafw_profile *prof;
772a0e61 402 struct context *ctx;
3a7a22cb 403 struct sr_probe *probe;
187b3582 404 libusb_device **devlist;
3a7a22cb
BV
405 int devcnt, num_logic_probes, ret, i, j;
406
407 /* Avoid compiler warnings. */
408 (void)options;
187b3582 409
921634ec 410 /* Find all fx2lafw compatible devices and upload firmware to them. */
3a7a22cb 411 devices = NULL;
187b3582
JH
412 libusb_get_device_list(usb_context, &devlist);
413 for (i = 0; devlist[i]; i++) {
414
ebc34738 415 if ((ret = libusb_get_device_descriptor(
7ae2f9d5
UH
416 devlist[i], &des)) != 0) {
417 sr_warn("fx2lafw: Failed to get device descriptor: %d.", ret);
187b3582
JH
418 continue;
419 }
420
da686568 421 prof = NULL;
187b3582
JH
422 for (j = 0; supported_fx2[j].vid; j++) {
423 if (des.idVendor == supported_fx2[j].vid &&
424 des.idProduct == supported_fx2[j].pid) {
da686568 425 prof = &supported_fx2[j];
187b3582
JH
426 }
427 }
428
429 /* Skip if the device was not found */
da686568 430 if (!prof)
187b3582
JH
431 continue;
432
433 sdi = sr_dev_inst_new(devcnt, SR_ST_INITIALIZING,
da686568 434 prof->vendor, prof->model, prof->model_version);
f4a9e5c0 435 if (!sdi)
187b3582
JH
436 return 0;
437
da686568
UH
438 ctx = fx2lafw_dev_new();
439 ctx->profile = prof;
90282c82 440 sdi->priv = ctx;
be4b99e8 441 dev_insts = g_slist_append(dev_insts, sdi);
187b3582 442
b1eeb67e
JH
443 if (check_conf_profile(devlist[i])) {
444 /* Already has the firmware, so fix the new address. */
7ae2f9d5 445 sr_dbg("fx2lafw: Found an fx2lafw device.");
b1eeb67e
JH
446 sdi->status = SR_ST_INACTIVE;
447 ctx->usb = sr_usb_dev_inst_new
448 (libusb_get_bus_number(devlist[i]),
449 libusb_get_device_address(devlist[i]), NULL);
450 } else {
f8b07fc6 451 if (ezusb_upload_firmware(devlist[i], USB_CONFIGURATION,
da686568 452 prof->firmware) == SR_OK)
b1eeb67e 453 /* Remember when the firmware on this device was updated */
e8bd58ff 454 ctx->fw_updated = g_get_monotonic_time();
b1eeb67e 455 else
7ae2f9d5
UH
456 sr_err("fx2lafw: Firmware upload failed for "
457 "device %d.", devcnt);
b1eeb67e
JH
458 ctx->usb = sr_usb_dev_inst_new
459 (libusb_get_bus_number(devlist[i]), 0xff, NULL);
460 }
187b3582
JH
461 }
462 libusb_free_device_list(devlist, 1);
463
3a7a22cb 464 return devices;
f302a082
JH
465}
466
772a0e61 467static int hw_dev_open(int dev_index)
f302a082 468{
43125c69 469 struct sr_dev_inst *sdi;
772a0e61 470 struct context *ctx;
e8bd58ff
UH
471 int ret;
472 int64_t timediff_us, timediff_ms;
43125c69 473
772a0e61 474 if (!(sdi = sr_dev_inst_get(dev_insts, dev_index)))
43125c69
JH
475 return SR_ERR;
476 ctx = sdi->priv;
477
478 /*
f60fdf6e
UH
479 * If the firmware was recently uploaded, wait up to MAX_RENUM_DELAY_MS
480 * milliseconds for the FX2 to renumerate.
43125c69 481 */
3b6c1930 482 ret = SR_ERR;
e8bd58ff 483 if (ctx->fw_updated > 0) {
7ae2f9d5 484 sr_info("fx2lafw: Waiting for device to reset.");
43125c69
JH
485 /* takes at least 300ms for the FX2 to be gone from the USB bus */
486 g_usleep(300 * 1000);
e8bd58ff 487 timediff_ms = 0;
f60fdf6e 488 while (timediff_ms < MAX_RENUM_DELAY_MS) {
da686568 489 if ((ret = fx2lafw_dev_open(dev_index)) == SR_OK)
43125c69
JH
490 break;
491 g_usleep(100 * 1000);
e8bd58ff
UH
492
493 timediff_us = g_get_monotonic_time() - ctx->fw_updated;
3b6c1930
BV
494 timediff_ms = timediff_us / 1000;
495 sr_spew("fx2lafw: waited %" PRIi64 " ms", timediff_ms);
43125c69 496 }
e8bd58ff 497 sr_info("fx2lafw: Device came back after %d ms.", timediff_ms);
43125c69 498 } else {
da686568 499 ret = fx2lafw_dev_open(dev_index);
43125c69
JH
500 }
501
ebc34738 502 if (ret != SR_OK) {
7ae2f9d5 503 sr_err("fx2lafw: Unable to open device.");
43125c69
JH
504 return SR_ERR;
505 }
506 ctx = sdi->priv;
507
ebc34738
UH
508 ret = libusb_claim_interface(ctx->usb->devhdl, USB_INTERFACE);
509 if (ret != 0) {
0c156e06
JH
510 switch(ret) {
511 case LIBUSB_ERROR_BUSY:
512 sr_err("fx2lafw: Unable to claim USB interface. Another "
513 "program or driver has already claimed it.");
514 break;
515
516 case LIBUSB_ERROR_NO_DEVICE:
517 sr_err("fx2lafw: Device has been disconnected.");
518 break;
519
520 default:
521 sr_err("fx2lafw: Unable to claim interface: %d.", ret);
522 break;
523 }
524
43125c69
JH
525 return SR_ERR;
526 }
527
f92994fd
JH
528 if (ctx->cur_samplerate == 0) {
529 /* Samplerate hasn't been set; default to the slowest one. */
530 if (hw_dev_config_set(dev_index, SR_HWCAP_SAMPLERATE,
590b9f9a 531 &supported_samplerates[0]) == SR_ERR)
f92994fd
JH
532 return SR_ERR;
533 }
534
f302a082
JH
535 return SR_OK;
536}
537
f1898235 538static int hw_dev_close(int dev_index)
f302a082 539{
f1898235
JH
540 struct sr_dev_inst *sdi;
541
542 if (!(sdi = sr_dev_inst_get(dev_insts, dev_index))) {
7ae2f9d5 543 sr_err("fx2lafw: %s: sdi was NULL.", __func__);
0abee507 544 return SR_ERR_BUG;
f1898235
JH
545 }
546
547 /* TODO */
548 close_dev(sdi);
549
f302a082
JH
550 return SR_OK;
551}
552
553static int hw_cleanup(void)
554{
187b3582
JH
555 GSList *l;
556 struct sr_dev_inst *sdi;
772a0e61 557 struct context *ctx;
62bc70e4 558 int ret = SR_OK;
187b3582 559
f4a9e5c0 560 for (l = dev_insts; l; l = l->next) {
62bc70e4
JH
561 if (!(sdi = l->data)) {
562 /* Log error, but continue cleaning up the rest. */
7ae2f9d5
UH
563 sr_err("fx2lafw: %s: sdi was NULL, continuing.",
564 __func__);
62bc70e4
JH
565 ret = SR_ERR_BUG;
566 continue;
567 }
568 if (!(ctx = sdi->priv)) {
569 /* Log error, but continue cleaning up the rest. */
570 sr_err("fx2lafw: %s: sdi->priv was NULL, continuing",
571 __func__);
572 ret = SR_ERR_BUG;
573 continue;
574 }
575 close_dev(sdi);
187b3582
JH
576 sdi = l->data;
577 sr_dev_inst_free(sdi);
578 }
579
62bc70e4
JH
580 g_slist_free(dev_insts);
581 dev_insts = NULL;
187b3582 582
f4a9e5c0 583 if (usb_context)
187b3582
JH
584 libusb_exit(usb_context);
585 usb_context = NULL;
586
62bc70e4 587 return ret;
f302a082
JH
588}
589
b7f578be 590static const void *hw_dev_info_get(int dev_index, int dev_info_id)
f302a082 591{
8b35f474 592 struct sr_dev_inst *sdi;
772a0e61 593 struct context *ctx;
8b35f474 594
772a0e61 595 if (!(sdi = sr_dev_inst_get(dev_insts, dev_index)))
8b35f474 596 return NULL;
cdfdd711 597 ctx = sdi->priv;
8b35f474 598
772a0e61 599 switch (dev_info_id) {
8b35f474
JH
600 case SR_DI_INST:
601 return sdi;
602 case SR_DI_NUM_PROBES:
d1ddc7a9
JH
603 return GINT_TO_POINTER(
604 (ctx->profile->dev_caps & DEV_CAPS_16BIT) ?
605 16 : 8);
8b35f474 606 case SR_DI_PROBE_NAMES:
da686568 607 return probe_names;
8b35f474 608 case SR_DI_SAMPLERATES:
590b9f9a 609 return &samplerates;
8b35f474
JH
610 case SR_DI_TRIGGER_TYPES:
611 return TRIGGER_TYPES;
e3186647
JH
612 case SR_DI_CUR_SAMPLERATE:
613 return &ctx->cur_samplerate;
8b35f474
JH
614 }
615
f302a082
JH
616 return NULL;
617}
618
772a0e61 619static int hw_dev_status_get(int dev_index)
f302a082 620{
aae2fed6 621 const struct sr_dev_inst *const sdi =
772a0e61 622 sr_dev_inst_get(dev_insts, dev_index);
aae2fed6
JH
623
624 if (!sdi)
625 return SR_ST_NOT_FOUND;
626
627 return sdi->status;
f302a082
JH
628}
629
915f7cc8 630static const int *hw_hwcap_get_all(void)
f302a082 631{
da686568 632 return hwcaps;
f302a082
JH
633}
634
1b79df2f 635static int hw_dev_config_set(int dev_index, int hwcap, const void *value)
f302a082 636{
7cb621d4 637 struct sr_dev_inst *sdi;
772a0e61 638 struct context *ctx;
7cb621d4
JH
639 int ret;
640
641 if (!(sdi = sr_dev_inst_get(dev_insts, dev_index)))
642 return SR_ERR;
643 ctx = sdi->priv;
644
e3186647 645 if (hwcap == SR_HWCAP_SAMPLERATE) {
1b79df2f 646 ctx->cur_samplerate = *(const uint64_t *)value;
e3186647
JH
647 ret = SR_OK;
648 } else if (hwcap == SR_HWCAP_PROBECONFIG) {
6c6781b6 649 ret = configure_probes(ctx, (GSList *) value);
e3186647 650 } else if (hwcap == SR_HWCAP_LIMIT_SAMPLES) {
1b79df2f 651 ctx->limit_samples = *(const uint64_t *)value;
7cb621d4
JH
652 ret = SR_OK;
653 } else {
654 ret = SR_ERR;
655 }
656
657 return ret;
f302a082
JH
658}
659
1f9813eb 660static int receive_data(int fd, int revents, void *cb_data)
610dbb70
JH
661{
662 struct timeval tv;
663
664 /* Avoid compiler warnings. */
665 (void)fd;
666 (void)revents;
1f9813eb 667 (void)cb_data;
610dbb70
JH
668
669 tv.tv_sec = tv.tv_usec = 0;
670 libusb_handle_events_timeout(usb_context, &tv);
671
672 return TRUE;
673}
674
2e526f4a 675static void abort_acquisition(struct context *ctx)
cb61e9f7 676{
e7d087bf 677 int i;
0caa1ef0 678
cb61e9f7 679 ctx->num_samples = -1;
0caa1ef0 680
e7d087bf 681 for (i = ctx->num_transfers - 1; i >= 0; i--) {
0caa1ef0
LPC
682 if (ctx->transfers[i])
683 libusb_cancel_transfer(ctx->transfers[i]);
684 }
cb61e9f7
JH
685}
686
3e6292b2 687static void finish_acquisition(struct context *ctx)
2e526f4a
JH
688{
689 struct sr_datafeed_packet packet;
cb61e9f7 690 int i;
2e526f4a 691
cb61e9f7 692 /* Terminate session */
2e526f4a
JH
693 packet.type = SR_DF_END;
694 sr_session_send(ctx->session_dev_id, &packet);
695
cb61e9f7
JH
696 /* Remove fds from polling */
697 const struct libusb_pollfd **const lupfd =
698 libusb_get_pollfds(usb_context);
699 for (i = 0; lupfd[i]; i++)
700 sr_source_remove(lupfd[i]->fd);
701 free(lupfd); /* NOT g_free()! */
0caa1ef0
LPC
702
703 ctx->num_transfers = 0;
704 g_free(ctx->transfers);
2e526f4a
JH
705}
706
f855de75
LPC
707static void free_transfer(struct libusb_transfer *transfer)
708{
709 struct context *ctx = transfer->user_data;
0caa1ef0 710 unsigned int i;
f855de75
LPC
711
712 g_free(transfer->buffer);
713 transfer->buffer = NULL;
714 libusb_free_transfer(transfer);
715
0caa1ef0
LPC
716 for (i = 0; i < ctx->num_transfers; i++) {
717 if (ctx->transfers[i] == transfer) {
718 ctx->transfers[i] = NULL;
719 break;
720 }
721 }
722
f855de75
LPC
723 ctx->submitted_transfers--;
724 if (ctx->submitted_transfers == 0)
725 finish_acquisition(ctx);
726
727}
728
17dff8a1
LPC
729static void resubmit_transfer(struct libusb_transfer *transfer)
730{
17dff8a1
LPC
731 if (libusb_submit_transfer(transfer) != 0) {
732 free_transfer(transfer);
733 /* TODO: Stop session? */
734 /* TODO: Better error message. */
735 sr_err("fx2lafw: %s: libusb_submit_transfer error.", __func__);
736 }
737}
738
610dbb70
JH
739static void receive_transfer(struct libusb_transfer *transfer)
740{
7ce737a7 741 gboolean packet_has_error = FALSE;
610dbb70
JH
742 struct sr_datafeed_packet packet;
743 struct sr_datafeed_logic logic;
2e526f4a 744 struct context *ctx = transfer->user_data;
d1ddc7a9 745 int trigger_offset, i;
610dbb70 746
610dbb70
JH
747 /*
748 * If acquisition has already ended, just free any queued up
749 * transfer that come in.
750 */
2e526f4a 751 if (ctx->num_samples == -1) {
f855de75 752 free_transfer(transfer);
610dbb70
JH
753 return;
754 }
755
7ae2f9d5 756 sr_info("fx2lafw: receive_transfer(): status %d received %d bytes.",
610dbb70
JH
757 transfer->status, transfer->actual_length);
758
759 /* Save incoming transfer before reusing the transfer struct. */
d1ddc7a9
JH
760 uint8_t *const cur_buf = transfer->buffer;
761 const int sample_width = ctx->sample_wide ? 2 : 1;
762 const int cur_sample_count = transfer->actual_length / sample_width;
610dbb70 763
7ce737a7
LPC
764 switch (transfer->status) {
765 case LIBUSB_TRANSFER_NO_DEVICE:
766 abort_acquisition(ctx);
767 free_transfer(transfer);
768 return;
769 case LIBUSB_TRANSFER_COMPLETED:
770 case LIBUSB_TRANSFER_TIMED_OUT: /* We may have received some data though */
771 break;
772 default:
773 packet_has_error = TRUE;
774 break;
775 }
776
777 if (transfer->actual_length == 0 || packet_has_error) {
2769eed9
LPC
778 ctx->empty_transfer_count++;
779 if (ctx->empty_transfer_count > MAX_EMPTY_TRANSFERS) {
610dbb70
JH
780 /*
781 * The FX2 gave up. End the acquisition, the frontend
782 * will work out that the samplecount is short.
783 */
2e526f4a 784 abort_acquisition(ctx);
17dff8a1
LPC
785 free_transfer(transfer);
786 } else {
787 resubmit_transfer(transfer);
610dbb70
JH
788 }
789 return;
790 } else {
2769eed9 791 ctx->empty_transfer_count = 0;
610dbb70
JH
792 }
793
6c6781b6
JH
794 trigger_offset = 0;
795 if (ctx->trigger_stage >= 0) {
d1ddc7a9
JH
796 for (i = 0; i < cur_sample_count; i++) {
797
798 const uint16_t cur_sample = ctx->sample_wide ?
799 *((const uint16_t*)cur_buf + i) :
800 *((const uint8_t*)cur_buf + i);
6c6781b6 801
d1ddc7a9
JH
802 if ((cur_sample & ctx->trigger_mask[ctx->trigger_stage]) ==
803 ctx->trigger_value[ctx->trigger_stage]) {
6c6781b6 804 /* Match on this trigger stage. */
d1ddc7a9 805 ctx->trigger_buffer[ctx->trigger_stage] = cur_sample;
6c6781b6
JH
806 ctx->trigger_stage++;
807
d1ddc7a9
JH
808 if (ctx->trigger_stage == NUM_TRIGGER_STAGES ||
809 ctx->trigger_mask[ctx->trigger_stage] == 0) {
6c6781b6
JH
810 /* Match on all trigger stages, we're done. */
811 trigger_offset = i + 1;
812
813 /*
814 * TODO: Send pre-trigger buffer to session bus.
815 * Tell the frontend we hit the trigger here.
816 */
817 packet.type = SR_DF_TRIGGER;
818 packet.payload = NULL;
819 sr_session_send(ctx->session_dev_id, &packet);
820
821 /*
822 * Send the samples that triggered it, since we're
823 * skipping past them.
824 */
825 packet.type = SR_DF_LOGIC;
826 packet.payload = &logic;
fa114e4a
LPC
827 logic.unitsize = sizeof(*ctx->trigger_buffer);
828 logic.length = ctx->trigger_stage * logic.unitsize;
6c6781b6
JH
829 logic.data = ctx->trigger_buffer;
830 sr_session_send(ctx->session_dev_id, &packet);
831
832 ctx->trigger_stage = TRIGGER_FIRED;
833 break;
834 }
f3ab43a8
LPC
835 } else if (ctx->trigger_stage > 0) {
836 /*
837 * We had a match before, but not in the next sample. However, we may
838 * have a match on this stage in the next bit -- trigger on 0001 will
839 * fail on seeing 00001, so we need to go back to stage 0 -- but at
840 * the next sample from the one that matched originally, which the
841 * counter increment at the end of the loop takes care of.
842 */
6c6781b6
JH
843 i -= ctx->trigger_stage;
844 if (i < -1)
845 i = -1; /* Oops, went back past this buffer. */
846 /* Reset trigger stage. */
847 ctx->trigger_stage = 0;
848 }
849 }
850 }
610dbb70 851
6c6781b6
JH
852 if (ctx->trigger_stage == TRIGGER_FIRED) {
853 /* Send the incoming transfer to the session bus. */
0a88ec3d 854 const int trigger_offset_bytes = trigger_offset * sample_width;
6c6781b6
JH
855 packet.type = SR_DF_LOGIC;
856 packet.payload = &logic;
d1ddc7a9
JH
857 logic.length = transfer->actual_length - trigger_offset_bytes;
858 logic.unitsize = sample_width;
859 logic.data = cur_buf + trigger_offset_bytes;
6c6781b6 860 sr_session_send(ctx->session_dev_id, &packet);
6c6781b6 861
d1ddc7a9 862 ctx->num_samples += cur_sample_count;
6c6781b6
JH
863 if (ctx->limit_samples &&
864 (unsigned int)ctx->num_samples > ctx->limit_samples) {
865 abort_acquisition(ctx);
0caa1ef0
LPC
866 free_transfer(transfer);
867 return;
6c6781b6
JH
868 }
869 } else {
870 /*
871 * TODO: Buffer pre-trigger data in capture
872 * ratio-sized buffer.
873 */
610dbb70 874 }
17dff8a1
LPC
875
876 resubmit_transfer(transfer);
610dbb70
JH
877}
878
5af666a9
LPC
879static unsigned int to_bytes_per_ms(unsigned int samplerate)
880{
881 return samplerate / 1000;
882}
883
884static size_t get_buffer_size(struct context *ctx)
885{
886 size_t s;
887
888 /* The buffer should be large enough to hold 10ms of data and a multiple
889 * of 512. */
890 s = 10 * to_bytes_per_ms(ctx->cur_samplerate);
891 return (s + 511) & ~511;
892}
893
894static unsigned int get_number_of_transfers(struct context *ctx)
895{
896 unsigned int n;
897
898 /* Total buffer size should be able to hold about 500ms of data */
899 n = 500 * to_bytes_per_ms(ctx->cur_samplerate) / get_buffer_size(ctx);
900
901 if (n > NUM_SIMUL_TRANSFERS)
902 return NUM_SIMUL_TRANSFERS;
903
904 return n;
905}
906
907static unsigned int get_timeout(struct context *ctx)
908{
909 size_t total_size;
910 unsigned int timeout;
911
912 total_size = get_buffer_size(ctx) * get_number_of_transfers(ctx);
913 timeout = total_size / to_bytes_per_ms(ctx->cur_samplerate);
914 return timeout + timeout / 4; /* Leave a headroom of 25% percent */
915}
916
3cd3a20b 917static int hw_dev_acquisition_start(int dev_index, void *cb_data)
f302a082 918{
610dbb70 919 struct sr_dev_inst *sdi;
bd47acab
LPC
920 struct sr_datafeed_packet packet;
921 struct sr_datafeed_header header;
f366e86c 922 struct sr_datafeed_meta_logic meta;
772a0e61 923 struct context *ctx;
610dbb70
JH
924 struct libusb_transfer *transfer;
925 const struct libusb_pollfd **lupfd;
5af666a9
LPC
926 unsigned int i;
927 int ret;
610dbb70
JH
928 unsigned char *buf;
929
930 if (!(sdi = sr_dev_inst_get(dev_insts, dev_index)))
931 return SR_ERR;
932 ctx = sdi->priv;
c03f0450
LPC
933
934 if (ctx->submitted_transfers != 0)
935 return SR_ERR;
936
3cd3a20b 937 ctx->session_dev_id = cb_data;
2e526f4a 938 ctx->num_samples = 0;
2769eed9 939 ctx->empty_transfer_count = 0;
610dbb70 940
5af666a9
LPC
941 const unsigned int timeout = get_timeout(ctx);
942 const unsigned int num_transfers = get_number_of_transfers(ctx);
943 const size_t size = get_buffer_size(ctx);
944
0caa1ef0
LPC
945 ctx->transfers = g_try_malloc0(sizeof(*ctx->transfers) * num_transfers);
946 if (!ctx->transfers)
947 return SR_ERR;
948
949 ctx->num_transfers = num_transfers;
950
5af666a9 951 for (i = 0; i < num_transfers; i++) {
610dbb70 952 if (!(buf = g_try_malloc(size))) {
7ae2f9d5 953 sr_err("fx2lafw: %s: buf malloc failed.", __func__);
610dbb70
JH
954 return SR_ERR_MALLOC;
955 }
956 transfer = libusb_alloc_transfer(0);
957 libusb_fill_bulk_transfer(transfer, ctx->usb->devhdl,
958 2 | LIBUSB_ENDPOINT_IN, buf, size,
5af666a9 959 receive_transfer, ctx, timeout);
610dbb70 960 if (libusb_submit_transfer(transfer) != 0) {
610dbb70
JH
961 libusb_free_transfer(transfer);
962 g_free(buf);
25f5d66a 963 abort_acquisition(ctx);
610dbb70
JH
964 return SR_ERR;
965 }
0caa1ef0 966 ctx->transfers[i] = transfer;
cb61e9f7 967 ctx->submitted_transfers++;
610dbb70
JH
968 }
969
970 lupfd = libusb_get_pollfds(usb_context);
971 for (i = 0; lupfd[i]; i++)
972 sr_source_add(lupfd[i]->fd, lupfd[i]->events,
5af666a9 973 timeout, receive_data, NULL);
610dbb70
JH
974 free(lupfd); /* NOT g_free()! */
975
bd47acab
LPC
976 packet.type = SR_DF_HEADER;
977 packet.payload = &header;
978 header.feed_version = 1;
979 gettimeofday(&header.starttime, NULL);
980 sr_session_send(cb_data, &packet);
f366e86c
BV
981
982 /* Send metadata about the SR_DF_LOGIC packets to come. */
bd47acab
LPC
983 packet.type = SR_DF_META_LOGIC;
984 packet.payload = &meta;
f366e86c 985 meta.samplerate = ctx->cur_samplerate;
d1ddc7a9 986 meta.num_probes = ctx->sample_wide ? 16 : 8;
bd47acab 987 sr_session_send(cb_data, &packet);
610dbb70 988
ebc34738 989 if ((ret = command_start_acquisition (ctx->usb->devhdl,
d1ddc7a9 990 ctx->cur_samplerate, ctx->sample_wide)) != SR_OK) {
25f5d66a 991 abort_acquisition(ctx);
ebc34738 992 return ret;
017375d1
JH
993 }
994
f302a082
JH
995 return SR_OK;
996}
997
3cd3a20b 998/* TODO: This stops acquisition on ALL devices, ignoring dev_index. */
c8f2c9dd 999static int hw_dev_acquisition_stop(int dev_index, void *cb_data)
f302a082 1000{
2e526f4a 1001 struct sr_dev_inst *sdi;
5da93902 1002
f4a9e5c0 1003 /* Avoid compiler warnings. */
2e526f4a 1004 (void)cb_data;
5da93902 1005
2e526f4a
JH
1006 if (!(sdi = sr_dev_inst_get(dev_insts, dev_index)))
1007 return SR_ERR;
1008
1009 abort_acquisition(sdi->priv);
5da93902 1010
f302a082
JH
1011 return SR_OK;
1012}
1013
c09f0b57 1014SR_PRIV struct sr_dev_driver fx2lafw_driver_info = {
f302a082 1015 .name = "fx2lafw",
2e7cb004 1016 .longname = "fx2lafw (generic driver for FX2 based LAs)",
f302a082
JH
1017 .api_version = 1,
1018 .init = hw_init,
1019 .cleanup = hw_cleanup,
61136ea6 1020 .scan = hw_scan,
f302a082
JH
1021 .dev_open = hw_dev_open,
1022 .dev_close = hw_dev_close,
1023 .dev_info_get = hw_dev_info_get,
1024 .dev_status_get = hw_dev_status_get,
1025 .hwcap_get_all = hw_hwcap_get_all,
1026 .dev_config_set = hw_dev_config_set,
1027 .dev_acquisition_start = hw_dev_acquisition_start,
1028 .dev_acquisition_stop = hw_dev_acquisition_stop,
1029};