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