]> sigrok.org Git - libsigrok.git/blame - hardware/saleae-logic/saleae-logic.c
sr: rename all sr_hwplugin(s)_* functions to sr_hw_*
[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
6d754b6d
BV
90/* List of struct sr_device_instance, maintained by opendev()/closedev(). */
91static GSList *device_instances = NULL;
92static libusb_context *usb_context = NULL;
a1bb33af 93
003f9beb
UH
94static int new_saleae_logic_firmware = 0;
95
a1bb33af 96static int hw_set_configuration(int device_index, int capability, void *value);
3010f21c 97static int hw_stop_acquisition(int device_index, gpointer session_device_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
6d754b6d 168static int sl_open_device(int device_index)
a1bb33af 169{
a1bb33af
UH
170 libusb_device **devlist;
171 struct libusb_device_descriptor des;
e10d6e32 172 struct sr_device_instance *sdi;
6d754b6d 173 struct fx2_device *fx2;
a1bb33af
UH
174 int err, skip, i;
175
da1466d6 176 if (!(sdi = sr_dev_inst_get(device_instances, device_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))) {
133a37bf 188 sr_err("failed to get device descriptor: %d", err);
e10d6e32 189 continue;
a1bb33af 190 }
e10d6e32 191
6d754b6d 192 if (des.idVendor != fx2->profile->fw_vid || des.idProduct != fx2->profile->fw_pid)
e10d6e32
BV
193 continue;
194
195 if (sdi->status == SR_ST_INITIALIZING) {
196 if (skip != device_index) {
197 /* Skip devices of this type that aren't the one we want. */
198 skip += 1;
199 continue;
200 }
201 } else if (sdi->status == SR_ST_INACTIVE) {
202 /*
203 * This device is fully enumerated, so we need to find this
204 * device by vendor, product, bus and address.
205 */
69890f73
UH
206 if (libusb_get_bus_number(devlist[i]) != fx2->usb->bus
207 || libusb_get_device_address(devlist[i]) != fx2->usb->address)
e10d6e32
BV
208 /* this is not the one */
209 continue;
210 }
211
69890f73
UH
212 if (!(err = libusb_open(devlist[i], &fx2->usb->devhdl))) {
213 if (fx2->usb->address == 0xff)
e10d6e32
BV
214 /*
215 * first time we touch this device after firmware upload,
216 * so we don't know the address yet.
217 */
69890f73 218 fx2->usb->address = libusb_get_device_address(devlist[i]);
e10d6e32
BV
219
220 sdi->status = SR_ST_ACTIVE;
e53c830f 221 sr_info("saleae: opened device %d on %d.%d interface %d",
69890f73
UH
222 sdi->index, fx2->usb->bus,
223 fx2->usb->address, USB_INTERFACE);
e10d6e32 224 } else {
133a37bf 225 sr_err("failed to open device: %d", err);
a1bb33af 226 }
6d754b6d
BV
227
228 /* if we made it here, we handled the device one way or another */
229 break;
a1bb33af
UH
230 }
231 libusb_free_device_list(devlist, 1);
232
6d754b6d
BV
233 if (sdi->status != SR_ST_ACTIVE)
234 return SR_ERR;
a1bb33af 235
6d754b6d 236 return SR_OK;
a1bb33af
UH
237}
238
a00ba012 239static void close_device(struct sr_device_instance *sdi)
a1bb33af 240{
69890f73
UH
241 struct fx2_device *fx2;
242
243 fx2 = sdi->priv;
244
245 if (fx2->usb->devhdl == NULL)
f6958dab
UH
246 return;
247
b08024a8 248 sr_info("saleae: closing device %d on %d.%d interface %d", sdi->index,
69890f73
UH
249 fx2->usb->bus, fx2->usb->address, USB_INTERFACE);
250 libusb_release_interface(fx2->usb->devhdl, USB_INTERFACE);
251 libusb_close(fx2->usb->devhdl);
252 fx2->usb->devhdl = NULL;
5a2326a7 253 sdi->status = SR_ST_INACTIVE;
a1bb33af
UH
254}
255
6d754b6d 256static int configure_probes(struct fx2_device *fx2, GSList *probes)
a1bb33af 257{
1afe8989 258 struct sr_probe *probe;
a1bb33af
UH
259 GSList *l;
260 int probe_bit, stage, i;
261 char *tc;
262
6d754b6d 263 fx2->probe_mask = 0;
6f5f21f9 264 for (i = 0; i < NUM_TRIGGER_STAGES; i++) {
6d754b6d
BV
265 fx2->trigger_mask[i] = 0;
266 fx2->trigger_value[i] = 0;
a1bb33af
UH
267 }
268
269 stage = -1;
6f5f21f9 270 for (l = probes; l; l = l->next) {
1afe8989 271 probe = (struct sr_probe *)l->data;
6f5f21f9 272 if (probe->enabled == FALSE)
a1bb33af
UH
273 continue;
274 probe_bit = 1 << (probe->index - 1);
6d754b6d 275 fx2->probe_mask |= probe_bit;
989938f6
UH
276 if (!(probe->trigger))
277 continue;
278
279 stage = 0;
280 for (tc = probe->trigger; *tc; tc++) {
6d754b6d 281 fx2->trigger_mask[stage] |= probe_bit;
989938f6 282 if (*tc == '1')
6d754b6d 283 fx2->trigger_value[stage] |= probe_bit;
989938f6
UH
284 stage++;
285 if (stage > NUM_TRIGGER_STAGES)
e46b8fb1 286 return SR_ERR;
a1bb33af
UH
287 }
288 }
289
6f5f21f9
UH
290 if (stage == -1)
291 /*
292 * We didn't configure any triggers, make sure acquisition
293 * doesn't wait for any.
294 */
6d754b6d 295 fx2->trigger_stage = TRIGGER_FIRED;
a1bb33af 296 else
6d754b6d 297 fx2->trigger_stage = 0;
a1bb33af 298
e46b8fb1 299 return SR_OK;
a1bb33af
UH
300}
301
6d754b6d
BV
302static struct fx2_device *fx2_device_new(void)
303{
304 struct fx2_device *fx2;
305
306 if (!(fx2 = g_try_malloc0(sizeof(struct fx2_device)))) {
69890f73 307 sr_err("saleae: %s: fx2 malloc failed", __func__);
6d754b6d
BV
308 return NULL;
309 }
310 fx2->trigger_stage = TRIGGER_FIRED;
69890f73 311 fx2->usb = NULL;
6d754b6d
BV
312
313 return fx2;
314}
315
316
a1bb33af
UH
317/*
318 * API callbacks
319 */
320
54ac5277 321static int hw_init(const char *deviceinfo)
a1bb33af 322{
a00ba012 323 struct sr_device_instance *sdi;
a1bb33af 324 struct libusb_device_descriptor des;
6d754b6d
BV
325 struct fx2_profile *fx2_prof;
326 struct fx2_device *fx2;
a1bb33af 327 libusb_device **devlist;
e10d6e32 328 int err, devcnt, i, j;
a1bb33af 329
17e1afcb 330 /* Avoid compiler warnings. */
cb93f8a9 331 (void)deviceinfo;
afc8e4de 332
6f5f21f9 333 if (libusb_init(&usb_context) != 0) {
133a37bf 334 sr_err("Failed to initialize USB.");
a1bb33af
UH
335 return 0;
336 }
a1bb33af 337
6f5f21f9 338 /* Find all Saleae Logic devices and upload firmware to all of them. */
a1bb33af
UH
339 devcnt = 0;
340 libusb_get_device_list(usb_context, &devlist);
6f5f21f9 341 for (i = 0; devlist[i]; i++) {
6d754b6d 342 fx2_prof = NULL;
a1bb33af 343 err = libusb_get_device_descriptor(devlist[i], &des);
6f5f21f9 344 if (err != 0) {
133a37bf 345 sr_err("failed to get device descriptor: %d", err);
a1bb33af
UH
346 continue;
347 }
348
e10d6e32
BV
349 for (j = 0; supported_fx2[j].orig_vid; j++) {
350 if (des.idVendor == supported_fx2[j].orig_vid
351 && des.idProduct == supported_fx2[j].orig_pid) {
6d754b6d 352 fx2_prof = &supported_fx2[j];
e10d6e32
BV
353 break;
354 }
355 }
6d754b6d 356 if (!fx2_prof)
e10d6e32
BV
357 /* not a supported VID/PID */
358 continue;
a1bb33af 359
d3683c42 360 sdi = sr_dev_inst_new(devcnt, SR_ST_INITIALIZING,
6d754b6d 361 fx2_prof->vendor, fx2_prof->model, fx2_prof->model_version);
f6958dab
UH
362 if (!sdi)
363 return 0;
6d754b6d
BV
364 fx2 = fx2_device_new();
365 fx2->profile = fx2_prof;
366 sdi->priv = fx2;
f6958dab 367 device_instances = g_slist_append(device_instances, sdi);
6f5f21f9 368
6d754b6d 369 if (check_conf_profile(devlist[i])) {
f6958dab 370 /* Already has the firmware, so fix the new address. */
003f9beb
UH
371 sr_dbg("Found a Saleae Logic with %s firmware.",
372 new_saleae_logic_firmware ? "new" : "old");
e10d6e32 373 sdi->status = SR_ST_INACTIVE;
d3683c42 374 fx2->usb = sr_usb_dev_inst_new
f6958dab 375 (libusb_get_bus_number(devlist[i]),
fed16f06 376 libusb_get_device_address(devlist[i]), NULL);
6d754b6d
BV
377 } else {
378 if (ezusb_upload_firmware(devlist[i], USB_CONFIGURATION, FIRMWARE) == SR_OK)
379 /* Remember when the firmware on this device was updated */
380 g_get_current_time(&fx2->fw_updated);
381 else
133a37bf 382 sr_err("firmware upload failed for device %d", devcnt);
d3683c42 383 fx2->usb = sr_usb_dev_inst_new
6d754b6d 384 (libusb_get_bus_number(devlist[i]), 0xff, NULL);
a1bb33af 385 }
f6958dab 386 devcnt++;
a1bb33af
UH
387 }
388 libusb_free_device_list(devlist, 1);
389
390 return devcnt;
391}
392
a1bb33af
UH
393static int hw_opendev(int device_index)
394{
395 GTimeVal cur_time;
a00ba012 396 struct sr_device_instance *sdi;
6d754b6d 397 struct fx2_device *fx2;
a1bb33af 398 int timediff, err;
e10d6e32 399
da1466d6 400 if (!(sdi = sr_dev_inst_get(device_instances, device_index)))
6d754b6d
BV
401 return SR_ERR;
402 fx2 = sdi->priv;
403
e10d6e32
BV
404 /*
405 * if the firmware was recently uploaded, wait up to MAX_RENUM_DELAY ms
406 * for the FX2 to renumerate
407 */
6d754b6d
BV
408 err = 0;
409 if (GTV_TO_MSEC(fx2->fw_updated) > 0) {
e53c830f 410 sr_info("saleae: waiting for device to reset");
e10d6e32
BV
411 /* takes at least 300ms for the FX2 to be gone from the USB bus */
412 g_usleep(300*1000);
413 timediff = 0;
414 while (timediff < MAX_RENUM_DELAY) {
6d754b6d 415 if ((err = sl_open_device(device_index)) == SR_OK)
e10d6e32
BV
416 break;
417 g_usleep(100*1000);
418 g_get_current_time(&cur_time);
6d754b6d 419 timediff = GTV_TO_MSEC(cur_time) - GTV_TO_MSEC(fx2->fw_updated);
a1bb33af 420 }
e53c830f 421 sr_info("saleae: device came back after %d ms", timediff);
e10d6e32 422 } else {
6d754b6d 423 err = sl_open_device(device_index);
a1bb33af
UH
424 }
425
6d754b6d 426 if (err != SR_OK) {
133a37bf 427 sr_err("unable to open device");
e46b8fb1 428 return SR_ERR;
a1bb33af 429 }
6d754b6d 430 fx2 = sdi->priv;
a1bb33af 431
69890f73 432 err = libusb_claim_interface(fx2->usb->devhdl, USB_INTERFACE);
6f5f21f9 433 if (err != 0) {
133a37bf 434 sr_err("Unable to claim interface: %d", err);
e46b8fb1 435 return SR_ERR;
a1bb33af
UH
436 }
437
6d754b6d 438 if (fx2->cur_samplerate == 0) {
6f5f21f9 439 /* Samplerate hasn't been set; default to the slowest one. */
5a2326a7 440 if (hw_set_configuration(device_index, SR_HWCAP_SAMPLERATE,
e46b8fb1
UH
441 &supported_samplerates[0]) == SR_ERR)
442 return SR_ERR;
a1bb33af
UH
443 }
444
e46b8fb1 445 return SR_OK;
a1bb33af
UH
446}
447
697785d1 448static int hw_closedev(int device_index)
a1bb33af 449{
a00ba012 450 struct sr_device_instance *sdi;
a1bb33af 451
da1466d6 452 if (!(sdi = sr_dev_inst_get(device_instances, device_index))) {
697785d1
UH
453 sr_err("logic: %s: sdi was NULL", __func__);
454 return SR_ERR; /* TODO: SR_ERR_ARG? */
455 }
456
457 /* TODO */
458 close_device(sdi);
459
460 return SR_OK;
a1bb33af
UH
461}
462
57ab7d9f 463static int hw_cleanup(void)
a1bb33af
UH
464{
465 GSList *l;
69890f73
UH
466 struct sr_device_instance *sdi;
467 struct fx2_device *fx2;
57ab7d9f 468 int ret = SR_OK;
a1bb33af 469
69890f73
UH
470 /* Properly close and free all devices. */
471 for (l = device_instances; l; l = l->next) {
57ab7d9f
UH
472 if (!(sdi = l->data)) {
473 /* Log error, but continue cleaning up the rest. */
474 sr_err("fx2: %s: sdi was NULL, continuing", __func__);
475 ret = SR_ERR_BUG;
476 continue;
477 }
478 if (!(fx2 = sdi->priv)) {
479 /* Log error, but continue cleaning up the rest. */
480 sr_err("fx2: %s: sdi->priv was NULL, continuing",
481 __func__);
482 ret = SR_ERR_BUG;
483 continue;
484 }
69890f73 485 close_device(sdi);
d3683c42
BV
486 sr_usb_dev_inst_free(fx2->usb);
487 sr_dev_inst_free(sdi);
69890f73 488 }
a1bb33af 489
a1bb33af
UH
490 g_slist_free(device_instances);
491 device_instances = NULL;
492
6f5f21f9 493 if (usb_context)
a1bb33af
UH
494 libusb_exit(usb_context);
495 usb_context = NULL;
57ab7d9f
UH
496
497 return ret;
a1bb33af
UH
498}
499
a1bb33af
UH
500static void *hw_get_device_info(int device_index, int device_info_id)
501{
a00ba012 502 struct sr_device_instance *sdi;
6d754b6d 503 struct fx2_device *fx2;
6f5f21f9 504 void *info = NULL;
a1bb33af 505
da1466d6 506 if (!(sdi = sr_dev_inst_get(device_instances, device_index)))
a1bb33af 507 return NULL;
6d754b6d 508 fx2 = sdi->priv;
a1bb33af 509
6f5f21f9 510 switch (device_info_id) {
5a2326a7 511 case SR_DI_INSTANCE:
a1bb33af
UH
512 info = sdi;
513 break;
5a2326a7 514 case SR_DI_NUM_PROBES:
6d754b6d 515 info = GINT_TO_POINTER(fx2->profile->num_probes);
a1bb33af 516 break;
464d12c7
KS
517 case SR_DI_PROBE_NAMES:
518 info = probe_names;
519 break;
5a2326a7 520 case SR_DI_SAMPLERATES:
a1bb33af
UH
521 info = &samplerates;
522 break;
5a2326a7 523 case SR_DI_TRIGGER_TYPES:
a1bb33af
UH
524 info = TRIGGER_TYPES;
525 break;
5a2326a7 526 case SR_DI_CUR_SAMPLERATE:
6d754b6d 527 info = &fx2->cur_samplerate;
a1bb33af
UH
528 break;
529 }
530
531 return info;
532}
533
a1bb33af
UH
534static int hw_get_status(int device_index)
535{
a00ba012 536 struct sr_device_instance *sdi;
a1bb33af 537
da1466d6 538 sdi = sr_dev_inst_get(device_instances, device_index);
6f5f21f9 539 if (sdi)
a1bb33af
UH
540 return sdi->status;
541 else
5a2326a7 542 return SR_ST_NOT_FOUND;
a1bb33af
UH
543}
544
a1bb33af
UH
545static int *hw_get_capabilities(void)
546{
a1bb33af
UH
547 return capabilities;
548}
549
003f9beb
UH
550static uint8_t new_firmware_divider_value(uint64_t samplerate)
551{
552 switch (samplerate) {
553 case SR_MHZ(24):
554 return 0xe0;
555 break;
556 case SR_MHZ(16):
557 return 0xd5;
558 break;
559 case SR_MHZ(12):
560 return 0xe2;
561 break;
562 case SR_MHZ(8):
563 return 0xd4;
564 break;
565 case SR_MHZ(4):
566 return 0xda;
567 break;
568 case SR_MHZ(2):
569 return 0xe6;
570 break;
571 case SR_MHZ(1):
572 return 0x8e;
573 break;
574 case SR_KHZ(500):
575 return 0xfe;
576 break;
577 case SR_KHZ(250):
578 return 0x9e;
579 break;
580 case SR_KHZ(200):
581 return 0x4e;
582 break;
583 }
584
585 /* Shouldn't happen. */
586 sr_err("saleae: %s: Invalid samplerate %" PRIu64 "",
587 __func__, samplerate);
588 return 0;
589}
590
a00ba012 591static int set_configuration_samplerate(struct sr_device_instance *sdi,
6f5f21f9 592 uint64_t samplerate)
a1bb33af 593{
6d754b6d 594 struct fx2_device *fx2;
a1bb33af
UH
595 uint8_t divider;
596 int ret, result, i;
597 unsigned char buf[2];
598
6d754b6d 599 fx2 = sdi->priv;
6f5f21f9
UH
600 for (i = 0; supported_samplerates[i]; i++) {
601 if (supported_samplerates[i] == samplerate)
a1bb33af
UH
602 break;
603 }
6f5f21f9 604 if (supported_samplerates[i] == 0)
e46b8fb1 605 return SR_ERR_SAMPLERATE;
a1bb33af 606
003f9beb
UH
607 if (new_saleae_logic_firmware)
608 divider = new_firmware_divider_value(samplerate);
609 else
610 divider = (uint8_t) (48 / (samplerate / 1000000.0)) - 1;
a1bb33af 611
b08024a8
UH
612 sr_info("saleae: setting samplerate to %" PRIu64 " Hz (divider %d)",
613 samplerate, divider);
003f9beb
UH
614
615 buf[0] = (new_saleae_logic_firmware) ? 0xd5 : 0x01;
a1bb33af 616 buf[1] = divider;
69890f73 617 ret = libusb_bulk_transfer(fx2->usb->devhdl, 1 | LIBUSB_ENDPOINT_OUT,
6f5f21f9
UH
618 buf, 2, &result, 500);
619 if (ret != 0) {
133a37bf 620 sr_err("failed to set samplerate: %d", ret);
e46b8fb1 621 return SR_ERR;
a1bb33af 622 }
6d754b6d 623 fx2->cur_samplerate = samplerate;
a1bb33af 624
e46b8fb1 625 return SR_OK;
a1bb33af
UH
626}
627
a1bb33af
UH
628static int hw_set_configuration(int device_index, int capability, void *value)
629{
a00ba012 630 struct sr_device_instance *sdi;
6d754b6d 631 struct fx2_device *fx2;
a1bb33af
UH
632 int ret;
633 uint64_t *tmp_u64;
634
da1466d6 635 if (!(sdi = sr_dev_inst_get(device_instances, device_index)))
e46b8fb1 636 return SR_ERR;
6d754b6d 637 fx2 = sdi->priv;
a1bb33af 638
5a2326a7 639 if (capability == SR_HWCAP_SAMPLERATE) {
a1bb33af
UH
640 tmp_u64 = value;
641 ret = set_configuration_samplerate(sdi, *tmp_u64);
5a2326a7 642 } else if (capability == SR_HWCAP_PROBECONFIG) {
6d754b6d 643 ret = configure_probes(fx2, (GSList *) value);
5a2326a7 644 } else if (capability == SR_HWCAP_LIMIT_SAMPLES) {
2458ea65 645 tmp_u64 = value;
6d754b6d 646 fx2->limit_samples = *tmp_u64;
e46b8fb1 647 ret = SR_OK;
6f5f21f9 648 } else {
e46b8fb1 649 ret = SR_ERR;
6f5f21f9 650 }
a1bb33af
UH
651
652 return ret;
653}
654
a1bb33af
UH
655static int receive_data(int fd, int revents, void *user_data)
656{
657 struct timeval tv;
658
17e1afcb 659 /* Avoid compiler warnings. */
cb93f8a9
UH
660 (void)fd;
661 (void)revents;
662 (void)user_data;
afc8e4de 663
a1bb33af
UH
664 tv.tv_sec = tv.tv_usec = 0;
665 libusb_handle_events_timeout(usb_context, &tv);
666
667 return TRUE;
668}
669
a0ecd83b 670static void receive_transfer(struct libusb_transfer *transfer)
a1bb33af 671{
9c939c51 672 /* TODO: these statics have to move to fx2_device struct */
a1bb33af
UH
673 static int num_samples = 0;
674 static int empty_transfer_count = 0;
b9c735a2 675 struct sr_datafeed_packet packet;
9c939c51 676 struct sr_datafeed_logic logic;
6d754b6d 677 struct fx2_device *fx2;
a1bb33af
UH
678 int cur_buflen, trigger_offset, i;
679 unsigned char *cur_buf, *new_buf;
680
f6958dab
UH
681 /* hw_stop_acquisition() is telling us to stop. */
682 if (transfer == NULL)
a1bb33af 683 num_samples = -1;
a1bb33af 684
f6958dab
UH
685 /*
686 * If acquisition has already ended, just free any queued up
687 * transfer that come in.
688 */
6f5f21f9 689 if (num_samples == -1) {
9c48090a
BV
690 if (transfer)
691 libusb_free_transfer(transfer);
f6958dab
UH
692 return;
693 }
a1bb33af 694
b08024a8
UH
695 sr_info("saleae: receive_transfer(): status %d received %d bytes",
696 transfer->status, transfer->actual_length);
f6958dab
UH
697
698 /* Save incoming transfer before reusing the transfer struct. */
699 cur_buf = transfer->buffer;
700 cur_buflen = transfer->actual_length;
6d754b6d 701 fx2 = transfer->user_data;
f6958dab
UH
702
703 /* Fire off a new request. */
b53738ba
UH
704 if (!(new_buf = g_try_malloc(4096))) {
705 sr_err("saleae: %s: new_buf malloc failed", __func__);
133a37bf 706 return; /* TODO: SR_ERR_MALLOC */
b53738ba
UH
707 }
708
f6958dab
UH
709 transfer->buffer = new_buf;
710 transfer->length = 4096;
711 if (libusb_submit_transfer(transfer) != 0) {
712 /* TODO: Stop session? */
133a37bf 713 sr_err("eek");
f6958dab
UH
714 }
715
716 if (cur_buflen == 0) {
717 empty_transfer_count++;
718 if (empty_transfer_count > MAX_EMPTY_TRANSFERS) {
719 /*
720 * The FX2 gave up. End the acquisition, the frontend
721 * will work out that the samplecount is short.
722 */
6d754b6d 723 hw_stop_acquisition(-1, fx2->session_data);
6f5f21f9 724 }
f6958dab
UH
725 return;
726 } else {
727 empty_transfer_count = 0;
728 }
a1bb33af 729
f6958dab 730 trigger_offset = 0;
6d754b6d 731 if (fx2->trigger_stage >= 0) {
f6958dab 732 for (i = 0; i < cur_buflen; i++) {
b5698bd7 733
6d754b6d 734 if ((cur_buf[i] & fx2->trigger_mask[fx2->trigger_stage]) == fx2->trigger_value[fx2->trigger_stage]) {
b5698bd7 735 /* Match on this trigger stage. */
6d754b6d
BV
736 fx2->trigger_buffer[fx2->trigger_stage] = cur_buf[i];
737 fx2->trigger_stage++;
a634574e 738
6d754b6d 739 if (fx2->trigger_stage == NUM_TRIGGER_STAGES || fx2->trigger_mask[fx2->trigger_stage] == 0) {
b5698bd7
BV
740 /* Match on all trigger stages, we're done. */
741 trigger_offset = i + 1;
742
743 /*
744 * TODO: Send pre-trigger buffer to session bus.
745 * Tell the frontend we hit the trigger here.
746 */
5a2326a7 747 packet.type = SR_DF_TRIGGER;
9c939c51 748 packet.payload = NULL;
6d754b6d 749 sr_session_bus(fx2->session_data, &packet);
b5698bd7
BV
750
751 /*
752 * Send the samples that triggered it, since we're
753 * skipping past them.
754 */
5a2326a7 755 packet.type = SR_DF_LOGIC;
9c939c51
BV
756 packet.payload = &logic;
757 logic.length = fx2->trigger_stage;
758 logic.unitsize = 1;
759 logic.data = fx2->trigger_buffer;
6d754b6d 760 sr_session_bus(fx2->session_data, &packet);
b5698bd7 761
6d754b6d 762 fx2->trigger_stage = TRIGGER_FIRED;
b5698bd7
BV
763 break;
764 }
765 return;
766 }
767
768 /*
769 * We had a match before, but not in the next sample. However, we may
770 * have a match on this stage in the next bit -- trigger on 0001 will
771 * fail on seeing 00001, so we need to go back to stage 0 -- but at
772 * the next sample from the one that matched originally, which the
773 * counter increment at the end of the loop takes care of.
774 */
6d754b6d
BV
775 if (fx2->trigger_stage > 0) {
776 i -= fx2->trigger_stage;
b5698bd7
BV
777 if (i < -1)
778 i = -1; /* Oops, went back past this buffer. */
779 /* Reset trigger stage. */
6d754b6d 780 fx2->trigger_stage = 0;
b5698bd7 781 }
a1bb33af 782 }
f6958dab 783 }
a1bb33af 784
6d754b6d 785 if (fx2->trigger_stage == TRIGGER_FIRED) {
f6958dab 786 /* Send the incoming transfer to the session bus. */
5a2326a7 787 packet.type = SR_DF_LOGIC;
9c939c51
BV
788 packet.payload = &logic;
789 logic.length = cur_buflen - trigger_offset;
790 logic.unitsize = 1;
791 logic.data = cur_buf + trigger_offset;
6d754b6d 792 sr_session_bus(fx2->session_data, &packet);
f6958dab
UH
793 g_free(cur_buf);
794
795 num_samples += cur_buflen;
6d754b6d
BV
796 if (fx2->limit_samples && (unsigned int) num_samples > fx2->limit_samples) {
797 hw_stop_acquisition(-1, fx2->session_data);
a1bb33af 798 }
f6958dab
UH
799 } else {
800 /*
801 * TODO: Buffer pre-trigger data in capture
802 * ratio-sized buffer.
803 */
a1bb33af 804 }
a1bb33af
UH
805}
806
6d754b6d 807static int hw_start_acquisition(int device_index, gpointer session_data)
a1bb33af 808{
a00ba012 809 struct sr_device_instance *sdi;
b9c735a2
UH
810 struct sr_datafeed_packet *packet;
811 struct sr_datafeed_header *header;
6d754b6d 812 struct fx2_device *fx2;
a1bb33af
UH
813 struct libusb_transfer *transfer;
814 const struct libusb_pollfd **lupfd;
815 int size, i;
816 unsigned char *buf;
817
da1466d6 818 if (!(sdi = sr_dev_inst_get(device_instances, device_index)))
e46b8fb1 819 return SR_ERR;
6d754b6d
BV
820 fx2 = sdi->priv;
821 fx2->session_data = session_data;
a1bb33af 822
b53738ba
UH
823 if (!(packet = g_try_malloc(sizeof(struct sr_datafeed_packet)))) {
824 sr_err("saleae: %s: packet malloc failed", __func__);
825 return SR_ERR_MALLOC;
826 }
9c939c51 827
b53738ba
UH
828 if (!(header = g_try_malloc(sizeof(struct sr_datafeed_header)))) {
829 sr_err("saleae: %s: header malloc failed", __func__);
830 return SR_ERR_MALLOC;
831 }
a1bb33af 832
6f5f21f9 833 /* Start with 2K transfer, subsequently increased to 4K. */
a1bb33af 834 size = 2048;
6f5f21f9 835 for (i = 0; i < NUM_SIMUL_TRANSFERS; i++) {
b53738ba
UH
836 if (!(buf = g_try_malloc(size))) {
837 sr_err("saleae: %s: buf malloc failed", __func__);
838 return SR_ERR_MALLOC;
839 }
a1bb33af 840 transfer = libusb_alloc_transfer(0);
69890f73 841 libusb_fill_bulk_transfer(transfer, fx2->usb->devhdl,
6f5f21f9 842 2 | LIBUSB_ENDPOINT_IN, buf, size,
6d754b6d 843 receive_transfer, fx2, 40);
6f5f21f9
UH
844 if (libusb_submit_transfer(transfer) != 0) {
845 /* TODO: Free them all. */
a1bb33af
UH
846 libusb_free_transfer(transfer);
847 g_free(buf);
e46b8fb1 848 return SR_ERR;
a1bb33af
UH
849 }
850 size = 4096;
851 }
852
853 lupfd = libusb_get_pollfds(usb_context);
6f5f21f9 854 for (i = 0; lupfd[i]; i++)
6f1be0a2
UH
855 sr_source_add(lupfd[i]->fd, lupfd[i]->events, 40, receive_data,
856 NULL);
133a37bf 857 free(lupfd); /* NOT g_free()! */
a1bb33af 858
5a2326a7 859 packet->type = SR_DF_HEADER;
9c939c51 860 packet->payload = header;
a1bb33af
UH
861 header->feed_version = 1;
862 gettimeofday(&header->starttime, NULL);
6d754b6d 863 header->samplerate = fx2->cur_samplerate;
6d754b6d 864 header->num_logic_probes = fx2->profile->num_probes;
6d754b6d 865 sr_session_bus(session_data, packet);
a1bb33af
UH
866 g_free(header);
867 g_free(packet);
868
e46b8fb1 869 return SR_OK;
a1bb33af
UH
870}
871
6f5f21f9 872/* This stops acquisition on ALL devices, ignoring device_index. */
3010f21c 873static int hw_stop_acquisition(int device_index, gpointer session_data)
a1bb33af 874{
b9c735a2 875 struct sr_datafeed_packet packet;
a1bb33af 876
17e1afcb 877 /* Avoid compiler warnings. */
cb93f8a9 878 (void)device_index;
afc8e4de 879
5a2326a7 880 packet.type = SR_DF_END;
6d754b6d 881 sr_session_bus(session_data, &packet);
a1bb33af
UH
882
883 receive_transfer(NULL);
884
6f5f21f9 885 /* TODO: Need to cancel and free any queued up transfers. */
3010f21c
UH
886
887 return SR_OK;
a1bb33af
UH
888}
889
ca070ed9 890SR_PRIV struct sr_device_plugin saleae_logic_plugin_info = {
e519ba86
UH
891 .name = "saleae-logic",
892 .longname = "Saleae Logic",
893 .api_version = 1,
894 .init = hw_init,
895 .cleanup = hw_cleanup,
86f5e3d8
UH
896 .opendev = hw_opendev,
897 .closedev = hw_closedev,
e519ba86
UH
898 .get_device_info = hw_get_device_info,
899 .get_status = hw_get_status,
900 .get_capabilities = hw_get_capabilities,
901 .set_configuration = hw_set_configuration,
902 .start_acquisition = hw_start_acquisition,
903 .stop_acquisition = hw_stop_acquisition,
a1bb33af 904};