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