]> sigrok.org Git - libsigrok.git/blame - hardware/saleae-logic/saleae-logic.c
sr/cli/gtk/qt: s/get_dev_info/dev_info_get/.
[libsigrok.git] / hardware / saleae-logic / saleae-logic.c
CommitLineData
a1bb33af
UH
1/*
2 * This file is part of the sigrok project.
3 *
c73d2ea4 4 * Copyright (C) 2010-2012 Bert Vermeulen <bert@biot.com>
a1bb33af
UH
5 *
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20#include <stdio.h>
21#include <stdlib.h>
22#include <sys/time.h>
23#include <inttypes.h>
24#include <glib.h>
25#include <libusb.h>
1a081ca6 26#include "config.h"
b7f09cf8
UH
27#include "sigrok.h"
28#include "sigrok-internal.h"
6d754b6d 29#include "saleae-logic.h"
a1bb33af 30
6d754b6d 31static struct fx2_profile supported_fx2[] = {
e10d6e32
BV
32 /* Saleae Logic */
33 { 0x0925, 0x3881, 0x0925, 0x3881, "Saleae", "Logic", NULL, 8 },
34 /* default Cypress FX2 without EEPROM */
35 { 0x04b4, 0x8613, 0x0925, 0x3881, "Cypress", "FX2", NULL, 16 },
6d754b6d 36 { 0, 0, 0, 0, 0, 0, 0, 0 }
e10d6e32
BV
37};
38
ffedd0bf 39static int hwcaps[] = {
5a2326a7
UH
40 SR_HWCAP_LOGIC_ANALYZER,
41 SR_HWCAP_SAMPLERATE,
a1bb33af 42
6f5f21f9 43 /* These are really implemented in the driver, not the hardware. */
5a2326a7
UH
44 SR_HWCAP_LIMIT_SAMPLES,
45 SR_HWCAP_CONTINUOUS,
6f5f21f9 46 0,
a1bb33af
UH
47};
48
c37d2b1b 49static const char *probe_names[] = {
464d12c7
KS
50 "0",
51 "1",
52 "2",
53 "3",
54 "4",
55 "5",
56 "6",
57 "7",
58 "8",
59 "9",
60 "10",
61 "11",
62 "12",
63 "13",
64 "14",
65 "15",
66 NULL,
67};
68
a1bb33af 69static uint64_t supported_samplerates[] = {
59df0c77
UH
70 SR_KHZ(200),
71 SR_KHZ(250),
72 SR_KHZ(500),
73 SR_MHZ(1),
74 SR_MHZ(2),
75 SR_MHZ(4),
76 SR_MHZ(8),
77 SR_MHZ(12),
78 SR_MHZ(16),
79 SR_MHZ(24),
6f5f21f9 80 0,
a1bb33af
UH
81};
82
60679b18 83static struct sr_samplerates samplerates = {
59df0c77
UH
84 SR_KHZ(200),
85 SR_MHZ(24),
c9140419 86 SR_HZ(0),
6f5f21f9 87 supported_samplerates,
a1bb33af
UH
88};
89
d68e2d1a
UH
90/* List of struct sr_dev_inst, maintained by opendev()/closedev(). */
91static GSList *dev_insts = NULL;
6d754b6d 92static libusb_context *usb_context = NULL;
a1bb33af 93
003f9beb
UH
94static int new_saleae_logic_firmware = 0;
95
a7d05fcb 96static int hw_config_set(int dev_index, int hwcap, void *value);
bb7ef793 97static int hw_stop_acquisition(int dev_index, gpointer session_dev_id);
a1bb33af 98
28fc6de0
UH
99/**
100 * Check the USB configuration to determine if this is a Saleae Logic.
101 *
102 * @return 1 if the device's configuration profile match the Logic firmware's
103 * configuration, 0 otherwise.
a1bb33af 104 */
e5d1717e 105static int check_conf_profile(libusb_device *dev)
a1bb33af
UH
106{
107 struct libusb_device_descriptor des;
6f5f21f9 108 struct libusb_config_descriptor *conf_dsc = NULL;
a1bb33af 109 const struct libusb_interface_descriptor *intf_dsc;
6f5f21f9 110 int ret = -1;
a1bb33af 111
6f5f21f9
UH
112 while (ret == -1) {
113 /* Assume it's not a Saleae Logic unless proven wrong. */
a1bb33af
UH
114 ret = 0;
115
6f5f21f9 116 if (libusb_get_device_descriptor(dev, &des) != 0)
a1bb33af
UH
117 break;
118
6f5f21f9
UH
119 if (des.bNumConfigurations != 1)
120 /* Need exactly 1 configuration. */
a1bb33af
UH
121 break;
122
6f5f21f9 123 if (libusb_get_config_descriptor(dev, 0, &conf_dsc) != 0)
a1bb33af
UH
124 break;
125
6f5f21f9
UH
126 if (conf_dsc->bNumInterfaces != 1)
127 /* Need exactly 1 interface. */
a1bb33af
UH
128 break;
129
6f5f21f9
UH
130 if (conf_dsc->interface[0].num_altsetting != 1)
131 /* Need just one alternate setting. */
a1bb33af
UH
132 break;
133
134 intf_dsc = &(conf_dsc->interface[0].altsetting[0]);
003f9beb
UH
135 if (intf_dsc->bNumEndpoints == 4) {
136 /* The new Saleae Logic firmware has 4 endpoints. */
137 new_saleae_logic_firmware = 1;
138 } else if (intf_dsc->bNumEndpoints == 2) {
139 /* The old Saleae Logic firmware has 2 endpoints. */
140 new_saleae_logic_firmware = 0;
141 } else {
142 /* Other number of endpoints -> not a Saleae Logic. */
a1bb33af 143 break;
003f9beb 144 }
a1bb33af 145
6f5f21f9
UH
146 if ((intf_dsc->endpoint[0].bEndpointAddress & 0x8f) !=
147 (1 | LIBUSB_ENDPOINT_OUT))
d38cd6c1 148 /* The first endpoint should be 1 (outbound). */
a1bb33af
UH
149 break;
150
6f5f21f9
UH
151 if ((intf_dsc->endpoint[1].bEndpointAddress & 0x8f) !=
152 (2 | LIBUSB_ENDPOINT_IN))
d38cd6c1 153 /* The second endpoint should be 2 (inbound). */
a1bb33af
UH
154 break;
155
003f9beb
UH
156 /* TODO: The new firmware has 4 endpoints... */
157
6f5f21f9 158 /* If we made it here, it must be a Saleae Logic. */
a1bb33af
UH
159 ret = 1;
160 }
6f5f21f9
UH
161
162 if (conf_dsc)
a1bb33af
UH
163 libusb_free_config_descriptor(conf_dsc);
164
165 return ret;
166}
167
bb7ef793 168static int sl_open_dev(int dev_index)
a1bb33af 169{
a1bb33af
UH
170 libusb_device **devlist;
171 struct libusb_device_descriptor des;
d68e2d1a 172 struct sr_dev_inst *sdi;
bb7ef793 173 struct fx2_dev *fx2;
a1bb33af
UH
174 int err, skip, i;
175
bb7ef793 176 if (!(sdi = sr_dev_inst_get(dev_insts, dev_index)))
6d754b6d
BV
177 return SR_ERR;
178 fx2 = sdi->priv;
a1bb33af 179
e10d6e32
BV
180 if (sdi->status == SR_ST_ACTIVE)
181 /* already in use */
6d754b6d 182 return SR_ERR;
e10d6e32
BV
183
184 skip = 0;
a1bb33af 185 libusb_get_device_list(usb_context, &devlist);
e10d6e32
BV
186 for (i = 0; devlist[i]; i++) {
187 if ((err = libusb_get_device_descriptor(devlist[i], &des))) {
7b48d6e1 188 sr_err("logic: failed to get device descriptor: %d", err);
e10d6e32 189 continue;
a1bb33af 190 }
e10d6e32 191
7b48d6e1
UH
192 if (des.idVendor != fx2->profile->fw_vid
193 || des.idProduct != fx2->profile->fw_pid)
e10d6e32
BV
194 continue;
195
196 if (sdi->status == SR_ST_INITIALIZING) {
bb7ef793 197 if (skip != dev_index) {
e10d6e32
BV
198 /* Skip devices of this type that aren't the one we want. */
199 skip += 1;
200 continue;
201 }
202 } else if (sdi->status == SR_ST_INACTIVE) {
203 /*
7b48d6e1
UH
204 * This device is fully enumerated, so we need to find
205 * this device by vendor, product, bus and address.
e10d6e32 206 */
69890f73
UH
207 if (libusb_get_bus_number(devlist[i]) != fx2->usb->bus
208 || libusb_get_device_address(devlist[i]) != fx2->usb->address)
e10d6e32
BV
209 /* this is not the one */
210 continue;
211 }
212
69890f73
UH
213 if (!(err = libusb_open(devlist[i], &fx2->usb->devhdl))) {
214 if (fx2->usb->address == 0xff)
e10d6e32
BV
215 /*
216 * first time we touch this device after firmware upload,
217 * so we don't know the address yet.
218 */
69890f73 219 fx2->usb->address = libusb_get_device_address(devlist[i]);
e10d6e32
BV
220
221 sdi->status = SR_ST_ACTIVE;
7b48d6e1
UH
222 sr_info("logic: opened device %d on %d.%d interface %d",
223 sdi->index, fx2->usb->bus,
224 fx2->usb->address, USB_INTERFACE);
e10d6e32 225 } else {
7b48d6e1 226 sr_err("logic: failed to open device: %d", err);
a1bb33af 227 }
6d754b6d
BV
228
229 /* if we made it here, we handled the device one way or another */
230 break;
a1bb33af
UH
231 }
232 libusb_free_device_list(devlist, 1);
233
6d754b6d
BV
234 if (sdi->status != SR_ST_ACTIVE)
235 return SR_ERR;
a1bb33af 236
6d754b6d 237 return SR_OK;
a1bb33af
UH
238}
239
bb7ef793 240static void close_dev(struct sr_dev_inst *sdi)
a1bb33af 241{
bb7ef793 242 struct fx2_dev *fx2;
69890f73
UH
243
244 fx2 = sdi->priv;
245
246 if (fx2->usb->devhdl == NULL)
f6958dab
UH
247 return;
248
7b48d6e1 249 sr_info("logic: closing device %d on %d.%d interface %d", sdi->index,
69890f73
UH
250 fx2->usb->bus, fx2->usb->address, USB_INTERFACE);
251 libusb_release_interface(fx2->usb->devhdl, USB_INTERFACE);
252 libusb_close(fx2->usb->devhdl);
253 fx2->usb->devhdl = NULL;
5a2326a7 254 sdi->status = SR_ST_INACTIVE;
a1bb33af
UH
255}
256
bb7ef793 257static int configure_probes(struct fx2_dev *fx2, GSList *probes)
a1bb33af 258{
1afe8989 259 struct sr_probe *probe;
a1bb33af
UH
260 GSList *l;
261 int probe_bit, stage, i;
262 char *tc;
263
6d754b6d 264 fx2->probe_mask = 0;
6f5f21f9 265 for (i = 0; i < NUM_TRIGGER_STAGES; i++) {
6d754b6d
BV
266 fx2->trigger_mask[i] = 0;
267 fx2->trigger_value[i] = 0;
a1bb33af
UH
268 }
269
270 stage = -1;
6f5f21f9 271 for (l = probes; l; l = l->next) {
1afe8989 272 probe = (struct sr_probe *)l->data;
6f5f21f9 273 if (probe->enabled == FALSE)
a1bb33af
UH
274 continue;
275 probe_bit = 1 << (probe->index - 1);
6d754b6d 276 fx2->probe_mask |= probe_bit;
989938f6
UH
277 if (!(probe->trigger))
278 continue;
279
280 stage = 0;
281 for (tc = probe->trigger; *tc; tc++) {
6d754b6d 282 fx2->trigger_mask[stage] |= probe_bit;
989938f6 283 if (*tc == '1')
6d754b6d 284 fx2->trigger_value[stage] |= probe_bit;
989938f6
UH
285 stage++;
286 if (stage > NUM_TRIGGER_STAGES)
e46b8fb1 287 return SR_ERR;
a1bb33af
UH
288 }
289 }
290
6f5f21f9
UH
291 if (stage == -1)
292 /*
293 * We didn't configure any triggers, make sure acquisition
294 * doesn't wait for any.
295 */
6d754b6d 296 fx2->trigger_stage = TRIGGER_FIRED;
a1bb33af 297 else
6d754b6d 298 fx2->trigger_stage = 0;
a1bb33af 299
e46b8fb1 300 return SR_OK;
a1bb33af
UH
301}
302
bb7ef793 303static struct fx2_dev *fx2_dev_new(void)
6d754b6d 304{
bb7ef793 305 struct fx2_dev *fx2;
6d754b6d 306
bb7ef793 307 if (!(fx2 = g_try_malloc0(sizeof(struct fx2_dev)))) {
7b48d6e1 308 sr_err("logic: %s: fx2 malloc failed", __func__);
6d754b6d
BV
309 return NULL;
310 }
311 fx2->trigger_stage = TRIGGER_FIRED;
69890f73 312 fx2->usb = NULL;
6d754b6d
BV
313
314 return fx2;
315}
316
317
a1bb33af
UH
318/*
319 * API callbacks
320 */
321
bb7ef793 322static int hw_init(const char *devinfo)
a1bb33af 323{
d68e2d1a 324 struct sr_dev_inst *sdi;
a1bb33af 325 struct libusb_device_descriptor des;
6d754b6d 326 struct fx2_profile *fx2_prof;
bb7ef793 327 struct fx2_dev *fx2;
a1bb33af 328 libusb_device **devlist;
e10d6e32 329 int err, devcnt, i, j;
a1bb33af 330
17e1afcb 331 /* Avoid compiler warnings. */
bb7ef793 332 (void)devinfo;
afc8e4de 333
6f5f21f9 334 if (libusb_init(&usb_context) != 0) {
7b48d6e1 335 sr_err("logic: Failed to initialize USB.");
a1bb33af
UH
336 return 0;
337 }
a1bb33af 338
6f5f21f9 339 /* Find all Saleae Logic devices and upload firmware to all of them. */
a1bb33af
UH
340 devcnt = 0;
341 libusb_get_device_list(usb_context, &devlist);
6f5f21f9 342 for (i = 0; devlist[i]; i++) {
6d754b6d 343 fx2_prof = NULL;
a1bb33af 344 err = libusb_get_device_descriptor(devlist[i], &des);
6f5f21f9 345 if (err != 0) {
7b48d6e1
UH
346 sr_err("logic: failed to get device descriptor: %d",
347 err);
a1bb33af
UH
348 continue;
349 }
350
e10d6e32
BV
351 for (j = 0; supported_fx2[j].orig_vid; j++) {
352 if (des.idVendor == supported_fx2[j].orig_vid
353 && des.idProduct == supported_fx2[j].orig_pid) {
6d754b6d 354 fx2_prof = &supported_fx2[j];
e10d6e32
BV
355 break;
356 }
357 }
6d754b6d 358 if (!fx2_prof)
e10d6e32
BV
359 /* not a supported VID/PID */
360 continue;
a1bb33af 361
d3683c42 362 sdi = sr_dev_inst_new(devcnt, SR_ST_INITIALIZING,
6d754b6d 363 fx2_prof->vendor, fx2_prof->model, fx2_prof->model_version);
f6958dab
UH
364 if (!sdi)
365 return 0;
bb7ef793 366 fx2 = fx2_dev_new();
6d754b6d
BV
367 fx2->profile = fx2_prof;
368 sdi->priv = fx2;
d68e2d1a 369 dev_insts = g_slist_append(dev_insts, sdi);
6f5f21f9 370
6d754b6d 371 if (check_conf_profile(devlist[i])) {
f6958dab 372 /* Already has the firmware, so fix the new address. */
7b48d6e1 373 sr_dbg("logic: Found a Saleae Logic with %s firmware.",
003f9beb 374 new_saleae_logic_firmware ? "new" : "old");
e10d6e32 375 sdi->status = SR_ST_INACTIVE;
d3683c42 376 fx2->usb = sr_usb_dev_inst_new
f6958dab 377 (libusb_get_bus_number(devlist[i]),
fed16f06 378 libusb_get_device_address(devlist[i]), NULL);
6d754b6d
BV
379 } else {
380 if (ezusb_upload_firmware(devlist[i], USB_CONFIGURATION, FIRMWARE) == SR_OK)
381 /* Remember when the firmware on this device was updated */
382 g_get_current_time(&fx2->fw_updated);
383 else
7b48d6e1
UH
384 sr_err("logic: firmware upload failed for "
385 "device %d", devcnt);
d3683c42 386 fx2->usb = sr_usb_dev_inst_new
6d754b6d 387 (libusb_get_bus_number(devlist[i]), 0xff, NULL);
a1bb33af 388 }
f6958dab 389 devcnt++;
a1bb33af
UH
390 }
391 libusb_free_device_list(devlist, 1);
392
393 return devcnt;
394}
395
bb7ef793 396static int hw_opendev(int dev_index)
a1bb33af
UH
397{
398 GTimeVal cur_time;
d68e2d1a 399 struct sr_dev_inst *sdi;
bb7ef793 400 struct fx2_dev *fx2;
a1bb33af 401 int timediff, err;
e10d6e32 402
bb7ef793 403 if (!(sdi = sr_dev_inst_get(dev_insts, dev_index)))
6d754b6d
BV
404 return SR_ERR;
405 fx2 = sdi->priv;
406
e10d6e32
BV
407 /*
408 * if the firmware was recently uploaded, wait up to MAX_RENUM_DELAY ms
409 * for the FX2 to renumerate
410 */
6d754b6d
BV
411 err = 0;
412 if (GTV_TO_MSEC(fx2->fw_updated) > 0) {
7b48d6e1 413 sr_info("logic: waiting for device to reset");
e10d6e32 414 /* takes at least 300ms for the FX2 to be gone from the USB bus */
7b48d6e1 415 g_usleep(300 * 1000);
e10d6e32
BV
416 timediff = 0;
417 while (timediff < MAX_RENUM_DELAY) {
bb7ef793 418 if ((err = sl_open_dev(dev_index)) == SR_OK)
e10d6e32 419 break;
7b48d6e1 420 g_usleep(100 * 1000);
e10d6e32 421 g_get_current_time(&cur_time);
6d754b6d 422 timediff = GTV_TO_MSEC(cur_time) - GTV_TO_MSEC(fx2->fw_updated);
a1bb33af 423 }
7b48d6e1 424 sr_info("logic: device came back after %d ms", timediff);
e10d6e32 425 } else {
bb7ef793 426 err = sl_open_dev(dev_index);
a1bb33af
UH
427 }
428
6d754b6d 429 if (err != SR_OK) {
7b48d6e1 430 sr_err("logic: unable to open device");
e46b8fb1 431 return SR_ERR;
a1bb33af 432 }
6d754b6d 433 fx2 = sdi->priv;
a1bb33af 434
69890f73 435 err = libusb_claim_interface(fx2->usb->devhdl, USB_INTERFACE);
6f5f21f9 436 if (err != 0) {
7b48d6e1 437 sr_err("logic: Unable to claim interface: %d", err);
e46b8fb1 438 return SR_ERR;
a1bb33af
UH
439 }
440
6d754b6d 441 if (fx2->cur_samplerate == 0) {
6f5f21f9 442 /* Samplerate hasn't been set; default to the slowest one. */
a7d05fcb 443 if (hw_config_set(dev_index, SR_HWCAP_SAMPLERATE,
e46b8fb1
UH
444 &supported_samplerates[0]) == SR_ERR)
445 return SR_ERR;
a1bb33af
UH
446 }
447
e46b8fb1 448 return SR_OK;
a1bb33af
UH
449}
450
bb7ef793 451static int hw_closedev(int dev_index)
a1bb33af 452{
d68e2d1a 453 struct sr_dev_inst *sdi;
a1bb33af 454
bb7ef793 455 if (!(sdi = sr_dev_inst_get(dev_insts, dev_index))) {
697785d1
UH
456 sr_err("logic: %s: sdi was NULL", __func__);
457 return SR_ERR; /* TODO: SR_ERR_ARG? */
458 }
459
460 /* TODO */
bb7ef793 461 close_dev(sdi);
697785d1
UH
462
463 return SR_OK;
a1bb33af
UH
464}
465
57ab7d9f 466static int hw_cleanup(void)
a1bb33af
UH
467{
468 GSList *l;
d68e2d1a 469 struct sr_dev_inst *sdi;
bb7ef793 470 struct fx2_dev *fx2;
57ab7d9f 471 int ret = SR_OK;
a1bb33af 472
69890f73 473 /* Properly close and free all devices. */
d68e2d1a 474 for (l = dev_insts; l; l = l->next) {
57ab7d9f
UH
475 if (!(sdi = l->data)) {
476 /* Log error, but continue cleaning up the rest. */
7b48d6e1 477 sr_err("logic: %s: sdi was NULL, continuing", __func__);
57ab7d9f
UH
478 ret = SR_ERR_BUG;
479 continue;
480 }
481 if (!(fx2 = sdi->priv)) {
482 /* Log error, but continue cleaning up the rest. */
7b48d6e1 483 sr_err("logic: %s: sdi->priv was NULL, continuing",
57ab7d9f
UH
484 __func__);
485 ret = SR_ERR_BUG;
486 continue;
487 }
bb7ef793 488 close_dev(sdi);
d3683c42
BV
489 sr_usb_dev_inst_free(fx2->usb);
490 sr_dev_inst_free(sdi);
69890f73 491 }
a1bb33af 492
d68e2d1a
UH
493 g_slist_free(dev_insts);
494 dev_insts = NULL;
a1bb33af 495
6f5f21f9 496 if (usb_context)
a1bb33af
UH
497 libusb_exit(usb_context);
498 usb_context = NULL;
57ab7d9f
UH
499
500 return ret;
a1bb33af
UH
501}
502
5097b0d0 503static void *hw_dev_info_get(int dev_index, int dev_info_id)
a1bb33af 504{
d68e2d1a 505 struct sr_dev_inst *sdi;
bb7ef793 506 struct fx2_dev *fx2;
6f5f21f9 507 void *info = NULL;
a1bb33af 508
bb7ef793 509 if (!(sdi = sr_dev_inst_get(dev_insts, dev_index)))
a1bb33af 510 return NULL;
6d754b6d 511 fx2 = sdi->priv;
a1bb33af 512
bb7ef793 513 switch (dev_info_id) {
1d9a8a5f 514 case SR_DI_INST:
a1bb33af
UH
515 info = sdi;
516 break;
5a2326a7 517 case SR_DI_NUM_PROBES:
6d754b6d 518 info = GINT_TO_POINTER(fx2->profile->num_probes);
a1bb33af 519 break;
464d12c7
KS
520 case SR_DI_PROBE_NAMES:
521 info = probe_names;
522 break;
5a2326a7 523 case SR_DI_SAMPLERATES:
a1bb33af
UH
524 info = &samplerates;
525 break;
5a2326a7 526 case SR_DI_TRIGGER_TYPES:
a1bb33af
UH
527 info = TRIGGER_TYPES;
528 break;
5a2326a7 529 case SR_DI_CUR_SAMPLERATE:
6d754b6d 530 info = &fx2->cur_samplerate;
a1bb33af
UH
531 break;
532 }
533
534 return info;
535}
536
bb7ef793 537static int hw_get_status(int dev_index)
a1bb33af 538{
d68e2d1a 539 struct sr_dev_inst *sdi;
a1bb33af 540
bb7ef793 541 sdi = sr_dev_inst_get(dev_insts, dev_index);
6f5f21f9 542 if (sdi)
a1bb33af
UH
543 return sdi->status;
544 else
5a2326a7 545 return SR_ST_NOT_FOUND;
a1bb33af
UH
546}
547
ffedd0bf 548static int *hw_hwcap_get_all(void)
a1bb33af 549{
ffedd0bf 550 return hwcaps;
a1bb33af
UH
551}
552
003f9beb
UH
553static uint8_t new_firmware_divider_value(uint64_t samplerate)
554{
555 switch (samplerate) {
556 case SR_MHZ(24):
557 return 0xe0;
558 break;
559 case SR_MHZ(16):
560 return 0xd5;
561 break;
562 case SR_MHZ(12):
563 return 0xe2;
564 break;
565 case SR_MHZ(8):
566 return 0xd4;
567 break;
568 case SR_MHZ(4):
569 return 0xda;
570 break;
571 case SR_MHZ(2):
572 return 0xe6;
573 break;
574 case SR_MHZ(1):
575 return 0x8e;
576 break;
577 case SR_KHZ(500):
578 return 0xfe;
579 break;
580 case SR_KHZ(250):
581 return 0x9e;
582 break;
583 case SR_KHZ(200):
584 return 0x4e;
585 break;
586 }
587
588 /* Shouldn't happen. */
7b48d6e1 589 sr_err("logic: %s: Invalid samplerate %" PRIu64 "",
003f9beb
UH
590 __func__, samplerate);
591 return 0;
592}
593
a7d05fcb 594static int config_set_samplerate(struct sr_dev_inst *sdi, uint64_t samplerate)
a1bb33af 595{
bb7ef793 596 struct fx2_dev *fx2;
a1bb33af
UH
597 uint8_t divider;
598 int ret, result, i;
599 unsigned char buf[2];
600
6d754b6d 601 fx2 = sdi->priv;
6f5f21f9
UH
602 for (i = 0; supported_samplerates[i]; i++) {
603 if (supported_samplerates[i] == samplerate)
a1bb33af
UH
604 break;
605 }
6f5f21f9 606 if (supported_samplerates[i] == 0)
e46b8fb1 607 return SR_ERR_SAMPLERATE;
a1bb33af 608
003f9beb
UH
609 if (new_saleae_logic_firmware)
610 divider = new_firmware_divider_value(samplerate);
611 else
612 divider = (uint8_t) (48 / (samplerate / 1000000.0)) - 1;
a1bb33af 613
7b48d6e1 614 sr_info("logic: setting samplerate to %" PRIu64 " Hz (divider %d)",
b08024a8 615 samplerate, divider);
003f9beb
UH
616
617 buf[0] = (new_saleae_logic_firmware) ? 0xd5 : 0x01;
a1bb33af 618 buf[1] = divider;
69890f73 619 ret = libusb_bulk_transfer(fx2->usb->devhdl, 1 | LIBUSB_ENDPOINT_OUT,
6f5f21f9
UH
620 buf, 2, &result, 500);
621 if (ret != 0) {
7b48d6e1 622 sr_err("logic: failed to set samplerate: %d", ret);
e46b8fb1 623 return SR_ERR;
a1bb33af 624 }
6d754b6d 625 fx2->cur_samplerate = samplerate;
a1bb33af 626
e46b8fb1 627 return SR_OK;
a1bb33af
UH
628}
629
a7d05fcb 630static int hw_config_set(int dev_index, int hwcap, void *value)
a1bb33af 631{
d68e2d1a 632 struct sr_dev_inst *sdi;
bb7ef793 633 struct fx2_dev *fx2;
a1bb33af
UH
634 int ret;
635 uint64_t *tmp_u64;
636
bb7ef793 637 if (!(sdi = sr_dev_inst_get(dev_insts, dev_index)))
e46b8fb1 638 return SR_ERR;
6d754b6d 639 fx2 = sdi->priv;
a1bb33af 640
ffedd0bf 641 if (hwcap == SR_HWCAP_SAMPLERATE) {
a1bb33af 642 tmp_u64 = value;
a7d05fcb 643 ret = config_set_samplerate(sdi, *tmp_u64);
ffedd0bf 644 } else if (hwcap == SR_HWCAP_PROBECONFIG) {
6d754b6d 645 ret = configure_probes(fx2, (GSList *) value);
ffedd0bf 646 } else if (hwcap == SR_HWCAP_LIMIT_SAMPLES) {
2458ea65 647 tmp_u64 = value;
6d754b6d 648 fx2->limit_samples = *tmp_u64;
e46b8fb1 649 ret = SR_OK;
6f5f21f9 650 } else {
e46b8fb1 651 ret = SR_ERR;
6f5f21f9 652 }
a1bb33af
UH
653
654 return ret;
655}
656
a1bb33af
UH
657static int receive_data(int fd, int revents, void *user_data)
658{
659 struct timeval tv;
660
17e1afcb 661 /* Avoid compiler warnings. */
cb93f8a9
UH
662 (void)fd;
663 (void)revents;
664 (void)user_data;
afc8e4de 665
a1bb33af
UH
666 tv.tv_sec = tv.tv_usec = 0;
667 libusb_handle_events_timeout(usb_context, &tv);
668
669 return TRUE;
670}
671
a0ecd83b 672static void receive_transfer(struct libusb_transfer *transfer)
a1bb33af 673{
bb7ef793 674 /* TODO: these statics have to move to fx2_dev struct */
a1bb33af
UH
675 static int num_samples = 0;
676 static int empty_transfer_count = 0;
b9c735a2 677 struct sr_datafeed_packet packet;
9c939c51 678 struct sr_datafeed_logic logic;
bb7ef793 679 struct fx2_dev *fx2;
a1bb33af
UH
680 int cur_buflen, trigger_offset, i;
681 unsigned char *cur_buf, *new_buf;
682
f6958dab
UH
683 /* hw_stop_acquisition() is telling us to stop. */
684 if (transfer == NULL)
a1bb33af 685 num_samples = -1;
a1bb33af 686
f6958dab
UH
687 /*
688 * If acquisition has already ended, just free any queued up
689 * transfer that come in.
690 */
6f5f21f9 691 if (num_samples == -1) {
9c48090a
BV
692 if (transfer)
693 libusb_free_transfer(transfer);
f6958dab
UH
694 return;
695 }
a1bb33af 696
7b48d6e1 697 sr_info("logic: receive_transfer(): status %d received %d bytes",
b08024a8 698 transfer->status, transfer->actual_length);
f6958dab
UH
699
700 /* Save incoming transfer before reusing the transfer struct. */
701 cur_buf = transfer->buffer;
702 cur_buflen = transfer->actual_length;
6d754b6d 703 fx2 = transfer->user_data;
f6958dab
UH
704
705 /* Fire off a new request. */
b53738ba 706 if (!(new_buf = g_try_malloc(4096))) {
7b48d6e1 707 sr_err("logic: %s: new_buf malloc failed", __func__);
133a37bf 708 return; /* TODO: SR_ERR_MALLOC */
b53738ba
UH
709 }
710
f6958dab
UH
711 transfer->buffer = new_buf;
712 transfer->length = 4096;
713 if (libusb_submit_transfer(transfer) != 0) {
714 /* TODO: Stop session? */
7b48d6e1
UH
715 /* TODO: Better error message. */
716 sr_err("logic: %s: libusb_submit_transfer error", __func__);
f6958dab
UH
717 }
718
719 if (cur_buflen == 0) {
720 empty_transfer_count++;
721 if (empty_transfer_count > MAX_EMPTY_TRANSFERS) {
722 /*
723 * The FX2 gave up. End the acquisition, the frontend
724 * will work out that the samplecount is short.
725 */
6d754b6d 726 hw_stop_acquisition(-1, fx2->session_data);
6f5f21f9 727 }
f6958dab
UH
728 return;
729 } else {
730 empty_transfer_count = 0;
731 }
a1bb33af 732
f6958dab 733 trigger_offset = 0;
6d754b6d 734 if (fx2->trigger_stage >= 0) {
f6958dab 735 for (i = 0; i < cur_buflen; i++) {
b5698bd7 736
6d754b6d 737 if ((cur_buf[i] & fx2->trigger_mask[fx2->trigger_stage]) == fx2->trigger_value[fx2->trigger_stage]) {
b5698bd7 738 /* Match on this trigger stage. */
6d754b6d
BV
739 fx2->trigger_buffer[fx2->trigger_stage] = cur_buf[i];
740 fx2->trigger_stage++;
a634574e 741
6d754b6d 742 if (fx2->trigger_stage == NUM_TRIGGER_STAGES || fx2->trigger_mask[fx2->trigger_stage] == 0) {
b5698bd7
BV
743 /* Match on all trigger stages, we're done. */
744 trigger_offset = i + 1;
745
746 /*
747 * TODO: Send pre-trigger buffer to session bus.
748 * Tell the frontend we hit the trigger here.
749 */
5a2326a7 750 packet.type = SR_DF_TRIGGER;
9c939c51 751 packet.payload = NULL;
6d754b6d 752 sr_session_bus(fx2->session_data, &packet);
b5698bd7
BV
753
754 /*
755 * Send the samples that triggered it, since we're
756 * skipping past them.
757 */
5a2326a7 758 packet.type = SR_DF_LOGIC;
9c939c51
BV
759 packet.payload = &logic;
760 logic.length = fx2->trigger_stage;
761 logic.unitsize = 1;
762 logic.data = fx2->trigger_buffer;
6d754b6d 763 sr_session_bus(fx2->session_data, &packet);
b5698bd7 764
6d754b6d 765 fx2->trigger_stage = TRIGGER_FIRED;
b5698bd7
BV
766 break;
767 }
768 return;
769 }
770
771 /*
772 * We had a match before, but not in the next sample. However, we may
773 * have a match on this stage in the next bit -- trigger on 0001 will
774 * fail on seeing 00001, so we need to go back to stage 0 -- but at
775 * the next sample from the one that matched originally, which the
776 * counter increment at the end of the loop takes care of.
777 */
6d754b6d
BV
778 if (fx2->trigger_stage > 0) {
779 i -= fx2->trigger_stage;
b5698bd7
BV
780 if (i < -1)
781 i = -1; /* Oops, went back past this buffer. */
782 /* Reset trigger stage. */
6d754b6d 783 fx2->trigger_stage = 0;
b5698bd7 784 }
a1bb33af 785 }
f6958dab 786 }
a1bb33af 787
6d754b6d 788 if (fx2->trigger_stage == TRIGGER_FIRED) {
f6958dab 789 /* Send the incoming transfer to the session bus. */
5a2326a7 790 packet.type = SR_DF_LOGIC;
9c939c51
BV
791 packet.payload = &logic;
792 logic.length = cur_buflen - trigger_offset;
793 logic.unitsize = 1;
794 logic.data = cur_buf + trigger_offset;
6d754b6d 795 sr_session_bus(fx2->session_data, &packet);
f6958dab
UH
796 g_free(cur_buf);
797
798 num_samples += cur_buflen;
6d754b6d
BV
799 if (fx2->limit_samples && (unsigned int) num_samples > fx2->limit_samples) {
800 hw_stop_acquisition(-1, fx2->session_data);
a1bb33af 801 }
f6958dab
UH
802 } else {
803 /*
804 * TODO: Buffer pre-trigger data in capture
805 * ratio-sized buffer.
806 */
a1bb33af 807 }
a1bb33af
UH
808}
809
bb7ef793 810static int hw_start_acquisition(int dev_index, gpointer session_data)
a1bb33af 811{
d68e2d1a 812 struct sr_dev_inst *sdi;
b9c735a2
UH
813 struct sr_datafeed_packet *packet;
814 struct sr_datafeed_header *header;
bb7ef793 815 struct fx2_dev *fx2;
a1bb33af
UH
816 struct libusb_transfer *transfer;
817 const struct libusb_pollfd **lupfd;
818 int size, i;
819 unsigned char *buf;
820
bb7ef793 821 if (!(sdi = sr_dev_inst_get(dev_insts, dev_index)))
e46b8fb1 822 return SR_ERR;
6d754b6d
BV
823 fx2 = sdi->priv;
824 fx2->session_data = session_data;
a1bb33af 825
b53738ba 826 if (!(packet = g_try_malloc(sizeof(struct sr_datafeed_packet)))) {
7b48d6e1 827 sr_err("logic: %s: packet malloc failed", __func__);
b53738ba
UH
828 return SR_ERR_MALLOC;
829 }
9c939c51 830
b53738ba 831 if (!(header = g_try_malloc(sizeof(struct sr_datafeed_header)))) {
7b48d6e1 832 sr_err("logic: %s: header malloc failed", __func__);
b53738ba
UH
833 return SR_ERR_MALLOC;
834 }
a1bb33af 835
6f5f21f9 836 /* Start with 2K transfer, subsequently increased to 4K. */
a1bb33af 837 size = 2048;
6f5f21f9 838 for (i = 0; i < NUM_SIMUL_TRANSFERS; i++) {
b53738ba 839 if (!(buf = g_try_malloc(size))) {
7b48d6e1 840 sr_err("logic: %s: buf malloc failed", __func__);
b53738ba
UH
841 return SR_ERR_MALLOC;
842 }
a1bb33af 843 transfer = libusb_alloc_transfer(0);
69890f73 844 libusb_fill_bulk_transfer(transfer, fx2->usb->devhdl,
6f5f21f9 845 2 | LIBUSB_ENDPOINT_IN, buf, size,
6d754b6d 846 receive_transfer, fx2, 40);
6f5f21f9
UH
847 if (libusb_submit_transfer(transfer) != 0) {
848 /* TODO: Free them all. */
a1bb33af
UH
849 libusb_free_transfer(transfer);
850 g_free(buf);
e46b8fb1 851 return SR_ERR;
a1bb33af
UH
852 }
853 size = 4096;
854 }
855
856 lupfd = libusb_get_pollfds(usb_context);
6f5f21f9 857 for (i = 0; lupfd[i]; i++)
6f1be0a2
UH
858 sr_source_add(lupfd[i]->fd, lupfd[i]->events, 40, receive_data,
859 NULL);
133a37bf 860 free(lupfd); /* NOT g_free()! */
a1bb33af 861
5a2326a7 862 packet->type = SR_DF_HEADER;
9c939c51 863 packet->payload = header;
a1bb33af
UH
864 header->feed_version = 1;
865 gettimeofday(&header->starttime, NULL);
6d754b6d 866 header->samplerate = fx2->cur_samplerate;
6d754b6d 867 header->num_logic_probes = fx2->profile->num_probes;
6d754b6d 868 sr_session_bus(session_data, packet);
a1bb33af
UH
869 g_free(header);
870 g_free(packet);
871
e46b8fb1 872 return SR_OK;
a1bb33af
UH
873}
874
bb7ef793
UH
875/* This stops acquisition on ALL devices, ignoring dev_index. */
876static int hw_stop_acquisition(int dev_index, gpointer session_data)
a1bb33af 877{
b9c735a2 878 struct sr_datafeed_packet packet;
a1bb33af 879
17e1afcb 880 /* Avoid compiler warnings. */
bb7ef793 881 (void)dev_index;
afc8e4de 882
5a2326a7 883 packet.type = SR_DF_END;
6d754b6d 884 sr_session_bus(session_data, &packet);
a1bb33af
UH
885
886 receive_transfer(NULL);
887
6f5f21f9 888 /* TODO: Need to cancel and free any queued up transfers. */
3010f21c
UH
889
890 return SR_OK;
a1bb33af
UH
891}
892
bb7ef793 893SR_PRIV struct sr_dev_plugin saleae_logic_plugin_info = {
e519ba86
UH
894 .name = "saleae-logic",
895 .longname = "Saleae Logic",
896 .api_version = 1,
897 .init = hw_init,
898 .cleanup = hw_cleanup,
86f5e3d8
UH
899 .opendev = hw_opendev,
900 .closedev = hw_closedev,
5097b0d0 901 .dev_info_get = hw_dev_info_get,
e519ba86 902 .get_status = hw_get_status,
ffedd0bf 903 .hwcap_get_all = hw_hwcap_get_all,
a7d05fcb 904 .config_set = hw_config_set,
e519ba86
UH
905 .start_acquisition = hw_start_acquisition,
906 .stop_acquisition = hw_stop_acquisition,
a1bb33af 907};