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