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