]> sigrok.org Git - libsigrok.git/blame - hardware/saleae-logic/saleae-logic.c
sr/cli/gtk: A few more s/instance/inst/.
[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
a1bb33af 39static int capabilities[] = {
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
bb7ef793
UH
96static int hw_set_configuration(int dev_index, int capability, void *value);
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. */
bb7ef793 443 if (hw_set_configuration(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
bb7ef793 503static void *hw_get_dev_info(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
a1bb33af
UH
548static int *hw_get_capabilities(void)
549{
a1bb33af
UH
550 return capabilities;
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
d68e2d1a 594static int set_configuration_samplerate(struct sr_dev_inst *sdi,
6f5f21f9 595 uint64_t samplerate)
a1bb33af 596{
bb7ef793 597 struct fx2_dev *fx2;
a1bb33af
UH
598 uint8_t divider;
599 int ret, result, i;
600 unsigned char buf[2];
601
6d754b6d 602 fx2 = sdi->priv;
6f5f21f9
UH
603 for (i = 0; supported_samplerates[i]; i++) {
604 if (supported_samplerates[i] == samplerate)
a1bb33af
UH
605 break;
606 }
6f5f21f9 607 if (supported_samplerates[i] == 0)
e46b8fb1 608 return SR_ERR_SAMPLERATE;
a1bb33af 609
003f9beb
UH
610 if (new_saleae_logic_firmware)
611 divider = new_firmware_divider_value(samplerate);
612 else
613 divider = (uint8_t) (48 / (samplerate / 1000000.0)) - 1;
a1bb33af 614
7b48d6e1 615 sr_info("logic: setting samplerate to %" PRIu64 " Hz (divider %d)",
b08024a8 616 samplerate, divider);
003f9beb
UH
617
618 buf[0] = (new_saleae_logic_firmware) ? 0xd5 : 0x01;
a1bb33af 619 buf[1] = divider;
69890f73 620 ret = libusb_bulk_transfer(fx2->usb->devhdl, 1 | LIBUSB_ENDPOINT_OUT,
6f5f21f9
UH
621 buf, 2, &result, 500);
622 if (ret != 0) {
7b48d6e1 623 sr_err("logic: failed to set samplerate: %d", ret);
e46b8fb1 624 return SR_ERR;
a1bb33af 625 }
6d754b6d 626 fx2->cur_samplerate = samplerate;
a1bb33af 627
e46b8fb1 628 return SR_OK;
a1bb33af
UH
629}
630
bb7ef793 631static int hw_set_configuration(int dev_index, int capability, void *value)
a1bb33af 632{
d68e2d1a 633 struct sr_dev_inst *sdi;
bb7ef793 634 struct fx2_dev *fx2;
a1bb33af
UH
635 int ret;
636 uint64_t *tmp_u64;
637
bb7ef793 638 if (!(sdi = sr_dev_inst_get(dev_insts, dev_index)))
e46b8fb1 639 return SR_ERR;
6d754b6d 640 fx2 = sdi->priv;
a1bb33af 641
5a2326a7 642 if (capability == SR_HWCAP_SAMPLERATE) {
a1bb33af
UH
643 tmp_u64 = value;
644 ret = set_configuration_samplerate(sdi, *tmp_u64);
5a2326a7 645 } else if (capability == SR_HWCAP_PROBECONFIG) {
6d754b6d 646 ret = configure_probes(fx2, (GSList *) value);
5a2326a7 647 } else if (capability == SR_HWCAP_LIMIT_SAMPLES) {
2458ea65 648 tmp_u64 = value;
6d754b6d 649 fx2->limit_samples = *tmp_u64;
e46b8fb1 650 ret = SR_OK;
6f5f21f9 651 } else {
e46b8fb1 652 ret = SR_ERR;
6f5f21f9 653 }
a1bb33af
UH
654
655 return ret;
656}
657
a1bb33af
UH
658static int receive_data(int fd, int revents, void *user_data)
659{
660 struct timeval tv;
661
17e1afcb 662 /* Avoid compiler warnings. */
cb93f8a9
UH
663 (void)fd;
664 (void)revents;
665 (void)user_data;
afc8e4de 666
a1bb33af
UH
667 tv.tv_sec = tv.tv_usec = 0;
668 libusb_handle_events_timeout(usb_context, &tv);
669
670 return TRUE;
671}
672
a0ecd83b 673static void receive_transfer(struct libusb_transfer *transfer)
a1bb33af 674{
bb7ef793 675 /* TODO: these statics have to move to fx2_dev struct */
a1bb33af
UH
676 static int num_samples = 0;
677 static int empty_transfer_count = 0;
b9c735a2 678 struct sr_datafeed_packet packet;
9c939c51 679 struct sr_datafeed_logic logic;
bb7ef793 680 struct fx2_dev *fx2;
a1bb33af
UH
681 int cur_buflen, trigger_offset, i;
682 unsigned char *cur_buf, *new_buf;
683
f6958dab
UH
684 /* hw_stop_acquisition() is telling us to stop. */
685 if (transfer == NULL)
a1bb33af 686 num_samples = -1;
a1bb33af 687
f6958dab
UH
688 /*
689 * If acquisition has already ended, just free any queued up
690 * transfer that come in.
691 */
6f5f21f9 692 if (num_samples == -1) {
9c48090a
BV
693 if (transfer)
694 libusb_free_transfer(transfer);
f6958dab
UH
695 return;
696 }
a1bb33af 697
7b48d6e1 698 sr_info("logic: receive_transfer(): status %d received %d bytes",
b08024a8 699 transfer->status, transfer->actual_length);
f6958dab
UH
700
701 /* Save incoming transfer before reusing the transfer struct. */
702 cur_buf = transfer->buffer;
703 cur_buflen = transfer->actual_length;
6d754b6d 704 fx2 = transfer->user_data;
f6958dab
UH
705
706 /* Fire off a new request. */
b53738ba 707 if (!(new_buf = g_try_malloc(4096))) {
7b48d6e1 708 sr_err("logic: %s: new_buf malloc failed", __func__);
133a37bf 709 return; /* TODO: SR_ERR_MALLOC */
b53738ba
UH
710 }
711
f6958dab
UH
712 transfer->buffer = new_buf;
713 transfer->length = 4096;
714 if (libusb_submit_transfer(transfer) != 0) {
715 /* TODO: Stop session? */
7b48d6e1
UH
716 /* TODO: Better error message. */
717 sr_err("logic: %s: libusb_submit_transfer error", __func__);
f6958dab
UH
718 }
719
720 if (cur_buflen == 0) {
721 empty_transfer_count++;
722 if (empty_transfer_count > MAX_EMPTY_TRANSFERS) {
723 /*
724 * The FX2 gave up. End the acquisition, the frontend
725 * will work out that the samplecount is short.
726 */
6d754b6d 727 hw_stop_acquisition(-1, fx2->session_data);
6f5f21f9 728 }
f6958dab
UH
729 return;
730 } else {
731 empty_transfer_count = 0;
732 }
a1bb33af 733
f6958dab 734 trigger_offset = 0;
6d754b6d 735 if (fx2->trigger_stage >= 0) {
f6958dab 736 for (i = 0; i < cur_buflen; i++) {
b5698bd7 737
6d754b6d 738 if ((cur_buf[i] & fx2->trigger_mask[fx2->trigger_stage]) == fx2->trigger_value[fx2->trigger_stage]) {
b5698bd7 739 /* Match on this trigger stage. */
6d754b6d
BV
740 fx2->trigger_buffer[fx2->trigger_stage] = cur_buf[i];
741 fx2->trigger_stage++;
a634574e 742
6d754b6d 743 if (fx2->trigger_stage == NUM_TRIGGER_STAGES || fx2->trigger_mask[fx2->trigger_stage] == 0) {
b5698bd7
BV
744 /* Match on all trigger stages, we're done. */
745 trigger_offset = i + 1;
746
747 /*
748 * TODO: Send pre-trigger buffer to session bus.
749 * Tell the frontend we hit the trigger here.
750 */
5a2326a7 751 packet.type = SR_DF_TRIGGER;
9c939c51 752 packet.payload = NULL;
6d754b6d 753 sr_session_bus(fx2->session_data, &packet);
b5698bd7
BV
754
755 /*
756 * Send the samples that triggered it, since we're
757 * skipping past them.
758 */
5a2326a7 759 packet.type = SR_DF_LOGIC;
9c939c51
BV
760 packet.payload = &logic;
761 logic.length = fx2->trigger_stage;
762 logic.unitsize = 1;
763 logic.data = fx2->trigger_buffer;
6d754b6d 764 sr_session_bus(fx2->session_data, &packet);
b5698bd7 765
6d754b6d 766 fx2->trigger_stage = TRIGGER_FIRED;
b5698bd7
BV
767 break;
768 }
769 return;
770 }
771
772 /*
773 * We had a match before, but not in the next sample. However, we may
774 * have a match on this stage in the next bit -- trigger on 0001 will
775 * fail on seeing 00001, so we need to go back to stage 0 -- but at
776 * the next sample from the one that matched originally, which the
777 * counter increment at the end of the loop takes care of.
778 */
6d754b6d
BV
779 if (fx2->trigger_stage > 0) {
780 i -= fx2->trigger_stage;
b5698bd7
BV
781 if (i < -1)
782 i = -1; /* Oops, went back past this buffer. */
783 /* Reset trigger stage. */
6d754b6d 784 fx2->trigger_stage = 0;
b5698bd7 785 }
a1bb33af 786 }
f6958dab 787 }
a1bb33af 788
6d754b6d 789 if (fx2->trigger_stage == TRIGGER_FIRED) {
f6958dab 790 /* Send the incoming transfer to the session bus. */
5a2326a7 791 packet.type = SR_DF_LOGIC;
9c939c51
BV
792 packet.payload = &logic;
793 logic.length = cur_buflen - trigger_offset;
794 logic.unitsize = 1;
795 logic.data = cur_buf + trigger_offset;
6d754b6d 796 sr_session_bus(fx2->session_data, &packet);
f6958dab
UH
797 g_free(cur_buf);
798
799 num_samples += cur_buflen;
6d754b6d
BV
800 if (fx2->limit_samples && (unsigned int) num_samples > fx2->limit_samples) {
801 hw_stop_acquisition(-1, fx2->session_data);
a1bb33af 802 }
f6958dab
UH
803 } else {
804 /*
805 * TODO: Buffer pre-trigger data in capture
806 * ratio-sized buffer.
807 */
a1bb33af 808 }
a1bb33af
UH
809}
810
bb7ef793 811static int hw_start_acquisition(int dev_index, gpointer session_data)
a1bb33af 812{
d68e2d1a 813 struct sr_dev_inst *sdi;
b9c735a2
UH
814 struct sr_datafeed_packet *packet;
815 struct sr_datafeed_header *header;
bb7ef793 816 struct fx2_dev *fx2;
a1bb33af
UH
817 struct libusb_transfer *transfer;
818 const struct libusb_pollfd **lupfd;
819 int size, i;
820 unsigned char *buf;
821
bb7ef793 822 if (!(sdi = sr_dev_inst_get(dev_insts, dev_index)))
e46b8fb1 823 return SR_ERR;
6d754b6d
BV
824 fx2 = sdi->priv;
825 fx2->session_data = session_data;
a1bb33af 826
b53738ba 827 if (!(packet = g_try_malloc(sizeof(struct sr_datafeed_packet)))) {
7b48d6e1 828 sr_err("logic: %s: packet malloc failed", __func__);
b53738ba
UH
829 return SR_ERR_MALLOC;
830 }
9c939c51 831
b53738ba 832 if (!(header = g_try_malloc(sizeof(struct sr_datafeed_header)))) {
7b48d6e1 833 sr_err("logic: %s: header malloc failed", __func__);
b53738ba
UH
834 return SR_ERR_MALLOC;
835 }
a1bb33af 836
6f5f21f9 837 /* Start with 2K transfer, subsequently increased to 4K. */
a1bb33af 838 size = 2048;
6f5f21f9 839 for (i = 0; i < NUM_SIMUL_TRANSFERS; i++) {
b53738ba 840 if (!(buf = g_try_malloc(size))) {
7b48d6e1 841 sr_err("logic: %s: buf malloc failed", __func__);
b53738ba
UH
842 return SR_ERR_MALLOC;
843 }
a1bb33af 844 transfer = libusb_alloc_transfer(0);
69890f73 845 libusb_fill_bulk_transfer(transfer, fx2->usb->devhdl,
6f5f21f9 846 2 | LIBUSB_ENDPOINT_IN, buf, size,
6d754b6d 847 receive_transfer, fx2, 40);
6f5f21f9
UH
848 if (libusb_submit_transfer(transfer) != 0) {
849 /* TODO: Free them all. */
a1bb33af
UH
850 libusb_free_transfer(transfer);
851 g_free(buf);
e46b8fb1 852 return SR_ERR;
a1bb33af
UH
853 }
854 size = 4096;
855 }
856
857 lupfd = libusb_get_pollfds(usb_context);
6f5f21f9 858 for (i = 0; lupfd[i]; i++)
6f1be0a2
UH
859 sr_source_add(lupfd[i]->fd, lupfd[i]->events, 40, receive_data,
860 NULL);
133a37bf 861 free(lupfd); /* NOT g_free()! */
a1bb33af 862
5a2326a7 863 packet->type = SR_DF_HEADER;
9c939c51 864 packet->payload = header;
a1bb33af
UH
865 header->feed_version = 1;
866 gettimeofday(&header->starttime, NULL);
6d754b6d 867 header->samplerate = fx2->cur_samplerate;
6d754b6d 868 header->num_logic_probes = fx2->profile->num_probes;
6d754b6d 869 sr_session_bus(session_data, packet);
a1bb33af
UH
870 g_free(header);
871 g_free(packet);
872
e46b8fb1 873 return SR_OK;
a1bb33af
UH
874}
875
bb7ef793
UH
876/* This stops acquisition on ALL devices, ignoring dev_index. */
877static int hw_stop_acquisition(int dev_index, gpointer session_data)
a1bb33af 878{
b9c735a2 879 struct sr_datafeed_packet packet;
a1bb33af 880
17e1afcb 881 /* Avoid compiler warnings. */
bb7ef793 882 (void)dev_index;
afc8e4de 883
5a2326a7 884 packet.type = SR_DF_END;
6d754b6d 885 sr_session_bus(session_data, &packet);
a1bb33af
UH
886
887 receive_transfer(NULL);
888
6f5f21f9 889 /* TODO: Need to cancel and free any queued up transfers. */
3010f21c
UH
890
891 return SR_OK;
a1bb33af
UH
892}
893
bb7ef793 894SR_PRIV struct sr_dev_plugin saleae_logic_plugin_info = {
e519ba86
UH
895 .name = "saleae-logic",
896 .longname = "Saleae Logic",
897 .api_version = 1,
898 .init = hw_init,
899 .cleanup = hw_cleanup,
86f5e3d8
UH
900 .opendev = hw_opendev,
901 .closedev = hw_closedev,
bb7ef793 902 .get_dev_info = hw_get_dev_info,
e519ba86
UH
903 .get_status = hw_get_status,
904 .get_capabilities = hw_get_capabilities,
905 .set_configuration = hw_set_configuration,
906 .start_acquisition = hw_start_acquisition,
907 .stop_acquisition = hw_stop_acquisition,
a1bb33af 908};