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