]> sigrok.org Git - libsigrok.git/blame - hardware/asix-sigma/asix-sigma.c
sigma: Add support for SIGMA2 (req. new firmware).
[libsigrok.git] / hardware / asix-sigma / asix-sigma.c
CommitLineData
28a35d8a
HE
1/*
2 * This file is part of the sigrok project.
3 *
911f1834
UH
4 * Copyright (C) 2010 Håvard Espeland <gus@ping.uio.no>,
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/*
da0918aa 23 * ASIX SIGMA 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>
30#include <zlib.h>
b7f09cf8
UH
31#include "sigrok.h"
32#include "sigrok-internal.h"
28a35d8a
HE
33#include "asix-sigma.h"
34
35#define USB_VENDOR 0xa600
36#define USB_PRODUCT 0xa000
37#define USB_DESCRIPTION "ASIX SIGMA"
38#define USB_VENDOR_NAME "ASIX"
39#define USB_MODEL_NAME "SIGMA"
40#define USB_MODEL_VERSION ""
ee492173 41#define TRIGGER_TYPES "rf10"
464d12c7 42#define NUM_PROBES 16
28a35d8a 43
d68e2d1a 44static GSList *dev_insts = NULL;
28a35d8a 45
28a35d8a 46static 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
60679b18 85static struct sr_samplerates samplerates = {
590b9f9a
UH
86 0,
87 0,
88 0,
28a35d8a
HE
89 supported_samplerates,
90};
91
ffedd0bf 92static 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
bb7ef793 409static int hw_init(const char *devinfo)
28a35d8a 410{
d68e2d1a 411 struct sr_dev_inst *sdi;
ea9cfed7 412 struct context *ctx;
e3fff420
HE
413 struct ftdi_device_list *devlist;
414 char serial_txt[10];
415 uint32_t serial;
28a35d8a 416
b53738ba 417 /* Avoid compiler warnings. */
bb7ef793 418 (void)devinfo;
28a35d8a 419
ea9cfed7
UH
420 if (!(ctx = g_try_malloc(sizeof(struct context)))) {
421 sr_err("sigma: %s: ctx malloc failed", __func__);
e3fff420 422 return SR_ERR_MALLOC;
b53738ba 423 }
99965709 424
ea9cfed7 425 ftdi_init(&ctx->ftdic);
28a35d8a 426
fefa1800 427 /* Look for SIGMAs. */
e3fff420
HE
428
429 if (ftdi_usb_find_all(&ctx->ftdic, &devlist,
430 USB_VENDOR, USB_PRODUCT) < 0)
99965709
HE
431 goto free;
432
e3fff420
HE
433 /* Make sure it's a version 1 or 2 SIGMA. */
434 ftdi_usb_get_strings(&ctx->ftdic, devlist->dev, NULL, 0, NULL, 0,
435 serial_txt, sizeof(serial_txt));
436 sscanf(serial_txt, "%x", &serial);
437
438 if (serial < 0xa6010000 || serial > 0xa602ffff ) {
439 sr_err("sigma: Only SIGMA and SIGMA2 are supported "
440 "in this version of Sigrok.");
441 goto free;
442 }
443
444 sr_info("Found ASIX SIGMA - Serial: %s", serial_txt);
445
ea9cfed7
UH
446 ctx->cur_samplerate = 0;
447 ctx->period_ps = 0;
448 ctx->limit_msec = 0;
449 ctx->cur_firmware = -1;
450 ctx->num_probes = 0;
451 ctx->samples_per_event = 0;
452 ctx->capture_ratio = 50;
453 ctx->use_triggers = 0;
28a35d8a 454
fefa1800 455 /* Register SIGMA device. */
d68e2d1a
UH
456 if (!(sdi = sr_dev_inst_new(0, SR_ST_INITIALIZING, USB_VENDOR_NAME,
457 USB_MODEL_NAME, USB_MODEL_VERSION))) {
458 sr_err("sigma: %s: sdi was NULL", __func__);
99965709 459 goto free;
d68e2d1a 460 }
99965709 461
ea9cfed7 462 sdi->priv = ctx;
28a35d8a 463
d68e2d1a 464 dev_insts = g_slist_append(dev_insts, sdi);
28a35d8a 465
fefa1800 466 /* We will open the device again when we need it. */
e3fff420 467 ftdi_list_free(&devlist);
28a35d8a
HE
468
469 return 1;
ea9cfed7 470
99965709 471free:
ea9cfed7 472 g_free(ctx);
99965709 473 return 0;
28a35d8a
HE
474}
475
ea9cfed7 476static int upload_firmware(int firmware_idx, struct context *ctx)
28a35d8a
HE
477{
478 int ret;
479 unsigned char *buf;
480 unsigned char pins;
481 size_t buf_size;
28a35d8a 482 unsigned char result[32];
e8397563 483 char firmware_path[128];
28a35d8a 484
fefa1800 485 /* Make sure it's an ASIX SIGMA. */
ea9cfed7 486 if ((ret = ftdi_usb_open_desc(&ctx->ftdic,
28a35d8a 487 USB_VENDOR, USB_PRODUCT, USB_DESCRIPTION, NULL)) < 0) {
7b48d6e1 488 sr_err("sigma: ftdi_usb_open failed: %s",
ea9cfed7 489 ftdi_get_error_string(&ctx->ftdic));
28a35d8a
HE
490 return 0;
491 }
492
ea9cfed7 493 if ((ret = ftdi_set_bitmode(&ctx->ftdic, 0xdf, BITMODE_BITBANG)) < 0) {
7b48d6e1 494 sr_err("sigma: ftdi_set_bitmode failed: %s",
ea9cfed7 495 ftdi_get_error_string(&ctx->ftdic));
28a35d8a
HE
496 return 0;
497 }
498
fefa1800 499 /* Four times the speed of sigmalogan - Works well. */
ea9cfed7 500 if ((ret = ftdi_set_baudrate(&ctx->ftdic, 750000)) < 0) {
7b48d6e1 501 sr_err("sigma: ftdi_set_baudrate failed: %s",
ea9cfed7 502 ftdi_get_error_string(&ctx->ftdic));
28a35d8a
HE
503 return 0;
504 }
505
fefa1800 506 /* Force the FPGA to reboot. */
ea9cfed7
UH
507 sigma_write(suicide, sizeof(suicide), ctx);
508 sigma_write(suicide, sizeof(suicide), ctx);
509 sigma_write(suicide, sizeof(suicide), ctx);
510 sigma_write(suicide, sizeof(suicide), ctx);
28a35d8a 511
fefa1800 512 /* Prepare to upload firmware (FPGA specific). */
ea9cfed7 513 sigma_write(init, sizeof(init), ctx);
28a35d8a 514
ea9cfed7 515 ftdi_usb_purge_buffers(&ctx->ftdic);
28a35d8a 516
fefa1800 517 /* Wait until the FPGA asserts INIT_B. */
28a35d8a 518 while (1) {
ea9cfed7 519 ret = sigma_read(result, 1, ctx);
28a35d8a
HE
520 if (result[0] & 0x20)
521 break;
522 }
523
9ddb2a12 524 /* Prepare firmware. */
e8397563 525 snprintf(firmware_path, sizeof(firmware_path), "%s/%s", FIRMWARE_DIR,
f6564c8d
HE
526 firmware_files[firmware_idx]);
527
b53738ba 528 if ((ret = bin2bitbang(firmware_path, &buf, &buf_size)) != SR_OK) {
7b48d6e1 529 sr_err("sigma: An error occured while reading the firmware: %s",
133a37bf 530 firmware_path);
b53738ba 531 return ret;
28a35d8a
HE
532 }
533
fefa1800 534 /* Upload firmare. */
e3fff420 535 sr_info("sigma: Uploading firmware %s", firmware_files[firmware_idx]);
ea9cfed7 536 sigma_write(buf, buf_size, ctx);
28a35d8a
HE
537
538 g_free(buf);
539
ea9cfed7 540 if ((ret = ftdi_set_bitmode(&ctx->ftdic, 0x00, BITMODE_RESET)) < 0) {
7b48d6e1 541 sr_err("sigma: ftdi_set_bitmode failed: %s",
ea9cfed7 542 ftdi_get_error_string(&ctx->ftdic));
e46b8fb1 543 return SR_ERR;
28a35d8a
HE
544 }
545
ea9cfed7 546 ftdi_usb_purge_buffers(&ctx->ftdic);
28a35d8a 547
fefa1800 548 /* Discard garbage. */
ea9cfed7 549 while (1 == sigma_read(&pins, 1, ctx))
28a35d8a
HE
550 ;
551
fefa1800 552 /* Initialize the logic analyzer mode. */
ea9cfed7 553 sigma_write(logic_mode_start, sizeof(logic_mode_start), ctx);
28a35d8a 554
fefa1800 555 /* Expect a 3 byte reply. */
ea9cfed7 556 ret = sigma_read(result, 3, ctx);
28a35d8a
HE
557 if (ret != 3 ||
558 result[0] != 0xa6 || result[1] != 0x55 || result[2] != 0xaa) {
7b48d6e1 559 sr_err("sigma: Configuration failed. Invalid reply received.");
e46b8fb1 560 return SR_ERR;
28a35d8a
HE
561 }
562
ea9cfed7 563 ctx->cur_firmware = firmware_idx;
f6564c8d 564
e3fff420
HE
565 sr_info("sigma: Firmware uploaded");
566
e46b8fb1 567 return SR_OK;
f6564c8d
HE
568}
569
e7eb703f 570static int hw_dev_open(int dev_index)
f6564c8d 571{
d68e2d1a 572 struct sr_dev_inst *sdi;
ea9cfed7 573 struct context *ctx;
f6564c8d
HE
574 int ret;
575
bb7ef793 576 if (!(sdi = sr_dev_inst_get(dev_insts, dev_index)))
e46b8fb1 577 return SR_ERR;
99965709 578
ea9cfed7 579 ctx = sdi->priv;
99965709 580
9ddb2a12 581 /* Make sure it's an ASIX SIGMA. */
ea9cfed7 582 if ((ret = ftdi_usb_open_desc(&ctx->ftdic,
f6564c8d
HE
583 USB_VENDOR, USB_PRODUCT, USB_DESCRIPTION, NULL)) < 0) {
584
7b48d6e1 585 sr_err("sigma: ftdi_usb_open failed: %s",
ea9cfed7 586 ftdi_get_error_string(&ctx->ftdic));
f6564c8d
HE
587
588 return 0;
589 }
28a35d8a 590
5a2326a7 591 sdi->status = SR_ST_ACTIVE;
28a35d8a 592
e46b8fb1 593 return SR_OK;
f6564c8d
HE
594}
595
d68e2d1a 596static int set_samplerate(struct sr_dev_inst *sdi, uint64_t samplerate)
f6564c8d 597{
e8397563 598 int i, ret;
ea9cfed7 599 struct context *ctx = sdi->priv;
f6564c8d
HE
600
601 for (i = 0; supported_samplerates[i]; i++) {
602 if (supported_samplerates[i] == samplerate)
603 break;
604 }
605 if (supported_samplerates[i] == 0)
e46b8fb1 606 return SR_ERR_SAMPLERATE;
f6564c8d 607
59df0c77 608 if (samplerate <= SR_MHZ(50)) {
ea9cfed7
UH
609 ret = upload_firmware(0, ctx);
610 ctx->num_probes = 16;
e8397563 611 }
59df0c77 612 if (samplerate == SR_MHZ(100)) {
ea9cfed7
UH
613 ret = upload_firmware(1, ctx);
614 ctx->num_probes = 8;
f78898e9 615 }
59df0c77 616 else if (samplerate == SR_MHZ(200)) {
ea9cfed7
UH
617 ret = upload_firmware(2, ctx);
618 ctx->num_probes = 4;
f78898e9 619 }
f6564c8d 620
ea9cfed7
UH
621 ctx->cur_samplerate = samplerate;
622 ctx->period_ps = 1000000000000 / samplerate;
623 ctx->samples_per_event = 16 / ctx->num_probes;
624 ctx->state.state = SIGMA_IDLE;
f6564c8d 625
e8397563 626 return ret;
28a35d8a
HE
627}
628
c53d793f
HE
629/*
630 * In 100 and 200 MHz mode, only a single pin rising/falling can be
631 * set as trigger. In other modes, two rising/falling triggers can be set,
632 * in addition to value/mask trigger for any number of probes.
633 *
634 * The Sigma supports complex triggers using boolean expressions, but this
635 * has not been implemented yet.
636 */
d68e2d1a 637static int configure_probes(struct sr_dev_inst *sdi, GSList *probes)
57bbf56b 638{
ea9cfed7 639 struct context *ctx = sdi->priv;
1afe8989 640 struct sr_probe *probe;
57bbf56b
HE
641 GSList *l;
642 int trigger_set = 0;
a42aec7f 643 int probebit;
57bbf56b 644
ea9cfed7 645 memset(&ctx->trigger, 0, sizeof(struct sigma_trigger));
eec5275e 646
57bbf56b 647 for (l = probes; l; l = l->next) {
1afe8989 648 probe = (struct sr_probe *)l->data;
a42aec7f 649 probebit = 1 << (probe->index - 1);
57bbf56b
HE
650
651 if (!probe->enabled || !probe->trigger)
652 continue;
653
ea9cfed7 654 if (ctx->cur_samplerate >= SR_MHZ(100)) {
c53d793f 655 /* Fast trigger support. */
ee492173 656 if (trigger_set) {
7b48d6e1 657 sr_err("sigma: ASIX SIGMA only supports a single "
133a37bf 658 "pin trigger in 100 and 200MHz mode.");
e46b8fb1 659 return SR_ERR;
ee492173
HE
660 }
661 if (probe->trigger[0] == 'f')
ea9cfed7 662 ctx->trigger.fallingmask |= probebit;
ee492173 663 else if (probe->trigger[0] == 'r')
ea9cfed7 664 ctx->trigger.risingmask |= probebit;
ee492173 665 else {
7b48d6e1 666 sr_err("sigma: ASIX SIGMA only supports "
133a37bf
UH
667 "rising/falling trigger in 100 "
668 "and 200MHz mode.");
e46b8fb1 669 return SR_ERR;
ee492173 670 }
57bbf56b 671
c53d793f 672 ++trigger_set;
ee492173 673 } else {
c53d793f
HE
674 /* Simple trigger support (event). */
675 if (probe->trigger[0] == '1') {
ea9cfed7
UH
676 ctx->trigger.simplevalue |= probebit;
677 ctx->trigger.simplemask |= probebit;
c53d793f
HE
678 }
679 else if (probe->trigger[0] == '0') {
ea9cfed7
UH
680 ctx->trigger.simplevalue &= ~probebit;
681 ctx->trigger.simplemask |= probebit;
c53d793f
HE
682 }
683 else if (probe->trigger[0] == 'f') {
ea9cfed7 684 ctx->trigger.fallingmask |= probebit;
c53d793f
HE
685 ++trigger_set;
686 }
687 else if (probe->trigger[0] == 'r') {
ea9cfed7 688 ctx->trigger.risingmask |= probebit;
c53d793f
HE
689 ++trigger_set;
690 }
ee492173 691
ea9cfed7
UH
692 /*
693 * Actually, Sigma supports 2 rising/falling triggers,
694 * but they are ORed and the current trigger syntax
695 * does not permit ORed triggers.
696 */
98b8cbc1 697 if (trigger_set > 1) {
7b48d6e1
UH
698 sr_err("sigma: ASIX SIGMA only supports 1 "
699 "rising/falling triggers.");
e46b8fb1 700 return SR_ERR;
ee492173 701 }
ee492173 702 }
5b5ea7c6
HE
703
704 if (trigger_set)
ea9cfed7 705 ctx->use_triggers = 1;
57bbf56b
HE
706 }
707
e46b8fb1 708 return SR_OK;
57bbf56b
HE
709}
710
e7eb703f 711static int hw_dev_close(int dev_index)
28a35d8a 712{
d68e2d1a 713 struct sr_dev_inst *sdi;
ea9cfed7 714 struct context *ctx;
28a35d8a 715
bb7ef793 716 if (!(sdi = sr_dev_inst_get(dev_insts, dev_index))) {
340cfac0 717 sr_err("sigma: %s: sdi was NULL", __func__);
0abee507 718 return SR_ERR_BUG;
697785d1 719 }
9be9893e 720
ea9cfed7 721 if (!(ctx = sdi->priv)) {
340cfac0 722 sr_err("sigma: %s: sdi->priv was NULL", __func__);
0abee507 723 return SR_ERR_BUG;
9be9893e 724 }
697785d1
UH
725
726 /* TODO */
727 if (sdi->status == SR_ST_ACTIVE)
ea9cfed7 728 ftdi_usb_close(&ctx->ftdic);
697785d1
UH
729
730 sdi->status = SR_ST_INACTIVE;
731
732 return SR_OK;
28a35d8a
HE
733}
734
57ab7d9f 735static int hw_cleanup(void)
28a35d8a 736{
99965709 737 GSList *l;
d68e2d1a 738 struct sr_dev_inst *sdi;
57ab7d9f 739 int ret = SR_OK;
99965709
HE
740
741 /* Properly close all devices. */
d68e2d1a 742 for (l = dev_insts; l; l = l->next) {
57ab7d9f
UH
743 if (!(sdi = l->data)) {
744 /* Log error, but continue cleaning up the rest. */
7b48d6e1 745 sr_err("sigma: %s: sdi was NULL, continuing", __func__);
57ab7d9f
UH
746 ret = SR_ERR_BUG;
747 continue;
748 }
d3683c42 749 sr_dev_inst_free(sdi);
99965709 750 }
d68e2d1a
UH
751 g_slist_free(dev_insts);
752 dev_insts = NULL;
57ab7d9f
UH
753
754 return ret;
28a35d8a
HE
755}
756
5097b0d0 757static void *hw_dev_info_get(int dev_index, int dev_info_id)
28a35d8a 758{
d68e2d1a 759 struct sr_dev_inst *sdi;
ea9cfed7 760 struct context *ctx;
28a35d8a
HE
761 void *info = NULL;
762
bb7ef793 763 if (!(sdi = sr_dev_inst_get(dev_insts, dev_index))) {
7b48d6e1 764 sr_err("sigma: %s: sdi was NULL", __func__);
28a35d8a
HE
765 return NULL;
766 }
767
ea9cfed7 768 ctx = sdi->priv;
99965709 769
bb7ef793 770 switch (dev_info_id) {
1d9a8a5f 771 case SR_DI_INST:
28a35d8a
HE
772 info = sdi;
773 break;
5a2326a7 774 case SR_DI_NUM_PROBES:
464d12c7
KS
775 info = GINT_TO_POINTER(NUM_PROBES);
776 break;
777 case SR_DI_PROBE_NAMES:
778 info = probe_names;
28a35d8a 779 break;
5a2326a7 780 case SR_DI_SAMPLERATES:
28a35d8a
HE
781 info = &samplerates;
782 break;
5a2326a7 783 case SR_DI_TRIGGER_TYPES:
57bbf56b 784 info = (char *)TRIGGER_TYPES;
28a35d8a 785 break;
5a2326a7 786 case SR_DI_CUR_SAMPLERATE:
ea9cfed7 787 info = &ctx->cur_samplerate;
28a35d8a
HE
788 break;
789 }
790
791 return info;
792}
793
e7eb703f 794static int hw_dev_status_get(int dev_index)
28a35d8a 795{
d68e2d1a 796 struct sr_dev_inst *sdi;
28a35d8a 797
bb7ef793 798 sdi = sr_dev_inst_get(dev_insts, dev_index);
28a35d8a
HE
799 if (sdi)
800 return sdi->status;
801 else
5a2326a7 802 return SR_ST_NOT_FOUND;
28a35d8a
HE
803}
804
ffedd0bf 805static int *hw_hwcap_get_all(void)
28a35d8a 806{
ffedd0bf 807 return hwcaps;
28a35d8a
HE
808}
809
a9a245b4 810static int hw_dev_config_set(int dev_index, int hwcap, void *value)
28a35d8a 811{
d68e2d1a 812 struct sr_dev_inst *sdi;
ea9cfed7 813 struct context *ctx;
28a35d8a 814 int ret;
f6564c8d 815
bb7ef793 816 if (!(sdi = sr_dev_inst_get(dev_insts, dev_index)))
e46b8fb1 817 return SR_ERR;
28a35d8a 818
ea9cfed7 819 ctx = sdi->priv;
99965709 820
ffedd0bf 821 if (hwcap == SR_HWCAP_SAMPLERATE) {
ea9cfed7 822 ret = set_samplerate(sdi, *(uint64_t *)value);
ffedd0bf 823 } else if (hwcap == SR_HWCAP_PROBECONFIG) {
99965709 824 ret = configure_probes(sdi, value);
ffedd0bf 825 } else if (hwcap == SR_HWCAP_LIMIT_MSEC) {
ea9cfed7
UH
826 ctx->limit_msec = *(uint64_t *)value;
827 if (ctx->limit_msec > 0)
e46b8fb1 828 ret = SR_OK;
94ba4bd6 829 else
e46b8fb1 830 ret = SR_ERR;
ffedd0bf 831 } else if (hwcap == SR_HWCAP_CAPTURE_RATIO) {
ea9cfed7
UH
832 ctx->capture_ratio = *(uint64_t *)value;
833 if (ctx->capture_ratio < 0 || ctx->capture_ratio > 100)
e46b8fb1 834 ret = SR_ERR;
94ba4bd6 835 else
e46b8fb1 836 ret = SR_OK;
28a35d8a 837 } else {
e46b8fb1 838 ret = SR_ERR;
28a35d8a
HE
839 }
840
841 return ret;
842}
843
36b1c8e6
HE
844/* Software trigger to determine exact trigger position. */
845static int get_trigger_offset(uint16_t *samples, uint16_t last_sample,
846 struct sigma_trigger *t)
847{
848 int i;
849
850 for (i = 0; i < 8; ++i) {
851 if (i > 0)
852 last_sample = samples[i-1];
853
854 /* Simple triggers. */
855 if ((samples[i] & t->simplemask) != t->simplevalue)
856 continue;
857
858 /* Rising edge. */
859 if ((last_sample & t->risingmask) != 0 || (samples[i] &
860 t->risingmask) != t->risingmask)
861 continue;
862
863 /* Falling edge. */
bdfc7a89
HE
864 if ((last_sample & t->fallingmask) != t->fallingmask ||
865 (samples[i] & t->fallingmask) != 0)
36b1c8e6
HE
866 continue;
867
868 break;
869 }
870
871 /* If we did not match, return original trigger pos. */
872 return i & 0x7;
873}
874
28a35d8a 875/*
fefa1800
UH
876 * Decode chunk of 1024 bytes, 64 clusters, 7 events per cluster.
877 * Each event is 20ns apart, and can contain multiple samples.
f78898e9
HE
878 *
879 * For 200 MHz, events contain 4 samples for each channel, spread 5 ns apart.
880 * For 100 MHz, events contain 2 samples for each channel, spread 10 ns apart.
881 * For 50 MHz and below, events contain one sample for each channel,
882 * spread 20 ns apart.
28a35d8a
HE
883 */
884static int decode_chunk_ts(uint8_t *buf, uint16_t *lastts,
88c51afe 885 uint16_t *lastsample, int triggerpos,
3cd3a20b 886 uint16_t limit_chunk, void *cb_data)
28a35d8a 887{
3cd3a20b 888 struct sr_dev_inst *sdi = cb_data;
ea9cfed7 889 struct context *ctx = sdi->priv;
fefa1800 890 uint16_t tsdiff, ts;
ea9cfed7 891 uint16_t samples[65536 * ctx->samples_per_event];
b9c735a2 892 struct sr_datafeed_packet packet;
9c939c51 893 struct sr_datafeed_logic logic;
f78898e9 894 int i, j, k, l, numpad, tosend;
fefa1800 895 size_t n = 0, sent = 0;
ea9cfed7 896 int clustersize = EVENTS_PER_CLUSTER * ctx->samples_per_event;
fefa1800 897 uint16_t *event;
f78898e9 898 uint16_t cur_sample;
57bbf56b 899 int triggerts = -1;
ee492173 900
4ae1f451 901 /* Check if trigger is in this chunk. */
ee492173 902 if (triggerpos != -1) {
ea9cfed7 903 if (ctx->cur_samplerate <= SR_MHZ(50))
36b1c8e6 904 triggerpos -= EVENTS_PER_CLUSTER - 1;
ee492173
HE
905
906 if (triggerpos < 0)
907 triggerpos = 0;
57bbf56b 908
ee492173
HE
909 /* Find in which cluster the trigger occured. */
910 triggerts = triggerpos / 7;
911 }
28a35d8a 912
eec5275e 913 /* For each ts. */
28a35d8a 914 for (i = 0; i < 64; ++i) {
fefa1800 915 ts = *(uint16_t *) &buf[i * 16];
28a35d8a
HE
916 tsdiff = ts - *lastts;
917 *lastts = ts;
918
88c51afe
HE
919 /* Decode partial chunk. */
920 if (limit_chunk && ts > limit_chunk)
e46b8fb1 921 return SR_OK;
88c51afe 922
fefa1800 923 /* Pad last sample up to current point. */
ea9cfed7 924 numpad = tsdiff * ctx->samples_per_event - clustersize;
28a35d8a 925 if (numpad > 0) {
f78898e9
HE
926 for (j = 0; j < numpad; ++j)
927 samples[j] = *lastsample;
928
929 n = numpad;
28a35d8a
HE
930 }
931
57bbf56b
HE
932 /* Send samples between previous and this timestamp to sigrok. */
933 sent = 0;
934 while (sent < n) {
935 tosend = MIN(2048, n - sent);
936
5a2326a7 937 packet.type = SR_DF_LOGIC;
9c939c51
BV
938 packet.payload = &logic;
939 logic.length = tosend * sizeof(uint16_t);
940 logic.unitsize = 2;
941 logic.data = samples + sent;
3cd3a20b 942 sr_session_send(ctx->session_dev_id, &packet);
28a35d8a 943
57bbf56b
HE
944 sent += tosend;
945 }
946 n = 0;
947
948 event = (uint16_t *) &buf[i * 16 + 2];
f78898e9
HE
949 cur_sample = 0;
950
951 /* For each event in cluster. */
28a35d8a 952 for (j = 0; j < 7; ++j) {
f78898e9
HE
953
954 /* For each sample in event. */
ea9cfed7 955 for (k = 0; k < ctx->samples_per_event; ++k) {
f78898e9
HE
956 cur_sample = 0;
957
958 /* For each probe. */
ea9cfed7 959 for (l = 0; l < ctx->num_probes; ++l)
edca2c5c 960 cur_sample |= (!!(event[j] & (1 << (l *
ea9cfed7 961 ctx->samples_per_event + k)))) << l;
f78898e9
HE
962
963 samples[n++] = cur_sample;
28a35d8a
HE
964 }
965 }
966
eec5275e 967 /* Send data up to trigger point (if triggered). */
fefa1800 968 sent = 0;
57bbf56b
HE
969 if (i == triggerts) {
970 /*
36b1c8e6
HE
971 * Trigger is not always accurate to sample because of
972 * pipeline delay. However, it always triggers before
973 * the actual event. We therefore look at the next
974 * samples to pinpoint the exact position of the trigger.
57bbf56b 975 */
bdfc7a89 976 tosend = get_trigger_offset(samples, *lastsample,
ea9cfed7 977 &ctx->trigger);
57bbf56b
HE
978
979 if (tosend > 0) {
5a2326a7 980 packet.type = SR_DF_LOGIC;
9c939c51
BV
981 packet.payload = &logic;
982 logic.length = tosend * sizeof(uint16_t);
983 logic.unitsize = 2;
984 logic.data = samples;
3cd3a20b 985 sr_session_send(ctx->session_dev_id, &packet);
57bbf56b
HE
986
987 sent += tosend;
988 }
28a35d8a 989
5b5ea7c6 990 /* Only send trigger if explicitly enabled. */
ea9cfed7 991 if (ctx->use_triggers) {
5a2326a7 992 packet.type = SR_DF_TRIGGER;
3cd3a20b 993 sr_session_send(ctx->session_dev_id, &packet);
5b5ea7c6 994 }
28a35d8a 995 }
57bbf56b 996
eec5275e 997 /* Send rest of the chunk to sigrok. */
57bbf56b
HE
998 tosend = n - sent;
999
abda62ce 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 + sent;
3cd3a20b 1006 sr_session_send(ctx->session_dev_id, &packet);
abda62ce 1007 }
ee492173
HE
1008
1009 *lastsample = samples[n - 1];
28a35d8a
HE
1010 }
1011
e46b8fb1 1012 return SR_OK;
28a35d8a
HE
1013}
1014
1f9813eb 1015static int receive_data(int fd, int revents, void *cb_data)
28a35d8a 1016{
1f9813eb 1017 struct sr_dev_inst *sdi = cb_data;
ea9cfed7 1018 struct context *ctx = sdi->priv;
b9c735a2 1019 struct sr_datafeed_packet packet;
28a35d8a
HE
1020 const int chunks_per_read = 32;
1021 unsigned char buf[chunks_per_read * CHUNK_SIZE];
6aac7737 1022 int bufsz, numchunks, i, newchunks;
94ba4bd6 1023 uint64_t running_msec;
28a35d8a 1024 struct timeval tv;
28a35d8a 1025
cb93f8a9
UH
1026 /* Avoid compiler warnings. */
1027 (void)fd;
1028 (void)revents;
28a35d8a 1029
805919b0
HE
1030 /* Get the current position. */
1031 sigma_read_pos(&ctx->state.stoppos, &ctx->state.triggerpos, ctx);
1032
ea9cfed7 1033 numchunks = (ctx->state.stoppos + 511) / 512;
28a35d8a 1034
ea9cfed7 1035 if (ctx->state.state == SIGMA_IDLE)
805919b0 1036 return TRUE;
28a35d8a 1037
ea9cfed7 1038 if (ctx->state.state == SIGMA_CAPTURE) {
6aac7737
HE
1039 /* Check if the timer has expired, or memory is full. */
1040 gettimeofday(&tv, 0);
ea9cfed7
UH
1041 running_msec = (tv.tv_sec - ctx->start_tv.tv_sec) * 1000 +
1042 (tv.tv_usec - ctx->start_tv.tv_usec) / 1000;
28a35d8a 1043
ea9cfed7 1044 if (running_msec < ctx->limit_msec && numchunks < 32767)
805919b0 1045 return TRUE; /* While capturing... */
e3fff420
HE
1046 else
1047 hw_dev_acquisition_stop(sdi->index, sdi);
6aac7737 1048
ea9cfed7
UH
1049 } else if (ctx->state.state == SIGMA_DOWNLOAD) {
1050 if (ctx->state.chunks_downloaded >= numchunks) {
6aac7737 1051 /* End of samples. */
5a2326a7 1052 packet.type = SR_DF_END;
3cd3a20b 1053 sr_session_send(ctx->session_dev_id, &packet);
6aac7737 1054
ea9cfed7 1055 ctx->state.state = SIGMA_IDLE;
f78898e9 1056
6aac7737
HE
1057 return TRUE;
1058 }
1059
1060 newchunks = MIN(chunks_per_read,
ea9cfed7 1061 numchunks - ctx->state.chunks_downloaded);
28a35d8a 1062
7b48d6e1 1063 sr_info("sigma: Downloading sample data: %.0f %%",
ea9cfed7 1064 100.0 * ctx->state.chunks_downloaded / numchunks);
28a35d8a 1065
ea9cfed7
UH
1066 bufsz = sigma_read_dram(ctx->state.chunks_downloaded,
1067 newchunks, buf, ctx);
719c5a93
UH
1068 /* TODO: Check bufsz. For now, just avoid compiler warnings. */
1069 (void)bufsz;
28a35d8a 1070
fefa1800 1071 /* Find first ts. */
ea9cfed7
UH
1072 if (ctx->state.chunks_downloaded == 0) {
1073 ctx->state.lastts = *(uint16_t *) buf - 1;
1074 ctx->state.lastsample = 0;
6aac7737 1075 }
28a35d8a 1076
fefa1800 1077 /* Decode chunks and send them to sigrok. */
28a35d8a 1078 for (i = 0; i < newchunks; ++i) {
88c51afe
HE
1079 int limit_chunk = 0;
1080
1081 /* The last chunk may potentially be only in part. */
ea9cfed7 1082 if (ctx->state.chunks_downloaded == numchunks - 1) {
88c51afe 1083 /* Find the last valid timestamp */
ea9cfed7 1084 limit_chunk = ctx->state.stoppos % 512 + ctx->state.lastts;
88c51afe
HE
1085 }
1086
ea9cfed7 1087 if (ctx->state.chunks_downloaded + i == ctx->state.triggerchunk)
57bbf56b 1088 decode_chunk_ts(buf + (i * CHUNK_SIZE),
ea9cfed7
UH
1089 &ctx->state.lastts,
1090 &ctx->state.lastsample,
1091 ctx->state.triggerpos & 0x1ff,
1f9813eb 1092 limit_chunk, sdi);
57bbf56b
HE
1093 else
1094 decode_chunk_ts(buf + (i * CHUNK_SIZE),
ea9cfed7
UH
1095 &ctx->state.lastts,
1096 &ctx->state.lastsample,
1f9813eb 1097 -1, limit_chunk, sdi);
28a35d8a 1098
ea9cfed7 1099 ++ctx->state.chunks_downloaded;
88c51afe 1100 }
28a35d8a
HE
1101 }
1102
28a35d8a
HE
1103 return TRUE;
1104}
1105
c53d793f
HE
1106/* Build a LUT entry used by the trigger functions. */
1107static void build_lut_entry(uint16_t value, uint16_t mask, uint16_t *entry)
ee492173
HE
1108{
1109 int i, j, k, bit;
1110
f758d074 1111 /* For each quad probe. */
ee492173 1112 for (i = 0; i < 4; ++i) {
c53d793f 1113 entry[i] = 0xffff;
ee492173 1114
f758d074 1115 /* For each bit in LUT. */
ee492173
HE
1116 for (j = 0; j < 16; ++j)
1117
f758d074 1118 /* For each probe in quad. */
ee492173
HE
1119 for (k = 0; k < 4; ++k) {
1120 bit = 1 << (i * 4 + k);
1121
c53d793f
HE
1122 /* Set bit in entry */
1123 if ((mask & bit) &&
1124 ((!(value & bit)) !=
4ae1f451 1125 (!(j & (1 << k)))))
c53d793f 1126 entry[i] &= ~(1 << j);
ee492173
HE
1127 }
1128 }
c53d793f 1129}
ee492173 1130
c53d793f
HE
1131/* Add a logical function to LUT mask. */
1132static void add_trigger_function(enum triggerop oper, enum triggerfunc func,
1133 int index, int neg, uint16_t *mask)
1134{
1135 int i, j;
1136 int x[2][2], tmp, a, b, aset, bset, rset;
1137
1138 memset(x, 0, 4 * sizeof(int));
1139
1140 /* Trigger detect condition. */
1141 switch (oper) {
1142 case OP_LEVEL:
1143 x[0][1] = 1;
1144 x[1][1] = 1;
1145 break;
1146 case OP_NOT:
1147 x[0][0] = 1;
1148 x[1][0] = 1;
1149 break;
1150 case OP_RISE:
1151 x[0][1] = 1;
1152 break;
1153 case OP_FALL:
1154 x[1][0] = 1;
1155 break;
1156 case OP_RISEFALL:
1157 x[0][1] = 1;
1158 x[1][0] = 1;
1159 break;
1160 case OP_NOTRISE:
1161 x[1][1] = 1;
1162 x[0][0] = 1;
1163 x[1][0] = 1;
1164 break;
1165 case OP_NOTFALL:
1166 x[1][1] = 1;
1167 x[0][0] = 1;
1168 x[0][1] = 1;
1169 break;
1170 case OP_NOTRISEFALL:
1171 x[1][1] = 1;
1172 x[0][0] = 1;
1173 break;
1174 }
1175
1176 /* Transpose if neg is set. */
1177 if (neg) {
ea9cfed7 1178 for (i = 0; i < 2; ++i) {
c53d793f
HE
1179 for (j = 0; j < 2; ++j) {
1180 tmp = x[i][j];
1181 x[i][j] = x[1-i][1-j];
1182 x[1-i][1-j] = tmp;
1183 }
ea9cfed7 1184 }
c53d793f
HE
1185 }
1186
1187 /* Update mask with function. */
1188 for (i = 0; i < 16; ++i) {
1189 a = (i >> (2 * index + 0)) & 1;
1190 b = (i >> (2 * index + 1)) & 1;
1191
1192 aset = (*mask >> i) & 1;
1193 bset = x[b][a];
1194
1195 if (func == FUNC_AND || func == FUNC_NAND)
1196 rset = aset & bset;
1197 else if (func == FUNC_OR || func == FUNC_NOR)
1198 rset = aset | bset;
1199 else if (func == FUNC_XOR || func == FUNC_NXOR)
1200 rset = aset ^ bset;
1201
1202 if (func == FUNC_NAND || func == FUNC_NOR || func == FUNC_NXOR)
1203 rset = !rset;
1204
1205 *mask &= ~(1 << i);
1206
1207 if (rset)
1208 *mask |= 1 << i;
1209 }
1210}
1211
1212/*
1213 * Build trigger LUTs used by 50 MHz and lower sample rates for supporting
1214 * simple pin change and state triggers. Only two transitions (rise/fall) can be
1215 * set at any time, but a full mask and value can be set (0/1).
1216 */
ea9cfed7 1217static int build_basic_trigger(struct triggerlut *lut, struct context *ctx)
c53d793f
HE
1218{
1219 int i,j;
4ae1f451 1220 uint16_t masks[2] = { 0, 0 };
c53d793f
HE
1221
1222 memset(lut, 0, sizeof(struct triggerlut));
1223
1224 /* Contant for simple triggers. */
1225 lut->m4 = 0xa000;
1226
1227 /* Value/mask trigger support. */
ea9cfed7 1228 build_lut_entry(ctx->trigger.simplevalue, ctx->trigger.simplemask,
99965709 1229 lut->m2d);
c53d793f
HE
1230
1231 /* Rise/fall trigger support. */
1232 for (i = 0, j = 0; i < 16; ++i) {
ea9cfed7
UH
1233 if (ctx->trigger.risingmask & (1 << i) ||
1234 ctx->trigger.fallingmask & (1 << i))
c53d793f
HE
1235 masks[j++] = 1 << i;
1236 }
1237
1238 build_lut_entry(masks[0], masks[0], lut->m0d);
1239 build_lut_entry(masks[1], masks[1], lut->m1d);
1240
1241 /* Add glue logic */
1242 if (masks[0] || masks[1]) {
1243 /* Transition trigger. */
ea9cfed7 1244 if (masks[0] & ctx->trigger.risingmask)
c53d793f 1245 add_trigger_function(OP_RISE, FUNC_OR, 0, 0, &lut->m3);
ea9cfed7 1246 if (masks[0] & ctx->trigger.fallingmask)
c53d793f 1247 add_trigger_function(OP_FALL, FUNC_OR, 0, 0, &lut->m3);
ea9cfed7 1248 if (masks[1] & ctx->trigger.risingmask)
c53d793f 1249 add_trigger_function(OP_RISE, FUNC_OR, 1, 0, &lut->m3);
ea9cfed7 1250 if (masks[1] & ctx->trigger.fallingmask)
c53d793f
HE
1251 add_trigger_function(OP_FALL, FUNC_OR, 1, 0, &lut->m3);
1252 } else {
1253 /* Only value/mask trigger. */
1254 lut->m3 = 0xffff;
1255 }
ee492173 1256
c53d793f 1257 /* Triggertype: event. */
ee492173
HE
1258 lut->params.selres = 3;
1259
e46b8fb1 1260 return SR_OK;
ee492173
HE
1261}
1262
3cd3a20b 1263static int hw_dev_acquisition_start(int dev_index, void *cb_data)
28a35d8a 1264{
d68e2d1a 1265 struct sr_dev_inst *sdi;
ea9cfed7 1266 struct context *ctx;
3c36c403
HE
1267 struct sr_datafeed_packet *packet;
1268 struct sr_datafeed_header *header;
9ddb2a12 1269 struct clockselect_50 clockselect;
82957b65 1270 int frac, triggerpin, ret;
57bbf56b
HE
1271 uint8_t triggerselect;
1272 struct triggerinout triggerinout_conf;
ee492173 1273 struct triggerlut lut;
28a35d8a 1274
bb7ef793 1275 if (!(sdi = sr_dev_inst_get(dev_insts, dev_index)))
e46b8fb1 1276 return SR_ERR;
28a35d8a 1277
ea9cfed7 1278 ctx = sdi->priv;
28a35d8a 1279
ea9cfed7
UH
1280 /* If the samplerate has not been set, default to 200 kHz. */
1281 if (ctx->cur_firmware == -1) {
82957b65
UH
1282 if ((ret = set_samplerate(sdi, SR_KHZ(200))) != SR_OK)
1283 return ret;
1284 }
e8397563 1285
eec5275e 1286 /* Enter trigger programming mode. */
ea9cfed7 1287 sigma_set_register(WRITE_TRIGGER_SELECT1, 0x20, ctx);
28a35d8a 1288
eec5275e 1289 /* 100 and 200 MHz mode. */
ea9cfed7
UH
1290 if (ctx->cur_samplerate >= SR_MHZ(100)) {
1291 sigma_set_register(WRITE_TRIGGER_SELECT1, 0x81, ctx);
57bbf56b 1292
a42aec7f
HE
1293 /* Find which pin to trigger on from mask. */
1294 for (triggerpin = 0; triggerpin < 8; ++triggerpin)
ea9cfed7 1295 if ((ctx->trigger.risingmask | ctx->trigger.fallingmask) &
a42aec7f
HE
1296 (1 << triggerpin))
1297 break;
1298
1299 /* Set trigger pin and light LED on trigger. */
1300 triggerselect = (1 << LEDSEL1) | (triggerpin & 0x7);
1301
1302 /* Default rising edge. */
ea9cfed7 1303 if (ctx->trigger.fallingmask)
a42aec7f 1304 triggerselect |= 1 << 3;
57bbf56b 1305
eec5275e 1306 /* All other modes. */
ea9cfed7
UH
1307 } else if (ctx->cur_samplerate <= SR_MHZ(50)) {
1308 build_basic_trigger(&lut, ctx);
ee492173 1309
ea9cfed7 1310 sigma_write_trigger_lut(&lut, ctx);
57bbf56b
HE
1311
1312 triggerselect = (1 << LEDSEL1) | (1 << LEDSEL0);
1313 }
1314
eec5275e 1315 /* Setup trigger in and out pins to default values. */
57bbf56b
HE
1316 memset(&triggerinout_conf, 0, sizeof(struct triggerinout));
1317 triggerinout_conf.trgout_bytrigger = 1;
1318 triggerinout_conf.trgout_enable = 1;
1319
28a35d8a 1320 sigma_write_register(WRITE_TRIGGER_OPTION,
57bbf56b 1321 (uint8_t *) &triggerinout_conf,
ea9cfed7 1322 sizeof(struct triggerinout), ctx);
28a35d8a 1323
eec5275e 1324 /* Go back to normal mode. */
ea9cfed7 1325 sigma_set_register(WRITE_TRIGGER_SELECT1, triggerselect, ctx);
28a35d8a 1326
edca2c5c 1327 /* Set clock select register. */
ea9cfed7 1328 if (ctx->cur_samplerate == SR_MHZ(200))
edca2c5c 1329 /* Enable 4 probes. */
ea9cfed7
UH
1330 sigma_set_register(WRITE_CLOCK_SELECT, 0xf0, ctx);
1331 else if (ctx->cur_samplerate == SR_MHZ(100))
edca2c5c 1332 /* Enable 8 probes. */
ea9cfed7 1333 sigma_set_register(WRITE_CLOCK_SELECT, 0x00, ctx);
edca2c5c
HE
1334 else {
1335 /*
9ddb2a12 1336 * 50 MHz mode (or fraction thereof). Any fraction down to
eec5275e 1337 * 50 MHz / 256 can be used, but is not supported by sigrok API.
edca2c5c 1338 */
ea9cfed7 1339 frac = SR_MHZ(50) / ctx->cur_samplerate - 1;
edca2c5c 1340
9ddb2a12
UH
1341 clockselect.async = 0;
1342 clockselect.fraction = frac;
1343 clockselect.disabled_probes = 0;
edca2c5c
HE
1344
1345 sigma_write_register(WRITE_CLOCK_SELECT,
9ddb2a12 1346 (uint8_t *) &clockselect,
ea9cfed7 1347 sizeof(clockselect), ctx);
edca2c5c
HE
1348 }
1349
fefa1800 1350 /* Setup maximum post trigger time. */
99965709 1351 sigma_set_register(WRITE_POST_TRIGGER,
ea9cfed7 1352 (ctx->capture_ratio * 255) / 100, ctx);
28a35d8a 1353
eec5275e 1354 /* Start acqusition. */
ea9cfed7
UH
1355 gettimeofday(&ctx->start_tv, 0);
1356 sigma_set_register(WRITE_MODE, 0x0d, ctx);
99965709 1357
3cd3a20b 1358 ctx->session_dev_id = cb_data;
28a35d8a 1359
3c36c403
HE
1360 if (!(packet = g_try_malloc(sizeof(struct sr_datafeed_packet)))) {
1361 sr_err("sigma: %s: packet malloc failed.", __func__);
1362 return SR_ERR_MALLOC;
1363 }
1364
1365 if (!(header = g_try_malloc(sizeof(struct sr_datafeed_header)))) {
1366 sr_err("sigma: %s: header malloc failed.", __func__);
1367 return SR_ERR_MALLOC;
1368 }
28a35d8a 1369
57bbf56b 1370 /* Add capture source. */
6f1be0a2 1371 sr_source_add(0, G_IO_IN, 10, receive_data, sdi);
57bbf56b 1372
3c36c403
HE
1373 /* Send header packet to the session bus. */
1374 packet->type = SR_DF_HEADER;
1375 packet->payload = header;
1376 header->feed_version = 1;
1377 gettimeofday(&header->starttime, NULL);
1378 header->samplerate = ctx->cur_samplerate;
1379 header->num_logic_probes = ctx->num_probes;
1380 sr_session_send(ctx->session_dev_id, packet);
1381 g_free(header);
1382 g_free(packet);
1383
ea9cfed7 1384 ctx->state.state = SIGMA_CAPTURE;
6aac7737 1385
e46b8fb1 1386 return SR_OK;
28a35d8a
HE
1387}
1388
3cd3a20b 1389static int hw_dev_acquisition_stop(int dev_index, void *cb_data)
28a35d8a 1390{
d68e2d1a 1391 struct sr_dev_inst *sdi;
ea9cfed7 1392 struct context *ctx;
6aac7737
HE
1393 uint8_t modestatus;
1394
cb93f8a9 1395 /* Avoid compiler warnings. */
3cd3a20b 1396 (void)cb_data;
28a35d8a 1397
bb7ef793 1398 if (!(sdi = sr_dev_inst_get(dev_insts, dev_index))) {
7b48d6e1 1399 sr_err("sigma: %s: sdi was NULL", __func__);
3010f21c
UH
1400 return SR_ERR_BUG;
1401 }
1402
ea9cfed7 1403 if (!(ctx = sdi->priv)) {
7b48d6e1 1404 sr_err("sigma: %s: sdi->priv was NULL", __func__);
3010f21c
UH
1405 return SR_ERR_BUG;
1406 }
1407
fefa1800 1408 /* Stop acquisition. */
ea9cfed7 1409 sigma_set_register(WRITE_MODE, 0x11, ctx);
28a35d8a 1410
6aac7737 1411 /* Set SDRAM Read Enable. */
ea9cfed7 1412 sigma_set_register(WRITE_MODE, 0x02, ctx);
6aac7737
HE
1413
1414 /* Get the current position. */
ea9cfed7 1415 sigma_read_pos(&ctx->state.stoppos, &ctx->state.triggerpos, ctx);
6aac7737
HE
1416
1417 /* Check if trigger has fired. */
ea9cfed7 1418 modestatus = sigma_get_register(READ_MODE, ctx);
3010f21c 1419 if (modestatus & 0x20)
ea9cfed7 1420 ctx->state.triggerchunk = ctx->state.triggerpos / 512;
3010f21c 1421 else
ea9cfed7 1422 ctx->state.triggerchunk = -1;
6aac7737 1423
ea9cfed7 1424 ctx->state.chunks_downloaded = 0;
6aac7737 1425
ea9cfed7 1426 ctx->state.state = SIGMA_DOWNLOAD;
3010f21c
UH
1427
1428 return SR_OK;
28a35d8a
HE
1429}
1430
c09f0b57 1431SR_PRIV struct sr_dev_driver asix_sigma_driver_info = {
e519ba86
UH
1432 .name = "asix-sigma",
1433 .longname = "ASIX SIGMA",
1434 .api_version = 1,
1435 .init = hw_init,
1436 .cleanup = hw_cleanup,
e7eb703f
UH
1437 .dev_open = hw_dev_open,
1438 .dev_close = hw_dev_close,
5097b0d0 1439 .dev_info_get = hw_dev_info_get,
e7eb703f 1440 .dev_status_get = hw_dev_status_get,
ffedd0bf 1441 .hwcap_get_all = hw_hwcap_get_all,
a9a245b4 1442 .dev_config_set = hw_dev_config_set,
6b3dfec8
UH
1443 .dev_acquisition_start = hw_dev_acquisition_start,
1444 .dev_acquisition_stop = hw_dev_acquisition_stop,
28a35d8a 1445};