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