]> sigrok.org Git - libsigrok.git/blame - hardware/asix-sigma/asix-sigma.c
sr/drivers: add proper probe list to instances of all drivers
[libsigrok.git] / hardware / asix-sigma / asix-sigma.c
CommitLineData
28a35d8a
HE
1/*
2 * This file is part of the sigrok project.
3 *
868501fa 4 * Copyright (C) 2010-2012 Håvard Espeland <gus@ping.uio.no>,
911f1834
UH
5 * Copyright (C) 2010 Martin Stensgård <mastensg@ping.uio.no>
6 * Copyright (C) 2010 Carl Henrik Lunde <chlunde@ping.uio.no>
28a35d8a
HE
7 *
8 * This program is free software: you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation, either version 3 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 */
21
911f1834 22/*
6352d030 23 * ASIX SIGMA/SIGMA2 logic analyzer driver
911f1834
UH
24 */
25
3bbd9849
UH
26#include <glib.h>
27#include <glib/gstdio.h>
28a35d8a
HE
28#include <ftdi.h>
29#include <string.h>
45c59c8b
BV
30#include "libsigrok.h"
31#include "libsigrok-internal.h"
28a35d8a
HE
32#include "asix-sigma.h"
33
34#define USB_VENDOR 0xa600
35#define USB_PRODUCT 0xa000
36#define USB_DESCRIPTION "ASIX SIGMA"
37#define USB_VENDOR_NAME "ASIX"
38#define USB_MODEL_NAME "SIGMA"
39#define USB_MODEL_VERSION ""
ee492173 40#define TRIGGER_TYPES "rf10"
464d12c7 41#define NUM_PROBES 16
28a35d8a 42
ed300b9f
BV
43SR_PRIV struct sr_dev_driver asix_sigma_driver_info;
44static struct sr_dev_driver *adi = &asix_sigma_driver_info;
28a35d8a 45
a533743d 46static const uint64_t supported_samplerates[] = {
59df0c77
UH
47 SR_KHZ(200),
48 SR_KHZ(250),
49 SR_KHZ(500),
50 SR_MHZ(1),
51 SR_MHZ(5),
52 SR_MHZ(10),
53 SR_MHZ(25),
54 SR_MHZ(50),
55 SR_MHZ(100),
56 SR_MHZ(200),
28a35d8a
HE
57 0,
58};
59
d261dbbf
UH
60/*
61 * Probe numbers seem to go from 1-16, according to this image:
62 * http://tools.asix.net/img/sigma_sigmacab_pins_720.jpg
63 * (the cable has two additional GND pins, and a TI and TO pin)
64 */
c37d2b1b 65static const char *probe_names[NUM_PROBES + 1] = {
464d12c7
KS
66 "1",
67 "2",
68 "3",
69 "4",
70 "5",
71 "6",
72 "7",
73 "8",
74 "9",
75 "10",
76 "11",
77 "12",
78 "13",
79 "14",
80 "15",
d261dbbf 81 "16",
464d12c7
KS
82 NULL,
83};
84
a533743d 85static const struct sr_samplerates samplerates = {
590b9f9a
UH
86 0,
87 0,
88 0,
28a35d8a
HE
89 supported_samplerates,
90};
91
915f7cc8 92static const int hwcaps[] = {
5a2326a7
UH
93 SR_HWCAP_LOGIC_ANALYZER,
94 SR_HWCAP_SAMPLERATE,
95 SR_HWCAP_CAPTURE_RATIO,
96 SR_HWCAP_PROBECONFIG,
28a35d8a 97
5a2326a7 98 SR_HWCAP_LIMIT_MSEC,
28a35d8a
HE
99 0,
100};
101
fefa1800
UH
102/* Force the FPGA to reboot. */
103static uint8_t suicide[] = {
104 0x84, 0x84, 0x88, 0x84, 0x88, 0x84, 0x88, 0x84,
105};
106
107/* Prepare to upload firmware (FPGA specific). */
108static uint8_t init[] = {
109 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
110};
111
112/* Initialize the logic analyzer mode. */
113static uint8_t logic_mode_start[] = {
114 0x00, 0x40, 0x0f, 0x25, 0x35, 0x40,
115 0x2a, 0x3a, 0x40, 0x03, 0x20, 0x38,
116};
117
eec5275e 118static const char *firmware_files[] = {
a8116d76
HE
119 "asix-sigma-50.fw", /* 50 MHz, supports 8 bit fractions */
120 "asix-sigma-100.fw", /* 100 MHz */
121 "asix-sigma-200.fw", /* 200 MHz */
ed09fd07 122 "asix-sigma-50sync.fw", /* Synchronous clock from pin */
a8116d76 123 "asix-sigma-phasor.fw", /* Frequency counter */
f6564c8d
HE
124};
125
3ffb6964
BV
126static int hw_dev_acquisition_stop(const struct sr_dev_inst *sdi,
127 void *cb_data);
6aac7737 128
ea9cfed7 129static int sigma_read(void *buf, size_t size, struct context *ctx)
28a35d8a
HE
130{
131 int ret;
fefa1800 132
ea9cfed7 133 ret = ftdi_read_data(&ctx->ftdic, (unsigned char *)buf, size);
28a35d8a 134 if (ret < 0) {
7b48d6e1 135 sr_err("sigma: ftdi_read_data failed: %s",
ea9cfed7 136 ftdi_get_error_string(&ctx->ftdic));
28a35d8a
HE
137 }
138
139 return ret;
140}
141
ea9cfed7 142static int sigma_write(void *buf, size_t size, struct context *ctx)
28a35d8a
HE
143{
144 int ret;
fefa1800 145
ea9cfed7 146 ret = ftdi_write_data(&ctx->ftdic, (unsigned char *)buf, size);
28a35d8a 147 if (ret < 0) {
7b48d6e1 148 sr_err("sigma: ftdi_write_data failed: %s",
ea9cfed7 149 ftdi_get_error_string(&ctx->ftdic));
fefa1800 150 } else if ((size_t) ret != size) {
0aeb0ccd 151 sr_err("sigma: ftdi_write_data did not complete write.");
28a35d8a
HE
152 }
153
154 return ret;
155}
156
99965709 157static int sigma_write_register(uint8_t reg, uint8_t *data, size_t len,
ea9cfed7 158 struct context *ctx)
28a35d8a
HE
159{
160 size_t i;
161 uint8_t buf[len + 2];
162 int idx = 0;
163
164 buf[idx++] = REG_ADDR_LOW | (reg & 0xf);
165 buf[idx++] = REG_ADDR_HIGH | (reg >> 4);
166
fefa1800 167 for (i = 0; i < len; ++i) {
28a35d8a
HE
168 buf[idx++] = REG_DATA_LOW | (data[i] & 0xf);
169 buf[idx++] = REG_DATA_HIGH_WRITE | (data[i] >> 4);
170 }
171
ea9cfed7 172 return sigma_write(buf, idx, ctx);
28a35d8a
HE
173}
174
ea9cfed7 175static int sigma_set_register(uint8_t reg, uint8_t value, struct context *ctx)
28a35d8a 176{
ea9cfed7 177 return sigma_write_register(reg, &value, 1, ctx);
28a35d8a
HE
178}
179
99965709 180static int sigma_read_register(uint8_t reg, uint8_t *data, size_t len,
ea9cfed7 181 struct context *ctx)
28a35d8a
HE
182{
183 uint8_t buf[3];
fefa1800 184
28a35d8a
HE
185 buf[0] = REG_ADDR_LOW | (reg & 0xf);
186 buf[1] = REG_ADDR_HIGH | (reg >> 4);
28a35d8a
HE
187 buf[2] = REG_READ_ADDR;
188
ea9cfed7 189 sigma_write(buf, sizeof(buf), ctx);
28a35d8a 190
ea9cfed7 191 return sigma_read(data, len, ctx);
28a35d8a
HE
192}
193
ea9cfed7 194static uint8_t sigma_get_register(uint8_t reg, struct context *ctx)
28a35d8a
HE
195{
196 uint8_t value;
fefa1800 197
ea9cfed7 198 if (1 != sigma_read_register(reg, &value, 1, ctx)) {
7b48d6e1 199 sr_err("sigma: sigma_get_register: 1 byte expected");
28a35d8a
HE
200 return 0;
201 }
202
203 return value;
204}
205
99965709 206static int sigma_read_pos(uint32_t *stoppos, uint32_t *triggerpos,
ea9cfed7 207 struct context *ctx)
28a35d8a
HE
208{
209 uint8_t buf[] = {
210 REG_ADDR_LOW | READ_TRIGGER_POS_LOW,
211
212 REG_READ_ADDR | NEXT_REG,
213 REG_READ_ADDR | NEXT_REG,
214 REG_READ_ADDR | NEXT_REG,
215 REG_READ_ADDR | NEXT_REG,
216 REG_READ_ADDR | NEXT_REG,
217 REG_READ_ADDR | NEXT_REG,
218 };
28a35d8a
HE
219 uint8_t result[6];
220
ea9cfed7 221 sigma_write(buf, sizeof(buf), ctx);
28a35d8a 222
ea9cfed7 223 sigma_read(result, sizeof(result), ctx);
28a35d8a
HE
224
225 *triggerpos = result[0] | (result[1] << 8) | (result[2] << 16);
226 *stoppos = result[3] | (result[4] << 8) | (result[5] << 16);
227
57bbf56b
HE
228 /* Not really sure why this must be done, but according to spec. */
229 if ((--*stoppos & 0x1ff) == 0x1ff)
230 stoppos -= 64;
231
232 if ((*--triggerpos & 0x1ff) == 0x1ff)
233 triggerpos -= 64;
234
28a35d8a
HE
235 return 1;
236}
237
99965709 238static int sigma_read_dram(uint16_t startchunk, size_t numchunks,
ea9cfed7 239 uint8_t *data, struct context *ctx)
28a35d8a
HE
240{
241 size_t i;
242 uint8_t buf[4096];
243 int idx = 0;
244
fefa1800 245 /* Send the startchunk. Index start with 1. */
28a35d8a
HE
246 buf[0] = startchunk >> 8;
247 buf[1] = startchunk & 0xff;
ea9cfed7 248 sigma_write_register(WRITE_MEMROW, buf, 2, ctx);
28a35d8a 249
fefa1800 250 /* Read the DRAM. */
28a35d8a
HE
251 buf[idx++] = REG_DRAM_BLOCK;
252 buf[idx++] = REG_DRAM_WAIT_ACK;
253
254 for (i = 0; i < numchunks; ++i) {
fefa1800
UH
255 /* Alternate bit to copy from DRAM to cache. */
256 if (i != (numchunks - 1))
257 buf[idx++] = REG_DRAM_BLOCK | (((i + 1) % 2) << 4);
28a35d8a
HE
258
259 buf[idx++] = REG_DRAM_BLOCK_DATA | ((i % 2) << 4);
260
fefa1800 261 if (i != (numchunks - 1))
28a35d8a
HE
262 buf[idx++] = REG_DRAM_WAIT_ACK;
263 }
264
ea9cfed7 265 sigma_write(buf, idx, ctx);
28a35d8a 266
ea9cfed7 267 return sigma_read(data, numchunks * CHUNK_SIZE, ctx);
28a35d8a
HE
268}
269
4ae1f451 270/* Upload trigger look-up tables to Sigma. */
ea9cfed7 271static int sigma_write_trigger_lut(struct triggerlut *lut, struct context *ctx)
ee492173
HE
272{
273 int i;
274 uint8_t tmp[2];
275 uint16_t bit;
276
277 /* Transpose the table and send to Sigma. */
278 for (i = 0; i < 16; ++i) {
279 bit = 1 << i;
280
281 tmp[0] = tmp[1] = 0;
282
283 if (lut->m2d[0] & bit)
284 tmp[0] |= 0x01;
285 if (lut->m2d[1] & bit)
286 tmp[0] |= 0x02;
287 if (lut->m2d[2] & bit)
288 tmp[0] |= 0x04;
289 if (lut->m2d[3] & bit)
290 tmp[0] |= 0x08;
291
292 if (lut->m3 & bit)
293 tmp[0] |= 0x10;
294 if (lut->m3s & bit)
295 tmp[0] |= 0x20;
296 if (lut->m4 & bit)
297 tmp[0] |= 0x40;
298
299 if (lut->m0d[0] & bit)
300 tmp[1] |= 0x01;
301 if (lut->m0d[1] & bit)
302 tmp[1] |= 0x02;
303 if (lut->m0d[2] & bit)
304 tmp[1] |= 0x04;
305 if (lut->m0d[3] & bit)
306 tmp[1] |= 0x08;
307
308 if (lut->m1d[0] & bit)
309 tmp[1] |= 0x10;
310 if (lut->m1d[1] & bit)
311 tmp[1] |= 0x20;
312 if (lut->m1d[2] & bit)
313 tmp[1] |= 0x40;
314 if (lut->m1d[3] & bit)
315 tmp[1] |= 0x80;
316
99965709 317 sigma_write_register(WRITE_TRIGGER_SELECT0, tmp, sizeof(tmp),
ea9cfed7
UH
318 ctx);
319 sigma_set_register(WRITE_TRIGGER_SELECT1, 0x30 | i, ctx);
ee492173
HE
320 }
321
322 /* Send the parameters */
323 sigma_write_register(WRITE_TRIGGER_SELECT0, (uint8_t *) &lut->params,
ea9cfed7 324 sizeof(lut->params), ctx);
ee492173 325
e46b8fb1 326 return SR_OK;
ee492173
HE
327}
328
fefa1800 329/* Generate the bitbang stream for programming the FPGA. */
28a35d8a 330static int bin2bitbang(const char *filename,
fefa1800 331 unsigned char **buf, size_t *buf_size)
28a35d8a 332{
fefa1800 333 FILE *f;
e3fff420 334 unsigned long file_size;
28a35d8a
HE
335 unsigned long offset = 0;
336 unsigned char *p;
e3fff420
HE
337 uint8_t *firmware;
338 unsigned long fwsize = 0;
28a35d8a
HE
339 const int buffer_size = 65536;
340 size_t i;
e3fff420 341 int c, bit, v;
fefa1800 342 uint32_t imm = 0x3f6df2ab;
28a35d8a 343
868d8cef 344 f = g_fopen(filename, "rb");
28a35d8a 345 if (!f) {
7b48d6e1 346 sr_err("sigma: g_fopen(\"%s\", \"rb\")", filename);
b53738ba 347 return SR_ERR;
28a35d8a
HE
348 }
349
350 if (-1 == fseek(f, 0, SEEK_END)) {
7b48d6e1 351 sr_err("sigma: fseek on %s failed", filename);
28a35d8a 352 fclose(f);
b53738ba 353 return SR_ERR;
28a35d8a
HE
354 }
355
356 file_size = ftell(f);
357
358 fseek(f, 0, SEEK_SET);
359
b53738ba 360 if (!(firmware = g_try_malloc(buffer_size))) {
340cfac0 361 sr_err("sigma: %s: firmware malloc failed", __func__);
12ad53f5 362 fclose(f);
b53738ba 363 return SR_ERR_MALLOC;
28a35d8a
HE
364 }
365
28a35d8a
HE
366 while ((c = getc(f)) != EOF) {
367 imm = (imm + 0xa853753) % 177 + (imm * 0x8034052);
e3fff420 368 firmware[fwsize++] = c ^ imm;
28a35d8a
HE
369 }
370 fclose(f);
371
e3fff420
HE
372 if(fwsize != file_size) {
373 sr_err("sigma: %s: Error reading firmware", filename);
374 fclose(f);
375 g_free(firmware);
376 return SR_ERR;
28a35d8a
HE
377 }
378
28a35d8a
HE
379 *buf_size = fwsize * 2 * 8;
380
b53738ba 381 *buf = p = (unsigned char *)g_try_malloc(*buf_size);
28a35d8a 382 if (!p) {
340cfac0 383 sr_err("sigma: %s: buf/p malloc failed", __func__);
12ad53f5 384 g_free(firmware);
b53738ba 385 return SR_ERR_MALLOC;
28a35d8a
HE
386 }
387
388 for (i = 0; i < fwsize; ++i) {
28a35d8a 389 for (bit = 7; bit >= 0; --bit) {
fefa1800 390 v = firmware[i] & 1 << bit ? 0x40 : 0x00;
28a35d8a
HE
391 p[offset++] = v | 0x01;
392 p[offset++] = v;
393 }
394 }
395
396 g_free(firmware);
397
398 if (offset != *buf_size) {
399 g_free(*buf);
7b48d6e1 400 sr_err("sigma: Error reading firmware %s "
0aeb0ccd 401 "offset=%ld, file_size=%ld, buf_size=%zd.",
133a37bf 402 filename, offset, file_size, *buf_size);
28a35d8a 403
b53738ba 404 return SR_ERR;
28a35d8a
HE
405 }
406
b53738ba 407 return SR_OK;
28a35d8a
HE
408}
409
0448d110
BV
410static void clear_instances(void)
411{
412 GSList *l;
413 struct sr_dev_inst *sdi;
414 struct context *ctx;
415
416 /* Properly close all devices. */
417 for (l = adi->instances; l; l = l->next) {
418 if (!(sdi = l->data)) {
419 /* Log error, but continue cleaning up the rest. */
420 sr_err("sigma: %s: sdi was NULL, continuing", __func__);
421 continue;
422 }
423 if (sdi->priv) {
424 ctx = sdi->priv;
425 ftdi_free(&ctx->ftdic);
426 g_free(ctx);
427 }
428 sr_dev_inst_free(sdi);
429 }
430 g_slist_free(adi->instances);
431 adi->instances = NULL;
432
433}
434
40dda2c3 435static int hw_init(void)
61136ea6
BV
436{
437
438 /* Nothing to do. */
439
440 return SR_OK;
441}
442
0448d110 443static GSList *hw_scan(GSList *options)
28a35d8a 444{
d68e2d1a 445 struct sr_dev_inst *sdi;
87ca93c5 446 struct sr_probe *probe;
ea9cfed7 447 struct context *ctx;
0448d110 448 GSList *devices;
e3fff420
HE
449 struct ftdi_device_list *devlist;
450 char serial_txt[10];
451 uint32_t serial;
87ca93c5 452 int ret, i;
28a35d8a 453
0448d110
BV
454 (void)options;
455 devices = NULL;
456 clear_instances();
457
ea9cfed7
UH
458 if (!(ctx = g_try_malloc(sizeof(struct context)))) {
459 sr_err("sigma: %s: ctx malloc failed", __func__);
0448d110 460 return NULL;
b53738ba 461 }
99965709 462
ea9cfed7 463 ftdi_init(&ctx->ftdic);
28a35d8a 464
fefa1800 465 /* Look for SIGMAs. */
e3fff420 466
eec944c5
BV
467 if ((ret = ftdi_usb_find_all(&ctx->ftdic, &devlist,
468 USB_VENDOR, USB_PRODUCT)) <= 0) {
469 if (ret < 0)
470 sr_err("ftdi_usb_find_all(): %d", ret);
99965709 471 goto free;
eec944c5 472 }
99965709 473
e3fff420
HE
474 /* Make sure it's a version 1 or 2 SIGMA. */
475 ftdi_usb_get_strings(&ctx->ftdic, devlist->dev, NULL, 0, NULL, 0,
6352d030 476 serial_txt, sizeof(serial_txt));
e3fff420
HE
477 sscanf(serial_txt, "%x", &serial);
478
6352d030 479 if (serial < 0xa6010000 || serial > 0xa602ffff) {
e3fff420 480 sr_err("sigma: Only SIGMA and SIGMA2 are supported "
6352d030 481 "in this version of sigrok.");
e3fff420
HE
482 goto free;
483 }
484
485 sr_info("Found ASIX SIGMA - Serial: %s", serial_txt);
486
ea9cfed7
UH
487 ctx->cur_samplerate = 0;
488 ctx->period_ps = 0;
489 ctx->limit_msec = 0;
490 ctx->cur_firmware = -1;
491 ctx->num_probes = 0;
492 ctx->samples_per_event = 0;
493 ctx->capture_ratio = 50;
494 ctx->use_triggers = 0;
28a35d8a 495
fefa1800 496 /* Register SIGMA device. */
d68e2d1a
UH
497 if (!(sdi = sr_dev_inst_new(0, SR_ST_INITIALIZING, USB_VENDOR_NAME,
498 USB_MODEL_NAME, USB_MODEL_VERSION))) {
499 sr_err("sigma: %s: sdi was NULL", __func__);
99965709 500 goto free;
d68e2d1a 501 }
d7bbecfd 502 sdi->driver = adi;
87ca93c5
BV
503
504 for (i = 0; probe_names[i]; i++) {
505 if (!(probe = sr_probe_new(i, SR_PROBE_ANALOG, TRUE,
506 probe_names[i])))
507 return NULL;
508 sdi->probes = g_slist_append(sdi->probes, probe);
509 }
510
0448d110 511 devices = g_slist_append(devices, sdi);
ed300b9f 512 adi->instances = g_slist_append(adi->instances, sdi);
0448d110 513 sdi->priv = ctx;
28a35d8a 514
fefa1800 515 /* We will open the device again when we need it. */
e3fff420 516 ftdi_list_free(&devlist);
28a35d8a 517
0448d110 518 return devices;
ea9cfed7 519
99965709 520free:
eec944c5 521 ftdi_deinit(&ctx->ftdic);
ea9cfed7 522 g_free(ctx);
0448d110 523 return NULL;
28a35d8a
HE
524}
525
ea9cfed7 526static int upload_firmware(int firmware_idx, struct context *ctx)
28a35d8a
HE
527{
528 int ret;
529 unsigned char *buf;
530 unsigned char pins;
531 size_t buf_size;
28a35d8a 532 unsigned char result[32];
e8397563 533 char firmware_path[128];
28a35d8a 534
fefa1800 535 /* Make sure it's an ASIX SIGMA. */
ea9cfed7 536 if ((ret = ftdi_usb_open_desc(&ctx->ftdic,
28a35d8a 537 USB_VENDOR, USB_PRODUCT, USB_DESCRIPTION, NULL)) < 0) {
7b48d6e1 538 sr_err("sigma: ftdi_usb_open failed: %s",
ea9cfed7 539 ftdi_get_error_string(&ctx->ftdic));
28a35d8a
HE
540 return 0;
541 }
542
ea9cfed7 543 if ((ret = ftdi_set_bitmode(&ctx->ftdic, 0xdf, BITMODE_BITBANG)) < 0) {
7b48d6e1 544 sr_err("sigma: ftdi_set_bitmode failed: %s",
ea9cfed7 545 ftdi_get_error_string(&ctx->ftdic));
28a35d8a
HE
546 return 0;
547 }
548
fefa1800 549 /* Four times the speed of sigmalogan - Works well. */
ea9cfed7 550 if ((ret = ftdi_set_baudrate(&ctx->ftdic, 750000)) < 0) {
7b48d6e1 551 sr_err("sigma: ftdi_set_baudrate failed: %s",
ea9cfed7 552 ftdi_get_error_string(&ctx->ftdic));
28a35d8a
HE
553 return 0;
554 }
555
fefa1800 556 /* Force the FPGA to reboot. */
ea9cfed7
UH
557 sigma_write(suicide, sizeof(suicide), ctx);
558 sigma_write(suicide, sizeof(suicide), ctx);
559 sigma_write(suicide, sizeof(suicide), ctx);
560 sigma_write(suicide, sizeof(suicide), ctx);
28a35d8a 561
fefa1800 562 /* Prepare to upload firmware (FPGA specific). */
ea9cfed7 563 sigma_write(init, sizeof(init), ctx);
28a35d8a 564
ea9cfed7 565 ftdi_usb_purge_buffers(&ctx->ftdic);
28a35d8a 566
fefa1800 567 /* Wait until the FPGA asserts INIT_B. */
28a35d8a 568 while (1) {
ea9cfed7 569 ret = sigma_read(result, 1, ctx);
28a35d8a
HE
570 if (result[0] & 0x20)
571 break;
572 }
573
9ddb2a12 574 /* Prepare firmware. */
e8397563 575 snprintf(firmware_path, sizeof(firmware_path), "%s/%s", FIRMWARE_DIR,
f6564c8d
HE
576 firmware_files[firmware_idx]);
577
b53738ba 578 if ((ret = bin2bitbang(firmware_path, &buf, &buf_size)) != SR_OK) {
7b48d6e1 579 sr_err("sigma: An error occured while reading the firmware: %s",
133a37bf 580 firmware_path);
b53738ba 581 return ret;
28a35d8a
HE
582 }
583
fefa1800 584 /* Upload firmare. */
e3fff420 585 sr_info("sigma: Uploading firmware %s", firmware_files[firmware_idx]);
ea9cfed7 586 sigma_write(buf, buf_size, ctx);
28a35d8a
HE
587
588 g_free(buf);
589
ea9cfed7 590 if ((ret = ftdi_set_bitmode(&ctx->ftdic, 0x00, BITMODE_RESET)) < 0) {
7b48d6e1 591 sr_err("sigma: ftdi_set_bitmode failed: %s",
ea9cfed7 592 ftdi_get_error_string(&ctx->ftdic));
e46b8fb1 593 return SR_ERR;
28a35d8a
HE
594 }
595
ea9cfed7 596 ftdi_usb_purge_buffers(&ctx->ftdic);
28a35d8a 597
fefa1800 598 /* Discard garbage. */
ea9cfed7 599 while (1 == sigma_read(&pins, 1, ctx))
28a35d8a
HE
600 ;
601
fefa1800 602 /* Initialize the logic analyzer mode. */
ea9cfed7 603 sigma_write(logic_mode_start, sizeof(logic_mode_start), ctx);
28a35d8a 604
fefa1800 605 /* Expect a 3 byte reply. */
ea9cfed7 606 ret = sigma_read(result, 3, ctx);
28a35d8a
HE
607 if (ret != 3 ||
608 result[0] != 0xa6 || result[1] != 0x55 || result[2] != 0xaa) {
7b48d6e1 609 sr_err("sigma: Configuration failed. Invalid reply received.");
e46b8fb1 610 return SR_ERR;
28a35d8a
HE
611 }
612
ea9cfed7 613 ctx->cur_firmware = firmware_idx;
f6564c8d 614
e3fff420
HE
615 sr_info("sigma: Firmware uploaded");
616
e46b8fb1 617 return SR_OK;
f6564c8d
HE
618}
619
25a0f108 620static int hw_dev_open(struct sr_dev_inst *sdi)
f6564c8d 621{
ea9cfed7 622 struct context *ctx;
f6564c8d
HE
623 int ret;
624
ea9cfed7 625 ctx = sdi->priv;
99965709 626
9ddb2a12 627 /* Make sure it's an ASIX SIGMA. */
ea9cfed7 628 if ((ret = ftdi_usb_open_desc(&ctx->ftdic,
f6564c8d
HE
629 USB_VENDOR, USB_PRODUCT, USB_DESCRIPTION, NULL)) < 0) {
630
7b48d6e1 631 sr_err("sigma: ftdi_usb_open failed: %s",
ea9cfed7 632 ftdi_get_error_string(&ctx->ftdic));
f6564c8d
HE
633
634 return 0;
635 }
28a35d8a 636
5a2326a7 637 sdi->status = SR_ST_ACTIVE;
28a35d8a 638
e46b8fb1 639 return SR_OK;
f6564c8d
HE
640}
641
6f4b1868 642static int set_samplerate(const struct sr_dev_inst *sdi, uint64_t samplerate)
f6564c8d 643{
e8397563 644 int i, ret;
ea9cfed7 645 struct context *ctx = sdi->priv;
f6564c8d
HE
646
647 for (i = 0; supported_samplerates[i]; i++) {
648 if (supported_samplerates[i] == samplerate)
649 break;
650 }
651 if (supported_samplerates[i] == 0)
e46b8fb1 652 return SR_ERR_SAMPLERATE;
f6564c8d 653
59df0c77 654 if (samplerate <= SR_MHZ(50)) {
ea9cfed7
UH
655 ret = upload_firmware(0, ctx);
656 ctx->num_probes = 16;
e8397563 657 }
59df0c77 658 if (samplerate == SR_MHZ(100)) {
ea9cfed7
UH
659 ret = upload_firmware(1, ctx);
660 ctx->num_probes = 8;
f78898e9 661 }
59df0c77 662 else if (samplerate == SR_MHZ(200)) {
ea9cfed7
UH
663 ret = upload_firmware(2, ctx);
664 ctx->num_probes = 4;
f78898e9 665 }
f6564c8d 666
ea9cfed7
UH
667 ctx->cur_samplerate = samplerate;
668 ctx->period_ps = 1000000000000 / samplerate;
669 ctx->samples_per_event = 16 / ctx->num_probes;
670 ctx->state.state = SIGMA_IDLE;
f6564c8d 671
e8397563 672 return ret;
28a35d8a
HE
673}
674
c53d793f
HE
675/*
676 * In 100 and 200 MHz mode, only a single pin rising/falling can be
677 * set as trigger. In other modes, two rising/falling triggers can be set,
678 * in addition to value/mask trigger for any number of probes.
679 *
680 * The Sigma supports complex triggers using boolean expressions, but this
681 * has not been implemented yet.
682 */
6f4b1868 683static int configure_probes(const struct sr_dev_inst *sdi, const GSList *probes)
57bbf56b 684{
ea9cfed7 685 struct context *ctx = sdi->priv;
1b79df2f
JH
686 const struct sr_probe *probe;
687 const GSList *l;
57bbf56b 688 int trigger_set = 0;
a42aec7f 689 int probebit;
57bbf56b 690
ea9cfed7 691 memset(&ctx->trigger, 0, sizeof(struct sigma_trigger));
eec5275e 692
57bbf56b 693 for (l = probes; l; l = l->next) {
1afe8989 694 probe = (struct sr_probe *)l->data;
b35c8293 695 probebit = 1 << (probe->index);
57bbf56b
HE
696
697 if (!probe->enabled || !probe->trigger)
698 continue;
699
ea9cfed7 700 if (ctx->cur_samplerate >= SR_MHZ(100)) {
c53d793f 701 /* Fast trigger support. */
ee492173 702 if (trigger_set) {
7b48d6e1 703 sr_err("sigma: ASIX SIGMA only supports a single "
133a37bf 704 "pin trigger in 100 and 200MHz mode.");
e46b8fb1 705 return SR_ERR;
ee492173
HE
706 }
707 if (probe->trigger[0] == 'f')
ea9cfed7 708 ctx->trigger.fallingmask |= probebit;
ee492173 709 else if (probe->trigger[0] == 'r')
ea9cfed7 710 ctx->trigger.risingmask |= probebit;
ee492173 711 else {
7b48d6e1 712 sr_err("sigma: ASIX SIGMA only supports "
133a37bf
UH
713 "rising/falling trigger in 100 "
714 "and 200MHz mode.");
e46b8fb1 715 return SR_ERR;
ee492173 716 }
57bbf56b 717
c53d793f 718 ++trigger_set;
ee492173 719 } else {
c53d793f
HE
720 /* Simple trigger support (event). */
721 if (probe->trigger[0] == '1') {
ea9cfed7
UH
722 ctx->trigger.simplevalue |= probebit;
723 ctx->trigger.simplemask |= probebit;
c53d793f
HE
724 }
725 else if (probe->trigger[0] == '0') {
ea9cfed7
UH
726 ctx->trigger.simplevalue &= ~probebit;
727 ctx->trigger.simplemask |= probebit;
c53d793f
HE
728 }
729 else if (probe->trigger[0] == 'f') {
ea9cfed7 730 ctx->trigger.fallingmask |= probebit;
c53d793f
HE
731 ++trigger_set;
732 }
733 else if (probe->trigger[0] == 'r') {
ea9cfed7 734 ctx->trigger.risingmask |= probebit;
c53d793f
HE
735 ++trigger_set;
736 }
ee492173 737
ea9cfed7
UH
738 /*
739 * Actually, Sigma supports 2 rising/falling triggers,
740 * but they are ORed and the current trigger syntax
741 * does not permit ORed triggers.
742 */
98b8cbc1 743 if (trigger_set > 1) {
7b48d6e1
UH
744 sr_err("sigma: ASIX SIGMA only supports 1 "
745 "rising/falling triggers.");
e46b8fb1 746 return SR_ERR;
ee492173 747 }
ee492173 748 }
5b5ea7c6
HE
749
750 if (trigger_set)
ea9cfed7 751 ctx->use_triggers = 1;
57bbf56b
HE
752 }
753
e46b8fb1 754 return SR_OK;
57bbf56b
HE
755}
756
25a0f108 757static int hw_dev_close(struct sr_dev_inst *sdi)
28a35d8a 758{
ea9cfed7 759 struct context *ctx;
28a35d8a 760
ea9cfed7 761 if (!(ctx = sdi->priv)) {
340cfac0 762 sr_err("sigma: %s: sdi->priv was NULL", __func__);
0abee507 763 return SR_ERR_BUG;
9be9893e 764 }
697785d1
UH
765
766 /* TODO */
767 if (sdi->status == SR_ST_ACTIVE)
ea9cfed7 768 ftdi_usb_close(&ctx->ftdic);
697785d1
UH
769
770 sdi->status = SR_ST_INACTIVE;
771
772 return SR_OK;
28a35d8a
HE
773}
774
57ab7d9f 775static int hw_cleanup(void)
28a35d8a 776{
99965709 777
0448d110 778 clear_instances();
57ab7d9f 779
0448d110 780 return SR_OK;
28a35d8a
HE
781}
782
41479605
BV
783static int hw_info_get(int info_id, const void **data,
784 const struct sr_dev_inst *sdi)
28a35d8a 785{
ea9cfed7 786 struct context *ctx;
99965709 787
41479605 788 switch (info_id) {
1d9a8a5f 789 case SR_DI_INST:
41479605 790 *data = sdi;
28a35d8a 791 break;
b2b5445c
BV
792 case SR_DI_HWCAPS:
793 *data = hwcaps;
794 break;
5a2326a7 795 case SR_DI_NUM_PROBES:
41479605 796 *data = GINT_TO_POINTER(NUM_PROBES);
464d12c7
KS
797 break;
798 case SR_DI_PROBE_NAMES:
41479605 799 *data = probe_names;
28a35d8a 800 break;
5a2326a7 801 case SR_DI_SAMPLERATES:
41479605 802 *data = &samplerates;
28a35d8a 803 break;
5a2326a7 804 case SR_DI_TRIGGER_TYPES:
41479605 805 *data = (char *)TRIGGER_TYPES;
28a35d8a 806 break;
5a2326a7 807 case SR_DI_CUR_SAMPLERATE:
41479605
BV
808 if (sdi) {
809 ctx = sdi->priv;
810 *data = &ctx->cur_samplerate;
811 } else
812 return SR_ERR;
28a35d8a 813 break;
d7bbecfd
BV
814 default:
815 return SR_ERR_ARG;
28a35d8a
HE
816 }
817
41479605 818 return SR_OK;
28a35d8a
HE
819}
820
6f4b1868
BV
821static int hw_dev_config_set(const struct sr_dev_inst *sdi, int hwcap,
822 const void *value)
28a35d8a 823{
ea9cfed7 824 struct context *ctx;
28a35d8a 825 int ret;
f6564c8d 826
ea9cfed7 827 ctx = sdi->priv;
99965709 828
ffedd0bf 829 if (hwcap == SR_HWCAP_SAMPLERATE) {
1b79df2f 830 ret = set_samplerate(sdi, *(const uint64_t *)value);
ffedd0bf 831 } else if (hwcap == SR_HWCAP_PROBECONFIG) {
99965709 832 ret = configure_probes(sdi, value);
ffedd0bf 833 } else if (hwcap == SR_HWCAP_LIMIT_MSEC) {
1b79df2f 834 ctx->limit_msec = *(const uint64_t *)value;
ea9cfed7 835 if (ctx->limit_msec > 0)
e46b8fb1 836 ret = SR_OK;
94ba4bd6 837 else
e46b8fb1 838 ret = SR_ERR;
ffedd0bf 839 } else if (hwcap == SR_HWCAP_CAPTURE_RATIO) {
1b79df2f 840 ctx->capture_ratio = *(const uint64_t *)value;
ea9cfed7 841 if (ctx->capture_ratio < 0 || ctx->capture_ratio > 100)
e46b8fb1 842 ret = SR_ERR;
94ba4bd6 843 else
e46b8fb1 844 ret = SR_OK;
28a35d8a 845 } else {
e46b8fb1 846 ret = SR_ERR;
28a35d8a
HE
847 }
848
849 return ret;
850}
851
36b1c8e6
HE
852/* Software trigger to determine exact trigger position. */
853static int get_trigger_offset(uint16_t *samples, uint16_t last_sample,
854 struct sigma_trigger *t)
855{
856 int i;
857
858 for (i = 0; i < 8; ++i) {
859 if (i > 0)
860 last_sample = samples[i-1];
861
862 /* Simple triggers. */
863 if ((samples[i] & t->simplemask) != t->simplevalue)
864 continue;
865
866 /* Rising edge. */
867 if ((last_sample & t->risingmask) != 0 || (samples[i] &
868 t->risingmask) != t->risingmask)
869 continue;
870
871 /* Falling edge. */
bdfc7a89
HE
872 if ((last_sample & t->fallingmask) != t->fallingmask ||
873 (samples[i] & t->fallingmask) != 0)
36b1c8e6
HE
874 continue;
875
876 break;
877 }
878
879 /* If we did not match, return original trigger pos. */
880 return i & 0x7;
881}
882
28a35d8a 883/*
fefa1800
UH
884 * Decode chunk of 1024 bytes, 64 clusters, 7 events per cluster.
885 * Each event is 20ns apart, and can contain multiple samples.
f78898e9
HE
886 *
887 * For 200 MHz, events contain 4 samples for each channel, spread 5 ns apart.
888 * For 100 MHz, events contain 2 samples for each channel, spread 10 ns apart.
889 * For 50 MHz and below, events contain one sample for each channel,
890 * spread 20 ns apart.
28a35d8a
HE
891 */
892static int decode_chunk_ts(uint8_t *buf, uint16_t *lastts,
88c51afe 893 uint16_t *lastsample, int triggerpos,
3cd3a20b 894 uint16_t limit_chunk, void *cb_data)
28a35d8a 895{
3cd3a20b 896 struct sr_dev_inst *sdi = cb_data;
ea9cfed7 897 struct context *ctx = sdi->priv;
fefa1800 898 uint16_t tsdiff, ts;
ea9cfed7 899 uint16_t samples[65536 * ctx->samples_per_event];
b9c735a2 900 struct sr_datafeed_packet packet;
9c939c51 901 struct sr_datafeed_logic logic;
f78898e9 902 int i, j, k, l, numpad, tosend;
fefa1800 903 size_t n = 0, sent = 0;
ea9cfed7 904 int clustersize = EVENTS_PER_CLUSTER * ctx->samples_per_event;
fefa1800 905 uint16_t *event;
f78898e9 906 uint16_t cur_sample;
57bbf56b 907 int triggerts = -1;
ee492173 908
4ae1f451 909 /* Check if trigger is in this chunk. */
ee492173 910 if (triggerpos != -1) {
ea9cfed7 911 if (ctx->cur_samplerate <= SR_MHZ(50))
36b1c8e6 912 triggerpos -= EVENTS_PER_CLUSTER - 1;
ee492173
HE
913
914 if (triggerpos < 0)
915 triggerpos = 0;
57bbf56b 916
ee492173
HE
917 /* Find in which cluster the trigger occured. */
918 triggerts = triggerpos / 7;
919 }
28a35d8a 920
eec5275e 921 /* For each ts. */
28a35d8a 922 for (i = 0; i < 64; ++i) {
fefa1800 923 ts = *(uint16_t *) &buf[i * 16];
28a35d8a
HE
924 tsdiff = ts - *lastts;
925 *lastts = ts;
926
88c51afe
HE
927 /* Decode partial chunk. */
928 if (limit_chunk && ts > limit_chunk)
e46b8fb1 929 return SR_OK;
88c51afe 930
fefa1800 931 /* Pad last sample up to current point. */
ea9cfed7 932 numpad = tsdiff * ctx->samples_per_event - clustersize;
28a35d8a 933 if (numpad > 0) {
f78898e9
HE
934 for (j = 0; j < numpad; ++j)
935 samples[j] = *lastsample;
936
937 n = numpad;
28a35d8a
HE
938 }
939
57bbf56b
HE
940 /* Send samples between previous and this timestamp to sigrok. */
941 sent = 0;
942 while (sent < n) {
943 tosend = MIN(2048, n - sent);
944
5a2326a7 945 packet.type = SR_DF_LOGIC;
9c939c51
BV
946 packet.payload = &logic;
947 logic.length = tosend * sizeof(uint16_t);
948 logic.unitsize = 2;
949 logic.data = samples + sent;
3cd3a20b 950 sr_session_send(ctx->session_dev_id, &packet);
28a35d8a 951
57bbf56b
HE
952 sent += tosend;
953 }
954 n = 0;
955
956 event = (uint16_t *) &buf[i * 16 + 2];
f78898e9
HE
957 cur_sample = 0;
958
959 /* For each event in cluster. */
28a35d8a 960 for (j = 0; j < 7; ++j) {
f78898e9
HE
961
962 /* For each sample in event. */
ea9cfed7 963 for (k = 0; k < ctx->samples_per_event; ++k) {
f78898e9
HE
964 cur_sample = 0;
965
966 /* For each probe. */
ea9cfed7 967 for (l = 0; l < ctx->num_probes; ++l)
edca2c5c 968 cur_sample |= (!!(event[j] & (1 << (l *
ea9cfed7 969 ctx->samples_per_event + k)))) << l;
f78898e9
HE
970
971 samples[n++] = cur_sample;
28a35d8a
HE
972 }
973 }
974
eec5275e 975 /* Send data up to trigger point (if triggered). */
fefa1800 976 sent = 0;
57bbf56b
HE
977 if (i == triggerts) {
978 /*
36b1c8e6
HE
979 * Trigger is not always accurate to sample because of
980 * pipeline delay. However, it always triggers before
981 * the actual event. We therefore look at the next
982 * samples to pinpoint the exact position of the trigger.
57bbf56b 983 */
bdfc7a89 984 tosend = get_trigger_offset(samples, *lastsample,
ea9cfed7 985 &ctx->trigger);
57bbf56b
HE
986
987 if (tosend > 0) {
5a2326a7 988 packet.type = SR_DF_LOGIC;
9c939c51
BV
989 packet.payload = &logic;
990 logic.length = tosend * sizeof(uint16_t);
991 logic.unitsize = 2;
992 logic.data = samples;
3cd3a20b 993 sr_session_send(ctx->session_dev_id, &packet);
57bbf56b
HE
994
995 sent += tosend;
996 }
28a35d8a 997
5b5ea7c6 998 /* Only send trigger if explicitly enabled. */
ea9cfed7 999 if (ctx->use_triggers) {
5a2326a7 1000 packet.type = SR_DF_TRIGGER;
3cd3a20b 1001 sr_session_send(ctx->session_dev_id, &packet);
5b5ea7c6 1002 }
28a35d8a 1003 }
57bbf56b 1004
eec5275e 1005 /* Send rest of the chunk to sigrok. */
57bbf56b
HE
1006 tosend = n - sent;
1007
abda62ce 1008 if (tosend > 0) {
5a2326a7 1009 packet.type = SR_DF_LOGIC;
9c939c51
BV
1010 packet.payload = &logic;
1011 logic.length = tosend * sizeof(uint16_t);
1012 logic.unitsize = 2;
1013 logic.data = samples + sent;
3cd3a20b 1014 sr_session_send(ctx->session_dev_id, &packet);
abda62ce 1015 }
ee492173
HE
1016
1017 *lastsample = samples[n - 1];
28a35d8a
HE
1018 }
1019
e46b8fb1 1020 return SR_OK;
28a35d8a
HE
1021}
1022
1f9813eb 1023static int receive_data(int fd, int revents, void *cb_data)
28a35d8a 1024{
1f9813eb 1025 struct sr_dev_inst *sdi = cb_data;
ea9cfed7 1026 struct context *ctx = sdi->priv;
b9c735a2 1027 struct sr_datafeed_packet packet;
28a35d8a
HE
1028 const int chunks_per_read = 32;
1029 unsigned char buf[chunks_per_read * CHUNK_SIZE];
6aac7737 1030 int bufsz, numchunks, i, newchunks;
94ba4bd6 1031 uint64_t running_msec;
28a35d8a 1032 struct timeval tv;
28a35d8a 1033
cb93f8a9
UH
1034 /* Avoid compiler warnings. */
1035 (void)fd;
1036 (void)revents;
28a35d8a 1037
805919b0
HE
1038 /* Get the current position. */
1039 sigma_read_pos(&ctx->state.stoppos, &ctx->state.triggerpos, ctx);
1040
ea9cfed7 1041 numchunks = (ctx->state.stoppos + 511) / 512;
28a35d8a 1042
ea9cfed7 1043 if (ctx->state.state == SIGMA_IDLE)
805919b0 1044 return TRUE;
28a35d8a 1045
ea9cfed7 1046 if (ctx->state.state == SIGMA_CAPTURE) {
6aac7737
HE
1047 /* Check if the timer has expired, or memory is full. */
1048 gettimeofday(&tv, 0);
ea9cfed7
UH
1049 running_msec = (tv.tv_sec - ctx->start_tv.tv_sec) * 1000 +
1050 (tv.tv_usec - ctx->start_tv.tv_usec) / 1000;
28a35d8a 1051
ea9cfed7 1052 if (running_msec < ctx->limit_msec && numchunks < 32767)
805919b0 1053 return TRUE; /* While capturing... */
e3fff420 1054 else
3ffb6964 1055 hw_dev_acquisition_stop(sdi, sdi);
6aac7737 1056
ea9cfed7
UH
1057 } else if (ctx->state.state == SIGMA_DOWNLOAD) {
1058 if (ctx->state.chunks_downloaded >= numchunks) {
6aac7737 1059 /* End of samples. */
5a2326a7 1060 packet.type = SR_DF_END;
3cd3a20b 1061 sr_session_send(ctx->session_dev_id, &packet);
6aac7737 1062
ea9cfed7 1063 ctx->state.state = SIGMA_IDLE;
f78898e9 1064
6aac7737
HE
1065 return TRUE;
1066 }
1067
1068 newchunks = MIN(chunks_per_read,
ea9cfed7 1069 numchunks - ctx->state.chunks_downloaded);
28a35d8a 1070
7b48d6e1 1071 sr_info("sigma: Downloading sample data: %.0f %%",
ea9cfed7 1072 100.0 * ctx->state.chunks_downloaded / numchunks);
28a35d8a 1073
ea9cfed7
UH
1074 bufsz = sigma_read_dram(ctx->state.chunks_downloaded,
1075 newchunks, buf, ctx);
719c5a93
UH
1076 /* TODO: Check bufsz. For now, just avoid compiler warnings. */
1077 (void)bufsz;
28a35d8a 1078
fefa1800 1079 /* Find first ts. */
ea9cfed7
UH
1080 if (ctx->state.chunks_downloaded == 0) {
1081 ctx->state.lastts = *(uint16_t *) buf - 1;
1082 ctx->state.lastsample = 0;
6aac7737 1083 }
28a35d8a 1084
fefa1800 1085 /* Decode chunks and send them to sigrok. */
28a35d8a 1086 for (i = 0; i < newchunks; ++i) {
88c51afe
HE
1087 int limit_chunk = 0;
1088
1089 /* The last chunk may potentially be only in part. */
ea9cfed7 1090 if (ctx->state.chunks_downloaded == numchunks - 1) {
88c51afe 1091 /* Find the last valid timestamp */
ea9cfed7 1092 limit_chunk = ctx->state.stoppos % 512 + ctx->state.lastts;
88c51afe
HE
1093 }
1094
ea9cfed7 1095 if (ctx->state.chunks_downloaded + i == ctx->state.triggerchunk)
57bbf56b 1096 decode_chunk_ts(buf + (i * CHUNK_SIZE),
ea9cfed7
UH
1097 &ctx->state.lastts,
1098 &ctx->state.lastsample,
1099 ctx->state.triggerpos & 0x1ff,
1f9813eb 1100 limit_chunk, sdi);
57bbf56b
HE
1101 else
1102 decode_chunk_ts(buf + (i * CHUNK_SIZE),
ea9cfed7
UH
1103 &ctx->state.lastts,
1104 &ctx->state.lastsample,
1f9813eb 1105 -1, limit_chunk, sdi);
28a35d8a 1106
ea9cfed7 1107 ++ctx->state.chunks_downloaded;
88c51afe 1108 }
28a35d8a
HE
1109 }
1110
28a35d8a
HE
1111 return TRUE;
1112}
1113
c53d793f
HE
1114/* Build a LUT entry used by the trigger functions. */
1115static void build_lut_entry(uint16_t value, uint16_t mask, uint16_t *entry)
ee492173
HE
1116{
1117 int i, j, k, bit;
1118
f758d074 1119 /* For each quad probe. */
ee492173 1120 for (i = 0; i < 4; ++i) {
c53d793f 1121 entry[i] = 0xffff;
ee492173 1122
f758d074 1123 /* For each bit in LUT. */
ee492173
HE
1124 for (j = 0; j < 16; ++j)
1125
f758d074 1126 /* For each probe in quad. */
ee492173
HE
1127 for (k = 0; k < 4; ++k) {
1128 bit = 1 << (i * 4 + k);
1129
c53d793f
HE
1130 /* Set bit in entry */
1131 if ((mask & bit) &&
1132 ((!(value & bit)) !=
4ae1f451 1133 (!(j & (1 << k)))))
c53d793f 1134 entry[i] &= ~(1 << j);
ee492173
HE
1135 }
1136 }
c53d793f 1137}
ee492173 1138
c53d793f
HE
1139/* Add a logical function to LUT mask. */
1140static void add_trigger_function(enum triggerop oper, enum triggerfunc func,
1141 int index, int neg, uint16_t *mask)
1142{
1143 int i, j;
1144 int x[2][2], tmp, a, b, aset, bset, rset;
1145
1146 memset(x, 0, 4 * sizeof(int));
1147
1148 /* Trigger detect condition. */
1149 switch (oper) {
1150 case OP_LEVEL:
1151 x[0][1] = 1;
1152 x[1][1] = 1;
1153 break;
1154 case OP_NOT:
1155 x[0][0] = 1;
1156 x[1][0] = 1;
1157 break;
1158 case OP_RISE:
1159 x[0][1] = 1;
1160 break;
1161 case OP_FALL:
1162 x[1][0] = 1;
1163 break;
1164 case OP_RISEFALL:
1165 x[0][1] = 1;
1166 x[1][0] = 1;
1167 break;
1168 case OP_NOTRISE:
1169 x[1][1] = 1;
1170 x[0][0] = 1;
1171 x[1][0] = 1;
1172 break;
1173 case OP_NOTFALL:
1174 x[1][1] = 1;
1175 x[0][0] = 1;
1176 x[0][1] = 1;
1177 break;
1178 case OP_NOTRISEFALL:
1179 x[1][1] = 1;
1180 x[0][0] = 1;
1181 break;
1182 }
1183
1184 /* Transpose if neg is set. */
1185 if (neg) {
ea9cfed7 1186 for (i = 0; i < 2; ++i) {
c53d793f
HE
1187 for (j = 0; j < 2; ++j) {
1188 tmp = x[i][j];
1189 x[i][j] = x[1-i][1-j];
1190 x[1-i][1-j] = tmp;
1191 }
ea9cfed7 1192 }
c53d793f
HE
1193 }
1194
1195 /* Update mask with function. */
1196 for (i = 0; i < 16; ++i) {
1197 a = (i >> (2 * index + 0)) & 1;
1198 b = (i >> (2 * index + 1)) & 1;
1199
1200 aset = (*mask >> i) & 1;
1201 bset = x[b][a];
1202
1203 if (func == FUNC_AND || func == FUNC_NAND)
1204 rset = aset & bset;
1205 else if (func == FUNC_OR || func == FUNC_NOR)
1206 rset = aset | bset;
1207 else if (func == FUNC_XOR || func == FUNC_NXOR)
1208 rset = aset ^ bset;
1209
1210 if (func == FUNC_NAND || func == FUNC_NOR || func == FUNC_NXOR)
1211 rset = !rset;
1212
1213 *mask &= ~(1 << i);
1214
1215 if (rset)
1216 *mask |= 1 << i;
1217 }
1218}
1219
1220/*
1221 * Build trigger LUTs used by 50 MHz and lower sample rates for supporting
1222 * simple pin change and state triggers. Only two transitions (rise/fall) can be
1223 * set at any time, but a full mask and value can be set (0/1).
1224 */
ea9cfed7 1225static int build_basic_trigger(struct triggerlut *lut, struct context *ctx)
c53d793f
HE
1226{
1227 int i,j;
4ae1f451 1228 uint16_t masks[2] = { 0, 0 };
c53d793f
HE
1229
1230 memset(lut, 0, sizeof(struct triggerlut));
1231
1232 /* Contant for simple triggers. */
1233 lut->m4 = 0xa000;
1234
1235 /* Value/mask trigger support. */
ea9cfed7 1236 build_lut_entry(ctx->trigger.simplevalue, ctx->trigger.simplemask,
99965709 1237 lut->m2d);
c53d793f
HE
1238
1239 /* Rise/fall trigger support. */
1240 for (i = 0, j = 0; i < 16; ++i) {
ea9cfed7
UH
1241 if (ctx->trigger.risingmask & (1 << i) ||
1242 ctx->trigger.fallingmask & (1 << i))
c53d793f
HE
1243 masks[j++] = 1 << i;
1244 }
1245
1246 build_lut_entry(masks[0], masks[0], lut->m0d);
1247 build_lut_entry(masks[1], masks[1], lut->m1d);
1248
1249 /* Add glue logic */
1250 if (masks[0] || masks[1]) {
1251 /* Transition trigger. */
ea9cfed7 1252 if (masks[0] & ctx->trigger.risingmask)
c53d793f 1253 add_trigger_function(OP_RISE, FUNC_OR, 0, 0, &lut->m3);
ea9cfed7 1254 if (masks[0] & ctx->trigger.fallingmask)
c53d793f 1255 add_trigger_function(OP_FALL, FUNC_OR, 0, 0, &lut->m3);
ea9cfed7 1256 if (masks[1] & ctx->trigger.risingmask)
c53d793f 1257 add_trigger_function(OP_RISE, FUNC_OR, 1, 0, &lut->m3);
ea9cfed7 1258 if (masks[1] & ctx->trigger.fallingmask)
c53d793f
HE
1259 add_trigger_function(OP_FALL, FUNC_OR, 1, 0, &lut->m3);
1260 } else {
1261 /* Only value/mask trigger. */
1262 lut->m3 = 0xffff;
1263 }
ee492173 1264
c53d793f 1265 /* Triggertype: event. */
ee492173
HE
1266 lut->params.selres = 3;
1267
e46b8fb1 1268 return SR_OK;
ee492173
HE
1269}
1270
3ffb6964
BV
1271static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi,
1272 void *cb_data)
28a35d8a 1273{
ea9cfed7 1274 struct context *ctx;
3c36c403
HE
1275 struct sr_datafeed_packet *packet;
1276 struct sr_datafeed_header *header;
f366e86c 1277 struct sr_datafeed_meta_logic meta;
9ddb2a12 1278 struct clockselect_50 clockselect;
82957b65 1279 int frac, triggerpin, ret;
57bbf56b
HE
1280 uint8_t triggerselect;
1281 struct triggerinout triggerinout_conf;
ee492173 1282 struct triggerlut lut;
28a35d8a 1283
ea9cfed7 1284 ctx = sdi->priv;
28a35d8a 1285
ea9cfed7
UH
1286 /* If the samplerate has not been set, default to 200 kHz. */
1287 if (ctx->cur_firmware == -1) {
82957b65
UH
1288 if ((ret = set_samplerate(sdi, SR_KHZ(200))) != SR_OK)
1289 return ret;
1290 }
e8397563 1291
eec5275e 1292 /* Enter trigger programming mode. */
ea9cfed7 1293 sigma_set_register(WRITE_TRIGGER_SELECT1, 0x20, ctx);
28a35d8a 1294
eec5275e 1295 /* 100 and 200 MHz mode. */
ea9cfed7
UH
1296 if (ctx->cur_samplerate >= SR_MHZ(100)) {
1297 sigma_set_register(WRITE_TRIGGER_SELECT1, 0x81, ctx);
57bbf56b 1298
a42aec7f
HE
1299 /* Find which pin to trigger on from mask. */
1300 for (triggerpin = 0; triggerpin < 8; ++triggerpin)
ea9cfed7 1301 if ((ctx->trigger.risingmask | ctx->trigger.fallingmask) &
a42aec7f
HE
1302 (1 << triggerpin))
1303 break;
1304
1305 /* Set trigger pin and light LED on trigger. */
1306 triggerselect = (1 << LEDSEL1) | (triggerpin & 0x7);
1307
1308 /* Default rising edge. */
ea9cfed7 1309 if (ctx->trigger.fallingmask)
a42aec7f 1310 triggerselect |= 1 << 3;
57bbf56b 1311
eec5275e 1312 /* All other modes. */
ea9cfed7
UH
1313 } else if (ctx->cur_samplerate <= SR_MHZ(50)) {
1314 build_basic_trigger(&lut, ctx);
ee492173 1315
ea9cfed7 1316 sigma_write_trigger_lut(&lut, ctx);
57bbf56b
HE
1317
1318 triggerselect = (1 << LEDSEL1) | (1 << LEDSEL0);
1319 }
1320
eec5275e 1321 /* Setup trigger in and out pins to default values. */
57bbf56b
HE
1322 memset(&triggerinout_conf, 0, sizeof(struct triggerinout));
1323 triggerinout_conf.trgout_bytrigger = 1;
1324 triggerinout_conf.trgout_enable = 1;
1325
28a35d8a 1326 sigma_write_register(WRITE_TRIGGER_OPTION,
57bbf56b 1327 (uint8_t *) &triggerinout_conf,
ea9cfed7 1328 sizeof(struct triggerinout), ctx);
28a35d8a 1329
eec5275e 1330 /* Go back to normal mode. */
ea9cfed7 1331 sigma_set_register(WRITE_TRIGGER_SELECT1, triggerselect, ctx);
28a35d8a 1332
edca2c5c 1333 /* Set clock select register. */
ea9cfed7 1334 if (ctx->cur_samplerate == SR_MHZ(200))
edca2c5c 1335 /* Enable 4 probes. */
ea9cfed7
UH
1336 sigma_set_register(WRITE_CLOCK_SELECT, 0xf0, ctx);
1337 else if (ctx->cur_samplerate == SR_MHZ(100))
edca2c5c 1338 /* Enable 8 probes. */
ea9cfed7 1339 sigma_set_register(WRITE_CLOCK_SELECT, 0x00, ctx);
edca2c5c
HE
1340 else {
1341 /*
9ddb2a12 1342 * 50 MHz mode (or fraction thereof). Any fraction down to
eec5275e 1343 * 50 MHz / 256 can be used, but is not supported by sigrok API.
edca2c5c 1344 */
ea9cfed7 1345 frac = SR_MHZ(50) / ctx->cur_samplerate - 1;
edca2c5c 1346
9ddb2a12
UH
1347 clockselect.async = 0;
1348 clockselect.fraction = frac;
1349 clockselect.disabled_probes = 0;
edca2c5c
HE
1350
1351 sigma_write_register(WRITE_CLOCK_SELECT,
9ddb2a12 1352 (uint8_t *) &clockselect,
ea9cfed7 1353 sizeof(clockselect), ctx);
edca2c5c
HE
1354 }
1355
fefa1800 1356 /* Setup maximum post trigger time. */
99965709 1357 sigma_set_register(WRITE_POST_TRIGGER,
6352d030 1358 (ctx->capture_ratio * 255) / 100, ctx);
28a35d8a 1359
eec5275e 1360 /* Start acqusition. */
ea9cfed7
UH
1361 gettimeofday(&ctx->start_tv, 0);
1362 sigma_set_register(WRITE_MODE, 0x0d, ctx);
99965709 1363
3cd3a20b 1364 ctx->session_dev_id = cb_data;
28a35d8a 1365
3c36c403
HE
1366 if (!(packet = g_try_malloc(sizeof(struct sr_datafeed_packet)))) {
1367 sr_err("sigma: %s: packet malloc failed.", __func__);
1368 return SR_ERR_MALLOC;
1369 }
1370
1371 if (!(header = g_try_malloc(sizeof(struct sr_datafeed_header)))) {
1372 sr_err("sigma: %s: header malloc failed.", __func__);
1373 return SR_ERR_MALLOC;
1374 }
28a35d8a 1375
3c36c403
HE
1376 /* Send header packet to the session bus. */
1377 packet->type = SR_DF_HEADER;
1378 packet->payload = header;
1379 header->feed_version = 1;
1380 gettimeofday(&header->starttime, NULL);
3c36c403 1381 sr_session_send(ctx->session_dev_id, packet);
f366e86c
BV
1382
1383 /* Send metadata about the SR_DF_LOGIC packets to come. */
1384 packet->type = SR_DF_META_LOGIC;
1385 packet->payload = &meta;
1386 meta.samplerate = ctx->cur_samplerate;
1387 meta.num_probes = ctx->num_probes;
1388 sr_session_send(ctx->session_dev_id, packet);
1389
1390 /* Add capture source. */
3ffb6964 1391 sr_source_add(0, G_IO_IN, 10, receive_data, (void *)sdi);
f366e86c 1392
3c36c403
HE
1393 g_free(header);
1394 g_free(packet);
1395
ea9cfed7 1396 ctx->state.state = SIGMA_CAPTURE;
6aac7737 1397
e46b8fb1 1398 return SR_OK;
28a35d8a
HE
1399}
1400
3ffb6964
BV
1401static int hw_dev_acquisition_stop(const struct sr_dev_inst *sdi,
1402 void *cb_data)
28a35d8a 1403{
ea9cfed7 1404 struct context *ctx;
6aac7737
HE
1405 uint8_t modestatus;
1406
cb93f8a9 1407 /* Avoid compiler warnings. */
3cd3a20b 1408 (void)cb_data;
28a35d8a 1409
ea9cfed7 1410 if (!(ctx = sdi->priv)) {
7b48d6e1 1411 sr_err("sigma: %s: sdi->priv was NULL", __func__);
3010f21c
UH
1412 return SR_ERR_BUG;
1413 }
1414
fefa1800 1415 /* Stop acquisition. */
ea9cfed7 1416 sigma_set_register(WRITE_MODE, 0x11, ctx);
28a35d8a 1417
6aac7737 1418 /* Set SDRAM Read Enable. */
ea9cfed7 1419 sigma_set_register(WRITE_MODE, 0x02, ctx);
6aac7737
HE
1420
1421 /* Get the current position. */
ea9cfed7 1422 sigma_read_pos(&ctx->state.stoppos, &ctx->state.triggerpos, ctx);
6aac7737
HE
1423
1424 /* Check if trigger has fired. */
ea9cfed7 1425 modestatus = sigma_get_register(READ_MODE, ctx);
3010f21c 1426 if (modestatus & 0x20)
ea9cfed7 1427 ctx->state.triggerchunk = ctx->state.triggerpos / 512;
3010f21c 1428 else
ea9cfed7 1429 ctx->state.triggerchunk = -1;
6aac7737 1430
ea9cfed7 1431 ctx->state.chunks_downloaded = 0;
6aac7737 1432
ea9cfed7 1433 ctx->state.state = SIGMA_DOWNLOAD;
3010f21c
UH
1434
1435 return SR_OK;
28a35d8a
HE
1436}
1437
c09f0b57 1438SR_PRIV struct sr_dev_driver asix_sigma_driver_info = {
e519ba86 1439 .name = "asix-sigma",
6352d030 1440 .longname = "ASIX SIGMA/SIGMA2",
e519ba86
UH
1441 .api_version = 1,
1442 .init = hw_init,
1443 .cleanup = hw_cleanup,
61136ea6 1444 .scan = hw_scan,
e7eb703f
UH
1445 .dev_open = hw_dev_open,
1446 .dev_close = hw_dev_close,
41479605 1447 .info_get = hw_info_get,
a9a245b4 1448 .dev_config_set = hw_dev_config_set,
6b3dfec8
UH
1449 .dev_acquisition_start = hw_dev_acquisition_start,
1450 .dev_acquisition_stop = hw_dev_acquisition_stop,
ed300b9f 1451 .instances = NULL,
28a35d8a 1452};