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