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