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