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