]> sigrok.org Git - libsigrok.git/blame - hardware/fx2lafw/fx2lafw.c
allow for intermediate stage in stopping acquisition
[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;
13bf7ecc 197 struct version_info vi;
ebc34738 198 int ret, skip, i;
1e94408a 199 uint8_t revid;
43125c69 200
dc9dbe94 201 devc = sdi->priv;
43125c69
JH
202
203 if (sdi->status == SR_ST_ACTIVE)
204 /* already in use */
205 return SR_ERR;
206
207 skip = 0;
f5cfe894 208 const int device_count = libusb_get_device_list(NULL, &devlist);
6fbe5e60
JH
209 if (device_count < 0) {
210 sr_err("fx2lafw: Failed to retrieve device list (%d)",
211 device_count);
212 return SR_ERR;
213 }
214
215 for (i = 0; i < device_count; i++) {
ebc34738 216 if ((ret = libusb_get_device_descriptor(devlist[i], &des))) {
7ae2f9d5
UH
217 sr_err("fx2lafw: Failed to get device descriptor: %d.",
218 ret);
43125c69
JH
219 continue;
220 }
221
dc9dbe94
BV
222 if (des.idVendor != devc->profile->vid
223 || des.idProduct != devc->profile->pid)
43125c69
JH
224 continue;
225
226 if (sdi->status == SR_ST_INITIALIZING) {
25a0f108 227 if (skip != sdi->index) {
43125c69
JH
228 /* Skip devices of this type that aren't the one we want. */
229 skip += 1;
230 continue;
231 }
232 } else if (sdi->status == SR_ST_INACTIVE) {
233 /*
234 * This device is fully enumerated, so we need to find
235 * this device by vendor, product, bus and address.
236 */
dc9dbe94
BV
237 if (libusb_get_bus_number(devlist[i]) != devc->usb->bus
238 || libusb_get_device_address(devlist[i]) != devc->usb->address)
43125c69
JH
239 /* this is not the one */
240 continue;
241 }
242
dc9dbe94
BV
243 if (!(ret = libusb_open(devlist[i], &devc->usb->devhdl))) {
244 if (devc->usb->address == 0xff)
43125c69
JH
245 /*
246 * first time we touch this device after firmware upload,
247 * so we don't know the address yet.
248 */
dc9dbe94 249 devc->usb->address = libusb_get_device_address(devlist[i]);
43125c69 250 } else {
7ae2f9d5 251 sr_err("fx2lafw: Failed to open device: %d.", ret);
13bf7ecc
JH
252 break;
253 }
254
dc9dbe94 255 ret = command_get_fw_version(devc->usb->devhdl, &vi);
44dfd483 256 if (ret != SR_OK) {
13bf7ecc 257 sr_err("fx2lafw: Failed to retrieve "
44dfd483 258 "firmware version information.");
13bf7ecc 259 break;
43125c69
JH
260 }
261
dc9dbe94 262 ret = command_get_revid_version(devc->usb->devhdl, &revid);
1e94408a
UH
263 if (ret != SR_OK) {
264 sr_err("fx2lafw: Failed to retrieve REVID.");
265 break;
266 }
267
0a8c0c32
UH
268 /*
269 * Changes in major version mean incompatible/API changes, so
270 * bail out if we encounter an incompatible version.
271 * Different minor versions are OK, they should be compatible.
272 */
273 if (vi.major != FX2LAFW_REQUIRED_VERSION_MAJOR) {
274 sr_err("fx2lafw: Expected firmware version %d.x, "
275 "got %d.%d.", FX2LAFW_REQUIRED_VERSION_MAJOR,
276 vi.major, vi.minor);
13bf7ecc
JH
277 break;
278 }
279
280 sdi->status = SR_ST_ACTIVE;
281 sr_info("fx2lafw: Opened device %d on %d.%d "
1e94408a 282 "interface %d, firmware %d.%d, REVID %d.",
dc9dbe94 283 sdi->index, devc->usb->bus, devc->usb->address,
1e94408a 284 USB_INTERFACE, vi.major, vi.minor, revid);
13bf7ecc 285
43125c69
JH
286 break;
287 }
288 libusb_free_device_list(devlist, 1);
289
290 if (sdi->status != SR_ST_ACTIVE)
291 return SR_ERR;
292
293 return SR_OK;
294}
295
014359e3 296static int configure_probes(const struct sr_dev_inst *sdi)
6c6781b6 297{
014359e3 298 struct dev_context *devc;
6c6781b6
JH
299 struct sr_probe *probe;
300 GSList *l;
301 int probe_bit, stage, i;
302 char *tc;
303
014359e3 304 devc = sdi->priv;
6c6781b6 305 for (i = 0; i < NUM_TRIGGER_STAGES; i++) {
dc9dbe94
BV
306 devc->trigger_mask[i] = 0;
307 devc->trigger_value[i] = 0;
6c6781b6
JH
308 }
309
310 stage = -1;
014359e3 311 for (l = sdi->probes; l; l = l->next) {
6c6781b6
JH
312 probe = (struct sr_probe *)l->data;
313 if (probe->enabled == FALSE)
314 continue;
d1ddc7a9 315
b35c8293 316 if (probe->index > 7)
dc9dbe94 317 devc->sample_wide = TRUE;
d1ddc7a9 318
b35c8293 319 probe_bit = 1 << (probe->index);
6c6781b6
JH
320 if (!(probe->trigger))
321 continue;
322
323 stage = 0;
324 for (tc = probe->trigger; *tc; tc++) {
dc9dbe94 325 devc->trigger_mask[stage] |= probe_bit;
6c6781b6 326 if (*tc == '1')
dc9dbe94 327 devc->trigger_value[stage] |= probe_bit;
6c6781b6
JH
328 stage++;
329 if (stage > NUM_TRIGGER_STAGES)
330 return SR_ERR;
331 }
332 }
333
334 if (stage == -1)
335 /*
336 * We didn't configure any triggers, make sure acquisition
337 * doesn't wait for any.
338 */
dc9dbe94 339 devc->trigger_stage = TRIGGER_FIRED;
6c6781b6 340 else
dc9dbe94 341 devc->trigger_stage = 0;
6c6781b6
JH
342
343 return SR_OK;
344}
345
dc9dbe94 346static struct dev_context *fx2lafw_dev_new(void)
187b3582 347{
dc9dbe94 348 struct dev_context *devc;
187b3582 349
dc9dbe94
BV
350 if (!(devc = g_try_malloc0(sizeof(struct dev_context)))) {
351 sr_err("fx2lafw: %s: devc malloc failed.", __func__);
187b3582
JH
352 return NULL;
353 }
354
dc9dbe94 355 devc->trigger_stage = TRIGGER_FIRED;
6c6781b6 356
dc9dbe94 357 return devc;
187b3582 358}
f302a082 359
f69b47f0
BV
360static int clear_instances(void)
361{
362 GSList *l;
363 struct sr_dev_inst *sdi;
dc9dbe94
BV
364 struct drv_context *drvc;
365 struct dev_context *devc;
f69b47f0
BV
366 int ret;
367
dc9dbe94 368 drvc = fdi->priv;
f69b47f0 369 ret = SR_OK;
dc9dbe94 370 for (l = drvc->instances; l; l = l->next) {
f69b47f0
BV
371 if (!(sdi = l->data)) {
372 /* Log error, but continue cleaning up the rest. */
373 sr_err("fx2lafw: %s: sdi was NULL, continuing.",
374 __func__);
375 ret = SR_ERR_BUG;
376 continue;
377 }
dc9dbe94 378 if (!(devc = sdi->priv)) {
f69b47f0
BV
379 /* Log error, but continue cleaning up the rest. */
380 sr_err("fx2lafw: %s: sdi->priv was NULL, continuing",
381 __func__);
382 ret = SR_ERR_BUG;
383 continue;
384 }
25a0f108 385 hw_dev_close(sdi);
fabe59b3 386 sr_usb_dev_inst_free(devc->usb);
f69b47f0
BV
387 sdi = l->data;
388 sr_dev_inst_free(sdi);
389 }
390
dc9dbe94
BV
391 g_slist_free(drvc->instances);
392 drvc->instances = NULL;
f69b47f0
BV
393
394 return ret;
395}
396
397
f302a082
JH
398/*
399 * API callbacks
400 */
401
40dda2c3 402static int hw_init(void)
61136ea6 403{
dc9dbe94
BV
404 struct drv_context *drvc;
405
406 if (!(drvc = g_try_malloc0(sizeof(struct drv_context)))) {
407 sr_err("fx2lafw: driver context malloc failed.");
886a52b6 408 return SR_ERR_MALLOC;
dc9dbe94 409 }
61136ea6 410
f5cfe894 411 if (libusb_init(NULL) != 0) {
dc9dbe94 412 g_free(drvc);
61136ea6
BV
413 sr_warn("fx2lafw: Failed to initialize libusb.");
414 return SR_ERR;
415 }
416
dc9dbe94
BV
417 fdi->priv = drvc;
418
61136ea6
BV
419 return SR_OK;
420}
421
3a7a22cb 422static GSList *hw_scan(GSList *options)
f302a082 423{
3a7a22cb 424 GSList *devices;
187b3582 425 struct libusb_device_descriptor des;
3a7a22cb 426 struct sr_dev_inst *sdi;
da686568 427 const struct fx2lafw_profile *prof;
dc9dbe94
BV
428 struct drv_context *drvc;
429 struct dev_context *devc;
3a7a22cb 430 struct sr_probe *probe;
187b3582 431 libusb_device **devlist;
3a7a22cb
BV
432 int devcnt, num_logic_probes, ret, i, j;
433
434 /* Avoid compiler warnings. */
435 (void)options;
dc9dbe94 436 drvc = fdi->priv;
187b3582 437
f69b47f0
BV
438 /* This scan always invalidates any previous scans. */
439 clear_instances();
440
921634ec 441 /* Find all fx2lafw compatible devices and upload firmware to them. */
3a7a22cb 442 devices = NULL;
f5cfe894 443 libusb_get_device_list(NULL, &devlist);
187b3582
JH
444 for (i = 0; devlist[i]; i++) {
445
ebc34738 446 if ((ret = libusb_get_device_descriptor(
7ae2f9d5
UH
447 devlist[i], &des)) != 0) {
448 sr_warn("fx2lafw: Failed to get device descriptor: %d.", ret);
187b3582
JH
449 continue;
450 }
451
da686568 452 prof = NULL;
187b3582
JH
453 for (j = 0; supported_fx2[j].vid; j++) {
454 if (des.idVendor == supported_fx2[j].vid &&
455 des.idProduct == supported_fx2[j].pid) {
da686568 456 prof = &supported_fx2[j];
187b3582
JH
457 }
458 }
459
460 /* Skip if the device was not found */
da686568 461 if (!prof)
187b3582
JH
462 continue;
463
dc9dbe94 464 devcnt = g_slist_length(drvc->instances);
187b3582 465 sdi = sr_dev_inst_new(devcnt, SR_ST_INITIALIZING,
da686568 466 prof->vendor, prof->model, prof->model_version);
f4a9e5c0 467 if (!sdi)
25a0f108 468 return NULL;
c5e82ca5 469 sdi->driver = fdi;
187b3582 470
06717a8a
BV
471 /* Fill in probelist according to this device's profile. */
472 num_logic_probes = prof->dev_caps & DEV_CAPS_16BIT ? 16 : 8;
c5e82ca5 473 for (j = 0; j < num_logic_probes; j++) {
06717a8a
BV
474 if (!(probe = sr_probe_new(j, SR_PROBE_LOGIC, TRUE,
475 probe_names[j])))
25a0f108 476 return NULL;
06717a8a
BV
477 sdi->probes = g_slist_append(sdi->probes, probe);
478 }
479
dc9dbe94
BV
480 devc = fx2lafw_dev_new();
481 devc->profile = prof;
482 sdi->priv = devc;
483 drvc->instances = g_slist_append(drvc->instances, sdi);
a8cc8e44 484 devices = g_slist_append(devices, sdi);
187b3582 485
b1eeb67e
JH
486 if (check_conf_profile(devlist[i])) {
487 /* Already has the firmware, so fix the new address. */
7ae2f9d5 488 sr_dbg("fx2lafw: Found an fx2lafw device.");
b1eeb67e 489 sdi->status = SR_ST_INACTIVE;
dc9dbe94 490 devc->usb = sr_usb_dev_inst_new
b1eeb67e
JH
491 (libusb_get_bus_number(devlist[i]),
492 libusb_get_device_address(devlist[i]), NULL);
493 } else {
f8b07fc6 494 if (ezusb_upload_firmware(devlist[i], USB_CONFIGURATION,
da686568 495 prof->firmware) == SR_OK)
b1eeb67e 496 /* Remember when the firmware on this device was updated */
dc9dbe94 497 devc->fw_updated = g_get_monotonic_time();
b1eeb67e 498 else
7ae2f9d5
UH
499 sr_err("fx2lafw: Firmware upload failed for "
500 "device %d.", devcnt);
dc9dbe94 501 devc->usb = sr_usb_dev_inst_new
b1eeb67e
JH
502 (libusb_get_bus_number(devlist[i]), 0xff, NULL);
503 }
187b3582
JH
504 }
505 libusb_free_device_list(devlist, 1);
506
3a7a22cb 507 return devices;
f302a082
JH
508}
509
811deee4
BV
510static GSList *hw_dev_list(void)
511{
512 struct drv_context *drvc;
513
514 drvc = fdi->priv;
515
516 return drvc->instances;
517}
518
25a0f108 519static int hw_dev_open(struct sr_dev_inst *sdi)
f302a082 520{
dc9dbe94 521 struct dev_context *devc;
e8bd58ff
UH
522 int ret;
523 int64_t timediff_us, timediff_ms;
43125c69 524
dc9dbe94 525 devc = sdi->priv;
43125c69
JH
526
527 /*
f60fdf6e
UH
528 * If the firmware was recently uploaded, wait up to MAX_RENUM_DELAY_MS
529 * milliseconds for the FX2 to renumerate.
43125c69 530 */
3b6c1930 531 ret = SR_ERR;
dc9dbe94 532 if (devc->fw_updated > 0) {
7ae2f9d5 533 sr_info("fx2lafw: Waiting for device to reset.");
43125c69
JH
534 /* takes at least 300ms for the FX2 to be gone from the USB bus */
535 g_usleep(300 * 1000);
e8bd58ff 536 timediff_ms = 0;
f60fdf6e 537 while (timediff_ms < MAX_RENUM_DELAY_MS) {
25a0f108 538 if ((ret = fx2lafw_dev_open(sdi)) == SR_OK)
43125c69
JH
539 break;
540 g_usleep(100 * 1000);
e8bd58ff 541
dc9dbe94 542 timediff_us = g_get_monotonic_time() - devc->fw_updated;
3b6c1930
BV
543 timediff_ms = timediff_us / 1000;
544 sr_spew("fx2lafw: waited %" PRIi64 " ms", timediff_ms);
43125c69 545 }
e8bd58ff 546 sr_info("fx2lafw: Device came back after %d ms.", timediff_ms);
43125c69 547 } else {
25a0f108 548 ret = fx2lafw_dev_open(sdi);
43125c69
JH
549 }
550
ebc34738 551 if (ret != SR_OK) {
7ae2f9d5 552 sr_err("fx2lafw: Unable to open device.");
43125c69
JH
553 return SR_ERR;
554 }
dc9dbe94 555 devc = sdi->priv;
43125c69 556
dc9dbe94 557 ret = libusb_claim_interface(devc->usb->devhdl, USB_INTERFACE);
ebc34738 558 if (ret != 0) {
0c156e06
JH
559 switch(ret) {
560 case LIBUSB_ERROR_BUSY:
561 sr_err("fx2lafw: Unable to claim USB interface. Another "
562 "program or driver has already claimed it.");
563 break;
564
565 case LIBUSB_ERROR_NO_DEVICE:
566 sr_err("fx2lafw: Device has been disconnected.");
567 break;
568
569 default:
570 sr_err("fx2lafw: Unable to claim interface: %d.", ret);
571 break;
572 }
573
43125c69
JH
574 return SR_ERR;
575 }
576
dc9dbe94 577 if (devc->cur_samplerate == 0) {
f92994fd 578 /* Samplerate hasn't been set; default to the slowest one. */
6f4b1868 579 if (hw_dev_config_set(sdi, SR_HWCAP_SAMPLERATE,
590b9f9a 580 &supported_samplerates[0]) == SR_ERR)
f92994fd
JH
581 return SR_ERR;
582 }
583
f302a082
JH
584 return SR_OK;
585}
586
25a0f108 587static int hw_dev_close(struct sr_dev_inst *sdi)
f302a082 588{
dc9dbe94 589 struct dev_context *devc;
f1898235 590
dc9dbe94
BV
591 devc = sdi->priv;
592 if (devc->usb->devhdl == NULL)
25a0f108 593 return SR_ERR;
f1898235 594
25a0f108 595 sr_info("fx2lafw: Closing device %d on %d.%d interface %d.",
dc9dbe94
BV
596 sdi->index, devc->usb->bus, devc->usb->address, USB_INTERFACE);
597 libusb_release_interface(devc->usb->devhdl, USB_INTERFACE);
598 libusb_close(devc->usb->devhdl);
599 devc->usb->devhdl = NULL;
25a0f108 600 sdi->status = SR_ST_INACTIVE;
f1898235 601
f302a082
JH
602 return SR_OK;
603}
604
605static int hw_cleanup(void)
606{
dc9dbe94 607 struct drv_context *drvc;
f69b47f0 608 int ret;
187b3582 609
dc9dbe94
BV
610 if (!(drvc = fdi->priv))
611 return SR_OK;
612
f69b47f0 613 ret = clear_instances();
187b3582 614
f5cfe894 615 libusb_exit(NULL);
dc9dbe94
BV
616
617 g_free(drvc);
618 fdi->priv = NULL;
187b3582 619
62bc70e4 620 return ret;
f302a082
JH
621}
622
cbd798f4 623static int hw_info_get(int info_id, const void **data,
6e9339aa 624 const struct sr_dev_inst *sdi)
f302a082 625{
dc9dbe94 626 struct dev_context *devc;
8b35f474 627
cbd798f4 628 switch (info_id) {
a27999e6
BV
629 case SR_DI_HWCAPS:
630 *data = hwcaps;
631 break;
8b35f474 632 case SR_DI_NUM_PROBES:
6e9339aa 633 if (sdi) {
dc9dbe94 634 devc = sdi->priv;
6e9339aa 635 *data = GINT_TO_POINTER(
dc9dbe94 636 (devc->profile->dev_caps & DEV_CAPS_16BIT) ?
6e9339aa
BV
637 16 : 8);
638 } else
639 return SR_ERR;
640 break;
8b35f474 641 case SR_DI_PROBE_NAMES:
6e9339aa
BV
642 *data = probe_names;
643 break;
8b35f474 644 case SR_DI_SAMPLERATES:
6e9339aa
BV
645 *data = &samplerates;
646 break;
8b35f474 647 case SR_DI_TRIGGER_TYPES:
6e9339aa
BV
648 *data = TRIGGER_TYPES;
649 break;
e3186647 650 case SR_DI_CUR_SAMPLERATE:
6e9339aa 651 if (sdi) {
dc9dbe94
BV
652 devc = sdi->priv;
653 *data = &devc->cur_samplerate;
6e9339aa
BV
654 } else
655 return SR_ERR;
656 break;
657 default:
658 return SR_ERR_ARG;
8b35f474
JH
659 }
660
6e9339aa 661 return SR_OK;
f302a082
JH
662}
663
6f4b1868
BV
664static int hw_dev_config_set(const struct sr_dev_inst *sdi, int hwcap,
665 const void *value)
f302a082 666{
dc9dbe94 667 struct dev_context *devc;
7cb621d4
JH
668 int ret;
669
dc9dbe94 670 devc = sdi->priv;
7cb621d4 671
e3186647 672 if (hwcap == SR_HWCAP_SAMPLERATE) {
dc9dbe94 673 devc->cur_samplerate = *(const uint64_t *)value;
e3186647 674 ret = SR_OK;
e3186647 675 } else if (hwcap == SR_HWCAP_LIMIT_SAMPLES) {
dc9dbe94 676 devc->limit_samples = *(const uint64_t *)value;
7cb621d4
JH
677 ret = SR_OK;
678 } else {
679 ret = SR_ERR;
680 }
681
682 return ret;
f302a082
JH
683}
684
1f9813eb 685static int receive_data(int fd, int revents, void *cb_data)
610dbb70
JH
686{
687 struct timeval tv;
688
689 /* Avoid compiler warnings. */
690 (void)fd;
691 (void)revents;
1f9813eb 692 (void)cb_data;
610dbb70
JH
693
694 tv.tv_sec = tv.tv_usec = 0;
f5cfe894 695 libusb_handle_events_timeout(NULL, &tv);
610dbb70
JH
696
697 return TRUE;
698}
699
dc9dbe94 700static void abort_acquisition(struct dev_context *devc)
cb61e9f7 701{
e7d087bf 702 int i;
0caa1ef0 703
dc9dbe94 704 devc->num_samples = -1;
0caa1ef0 705
dc9dbe94
BV
706 for (i = devc->num_transfers - 1; i >= 0; i--) {
707 if (devc->transfers[i])
708 libusb_cancel_transfer(devc->transfers[i]);
0caa1ef0 709 }
cb61e9f7
JH
710}
711
dc9dbe94 712static void finish_acquisition(struct dev_context *devc)
2e526f4a
JH
713{
714 struct sr_datafeed_packet packet;
cb61e9f7 715 int i;
2e526f4a 716
dc9dbe94 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 =
f5cfe894 724 libusb_get_pollfds(NULL);
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 949 struct dev_context *devc;
610dbb70
JH
950 struct libusb_transfer *transfer;
951 const struct libusb_pollfd **lupfd;
5af666a9
LPC
952 unsigned int i;
953 int ret;
610dbb70
JH
954 unsigned char *buf;
955
dc9dbe94
BV
956 devc = sdi->priv;
957 if (devc->submitted_transfers != 0)
c03f0450
LPC
958 return SR_ERR;
959
014359e3
BV
960 if (configure_probes(sdi) != SR_OK) {
961 sr_err("fx2lafw: failed to configured probes");
962 return SR_ERR;
963 }
964
dc9dbe94
BV
965 devc->session_dev_id = cb_data;
966 devc->num_samples = 0;
967 devc->empty_transfer_count = 0;
610dbb70 968
dc9dbe94
BV
969 const unsigned int timeout = get_timeout(devc);
970 const unsigned int num_transfers = get_number_of_transfers(devc);
971 const size_t size = get_buffer_size(devc);
5af666a9 972
dc9dbe94 973 devc->transfers = g_try_malloc0(sizeof(*devc->transfers) * num_transfers);
886a52b6
UH
974 if (!devc->transfers) {
975 sr_err("fx2lafw: USB transfers malloc failed.");
976 return SR_ERR_MALLOC;
977 }
0caa1ef0 978
dc9dbe94 979 devc->num_transfers = num_transfers;
0caa1ef0 980
5af666a9 981 for (i = 0; i < num_transfers; i++) {
610dbb70 982 if (!(buf = g_try_malloc(size))) {
7ae2f9d5 983 sr_err("fx2lafw: %s: buf malloc failed.", __func__);
610dbb70
JH
984 return SR_ERR_MALLOC;
985 }
986 transfer = libusb_alloc_transfer(0);
dc9dbe94 987 libusb_fill_bulk_transfer(transfer, devc->usb->devhdl,
610dbb70 988 2 | LIBUSB_ENDPOINT_IN, buf, size,
dc9dbe94 989 receive_transfer, devc, timeout);
610dbb70 990 if (libusb_submit_transfer(transfer) != 0) {
610dbb70
JH
991 libusb_free_transfer(transfer);
992 g_free(buf);
dc9dbe94 993 abort_acquisition(devc);
610dbb70
JH
994 return SR_ERR;
995 }
dc9dbe94
BV
996 devc->transfers[i] = transfer;
997 devc->submitted_transfers++;
610dbb70
JH
998 }
999
f5cfe894 1000 lupfd = libusb_get_pollfds(NULL);
610dbb70
JH
1001 for (i = 0; lupfd[i]; i++)
1002 sr_source_add(lupfd[i]->fd, lupfd[i]->events,
5af666a9 1003 timeout, receive_data, NULL);
610dbb70
JH
1004 free(lupfd); /* NOT g_free()! */
1005
bd47acab
LPC
1006 packet.type = SR_DF_HEADER;
1007 packet.payload = &header;
1008 header.feed_version = 1;
1009 gettimeofday(&header.starttime, NULL);
1010 sr_session_send(cb_data, &packet);
f366e86c
BV
1011
1012 /* Send metadata about the SR_DF_LOGIC packets to come. */
bd47acab
LPC
1013 packet.type = SR_DF_META_LOGIC;
1014 packet.payload = &meta;
dc9dbe94
BV
1015 meta.samplerate = devc->cur_samplerate;
1016 meta.num_probes = devc->sample_wide ? 16 : 8;
bd47acab 1017 sr_session_send(cb_data, &packet);
610dbb70 1018
dc9dbe94
BV
1019 if ((ret = command_start_acquisition (devc->usb->devhdl,
1020 devc->cur_samplerate, devc->sample_wide)) != SR_OK) {
1021 abort_acquisition(devc);
ebc34738 1022 return ret;
017375d1
JH
1023 }
1024
f302a082
JH
1025 return SR_OK;
1026}
1027
3cd3a20b 1028/* TODO: This stops acquisition on ALL devices, ignoring dev_index. */
69b07d14 1029static int hw_dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data)
f302a082 1030{
5da93902 1031
f4a9e5c0 1032 /* Avoid compiler warnings. */
2e526f4a 1033 (void)cb_data;
5da93902 1034
2e526f4a 1035 abort_acquisition(sdi->priv);
5da93902 1036
f302a082
JH
1037 return SR_OK;
1038}
1039
c09f0b57 1040SR_PRIV struct sr_dev_driver fx2lafw_driver_info = {
f302a082 1041 .name = "fx2lafw",
2e7cb004 1042 .longname = "fx2lafw (generic driver for FX2 based LAs)",
f302a082
JH
1043 .api_version = 1,
1044 .init = hw_init,
1045 .cleanup = hw_cleanup,
61136ea6 1046 .scan = hw_scan,
811deee4
BV
1047 .dev_list = hw_dev_list,
1048 .dev_clear = clear_instances,
f302a082
JH
1049 .dev_open = hw_dev_open,
1050 .dev_close = hw_dev_close,
6e9339aa 1051 .info_get = hw_info_get,
f302a082
JH
1052 .dev_config_set = hw_dev_config_set,
1053 .dev_acquisition_start = hw_dev_acquisition_start,
1054 .dev_acquisition_stop = hw_dev_acquisition_stop,
dc9dbe94 1055 .priv = NULL,
f302a082 1056};