]> sigrok.org Git - libsigrok.git/blame - hardware/fx2lafw/fx2lafw.c
hardware: Make USB drivers use the libusb_context in struct sr_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>
45c59c8b
BV
26#include "libsigrok.h"
27#include "libsigrok-internal.h"
f302a082 28#include "fx2lafw.h"
f6582cd7 29#include "command.h"
f302a082 30
4679d14d 31static const struct fx2lafw_profile supported_fx2[] = {
7ae2f9d5
UH
32 /*
33 * CWAV USBee AX
17b6c75a 34 * EE Electronics ESLA201A
9f05304e 35 * ARMFLY AX-Pro
17b6c75a 36 */
f8b07fc6 37 { 0x08a9, 0x0014, "CWAV", "USBee AX", NULL,
d1ddc7a9
JH
38 FIRMWARE_DIR "/fx2lafw-cwav-usbeeax.fw",
39 0 },
0e8d0e24
IF
40 /*
41 * CWAV USBee DX
42 * XZL-Studio DX
43 */
44 { 0x08a9, 0x0015, "CWAV", "USBee DX", NULL,
45 FIRMWARE_DIR "/fx2lafw-cwav-usbeedx.fw",
46 DEV_CAPS_16BIT },
93a9f3da 47
7ae2f9d5
UH
48 /*
49 * CWAV USBee SX
4502e869
JH
50 */
51 { 0x08a9, 0x0009, "CWAV", "USBee SX", NULL,
d1ddc7a9
JH
52 FIRMWARE_DIR "/fx2lafw-cwav-usbeesx.fw",
53 0 },
4502e869 54
7ae2f9d5
UH
55 /*
56 * Saleae Logic
93a9f3da
JH
57 * EE Electronics ESLA100
58 * Robomotic MiniLogic
1663e470 59 * Robomotic BugLogic 3
93a9f3da
JH
60 */
61 { 0x0925, 0x3881, "Saleae", "Logic", NULL,
d1ddc7a9
JH
62 FIRMWARE_DIR "/fx2lafw-saleae-logic.fw",
63 0 },
93a9f3da 64
f488762a 65 /*
1663e470
UH
66 * Default Cypress FX2 without EEPROM, e.g.:
67 * Lcsoft Mini Board
68 * Braintechnology USB Interface V2.x
f488762a
JH
69 */
70 { 0x04B4, 0x8613, "Cypress", "FX2", NULL,
d1ddc7a9
JH
71 FIRMWARE_DIR "/fx2lafw-cypress-fx2.fw",
72 DEV_CAPS_16BIT },
f488762a 73
1663e470
UH
74 /*
75 * Braintechnology USB-LPS
76 */
77 { 0x16d0, 0x0498, "Braintechnology", "USB-LPS", NULL,
d1ddc7a9
JH
78 FIRMWARE_DIR "/fx2lafw-braintechnology-usb-lps.fw",
79 DEV_CAPS_16BIT },
1663e470 80
f8b07fc6 81 { 0, 0, 0, 0, 0, 0, 0 }
187b3582
JH
82};
83
915f7cc8 84static const int hwcaps[] = {
8b35f474
JH
85 SR_HWCAP_LOGIC_ANALYZER,
86 SR_HWCAP_SAMPLERATE,
87
88 /* These are really implemented in the driver, not the hardware. */
89 SR_HWCAP_LIMIT_SAMPLES,
90 SR_HWCAP_CONTINUOUS,
772a0e61 91 0,
8b35f474
JH
92};
93
da686568 94static const char *probe_names[] = {
7ae2f9d5
UH
95 "0",
96 "1",
97 "2",
98 "3",
99 "4",
100 "5",
101 "6",
102 "7",
d1ddc7a9
JH
103 "8",
104 "9",
105 "10",
106 "11",
107 "12",
108 "13",
109 "14",
110 "15",
772a0e61 111 NULL,
8b35f474
JH
112};
113
a533743d 114static const uint64_t supported_samplerates[] = {
79dc6498
JH
115 SR_KHZ(20),
116 SR_KHZ(25),
897c1a2e
JH
117 SR_KHZ(50),
118 SR_KHZ(100),
9304d576
JH
119 SR_KHZ(200),
120 SR_KHZ(250),
121 SR_KHZ(500),
8b35f474
JH
122 SR_MHZ(1),
123 SR_MHZ(2),
124 SR_MHZ(3),
125 SR_MHZ(4),
126 SR_MHZ(6),
127 SR_MHZ(8),
128 SR_MHZ(12),
129 SR_MHZ(16),
772a0e61 130 SR_MHZ(24),
934cde02 131 0,
8b35f474
JH
132};
133
a533743d 134static const struct sr_samplerates samplerates = {
590b9f9a
UH
135 0,
136 0,
137 0,
138 supported_samplerates,
8b35f474
JH
139};
140
a8cc8e44
BV
141SR_PRIV struct sr_dev_driver fx2lafw_driver_info;
142static struct sr_dev_driver *fdi = &fx2lafw_driver_info;
25a0f108 143static int hw_dev_close(struct sr_dev_inst *sdi);
6f4b1868
BV
144static int hw_dev_config_set(const struct sr_dev_inst *sdi, int hwcap,
145 const void *value);
69b07d14 146static int hw_dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data);
610dbb70 147
b1eeb67e
JH
148/**
149 * Check the USB configuration to determine if this is an fx2lafw device.
150 *
f9a69557
UH
151 * @return TRUE if the device's configuration profile match fx2lafw
152 * configuration, FALSE otherwise.
b1eeb67e 153 */
f9a69557 154static gboolean check_conf_profile(libusb_device *dev)
b1eeb67e
JH
155{
156 struct libusb_device_descriptor des;
6b73d9a5
BV
157 struct libusb_device_handle *hdl;
158 gboolean ret;
159 unsigned char strdesc[64];
b1eeb67e 160
6b73d9a5
BV
161 hdl = NULL;
162 ret = FALSE;
b1eeb67e 163 while (!ret) {
da686568 164 /* Assume the FW has not been loaded, unless proven wrong. */
b1eeb67e
JH
165 if (libusb_get_device_descriptor(dev, &des) != 0)
166 break;
167
6b73d9a5 168 if (libusb_open(dev, &hdl) != 0)
b1eeb67e
JH
169 break;
170
6b73d9a5
BV
171 if (libusb_get_string_descriptor_ascii(hdl,
172 des.iManufacturer, strdesc, sizeof(strdesc)) < 0)
b1eeb67e 173 break;
6b73d9a5 174 if (strncmp((const char *)strdesc, "sigrok", 6))
b1eeb67e
JH
175 break;
176
6b73d9a5
BV
177 if (libusb_get_string_descriptor_ascii(hdl,
178 des.iProduct, strdesc, sizeof(strdesc)) < 0)
b1eeb67e 179 break;
6b73d9a5 180 if (strncmp((const char *)strdesc, "fx2lafw", 7))
b1eeb67e
JH
181 break;
182
b1eeb67e 183 /* If we made it here, it must be an fx2lafw. */
f9a69557 184 ret = TRUE;
b1eeb67e 185 }
6b73d9a5
BV
186 if (hdl)
187 libusb_close(hdl);
b1eeb67e
JH
188
189 return ret;
190}
191
25a0f108 192static int fx2lafw_dev_open(struct sr_dev_inst *sdi)
43125c69
JH
193{
194 libusb_device **devlist;
195 struct libusb_device_descriptor des;
dc9dbe94 196 struct dev_context *devc;
d4abb463 197 struct drv_context *drvc = fdi->priv;
13bf7ecc 198 struct version_info vi;
ebc34738 199 int ret, skip, i;
1e94408a 200 uint8_t revid;
43125c69 201
dc9dbe94 202 devc = sdi->priv;
43125c69
JH
203
204 if (sdi->status == SR_ST_ACTIVE)
205 /* already in use */
206 return SR_ERR;
207
208 skip = 0;
d4abb463
PS
209 const int device_count = libusb_get_device_list(
210 drvc->sr_ctx->libusb_ctx, &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
34f06b90 404static int hw_init(struct sr_context *sr_ctx)
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.");
886a52b6 410 return SR_ERR_MALLOC;
dc9dbe94 411 }
61136ea6 412
1ebe4b4e 413 drvc->sr_ctx = sr_ctx;
dc9dbe94
BV
414 fdi->priv = drvc;
415
61136ea6
BV
416 return SR_OK;
417}
418
3a7a22cb 419static GSList *hw_scan(GSList *options)
f302a082 420{
3a7a22cb 421 GSList *devices;
187b3582 422 struct libusb_device_descriptor des;
3a7a22cb 423 struct sr_dev_inst *sdi;
da686568 424 const struct fx2lafw_profile *prof;
dc9dbe94
BV
425 struct drv_context *drvc;
426 struct dev_context *devc;
3a7a22cb 427 struct sr_probe *probe;
187b3582 428 libusb_device **devlist;
3a7a22cb
BV
429 int devcnt, num_logic_probes, ret, i, j;
430
3a7a22cb 431 (void)options;
64d33dc2 432
dc9dbe94 433 drvc = fdi->priv;
187b3582 434
f69b47f0
BV
435 /* This scan always invalidates any previous scans. */
436 clear_instances();
437
921634ec 438 /* Find all fx2lafw compatible devices and upload firmware to them. */
3a7a22cb 439 devices = NULL;
d4abb463 440 libusb_get_device_list(drvc->sr_ctx->libusb_ctx, &devlist);
187b3582
JH
441 for (i = 0; devlist[i]; i++) {
442
ebc34738 443 if ((ret = libusb_get_device_descriptor(
7ae2f9d5
UH
444 devlist[i], &des)) != 0) {
445 sr_warn("fx2lafw: Failed to get device descriptor: %d.", ret);
187b3582
JH
446 continue;
447 }
448
da686568 449 prof = NULL;
187b3582
JH
450 for (j = 0; supported_fx2[j].vid; j++) {
451 if (des.idVendor == supported_fx2[j].vid &&
452 des.idProduct == supported_fx2[j].pid) {
da686568 453 prof = &supported_fx2[j];
187b3582
JH
454 }
455 }
456
457 /* Skip if the device was not found */
da686568 458 if (!prof)
187b3582
JH
459 continue;
460
dc9dbe94 461 devcnt = g_slist_length(drvc->instances);
187b3582 462 sdi = sr_dev_inst_new(devcnt, SR_ST_INITIALIZING,
da686568 463 prof->vendor, prof->model, prof->model_version);
f4a9e5c0 464 if (!sdi)
25a0f108 465 return NULL;
c5e82ca5 466 sdi->driver = fdi;
187b3582 467
06717a8a
BV
468 /* Fill in probelist according to this device's profile. */
469 num_logic_probes = prof->dev_caps & DEV_CAPS_16BIT ? 16 : 8;
c5e82ca5 470 for (j = 0; j < num_logic_probes; j++) {
06717a8a
BV
471 if (!(probe = sr_probe_new(j, SR_PROBE_LOGIC, TRUE,
472 probe_names[j])))
25a0f108 473 return NULL;
06717a8a
BV
474 sdi->probes = g_slist_append(sdi->probes, probe);
475 }
476
dc9dbe94
BV
477 devc = fx2lafw_dev_new();
478 devc->profile = prof;
479 sdi->priv = devc;
480 drvc->instances = g_slist_append(drvc->instances, sdi);
a8cc8e44 481 devices = g_slist_append(devices, sdi);
187b3582 482
b1eeb67e
JH
483 if (check_conf_profile(devlist[i])) {
484 /* Already has the firmware, so fix the new address. */
7ae2f9d5 485 sr_dbg("fx2lafw: Found an fx2lafw device.");
b1eeb67e 486 sdi->status = SR_ST_INACTIVE;
dc9dbe94 487 devc->usb = sr_usb_dev_inst_new
b1eeb67e
JH
488 (libusb_get_bus_number(devlist[i]),
489 libusb_get_device_address(devlist[i]), NULL);
490 } else {
f8b07fc6 491 if (ezusb_upload_firmware(devlist[i], USB_CONFIGURATION,
da686568 492 prof->firmware) == SR_OK)
b1eeb67e 493 /* Remember when the firmware on this device was updated */
dc9dbe94 494 devc->fw_updated = g_get_monotonic_time();
b1eeb67e 495 else
7ae2f9d5
UH
496 sr_err("fx2lafw: Firmware upload failed for "
497 "device %d.", devcnt);
dc9dbe94 498 devc->usb = sr_usb_dev_inst_new
b1eeb67e
JH
499 (libusb_get_bus_number(devlist[i]), 0xff, NULL);
500 }
187b3582
JH
501 }
502 libusb_free_device_list(devlist, 1);
503
3a7a22cb 504 return devices;
f302a082
JH
505}
506
811deee4
BV
507static GSList *hw_dev_list(void)
508{
509 struct drv_context *drvc;
510
511 drvc = fdi->priv;
512
513 return drvc->instances;
514}
515
25a0f108 516static int hw_dev_open(struct sr_dev_inst *sdi)
f302a082 517{
dc9dbe94 518 struct dev_context *devc;
e8bd58ff
UH
519 int ret;
520 int64_t timediff_us, timediff_ms;
43125c69 521
dc9dbe94 522 devc = sdi->priv;
43125c69
JH
523
524 /*
f60fdf6e
UH
525 * If the firmware was recently uploaded, wait up to MAX_RENUM_DELAY_MS
526 * milliseconds for the FX2 to renumerate.
43125c69 527 */
3b6c1930 528 ret = SR_ERR;
dc9dbe94 529 if (devc->fw_updated > 0) {
7ae2f9d5 530 sr_info("fx2lafw: Waiting for device to reset.");
43125c69
JH
531 /* takes at least 300ms for the FX2 to be gone from the USB bus */
532 g_usleep(300 * 1000);
e8bd58ff 533 timediff_ms = 0;
f60fdf6e 534 while (timediff_ms < MAX_RENUM_DELAY_MS) {
25a0f108 535 if ((ret = fx2lafw_dev_open(sdi)) == SR_OK)
43125c69
JH
536 break;
537 g_usleep(100 * 1000);
e8bd58ff 538
dc9dbe94 539 timediff_us = g_get_monotonic_time() - devc->fw_updated;
3b6c1930
BV
540 timediff_ms = timediff_us / 1000;
541 sr_spew("fx2lafw: waited %" PRIi64 " ms", timediff_ms);
43125c69 542 }
e8bd58ff 543 sr_info("fx2lafw: Device came back after %d ms.", timediff_ms);
43125c69 544 } else {
25a0f108 545 ret = fx2lafw_dev_open(sdi);
43125c69
JH
546 }
547
ebc34738 548 if (ret != SR_OK) {
7ae2f9d5 549 sr_err("fx2lafw: Unable to open device.");
43125c69
JH
550 return SR_ERR;
551 }
dc9dbe94 552 devc = sdi->priv;
43125c69 553
dc9dbe94 554 ret = libusb_claim_interface(devc->usb->devhdl, USB_INTERFACE);
ebc34738 555 if (ret != 0) {
0c156e06
JH
556 switch(ret) {
557 case LIBUSB_ERROR_BUSY:
558 sr_err("fx2lafw: Unable to claim USB interface. Another "
559 "program or driver has already claimed it.");
560 break;
561
562 case LIBUSB_ERROR_NO_DEVICE:
563 sr_err("fx2lafw: Device has been disconnected.");
564 break;
565
566 default:
567 sr_err("fx2lafw: Unable to claim interface: %d.", ret);
568 break;
569 }
570
43125c69
JH
571 return SR_ERR;
572 }
573
dc9dbe94 574 if (devc->cur_samplerate == 0) {
f92994fd 575 /* Samplerate hasn't been set; default to the slowest one. */
6f4b1868 576 if (hw_dev_config_set(sdi, SR_HWCAP_SAMPLERATE,
590b9f9a 577 &supported_samplerates[0]) == SR_ERR)
f92994fd
JH
578 return SR_ERR;
579 }
580
f302a082
JH
581 return SR_OK;
582}
583
25a0f108 584static int hw_dev_close(struct sr_dev_inst *sdi)
f302a082 585{
dc9dbe94 586 struct dev_context *devc;
f1898235 587
dc9dbe94
BV
588 devc = sdi->priv;
589 if (devc->usb->devhdl == NULL)
25a0f108 590 return SR_ERR;
f1898235 591
25a0f108 592 sr_info("fx2lafw: Closing device %d on %d.%d interface %d.",
dc9dbe94
BV
593 sdi->index, devc->usb->bus, devc->usb->address, USB_INTERFACE);
594 libusb_release_interface(devc->usb->devhdl, USB_INTERFACE);
595 libusb_close(devc->usb->devhdl);
596 devc->usb->devhdl = NULL;
25a0f108 597 sdi->status = SR_ST_INACTIVE;
f1898235 598
f302a082
JH
599 return SR_OK;
600}
601
602static int hw_cleanup(void)
603{
dc9dbe94 604 struct drv_context *drvc;
f69b47f0 605 int ret;
187b3582 606
dc9dbe94
BV
607 if (!(drvc = fdi->priv))
608 return SR_OK;
609
f69b47f0 610 ret = clear_instances();
187b3582 611
dc9dbe94
BV
612 g_free(drvc);
613 fdi->priv = NULL;
187b3582 614
62bc70e4 615 return ret;
f302a082
JH
616}
617
cbd798f4 618static int hw_info_get(int info_id, const void **data,
6e9339aa 619 const struct sr_dev_inst *sdi)
f302a082 620{
dc9dbe94 621 struct dev_context *devc;
8b35f474 622
cbd798f4 623 switch (info_id) {
a27999e6
BV
624 case SR_DI_HWCAPS:
625 *data = hwcaps;
626 break;
8b35f474 627 case SR_DI_NUM_PROBES:
6e9339aa 628 if (sdi) {
dc9dbe94 629 devc = sdi->priv;
6e9339aa 630 *data = GINT_TO_POINTER(
dc9dbe94 631 (devc->profile->dev_caps & DEV_CAPS_16BIT) ?
6e9339aa
BV
632 16 : 8);
633 } else
634 return SR_ERR;
635 break;
8b35f474 636 case SR_DI_PROBE_NAMES:
6e9339aa
BV
637 *data = probe_names;
638 break;
8b35f474 639 case SR_DI_SAMPLERATES:
6e9339aa
BV
640 *data = &samplerates;
641 break;
8b35f474 642 case SR_DI_TRIGGER_TYPES:
6e9339aa
BV
643 *data = TRIGGER_TYPES;
644 break;
e3186647 645 case SR_DI_CUR_SAMPLERATE:
6e9339aa 646 if (sdi) {
dc9dbe94
BV
647 devc = sdi->priv;
648 *data = &devc->cur_samplerate;
6e9339aa
BV
649 } else
650 return SR_ERR;
651 break;
652 default:
653 return SR_ERR_ARG;
8b35f474
JH
654 }
655
6e9339aa 656 return SR_OK;
f302a082
JH
657}
658
6f4b1868
BV
659static int hw_dev_config_set(const struct sr_dev_inst *sdi, int hwcap,
660 const void *value)
f302a082 661{
dc9dbe94 662 struct dev_context *devc;
7cb621d4
JH
663 int ret;
664
dc9dbe94 665 devc = sdi->priv;
7cb621d4 666
e3186647 667 if (hwcap == SR_HWCAP_SAMPLERATE) {
dc9dbe94 668 devc->cur_samplerate = *(const uint64_t *)value;
e3186647 669 ret = SR_OK;
e3186647 670 } else if (hwcap == SR_HWCAP_LIMIT_SAMPLES) {
dc9dbe94 671 devc->limit_samples = *(const uint64_t *)value;
7cb621d4
JH
672 ret = SR_OK;
673 } else {
674 ret = SR_ERR;
675 }
676
677 return ret;
f302a082
JH
678}
679
1f9813eb 680static int receive_data(int fd, int revents, void *cb_data)
610dbb70
JH
681{
682 struct timeval tv;
d4abb463 683 struct drv_context *drvc = fdi->priv;
610dbb70 684
610dbb70
JH
685 (void)fd;
686 (void)revents;
1f9813eb 687 (void)cb_data;
610dbb70
JH
688
689 tv.tv_sec = tv.tv_usec = 0;
d4abb463 690 libusb_handle_events_timeout(drvc->sr_ctx->libusb_ctx, &tv);
610dbb70
JH
691
692 return TRUE;
693}
694
dc9dbe94 695static void abort_acquisition(struct dev_context *devc)
cb61e9f7 696{
e7d087bf 697 int i;
0caa1ef0 698
dc9dbe94 699 devc->num_samples = -1;
0caa1ef0 700
dc9dbe94
BV
701 for (i = devc->num_transfers - 1; i >= 0; i--) {
702 if (devc->transfers[i])
703 libusb_cancel_transfer(devc->transfers[i]);
0caa1ef0 704 }
cb61e9f7
JH
705}
706
dc9dbe94 707static void finish_acquisition(struct dev_context *devc)
2e526f4a
JH
708{
709 struct sr_datafeed_packet packet;
d4abb463 710 struct drv_context *drvc = fdi->priv;
cb61e9f7 711 int i;
2e526f4a 712
dc9dbe94 713
cb61e9f7 714 /* Terminate session */
2e526f4a 715 packet.type = SR_DF_END;
dc9dbe94 716 sr_session_send(devc->session_dev_id, &packet);
2e526f4a 717
cb61e9f7
JH
718 /* Remove fds from polling */
719 const struct libusb_pollfd **const lupfd =
d4abb463 720 libusb_get_pollfds(drvc->sr_ctx->libusb_ctx);
cb61e9f7
JH
721 for (i = 0; lupfd[i]; i++)
722 sr_source_remove(lupfd[i]->fd);
723 free(lupfd); /* NOT g_free()! */
0caa1ef0 724
dc9dbe94
BV
725 devc->num_transfers = 0;
726 g_free(devc->transfers);
2e526f4a
JH
727}
728
f855de75
LPC
729static void free_transfer(struct libusb_transfer *transfer)
730{
dc9dbe94 731 struct dev_context *devc = transfer->user_data;
0caa1ef0 732 unsigned int i;
f855de75
LPC
733
734 g_free(transfer->buffer);
735 transfer->buffer = NULL;
736 libusb_free_transfer(transfer);
737
dc9dbe94
BV
738 for (i = 0; i < devc->num_transfers; i++) {
739 if (devc->transfers[i] == transfer) {
740 devc->transfers[i] = NULL;
0caa1ef0
LPC
741 break;
742 }
743 }
744
dc9dbe94
BV
745 devc->submitted_transfers--;
746 if (devc->submitted_transfers == 0)
747 finish_acquisition(devc);
f855de75
LPC
748
749}
750
17dff8a1
LPC
751static void resubmit_transfer(struct libusb_transfer *transfer)
752{
17dff8a1
LPC
753 if (libusb_submit_transfer(transfer) != 0) {
754 free_transfer(transfer);
755 /* TODO: Stop session? */
756 /* TODO: Better error message. */
757 sr_err("fx2lafw: %s: libusb_submit_transfer error.", __func__);
758 }
759}
760
610dbb70
JH
761static void receive_transfer(struct libusb_transfer *transfer)
762{
7ce737a7 763 gboolean packet_has_error = FALSE;
610dbb70
JH
764 struct sr_datafeed_packet packet;
765 struct sr_datafeed_logic logic;
dc9dbe94 766 struct dev_context *devc = transfer->user_data;
d1ddc7a9 767 int trigger_offset, i;
610dbb70 768
610dbb70
JH
769 /*
770 * If acquisition has already ended, just free any queued up
771 * transfer that come in.
772 */
dc9dbe94 773 if (devc->num_samples == -1) {
f855de75 774 free_transfer(transfer);
610dbb70
JH
775 return;
776 }
777
7ae2f9d5 778 sr_info("fx2lafw: receive_transfer(): status %d received %d bytes.",
610dbb70
JH
779 transfer->status, transfer->actual_length);
780
781 /* Save incoming transfer before reusing the transfer struct. */
d1ddc7a9 782 uint8_t *const cur_buf = transfer->buffer;
dc9dbe94 783 const int sample_width = devc->sample_wide ? 2 : 1;
d1ddc7a9 784 const int cur_sample_count = transfer->actual_length / sample_width;
610dbb70 785
7ce737a7
LPC
786 switch (transfer->status) {
787 case LIBUSB_TRANSFER_NO_DEVICE:
dc9dbe94 788 abort_acquisition(devc);
7ce737a7
LPC
789 free_transfer(transfer);
790 return;
791 case LIBUSB_TRANSFER_COMPLETED:
792 case LIBUSB_TRANSFER_TIMED_OUT: /* We may have received some data though */
793 break;
794 default:
795 packet_has_error = TRUE;
796 break;
797 }
798
799 if (transfer->actual_length == 0 || packet_has_error) {
dc9dbe94
BV
800 devc->empty_transfer_count++;
801 if (devc->empty_transfer_count > MAX_EMPTY_TRANSFERS) {
610dbb70
JH
802 /*
803 * The FX2 gave up. End the acquisition, the frontend
804 * will work out that the samplecount is short.
805 */
dc9dbe94 806 abort_acquisition(devc);
17dff8a1
LPC
807 free_transfer(transfer);
808 } else {
809 resubmit_transfer(transfer);
610dbb70
JH
810 }
811 return;
812 } else {
dc9dbe94 813 devc->empty_transfer_count = 0;
610dbb70
JH
814 }
815
6c6781b6 816 trigger_offset = 0;
dc9dbe94 817 if (devc->trigger_stage >= 0) {
d1ddc7a9
JH
818 for (i = 0; i < cur_sample_count; i++) {
819
dc9dbe94 820 const uint16_t cur_sample = devc->sample_wide ?
d1ddc7a9
JH
821 *((const uint16_t*)cur_buf + i) :
822 *((const uint8_t*)cur_buf + i);
6c6781b6 823
dc9dbe94
BV
824 if ((cur_sample & devc->trigger_mask[devc->trigger_stage]) ==
825 devc->trigger_value[devc->trigger_stage]) {
6c6781b6 826 /* Match on this trigger stage. */
dc9dbe94
BV
827 devc->trigger_buffer[devc->trigger_stage] = cur_sample;
828 devc->trigger_stage++;
6c6781b6 829
dc9dbe94
BV
830 if (devc->trigger_stage == NUM_TRIGGER_STAGES ||
831 devc->trigger_mask[devc->trigger_stage] == 0) {
6c6781b6
JH
832 /* Match on all trigger stages, we're done. */
833 trigger_offset = i + 1;
834
835 /*
836 * TODO: Send pre-trigger buffer to session bus.
837 * Tell the frontend we hit the trigger here.
838 */
839 packet.type = SR_DF_TRIGGER;
840 packet.payload = NULL;
dc9dbe94 841 sr_session_send(devc->session_dev_id, &packet);
6c6781b6
JH
842
843 /*
844 * Send the samples that triggered it, since we're
845 * skipping past them.
846 */
847 packet.type = SR_DF_LOGIC;
848 packet.payload = &logic;
dc9dbe94
BV
849 logic.unitsize = sizeof(*devc->trigger_buffer);
850 logic.length = devc->trigger_stage * logic.unitsize;
851 logic.data = devc->trigger_buffer;
852 sr_session_send(devc->session_dev_id, &packet);
6c6781b6 853
dc9dbe94 854 devc->trigger_stage = TRIGGER_FIRED;
6c6781b6
JH
855 break;
856 }
dc9dbe94 857 } else if (devc->trigger_stage > 0) {
f3ab43a8
LPC
858 /*
859 * We had a match before, but not in the next sample. However, we may
860 * have a match on this stage in the next bit -- trigger on 0001 will
861 * fail on seeing 00001, so we need to go back to stage 0 -- but at
862 * the next sample from the one that matched originally, which the
863 * counter increment at the end of the loop takes care of.
864 */
dc9dbe94 865 i -= devc->trigger_stage;
6c6781b6
JH
866 if (i < -1)
867 i = -1; /* Oops, went back past this buffer. */
868 /* Reset trigger stage. */
dc9dbe94 869 devc->trigger_stage = 0;
6c6781b6
JH
870 }
871 }
872 }
610dbb70 873
dc9dbe94 874 if (devc->trigger_stage == TRIGGER_FIRED) {
6c6781b6 875 /* Send the incoming transfer to the session bus. */
0a88ec3d 876 const int trigger_offset_bytes = trigger_offset * sample_width;
6c6781b6
JH
877 packet.type = SR_DF_LOGIC;
878 packet.payload = &logic;
d1ddc7a9
JH
879 logic.length = transfer->actual_length - trigger_offset_bytes;
880 logic.unitsize = sample_width;
881 logic.data = cur_buf + trigger_offset_bytes;
dc9dbe94 882 sr_session_send(devc->session_dev_id, &packet);
6c6781b6 883
dc9dbe94
BV
884 devc->num_samples += cur_sample_count;
885 if (devc->limit_samples &&
886 (unsigned int)devc->num_samples > devc->limit_samples) {
887 abort_acquisition(devc);
0caa1ef0
LPC
888 free_transfer(transfer);
889 return;
6c6781b6
JH
890 }
891 } else {
892 /*
893 * TODO: Buffer pre-trigger data in capture
894 * ratio-sized buffer.
895 */
610dbb70 896 }
17dff8a1
LPC
897
898 resubmit_transfer(transfer);
610dbb70
JH
899}
900
5af666a9
LPC
901static unsigned int to_bytes_per_ms(unsigned int samplerate)
902{
903 return samplerate / 1000;
904}
905
dc9dbe94 906static size_t get_buffer_size(struct dev_context *devc)
5af666a9
LPC
907{
908 size_t s;
909
910 /* The buffer should be large enough to hold 10ms of data and a multiple
911 * of 512. */
dc9dbe94 912 s = 10 * to_bytes_per_ms(devc->cur_samplerate);
5af666a9
LPC
913 return (s + 511) & ~511;
914}
915
dc9dbe94 916static unsigned int get_number_of_transfers(struct dev_context *devc)
5af666a9
LPC
917{
918 unsigned int n;
919
920 /* Total buffer size should be able to hold about 500ms of data */
dc9dbe94 921 n = 500 * to_bytes_per_ms(devc->cur_samplerate) / get_buffer_size(devc);
5af666a9
LPC
922
923 if (n > NUM_SIMUL_TRANSFERS)
924 return NUM_SIMUL_TRANSFERS;
925
926 return n;
927}
928
dc9dbe94 929static unsigned int get_timeout(struct dev_context *devc)
5af666a9
LPC
930{
931 size_t total_size;
932 unsigned int timeout;
933
dc9dbe94
BV
934 total_size = get_buffer_size(devc) * get_number_of_transfers(devc);
935 timeout = total_size / to_bytes_per_ms(devc->cur_samplerate);
5af666a9
LPC
936 return timeout + timeout / 4; /* Leave a headroom of 25% percent */
937}
938
3ffb6964
BV
939static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi,
940 void *cb_data)
f302a082 941{
bd47acab
LPC
942 struct sr_datafeed_packet packet;
943 struct sr_datafeed_header header;
f366e86c 944 struct sr_datafeed_meta_logic meta;
dc9dbe94 945 struct dev_context *devc;
d4abb463 946 struct drv_context *drvc = fdi->priv;
610dbb70
JH
947 struct libusb_transfer *transfer;
948 const struct libusb_pollfd **lupfd;
5af666a9
LPC
949 unsigned int i;
950 int ret;
610dbb70
JH
951 unsigned char *buf;
952
dc9dbe94
BV
953 devc = sdi->priv;
954 if (devc->submitted_transfers != 0)
c03f0450
LPC
955 return SR_ERR;
956
014359e3
BV
957 if (configure_probes(sdi) != SR_OK) {
958 sr_err("fx2lafw: failed to configured probes");
959 return SR_ERR;
960 }
961
dc9dbe94
BV
962 devc->session_dev_id = cb_data;
963 devc->num_samples = 0;
964 devc->empty_transfer_count = 0;
610dbb70 965
dc9dbe94
BV
966 const unsigned int timeout = get_timeout(devc);
967 const unsigned int num_transfers = get_number_of_transfers(devc);
968 const size_t size = get_buffer_size(devc);
5af666a9 969
dc9dbe94 970 devc->transfers = g_try_malloc0(sizeof(*devc->transfers) * num_transfers);
886a52b6
UH
971 if (!devc->transfers) {
972 sr_err("fx2lafw: USB transfers malloc failed.");
973 return SR_ERR_MALLOC;
974 }
0caa1ef0 975
dc9dbe94 976 devc->num_transfers = num_transfers;
0caa1ef0 977
5af666a9 978 for (i = 0; i < num_transfers; i++) {
610dbb70 979 if (!(buf = g_try_malloc(size))) {
7ae2f9d5 980 sr_err("fx2lafw: %s: buf malloc failed.", __func__);
610dbb70
JH
981 return SR_ERR_MALLOC;
982 }
983 transfer = libusb_alloc_transfer(0);
dc9dbe94 984 libusb_fill_bulk_transfer(transfer, devc->usb->devhdl,
610dbb70 985 2 | LIBUSB_ENDPOINT_IN, buf, size,
dc9dbe94 986 receive_transfer, devc, timeout);
610dbb70 987 if (libusb_submit_transfer(transfer) != 0) {
610dbb70
JH
988 libusb_free_transfer(transfer);
989 g_free(buf);
dc9dbe94 990 abort_acquisition(devc);
610dbb70
JH
991 return SR_ERR;
992 }
dc9dbe94
BV
993 devc->transfers[i] = transfer;
994 devc->submitted_transfers++;
610dbb70
JH
995 }
996
d4abb463 997 lupfd = libusb_get_pollfds(drvc->sr_ctx->libusb_ctx);
610dbb70
JH
998 for (i = 0; lupfd[i]; i++)
999 sr_source_add(lupfd[i]->fd, lupfd[i]->events,
5af666a9 1000 timeout, receive_data, NULL);
610dbb70
JH
1001 free(lupfd); /* NOT g_free()! */
1002
bd47acab
LPC
1003 packet.type = SR_DF_HEADER;
1004 packet.payload = &header;
1005 header.feed_version = 1;
1006 gettimeofday(&header.starttime, NULL);
1007 sr_session_send(cb_data, &packet);
f366e86c
BV
1008
1009 /* Send metadata about the SR_DF_LOGIC packets to come. */
bd47acab
LPC
1010 packet.type = SR_DF_META_LOGIC;
1011 packet.payload = &meta;
dc9dbe94
BV
1012 meta.samplerate = devc->cur_samplerate;
1013 meta.num_probes = devc->sample_wide ? 16 : 8;
bd47acab 1014 sr_session_send(cb_data, &packet);
610dbb70 1015
dc9dbe94
BV
1016 if ((ret = command_start_acquisition (devc->usb->devhdl,
1017 devc->cur_samplerate, devc->sample_wide)) != SR_OK) {
1018 abort_acquisition(devc);
ebc34738 1019 return ret;
017375d1
JH
1020 }
1021
f302a082
JH
1022 return SR_OK;
1023}
1024
3cd3a20b 1025/* TODO: This stops acquisition on ALL devices, ignoring dev_index. */
69b07d14 1026static int hw_dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data)
f302a082 1027{
2e526f4a 1028 (void)cb_data;
5da93902 1029
2e526f4a 1030 abort_acquisition(sdi->priv);
5da93902 1031
f302a082
JH
1032 return SR_OK;
1033}
1034
c09f0b57 1035SR_PRIV struct sr_dev_driver fx2lafw_driver_info = {
f302a082 1036 .name = "fx2lafw",
2e7cb004 1037 .longname = "fx2lafw (generic driver for FX2 based LAs)",
f302a082
JH
1038 .api_version = 1,
1039 .init = hw_init,
1040 .cleanup = hw_cleanup,
61136ea6 1041 .scan = hw_scan,
811deee4
BV
1042 .dev_list = hw_dev_list,
1043 .dev_clear = clear_instances,
f302a082
JH
1044 .dev_open = hw_dev_open,
1045 .dev_close = hw_dev_close,
6e9339aa 1046 .info_get = hw_info_get,
f302a082
JH
1047 .dev_config_set = hw_dev_config_set,
1048 .dev_acquisition_start = hw_dev_acquisition_start,
1049 .dev_acquisition_stop = hw_dev_acquisition_stop,
dc9dbe94 1050 .priv = NULL,
f302a082 1051};