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