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