]> sigrok.org Git - libsigrok.git/blame - hardware/fx2lafw/fx2lafw.c
ols: Split into api.c and protocol.[ch].
[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 141SR_PRIV struct sr_dev_driver fx2lafw_driver_info;
a873c594 142static struct sr_dev_driver *di = &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 171 if (libusb_get_string_descriptor_ascii(hdl,
b99457f0 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;
b99457f0 197 struct drv_context *drvc;
13bf7ecc 198 struct version_info vi;
b99457f0 199 int ret, skip, i, device_count;
1e94408a 200 uint8_t revid;
43125c69 201
b99457f0 202 drvc = di->priv;
dc9dbe94 203 devc = sdi->priv;
43125c69
JH
204
205 if (sdi->status == SR_ST_ACTIVE)
b99457f0 206 /* Device is already in use. */
43125c69
JH
207 return SR_ERR;
208
209 skip = 0;
b99457f0 210 device_count = libusb_get_device_list(drvc->sr_ctx->libusb_ctx, &devlist);
6fbe5e60 211 if (device_count < 0) {
b99457f0
UH
212 sr_err("Failed to get device list: %s.",
213 libusb_error_name(device_count));
6fbe5e60
JH
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))) {
f427daef 219 sr_err("Failed to get device descriptor: %s.",
d4928d71 220 libusb_error_name(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)
b99457f0 241 /* This is not the one. */
43125c69
JH
242 continue;
243 }
244
dc9dbe94
BV
245 if (!(ret = libusb_open(devlist[i], &devc->usb->devhdl))) {
246 if (devc->usb->address == 0xff)
43125c69 247 /*
b99457f0
UH
248 * First time we touch this device after FW
249 * upload, so we don't know the address yet.
43125c69 250 */
dc9dbe94 251 devc->usb->address = libusb_get_device_address(devlist[i]);
43125c69 252 } else {
f427daef 253 sr_err("Failed to open device: %s.",
d4928d71 254 libusb_error_name(ret));
13bf7ecc
JH
255 break;
256 }
257
dc9dbe94 258 ret = command_get_fw_version(devc->usb->devhdl, &vi);
44dfd483 259 if (ret != SR_OK) {
b99457f0 260 sr_err("Failed to get firmware version.");
13bf7ecc 261 break;
43125c69
JH
262 }
263
dc9dbe94 264 ret = command_get_revid_version(devc->usb->devhdl, &revid);
1e94408a 265 if (ret != SR_OK) {
b99457f0 266 sr_err("Failed to get REVID.");
1e94408a
UH
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) {
f427daef 276 sr_err("Expected firmware version %d.x, "
0a8c0c32
UH
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;
b99457f0 283 sr_info("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 352 if (!(devc = g_try_malloc0(sizeof(struct dev_context)))) {
b99457f0 353 sr_err("Device context malloc failed.");
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
a873c594 370 drvc = di->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. */
b99457f0 375 sr_err("sdi was NULL, continuing.");
f69b47f0
BV
376 ret = SR_ERR_BUG;
377 continue;
378 }
dc9dbe94 379 if (!(devc = sdi->priv)) {
f69b47f0 380 /* Log error, but continue cleaning up the rest. */
b99457f0 381 sr_err("sdi->priv was NULL, continuing.");
f69b47f0
BV
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
34f06b90 397static int hw_init(struct sr_context *sr_ctx)
61136ea6 398{
dc9dbe94
BV
399 struct drv_context *drvc;
400
401 if (!(drvc = g_try_malloc0(sizeof(struct drv_context)))) {
f427daef 402 sr_err("Driver context malloc failed.");
886a52b6 403 return SR_ERR_MALLOC;
dc9dbe94 404 }
61136ea6 405
1ebe4b4e 406 drvc->sr_ctx = sr_ctx;
a873c594 407 di->priv = drvc;
dc9dbe94 408
61136ea6
BV
409 return SR_OK;
410}
411
3a7a22cb 412static GSList *hw_scan(GSList *options)
f302a082 413{
3a7a22cb 414 GSList *devices;
187b3582 415 struct libusb_device_descriptor des;
3a7a22cb 416 struct sr_dev_inst *sdi;
da686568 417 const struct fx2lafw_profile *prof;
dc9dbe94
BV
418 struct drv_context *drvc;
419 struct dev_context *devc;
3a7a22cb 420 struct sr_probe *probe;
187b3582 421 libusb_device **devlist;
3a7a22cb
BV
422 int devcnt, num_logic_probes, ret, i, j;
423
3a7a22cb 424 (void)options;
64d33dc2 425
a873c594 426 drvc = di->priv;
187b3582 427
f69b47f0
BV
428 /* This scan always invalidates any previous scans. */
429 clear_instances();
430
921634ec 431 /* Find all fx2lafw compatible devices and upload firmware to them. */
3a7a22cb 432 devices = NULL;
d4abb463 433 libusb_get_device_list(drvc->sr_ctx->libusb_ctx, &devlist);
187b3582
JH
434 for (i = 0; devlist[i]; i++) {
435
ebc34738 436 if ((ret = libusb_get_device_descriptor(
7ae2f9d5 437 devlist[i], &des)) != 0) {
f427daef 438 sr_warn("Failed to get device descriptor: %s.",
d4928d71 439 libusb_error_name(ret));
187b3582
JH
440 continue;
441 }
442
da686568 443 prof = NULL;
187b3582
JH
444 for (j = 0; supported_fx2[j].vid; j++) {
445 if (des.idVendor == supported_fx2[j].vid &&
446 des.idProduct == supported_fx2[j].pid) {
da686568 447 prof = &supported_fx2[j];
187b3582
JH
448 }
449 }
450
b99457f0 451 /* Skip if the device was not found. */
da686568 452 if (!prof)
187b3582
JH
453 continue;
454
dc9dbe94 455 devcnt = g_slist_length(drvc->instances);
187b3582 456 sdi = sr_dev_inst_new(devcnt, SR_ST_INITIALIZING,
da686568 457 prof->vendor, prof->model, prof->model_version);
f4a9e5c0 458 if (!sdi)
25a0f108 459 return NULL;
a873c594 460 sdi->driver = di;
187b3582 461
06717a8a
BV
462 /* Fill in probelist according to this device's profile. */
463 num_logic_probes = prof->dev_caps & DEV_CAPS_16BIT ? 16 : 8;
c5e82ca5 464 for (j = 0; j < num_logic_probes; j++) {
06717a8a
BV
465 if (!(probe = sr_probe_new(j, SR_PROBE_LOGIC, TRUE,
466 probe_names[j])))
25a0f108 467 return NULL;
06717a8a
BV
468 sdi->probes = g_slist_append(sdi->probes, probe);
469 }
470
dc9dbe94
BV
471 devc = fx2lafw_dev_new();
472 devc->profile = prof;
473 sdi->priv = devc;
474 drvc->instances = g_slist_append(drvc->instances, sdi);
a8cc8e44 475 devices = g_slist_append(devices, sdi);
187b3582 476
b1eeb67e
JH
477 if (check_conf_profile(devlist[i])) {
478 /* Already has the firmware, so fix the new address. */
f427daef 479 sr_dbg("Found an fx2lafw device.");
b1eeb67e 480 sdi->status = SR_ST_INACTIVE;
dc9dbe94 481 devc->usb = sr_usb_dev_inst_new
b1eeb67e
JH
482 (libusb_get_bus_number(devlist[i]),
483 libusb_get_device_address(devlist[i]), NULL);
484 } else {
f8b07fc6 485 if (ezusb_upload_firmware(devlist[i], USB_CONFIGURATION,
da686568 486 prof->firmware) == SR_OK)
b99457f0 487 /* Store when this device's FW was updated. */
dc9dbe94 488 devc->fw_updated = g_get_monotonic_time();
b1eeb67e 489 else
f427daef 490 sr_err("Firmware upload failed for "
7ae2f9d5 491 "device %d.", devcnt);
dc9dbe94 492 devc->usb = sr_usb_dev_inst_new
b1eeb67e
JH
493 (libusb_get_bus_number(devlist[i]), 0xff, NULL);
494 }
187b3582
JH
495 }
496 libusb_free_device_list(devlist, 1);
497
3a7a22cb 498 return devices;
f302a082
JH
499}
500
811deee4
BV
501static GSList *hw_dev_list(void)
502{
503 struct drv_context *drvc;
504
a873c594 505 drvc = di->priv;
811deee4
BV
506
507 return drvc->instances;
508}
509
25a0f108 510static int hw_dev_open(struct sr_dev_inst *sdi)
f302a082 511{
dc9dbe94 512 struct dev_context *devc;
e8bd58ff
UH
513 int ret;
514 int64_t timediff_us, timediff_ms;
43125c69 515
dc9dbe94 516 devc = sdi->priv;
43125c69
JH
517
518 /*
f60fdf6e
UH
519 * If the firmware was recently uploaded, wait up to MAX_RENUM_DELAY_MS
520 * milliseconds for the FX2 to renumerate.
43125c69 521 */
3b6c1930 522 ret = SR_ERR;
dc9dbe94 523 if (devc->fw_updated > 0) {
f427daef 524 sr_info("Waiting for device to reset.");
b99457f0 525 /* Takes >= 300ms for the FX2 to be gone from the USB bus. */
43125c69 526 g_usleep(300 * 1000);
e8bd58ff 527 timediff_ms = 0;
f60fdf6e 528 while (timediff_ms < MAX_RENUM_DELAY_MS) {
25a0f108 529 if ((ret = fx2lafw_dev_open(sdi)) == SR_OK)
43125c69
JH
530 break;
531 g_usleep(100 * 1000);
e8bd58ff 532
dc9dbe94 533 timediff_us = g_get_monotonic_time() - devc->fw_updated;
3b6c1930 534 timediff_ms = timediff_us / 1000;
b99457f0 535 sr_spew("Waited %" PRIi64 "ms.", timediff_ms);
43125c69 536 }
443a14d8
AG
537 if (ret != SR_OK) {
538 sr_err("Device failed to renumerate.");
539 return SR_ERR;
540 }
c0bf69c2 541 sr_info("Device came back after %" PRIi64 "ms.", timediff_ms);
43125c69 542 } else {
443a14d8 543 sr_info("Firmware upload was not needed.");
25a0f108 544 ret = fx2lafw_dev_open(sdi);
43125c69
JH
545 }
546
ebc34738 547 if (ret != SR_OK) {
f427daef 548 sr_err("Unable to open device.");
43125c69
JH
549 return SR_ERR;
550 }
378abfea 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:
f427daef 558 sr_err("Unable to claim USB interface. Another "
b99457f0 559 "program or driver has already claimed it.");
0c156e06 560 break;
0c156e06 561 case LIBUSB_ERROR_NO_DEVICE:
f427daef 562 sr_err("Device has been disconnected.");
0c156e06 563 break;
0c156e06 564 default:
f427daef 565 sr_err("Unable to claim interface: %s.",
d4928d71 566 libusb_error_name(ret));
0c156e06
JH
567 break;
568 }
569
43125c69
JH
570 return SR_ERR;
571 }
572
dc9dbe94 573 if (devc->cur_samplerate == 0) {
f92994fd 574 /* Samplerate hasn't been set; default to the slowest one. */
6f4b1868 575 if (hw_dev_config_set(sdi, SR_HWCAP_SAMPLERATE,
590b9f9a 576 &supported_samplerates[0]) == SR_ERR)
f92994fd
JH
577 return SR_ERR;
578 }
579
f302a082
JH
580 return SR_OK;
581}
582
25a0f108 583static int hw_dev_close(struct sr_dev_inst *sdi)
f302a082 584{
dc9dbe94 585 struct dev_context *devc;
f1898235 586
dc9dbe94
BV
587 devc = sdi->priv;
588 if (devc->usb->devhdl == NULL)
25a0f108 589 return SR_ERR;
f1898235 590
b99457f0 591 sr_info("Closing device %d on %d.%d, interface %d.",
dc9dbe94
BV
592 sdi->index, devc->usb->bus, devc->usb->address, USB_INTERFACE);
593 libusb_release_interface(devc->usb->devhdl, USB_INTERFACE);
594 libusb_close(devc->usb->devhdl);
595 devc->usb->devhdl = NULL;
25a0f108 596 sdi->status = SR_ST_INACTIVE;
f1898235 597
f302a082
JH
598 return SR_OK;
599}
600
601static int hw_cleanup(void)
602{
dc9dbe94 603 struct drv_context *drvc;
f69b47f0 604 int ret;
187b3582 605
a873c594 606 if (!(drvc = di->priv))
dc9dbe94
BV
607 return SR_OK;
608
f69b47f0 609 ret = clear_instances();
187b3582 610
dc9dbe94 611 g_free(drvc);
a873c594 612 di->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 668 ret = SR_OK;
e3186647 669 } else if (hwcap == SR_HWCAP_LIMIT_SAMPLES) {
dc9dbe94 670 devc->limit_samples = *(const uint64_t *)value;
7cb621d4
JH
671 ret = SR_OK;
672 } else {
673 ret = SR_ERR;
674 }
675
676 return ret;
f302a082
JH
677}
678
1f9813eb 679static int receive_data(int fd, int revents, void *cb_data)
610dbb70
JH
680{
681 struct timeval tv;
b99457f0 682 struct drv_context *drvc;
610dbb70 683
610dbb70
JH
684 (void)fd;
685 (void)revents;
1f9813eb 686 (void)cb_data;
610dbb70 687
b99457f0
UH
688 drvc = di->priv;
689
610dbb70 690 tv.tv_sec = tv.tv_usec = 0;
d4abb463 691 libusb_handle_events_timeout(drvc->sr_ctx->libusb_ctx, &tv);
610dbb70
JH
692
693 return TRUE;
694}
695
dc9dbe94 696static void abort_acquisition(struct dev_context *devc)
cb61e9f7 697{
e7d087bf 698 int i;
0caa1ef0 699
dc9dbe94 700 devc->num_samples = -1;
0caa1ef0 701
dc9dbe94
BV
702 for (i = devc->num_transfers - 1; i >= 0; i--) {
703 if (devc->transfers[i])
704 libusb_cancel_transfer(devc->transfers[i]);
0caa1ef0 705 }
cb61e9f7
JH
706}
707
dc9dbe94 708static void finish_acquisition(struct dev_context *devc)
2e526f4a
JH
709{
710 struct sr_datafeed_packet packet;
a873c594 711 struct drv_context *drvc = di->priv;
b99457f0 712 const struct libusb_pollfd **lupfd;
cb61e9f7 713 int i;
2e526f4a 714
b99457f0 715 /* Terminate session. */
2e526f4a 716 packet.type = SR_DF_END;
dc9dbe94 717 sr_session_send(devc->session_dev_id, &packet);
2e526f4a 718
b99457f0
UH
719 /* Remove fds from polling. */
720 lupfd = 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{
b99457f0 731 struct dev_context *devc;
0caa1ef0 732 unsigned int i;
f855de75 733
b99457f0
UH
734 devc = transfer->user_data;
735
f855de75
LPC
736 g_free(transfer->buffer);
737 transfer->buffer = NULL;
738 libusb_free_transfer(transfer);
739
dc9dbe94
BV
740 for (i = 0; i < devc->num_transfers; i++) {
741 if (devc->transfers[i] == transfer) {
742 devc->transfers[i] = NULL;
0caa1ef0
LPC
743 break;
744 }
745 }
746
dc9dbe94
BV
747 devc->submitted_transfers--;
748 if (devc->submitted_transfers == 0)
749 finish_acquisition(devc);
f855de75
LPC
750}
751
17dff8a1
LPC
752static void resubmit_transfer(struct libusb_transfer *transfer)
753{
b99457f0 754 int ret;
d4928d71 755
b99457f0 756 if ((ret = libusb_submit_transfer(transfer)) == LIBUSB_SUCCESS)
d4928d71
PS
757 return;
758
759 free_transfer(transfer);
760 /* TODO: Stop session? */
761
f427daef 762 sr_err("%s: %s", __func__, libusb_error_name(ret));
17dff8a1
LPC
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;
b99457f0
UH
770 struct dev_context *devc;
771 int trigger_offset, i, sample_width, cur_sample_count;
772 int trigger_offset_bytes;
773 uint8_t *cur_buf;
774
775 devc = transfer->user_data;
610dbb70 776
610dbb70
JH
777 /*
778 * If acquisition has already ended, just free any queued up
779 * transfer that come in.
780 */
dc9dbe94 781 if (devc->num_samples == -1) {
f855de75 782 free_transfer(transfer);
610dbb70
JH
783 return;
784 }
785
f427daef 786 sr_info("receive_transfer(): status %d received %d bytes.",
610dbb70
JH
787 transfer->status, transfer->actual_length);
788
789 /* Save incoming transfer before reusing the transfer struct. */
b99457f0
UH
790 cur_buf = transfer->buffer;
791 sample_width = devc->sample_wide ? 2 : 1;
792 cur_sample_count = transfer->actual_length / sample_width;
610dbb70 793
7ce737a7
LPC
794 switch (transfer->status) {
795 case LIBUSB_TRANSFER_NO_DEVICE:
dc9dbe94 796 abort_acquisition(devc);
7ce737a7
LPC
797 free_transfer(transfer);
798 return;
799 case LIBUSB_TRANSFER_COMPLETED:
b99457f0 800 case LIBUSB_TRANSFER_TIMED_OUT: /* We may have received some data though. */
7ce737a7
LPC
801 break;
802 default:
803 packet_has_error = TRUE;
804 break;
805 }
806
807 if (transfer->actual_length == 0 || packet_has_error) {
dc9dbe94
BV
808 devc->empty_transfer_count++;
809 if (devc->empty_transfer_count > MAX_EMPTY_TRANSFERS) {
610dbb70
JH
810 /*
811 * The FX2 gave up. End the acquisition, the frontend
812 * will work out that the samplecount is short.
813 */
dc9dbe94 814 abort_acquisition(devc);
17dff8a1
LPC
815 free_transfer(transfer);
816 } else {
817 resubmit_transfer(transfer);
610dbb70
JH
818 }
819 return;
820 } else {
dc9dbe94 821 devc->empty_transfer_count = 0;
610dbb70
JH
822 }
823
6c6781b6 824 trigger_offset = 0;
dc9dbe94 825 if (devc->trigger_stage >= 0) {
d1ddc7a9
JH
826 for (i = 0; i < cur_sample_count; i++) {
827
dc9dbe94 828 const uint16_t cur_sample = devc->sample_wide ?
d1ddc7a9
JH
829 *((const uint16_t*)cur_buf + i) :
830 *((const uint8_t*)cur_buf + i);
6c6781b6 831
dc9dbe94
BV
832 if ((cur_sample & devc->trigger_mask[devc->trigger_stage]) ==
833 devc->trigger_value[devc->trigger_stage]) {
6c6781b6 834 /* Match on this trigger stage. */
dc9dbe94
BV
835 devc->trigger_buffer[devc->trigger_stage] = cur_sample;
836 devc->trigger_stage++;
6c6781b6 837
dc9dbe94
BV
838 if (devc->trigger_stage == NUM_TRIGGER_STAGES ||
839 devc->trigger_mask[devc->trigger_stage] == 0) {
6c6781b6
JH
840 /* Match on all trigger stages, we're done. */
841 trigger_offset = i + 1;
842
843 /*
844 * TODO: Send pre-trigger buffer to session bus.
845 * Tell the frontend we hit the trigger here.
846 */
847 packet.type = SR_DF_TRIGGER;
848 packet.payload = NULL;
dc9dbe94 849 sr_session_send(devc->session_dev_id, &packet);
6c6781b6
JH
850
851 /*
b99457f0
UH
852 * Send the samples that triggered it,
853 * since we're skipping past them.
6c6781b6
JH
854 */
855 packet.type = SR_DF_LOGIC;
856 packet.payload = &logic;
dc9dbe94
BV
857 logic.unitsize = sizeof(*devc->trigger_buffer);
858 logic.length = devc->trigger_stage * logic.unitsize;
859 logic.data = devc->trigger_buffer;
860 sr_session_send(devc->session_dev_id, &packet);
6c6781b6 861
dc9dbe94 862 devc->trigger_stage = TRIGGER_FIRED;
6c6781b6
JH
863 break;
864 }
dc9dbe94 865 } else if (devc->trigger_stage > 0) {
f3ab43a8
LPC
866 /*
867 * We had a match before, but not in the next sample. However, we may
868 * have a match on this stage in the next bit -- trigger on 0001 will
869 * fail on seeing 00001, so we need to go back to stage 0 -- but at
870 * the next sample from the one that matched originally, which the
871 * counter increment at the end of the loop takes care of.
872 */
dc9dbe94 873 i -= devc->trigger_stage;
6c6781b6
JH
874 if (i < -1)
875 i = -1; /* Oops, went back past this buffer. */
876 /* Reset trigger stage. */
dc9dbe94 877 devc->trigger_stage = 0;
6c6781b6
JH
878 }
879 }
880 }
610dbb70 881
dc9dbe94 882 if (devc->trigger_stage == TRIGGER_FIRED) {
6c6781b6 883 /* Send the incoming transfer to the session bus. */
b99457f0 884 trigger_offset_bytes = trigger_offset * sample_width;
6c6781b6
JH
885 packet.type = SR_DF_LOGIC;
886 packet.payload = &logic;
d1ddc7a9
JH
887 logic.length = transfer->actual_length - trigger_offset_bytes;
888 logic.unitsize = sample_width;
889 logic.data = cur_buf + trigger_offset_bytes;
dc9dbe94 890 sr_session_send(devc->session_dev_id, &packet);
6c6781b6 891
dc9dbe94
BV
892 devc->num_samples += cur_sample_count;
893 if (devc->limit_samples &&
894 (unsigned int)devc->num_samples > devc->limit_samples) {
895 abort_acquisition(devc);
0caa1ef0
LPC
896 free_transfer(transfer);
897 return;
6c6781b6
JH
898 }
899 } else {
900 /*
901 * TODO: Buffer pre-trigger data in capture
902 * ratio-sized buffer.
903 */
610dbb70 904 }
17dff8a1
LPC
905
906 resubmit_transfer(transfer);
610dbb70
JH
907}
908
5af666a9
LPC
909static unsigned int to_bytes_per_ms(unsigned int samplerate)
910{
911 return samplerate / 1000;
912}
913
dc9dbe94 914static size_t get_buffer_size(struct dev_context *devc)
5af666a9
LPC
915{
916 size_t s;
917
b99457f0
UH
918 /*
919 * The buffer should be large enough to hold 10ms of data and
920 * a multiple of 512.
921 */
dc9dbe94 922 s = 10 * to_bytes_per_ms(devc->cur_samplerate);
5af666a9
LPC
923 return (s + 511) & ~511;
924}
925
dc9dbe94 926static unsigned int get_number_of_transfers(struct dev_context *devc)
5af666a9
LPC
927{
928 unsigned int n;
929
b99457f0 930 /* Total buffer size should be able to hold about 500ms of data. */
dc9dbe94 931 n = 500 * to_bytes_per_ms(devc->cur_samplerate) / get_buffer_size(devc);
5af666a9
LPC
932
933 if (n > NUM_SIMUL_TRANSFERS)
934 return NUM_SIMUL_TRANSFERS;
935
936 return n;
937}
938
dc9dbe94 939static unsigned int get_timeout(struct dev_context *devc)
5af666a9
LPC
940{
941 size_t total_size;
942 unsigned int timeout;
943
dc9dbe94
BV
944 total_size = get_buffer_size(devc) * get_number_of_transfers(devc);
945 timeout = total_size / to_bytes_per_ms(devc->cur_samplerate);
b99457f0 946 return timeout + timeout / 4; /* Leave a headroom of 25% percent. */
5af666a9
LPC
947}
948
3ffb6964
BV
949static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi,
950 void *cb_data)
f302a082 951{
bd47acab
LPC
952 struct sr_datafeed_packet packet;
953 struct sr_datafeed_header header;
f366e86c 954 struct sr_datafeed_meta_logic meta;
dc9dbe94 955 struct dev_context *devc;
b99457f0 956 struct drv_context *drvc;
610dbb70
JH
957 struct libusb_transfer *transfer;
958 const struct libusb_pollfd **lupfd;
b99457f0 959 unsigned int i, timeout, num_transfers;
5af666a9 960 int ret;
610dbb70 961 unsigned char *buf;
b99457f0 962 size_t size;
610dbb70 963
b99457f0 964 drvc = di->priv;
dc9dbe94 965 devc = sdi->priv;
b99457f0 966
dc9dbe94 967 if (devc->submitted_transfers != 0)
c03f0450
LPC
968 return SR_ERR;
969
014359e3 970 if (configure_probes(sdi) != SR_OK) {
b99457f0 971 sr_err("Failed to configure probes.");
014359e3
BV
972 return SR_ERR;
973 }
974
dc9dbe94
BV
975 devc->session_dev_id = cb_data;
976 devc->num_samples = 0;
977 devc->empty_transfer_count = 0;
610dbb70 978
b99457f0
UH
979 timeout = get_timeout(devc);
980 num_transfers = get_number_of_transfers(devc);
981 size = get_buffer_size(devc);
5af666a9 982
dc9dbe94 983 devc->transfers = g_try_malloc0(sizeof(*devc->transfers) * num_transfers);
886a52b6 984 if (!devc->transfers) {
f427daef 985 sr_err("USB transfers malloc failed.");
886a52b6
UH
986 return SR_ERR_MALLOC;
987 }
0caa1ef0 988
dc9dbe94 989 devc->num_transfers = num_transfers;
0caa1ef0 990
5af666a9 991 for (i = 0; i < num_transfers; i++) {
610dbb70 992 if (!(buf = g_try_malloc(size))) {
b99457f0 993 sr_err("USB transfer buffer malloc failed.");
610dbb70
JH
994 return SR_ERR_MALLOC;
995 }
996 transfer = libusb_alloc_transfer(0);
dc9dbe94 997 libusb_fill_bulk_transfer(transfer, devc->usb->devhdl,
610dbb70 998 2 | LIBUSB_ENDPOINT_IN, buf, size,
dc9dbe94 999 receive_transfer, devc, timeout);
d4928d71 1000 if ((ret = libusb_submit_transfer(transfer)) != 0) {
b99457f0
UH
1001 sr_err("Failed to submit transfer: %s.",
1002 libusb_error_name(ret));
610dbb70
JH
1003 libusb_free_transfer(transfer);
1004 g_free(buf);
dc9dbe94 1005 abort_acquisition(devc);
610dbb70
JH
1006 return SR_ERR;
1007 }
dc9dbe94
BV
1008 devc->transfers[i] = transfer;
1009 devc->submitted_transfers++;
610dbb70
JH
1010 }
1011
d4abb463 1012 lupfd = libusb_get_pollfds(drvc->sr_ctx->libusb_ctx);
610dbb70
JH
1013 for (i = 0; lupfd[i]; i++)
1014 sr_source_add(lupfd[i]->fd, lupfd[i]->events,
5af666a9 1015 timeout, receive_data, NULL);
610dbb70
JH
1016 free(lupfd); /* NOT g_free()! */
1017
bd47acab
LPC
1018 packet.type = SR_DF_HEADER;
1019 packet.payload = &header;
1020 header.feed_version = 1;
1021 gettimeofday(&header.starttime, NULL);
1022 sr_session_send(cb_data, &packet);
f366e86c
BV
1023
1024 /* Send metadata about the SR_DF_LOGIC packets to come. */
bd47acab
LPC
1025 packet.type = SR_DF_META_LOGIC;
1026 packet.payload = &meta;
dc9dbe94
BV
1027 meta.samplerate = devc->cur_samplerate;
1028 meta.num_probes = devc->sample_wide ? 16 : 8;
bd47acab 1029 sr_session_send(cb_data, &packet);
610dbb70 1030
b99457f0 1031 if ((ret = command_start_acquisition(devc->usb->devhdl,
dc9dbe94
BV
1032 devc->cur_samplerate, devc->sample_wide)) != SR_OK) {
1033 abort_acquisition(devc);
ebc34738 1034 return ret;
017375d1
JH
1035 }
1036
f302a082
JH
1037 return SR_OK;
1038}
1039
3cd3a20b 1040/* TODO: This stops acquisition on ALL devices, ignoring dev_index. */
69b07d14 1041static int hw_dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data)
f302a082 1042{
2e526f4a 1043 (void)cb_data;
5da93902 1044
2e526f4a 1045 abort_acquisition(sdi->priv);
5da93902 1046
f302a082
JH
1047 return SR_OK;
1048}
1049
c09f0b57 1050SR_PRIV struct sr_dev_driver fx2lafw_driver_info = {
f302a082 1051 .name = "fx2lafw",
2e7cb004 1052 .longname = "fx2lafw (generic driver for FX2 based LAs)",
f302a082
JH
1053 .api_version = 1,
1054 .init = hw_init,
1055 .cleanup = hw_cleanup,
61136ea6 1056 .scan = hw_scan,
811deee4
BV
1057 .dev_list = hw_dev_list,
1058 .dev_clear = clear_instances,
f302a082
JH
1059 .dev_open = hw_dev_open,
1060 .dev_close = hw_dev_close,
6e9339aa 1061 .info_get = hw_info_get,
f302a082
JH
1062 .dev_config_set = hw_dev_config_set,
1063 .dev_acquisition_start = hw_dev_acquisition_start,
1064 .dev_acquisition_stop = hw_dev_acquisition_stop,
dc9dbe94 1065 .priv = NULL,
f302a082 1066};