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