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