]> sigrok.org Git - libsigrok.git/blame - hardware/saleae-logic/saleae-logic.c
sr: adjust copyright year
[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);
9c48090a 97static void 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
d32d961d 176 if (!(sdi = sr_get_device_instance(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
5a2326a7 360 sdi = sr_device_instance_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;
69890f73 374 fx2->usb = sr_usb_device_instance_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);
69890f73 383 fx2->usb = sr_usb_device_instance_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
6d754b6d
BV
400 if (!(sdi = sr_get_device_instance(device_instances, device_index)))
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
697785d1
UH
452 if (!(sdi = sr_get_device_instance(device_instances, device_index))) {
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
a1bb33af
UH
463static void hw_cleanup(void)
464{
465 GSList *l;
69890f73
UH
466 struct sr_device_instance *sdi;
467 struct fx2_device *fx2;
a1bb33af 468
69890f73
UH
469 /* Properly close and free all devices. */
470 for (l = device_instances; l; l = l->next) {
471 sdi = l->data;
472 fx2 = sdi->priv;
473 close_device(sdi);
474 sr_usb_device_instance_free(fx2->usb);
475 sr_device_instance_free(sdi);
476 }
a1bb33af 477
a1bb33af
UH
478 g_slist_free(device_instances);
479 device_instances = NULL;
480
6f5f21f9 481 if (usb_context)
a1bb33af
UH
482 libusb_exit(usb_context);
483 usb_context = NULL;
a1bb33af
UH
484}
485
a1bb33af
UH
486static void *hw_get_device_info(int device_index, int device_info_id)
487{
a00ba012 488 struct sr_device_instance *sdi;
6d754b6d 489 struct fx2_device *fx2;
6f5f21f9 490 void *info = NULL;
a1bb33af 491
d32d961d 492 if (!(sdi = sr_get_device_instance(device_instances, device_index)))
a1bb33af 493 return NULL;
6d754b6d 494 fx2 = sdi->priv;
a1bb33af 495
6f5f21f9 496 switch (device_info_id) {
5a2326a7 497 case SR_DI_INSTANCE:
a1bb33af
UH
498 info = sdi;
499 break;
5a2326a7 500 case SR_DI_NUM_PROBES:
6d754b6d 501 info = GINT_TO_POINTER(fx2->profile->num_probes);
a1bb33af 502 break;
464d12c7
KS
503 case SR_DI_PROBE_NAMES:
504 info = probe_names;
505 break;
5a2326a7 506 case SR_DI_SAMPLERATES:
a1bb33af
UH
507 info = &samplerates;
508 break;
5a2326a7 509 case SR_DI_TRIGGER_TYPES:
a1bb33af
UH
510 info = TRIGGER_TYPES;
511 break;
5a2326a7 512 case SR_DI_CUR_SAMPLERATE:
6d754b6d 513 info = &fx2->cur_samplerate;
a1bb33af
UH
514 break;
515 }
516
517 return info;
518}
519
a1bb33af
UH
520static int hw_get_status(int device_index)
521{
a00ba012 522 struct sr_device_instance *sdi;
a1bb33af 523
d32d961d 524 sdi = sr_get_device_instance(device_instances, device_index);
6f5f21f9 525 if (sdi)
a1bb33af
UH
526 return sdi->status;
527 else
5a2326a7 528 return SR_ST_NOT_FOUND;
a1bb33af
UH
529}
530
a1bb33af
UH
531static int *hw_get_capabilities(void)
532{
a1bb33af
UH
533 return capabilities;
534}
535
003f9beb
UH
536static uint8_t new_firmware_divider_value(uint64_t samplerate)
537{
538 switch (samplerate) {
539 case SR_MHZ(24):
540 return 0xe0;
541 break;
542 case SR_MHZ(16):
543 return 0xd5;
544 break;
545 case SR_MHZ(12):
546 return 0xe2;
547 break;
548 case SR_MHZ(8):
549 return 0xd4;
550 break;
551 case SR_MHZ(4):
552 return 0xda;
553 break;
554 case SR_MHZ(2):
555 return 0xe6;
556 break;
557 case SR_MHZ(1):
558 return 0x8e;
559 break;
560 case SR_KHZ(500):
561 return 0xfe;
562 break;
563 case SR_KHZ(250):
564 return 0x9e;
565 break;
566 case SR_KHZ(200):
567 return 0x4e;
568 break;
569 }
570
571 /* Shouldn't happen. */
572 sr_err("saleae: %s: Invalid samplerate %" PRIu64 "",
573 __func__, samplerate);
574 return 0;
575}
576
a00ba012 577static int set_configuration_samplerate(struct sr_device_instance *sdi,
6f5f21f9 578 uint64_t samplerate)
a1bb33af 579{
6d754b6d 580 struct fx2_device *fx2;
a1bb33af
UH
581 uint8_t divider;
582 int ret, result, i;
583 unsigned char buf[2];
584
6d754b6d 585 fx2 = sdi->priv;
6f5f21f9
UH
586 for (i = 0; supported_samplerates[i]; i++) {
587 if (supported_samplerates[i] == samplerate)
a1bb33af
UH
588 break;
589 }
6f5f21f9 590 if (supported_samplerates[i] == 0)
e46b8fb1 591 return SR_ERR_SAMPLERATE;
a1bb33af 592
003f9beb
UH
593 if (new_saleae_logic_firmware)
594 divider = new_firmware_divider_value(samplerate);
595 else
596 divider = (uint8_t) (48 / (samplerate / 1000000.0)) - 1;
a1bb33af 597
b08024a8
UH
598 sr_info("saleae: setting samplerate to %" PRIu64 " Hz (divider %d)",
599 samplerate, divider);
003f9beb
UH
600
601 buf[0] = (new_saleae_logic_firmware) ? 0xd5 : 0x01;
a1bb33af 602 buf[1] = divider;
69890f73 603 ret = libusb_bulk_transfer(fx2->usb->devhdl, 1 | LIBUSB_ENDPOINT_OUT,
6f5f21f9
UH
604 buf, 2, &result, 500);
605 if (ret != 0) {
133a37bf 606 sr_err("failed to set samplerate: %d", ret);
e46b8fb1 607 return SR_ERR;
a1bb33af 608 }
6d754b6d 609 fx2->cur_samplerate = samplerate;
a1bb33af 610
e46b8fb1 611 return SR_OK;
a1bb33af
UH
612}
613
a1bb33af
UH
614static int hw_set_configuration(int device_index, int capability, void *value)
615{
a00ba012 616 struct sr_device_instance *sdi;
6d754b6d 617 struct fx2_device *fx2;
a1bb33af
UH
618 int ret;
619 uint64_t *tmp_u64;
620
d32d961d 621 if (!(sdi = sr_get_device_instance(device_instances, device_index)))
e46b8fb1 622 return SR_ERR;
6d754b6d 623 fx2 = sdi->priv;
a1bb33af 624
5a2326a7 625 if (capability == SR_HWCAP_SAMPLERATE) {
a1bb33af
UH
626 tmp_u64 = value;
627 ret = set_configuration_samplerate(sdi, *tmp_u64);
5a2326a7 628 } else if (capability == SR_HWCAP_PROBECONFIG) {
6d754b6d 629 ret = configure_probes(fx2, (GSList *) value);
5a2326a7 630 } else if (capability == SR_HWCAP_LIMIT_SAMPLES) {
2458ea65 631 tmp_u64 = value;
6d754b6d 632 fx2->limit_samples = *tmp_u64;
e46b8fb1 633 ret = SR_OK;
6f5f21f9 634 } else {
e46b8fb1 635 ret = SR_ERR;
6f5f21f9 636 }
a1bb33af
UH
637
638 return ret;
639}
640
a1bb33af
UH
641static int receive_data(int fd, int revents, void *user_data)
642{
643 struct timeval tv;
644
17e1afcb 645 /* Avoid compiler warnings. */
cb93f8a9
UH
646 (void)fd;
647 (void)revents;
648 (void)user_data;
afc8e4de 649
a1bb33af
UH
650 tv.tv_sec = tv.tv_usec = 0;
651 libusb_handle_events_timeout(usb_context, &tv);
652
653 return TRUE;
654}
655
a0ecd83b 656static void receive_transfer(struct libusb_transfer *transfer)
a1bb33af 657{
9c939c51 658 /* TODO: these statics have to move to fx2_device struct */
a1bb33af
UH
659 static int num_samples = 0;
660 static int empty_transfer_count = 0;
b9c735a2 661 struct sr_datafeed_packet packet;
9c939c51 662 struct sr_datafeed_logic logic;
6d754b6d 663 struct fx2_device *fx2;
a1bb33af
UH
664 int cur_buflen, trigger_offset, i;
665 unsigned char *cur_buf, *new_buf;
666
f6958dab
UH
667 /* hw_stop_acquisition() is telling us to stop. */
668 if (transfer == NULL)
a1bb33af 669 num_samples = -1;
a1bb33af 670
f6958dab
UH
671 /*
672 * If acquisition has already ended, just free any queued up
673 * transfer that come in.
674 */
6f5f21f9 675 if (num_samples == -1) {
9c48090a
BV
676 if (transfer)
677 libusb_free_transfer(transfer);
f6958dab
UH
678 return;
679 }
a1bb33af 680
b08024a8
UH
681 sr_info("saleae: receive_transfer(): status %d received %d bytes",
682 transfer->status, transfer->actual_length);
f6958dab
UH
683
684 /* Save incoming transfer before reusing the transfer struct. */
685 cur_buf = transfer->buffer;
686 cur_buflen = transfer->actual_length;
6d754b6d 687 fx2 = transfer->user_data;
f6958dab
UH
688
689 /* Fire off a new request. */
b53738ba
UH
690 if (!(new_buf = g_try_malloc(4096))) {
691 sr_err("saleae: %s: new_buf malloc failed", __func__);
133a37bf 692 return; /* TODO: SR_ERR_MALLOC */
b53738ba
UH
693 }
694
f6958dab
UH
695 transfer->buffer = new_buf;
696 transfer->length = 4096;
697 if (libusb_submit_transfer(transfer) != 0) {
698 /* TODO: Stop session? */
133a37bf 699 sr_err("eek");
f6958dab
UH
700 }
701
702 if (cur_buflen == 0) {
703 empty_transfer_count++;
704 if (empty_transfer_count > MAX_EMPTY_TRANSFERS) {
705 /*
706 * The FX2 gave up. End the acquisition, the frontend
707 * will work out that the samplecount is short.
708 */
6d754b6d 709 hw_stop_acquisition(-1, fx2->session_data);
6f5f21f9 710 }
f6958dab
UH
711 return;
712 } else {
713 empty_transfer_count = 0;
714 }
a1bb33af 715
f6958dab 716 trigger_offset = 0;
6d754b6d 717 if (fx2->trigger_stage >= 0) {
f6958dab 718 for (i = 0; i < cur_buflen; i++) {
b5698bd7 719
6d754b6d 720 if ((cur_buf[i] & fx2->trigger_mask[fx2->trigger_stage]) == fx2->trigger_value[fx2->trigger_stage]) {
b5698bd7 721 /* Match on this trigger stage. */
6d754b6d
BV
722 fx2->trigger_buffer[fx2->trigger_stage] = cur_buf[i];
723 fx2->trigger_stage++;
a634574e 724
6d754b6d 725 if (fx2->trigger_stage == NUM_TRIGGER_STAGES || fx2->trigger_mask[fx2->trigger_stage] == 0) {
b5698bd7
BV
726 /* Match on all trigger stages, we're done. */
727 trigger_offset = i + 1;
728
729 /*
730 * TODO: Send pre-trigger buffer to session bus.
731 * Tell the frontend we hit the trigger here.
732 */
5a2326a7 733 packet.type = SR_DF_TRIGGER;
9c939c51 734 packet.payload = NULL;
6d754b6d 735 sr_session_bus(fx2->session_data, &packet);
b5698bd7
BV
736
737 /*
738 * Send the samples that triggered it, since we're
739 * skipping past them.
740 */
5a2326a7 741 packet.type = SR_DF_LOGIC;
9c939c51
BV
742 packet.payload = &logic;
743 logic.length = fx2->trigger_stage;
744 logic.unitsize = 1;
745 logic.data = fx2->trigger_buffer;
6d754b6d 746 sr_session_bus(fx2->session_data, &packet);
b5698bd7 747
6d754b6d 748 fx2->trigger_stage = TRIGGER_FIRED;
b5698bd7
BV
749 break;
750 }
751 return;
752 }
753
754 /*
755 * We had a match before, but not in the next sample. However, we may
756 * have a match on this stage in the next bit -- trigger on 0001 will
757 * fail on seeing 00001, so we need to go back to stage 0 -- but at
758 * the next sample from the one that matched originally, which the
759 * counter increment at the end of the loop takes care of.
760 */
6d754b6d
BV
761 if (fx2->trigger_stage > 0) {
762 i -= fx2->trigger_stage;
b5698bd7
BV
763 if (i < -1)
764 i = -1; /* Oops, went back past this buffer. */
765 /* Reset trigger stage. */
6d754b6d 766 fx2->trigger_stage = 0;
b5698bd7 767 }
a1bb33af 768 }
f6958dab 769 }
a1bb33af 770
6d754b6d 771 if (fx2->trigger_stage == TRIGGER_FIRED) {
f6958dab 772 /* Send the incoming transfer to the session bus. */
5a2326a7 773 packet.type = SR_DF_LOGIC;
9c939c51
BV
774 packet.payload = &logic;
775 logic.length = cur_buflen - trigger_offset;
776 logic.unitsize = 1;
777 logic.data = cur_buf + trigger_offset;
6d754b6d 778 sr_session_bus(fx2->session_data, &packet);
f6958dab
UH
779 g_free(cur_buf);
780
781 num_samples += cur_buflen;
6d754b6d
BV
782 if (fx2->limit_samples && (unsigned int) num_samples > fx2->limit_samples) {
783 hw_stop_acquisition(-1, fx2->session_data);
a1bb33af 784 }
f6958dab
UH
785 } else {
786 /*
787 * TODO: Buffer pre-trigger data in capture
788 * ratio-sized buffer.
789 */
a1bb33af 790 }
a1bb33af
UH
791}
792
6d754b6d 793static int hw_start_acquisition(int device_index, gpointer session_data)
a1bb33af 794{
a00ba012 795 struct sr_device_instance *sdi;
b9c735a2
UH
796 struct sr_datafeed_packet *packet;
797 struct sr_datafeed_header *header;
6d754b6d 798 struct fx2_device *fx2;
a1bb33af
UH
799 struct libusb_transfer *transfer;
800 const struct libusb_pollfd **lupfd;
801 int size, i;
802 unsigned char *buf;
803
d32d961d 804 if (!(sdi = sr_get_device_instance(device_instances, device_index)))
e46b8fb1 805 return SR_ERR;
6d754b6d
BV
806 fx2 = sdi->priv;
807 fx2->session_data = session_data;
a1bb33af 808
b53738ba
UH
809 if (!(packet = g_try_malloc(sizeof(struct sr_datafeed_packet)))) {
810 sr_err("saleae: %s: packet malloc failed", __func__);
811 return SR_ERR_MALLOC;
812 }
9c939c51 813
b53738ba
UH
814 if (!(header = g_try_malloc(sizeof(struct sr_datafeed_header)))) {
815 sr_err("saleae: %s: header malloc failed", __func__);
816 return SR_ERR_MALLOC;
817 }
a1bb33af 818
6f5f21f9 819 /* Start with 2K transfer, subsequently increased to 4K. */
a1bb33af 820 size = 2048;
6f5f21f9 821 for (i = 0; i < NUM_SIMUL_TRANSFERS; i++) {
b53738ba
UH
822 if (!(buf = g_try_malloc(size))) {
823 sr_err("saleae: %s: buf malloc failed", __func__);
824 return SR_ERR_MALLOC;
825 }
a1bb33af 826 transfer = libusb_alloc_transfer(0);
69890f73 827 libusb_fill_bulk_transfer(transfer, fx2->usb->devhdl,
6f5f21f9 828 2 | LIBUSB_ENDPOINT_IN, buf, size,
6d754b6d 829 receive_transfer, fx2, 40);
6f5f21f9
UH
830 if (libusb_submit_transfer(transfer) != 0) {
831 /* TODO: Free them all. */
a1bb33af
UH
832 libusb_free_transfer(transfer);
833 g_free(buf);
e46b8fb1 834 return SR_ERR;
a1bb33af
UH
835 }
836 size = 4096;
837 }
838
839 lupfd = libusb_get_pollfds(usb_context);
6f5f21f9 840 for (i = 0; lupfd[i]; i++)
6f1be0a2
UH
841 sr_source_add(lupfd[i]->fd, lupfd[i]->events, 40, receive_data,
842 NULL);
133a37bf 843 free(lupfd); /* NOT g_free()! */
a1bb33af 844
5a2326a7 845 packet->type = SR_DF_HEADER;
9c939c51 846 packet->payload = header;
a1bb33af
UH
847 header->feed_version = 1;
848 gettimeofday(&header->starttime, NULL);
6d754b6d 849 header->samplerate = fx2->cur_samplerate;
6d754b6d 850 header->num_logic_probes = fx2->profile->num_probes;
6d754b6d 851 sr_session_bus(session_data, packet);
a1bb33af
UH
852 g_free(header);
853 g_free(packet);
854
e46b8fb1 855 return SR_OK;
a1bb33af
UH
856}
857
6f5f21f9 858/* This stops acquisition on ALL devices, ignoring device_index. */
6d754b6d 859static void hw_stop_acquisition(int device_index, gpointer session_data)
a1bb33af 860{
b9c735a2 861 struct sr_datafeed_packet packet;
a1bb33af 862
17e1afcb 863 /* Avoid compiler warnings. */
cb93f8a9 864 (void)device_index;
afc8e4de 865
5a2326a7 866 packet.type = SR_DF_END;
6d754b6d 867 sr_session_bus(session_data, &packet);
a1bb33af
UH
868
869 receive_transfer(NULL);
870
6f5f21f9 871 /* TODO: Need to cancel and free any queued up transfers. */
a1bb33af
UH
872}
873
ca070ed9 874SR_PRIV struct sr_device_plugin saleae_logic_plugin_info = {
e519ba86
UH
875 .name = "saleae-logic",
876 .longname = "Saleae Logic",
877 .api_version = 1,
878 .init = hw_init,
879 .cleanup = hw_cleanup,
86f5e3d8
UH
880 .opendev = hw_opendev,
881 .closedev = hw_closedev,
e519ba86
UH
882 .get_device_info = hw_get_device_info,
883 .get_status = hw_get_status,
884 .get_capabilities = hw_get_capabilities,
885 .set_configuration = hw_set_configuration,
886 .start_acquisition = hw_start_acquisition,
887 .stop_acquisition = hw_stop_acquisition,
a1bb33af 888};