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