]> sigrok.org Git - libsigrok.git/blame - src/hardware/zeroplus-logic-cube/api.c
std_gvar_tuple_array(): Change to allow for more ARRAY_AND_SIZE usage.
[libsigrok.git] / src / hardware / zeroplus-logic-cube / api.c
CommitLineData
a1bb33af 1/*
50985c20 2 * This file is part of the libsigrok project.
a1bb33af 3 *
c73d2ea4 4 * Copyright (C) 2010-2012 Bert Vermeulen <bert@biot.com>
a1bb33af
UH
5 *
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19
6ec6c43b 20#include <config.h>
6d116114 21#include "protocol.h"
a1bb33af 22
a1bb33af
UH
23#define USB_INTERFACE 0
24#define USB_CONFIGURATION 1
25#define NUM_TRIGGER_STAGES 4
fed16f06 26#define PACKET_SIZE 2048 /* ?? */
a1bb33af 27
0ab0cb94
TY
28//#define ZP_EXPERIMENTAL
29
e495a676
UH
30struct zp_model {
31 uint16_t vid;
32 uint16_t pid;
2c240774 33 const char *model_name;
a1bb33af 34 unsigned int channels;
fed16f06 35 unsigned int sample_depth; /* In Ksamples/channel */
a1bb33af 36 unsigned int max_sampling_freq;
e495a676 37};
a1bb33af 38
fed16f06
UH
39/*
40 * Note -- 16032, 16064 and 16128 *usually* -- but not always -- have the
41 * same 128K sample depth.
42 */
e495a676 43static const struct zp_model zeroplus_models[] = {
9e5670d0 44 {0x0c12, 0x7002, "LAP-16128U", 16, 128, 200},
428edbe1 45 {0x0c12, 0x7009, "LAP-C(16064)", 16, 64, 100},
e495a676 46 {0x0c12, 0x700a, "LAP-C(16128)", 16, 128, 200},
5db0c668
RD
47 {0x0c12, 0x700b, "LAP-C(32128)", 32, 128, 200},
48 {0x0c12, 0x700c, "LAP-C(321000)", 32, 1024, 200},
49 {0x0c12, 0x700d, "LAP-C(322000)", 32, 2048, 200},
e495a676 50 {0x0c12, 0x700e, "LAP-C(16032)", 16, 32, 100},
428edbe1 51 {0x0c12, 0x7016, "LAP-C(162000)", 16, 2048, 200},
e3594306 52 {0x0c12, 0x7100, "AKIP-9101", 16, 256, 200},
9e9dba7b 53 ALL_ZERO
a1bb33af
UH
54};
55
716d6dfc 56static const uint32_t drvopts[] = {
1953564a 57 SR_CONF_LOGIC_ANALYZER,
716d6dfc
YS
58};
59
60static const uint32_t devopts[] = {
5827f61b
BV
61 SR_CONF_LIMIT_SAMPLES | SR_CONF_SET | SR_CONF_LIST,
62 SR_CONF_SAMPLERATE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
63 SR_CONF_TRIGGER_MATCH | SR_CONF_LIST,
64 SR_CONF_CAPTURE_RATIO | SR_CONF_GET | SR_CONF_SET,
65 SR_CONF_VOLTAGE_THRESHOLD | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
a1bb33af
UH
66};
67
28731bab
BV
68static const int32_t trigger_matches[] = {
69 SR_TRIGGER_ZERO,
70 SR_TRIGGER_ONE,
71};
72
d261dbbf 73/*
ba7dd8bb 74 * ZEROPLUS LAP-C (16032) numbers the 16 channels A0-A7 and B0-B7.
d261dbbf
UH
75 * We currently ignore other untested/unsupported devices here.
76 */
ba7dd8bb 77static const char *channel_names[] = {
78693401
UH
78 "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7",
79 "B0", "B1", "B2", "B3", "B4", "B5", "B6", "B7",
5db0c668
RD
80 "C0", "C1", "C2", "C3", "C4", "C5", "C6", "C7",
81 "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
464d12c7
KS
82};
83
fed16f06
UH
84/*
85 * The hardware supports more samplerates than these, but these are the
86 * options hardcoded into the vendor's Windows GUI.
87 */
a1bb33af 88
8386096f 89static const uint64_t samplerates_100[] = {
17548571
UH
90 SR_HZ(100),
91 SR_HZ(500),
92 SR_KHZ(1),
93 SR_KHZ(5),
94 SR_KHZ(25),
95 SR_KHZ(50),
96 SR_KHZ(100),
97 SR_KHZ(200),
98 SR_KHZ(400),
99 SR_KHZ(800),
100 SR_MHZ(1),
101 SR_MHZ(10),
102 SR_MHZ(25),
103 SR_MHZ(50),
104 SR_MHZ(80),
105 SR_MHZ(100),
17548571
UH
106};
107
8386096f 108const uint64_t samplerates_200[] = {
c9140419
UH
109 SR_HZ(100),
110 SR_HZ(500),
59df0c77
UH
111 SR_KHZ(1),
112 SR_KHZ(5),
113 SR_KHZ(25),
114 SR_KHZ(50),
115 SR_KHZ(100),
116 SR_KHZ(200),
117 SR_KHZ(400),
118 SR_KHZ(800),
119 SR_MHZ(1),
120 SR_MHZ(10),
121 SR_MHZ(25),
122 SR_MHZ(50),
123 SR_MHZ(80),
124 SR_MHZ(100),
125 SR_MHZ(150),
126 SR_MHZ(200),
bf43ea23 127};
a1bb33af 128
3316e149
BV
129SR_PRIV int zp_set_samplerate(struct dev_context *devc, uint64_t samplerate)
130{
131 int i;
132
133 for (i = 0; ARRAY_SIZE(samplerates_200); i++)
134 if (samplerate == samplerates_200[i])
135 break;
136
137 if (i == ARRAY_SIZE(samplerates_200) || samplerate > devc->max_samplerate) {
138 sr_err("Unsupported samplerate: %" PRIu64 "Hz.", samplerate);
139 return SR_ERR_ARG;
140 }
141
142 sr_info("Setting samplerate to %" PRIu64 "Hz.", samplerate);
143
144 if (samplerate >= SR_MHZ(1))
145 analyzer_set_freq(samplerate / SR_MHZ(1), FREQ_SCALE_MHZ);
146 else if (samplerate >= SR_KHZ(1))
147 analyzer_set_freq(samplerate / SR_KHZ(1), FREQ_SCALE_KHZ);
148 else
149 analyzer_set_freq(samplerate, FREQ_SCALE_HZ);
150
151 devc->cur_samplerate = samplerate;
152
153 return SR_OK;
154}
155
4f840ce9 156static GSList *scan(struct sr_dev_driver *di, GSList *options)
a1bb33af 157{
d68e2d1a 158 struct sr_dev_inst *sdi;
310e9e9b
BV
159 struct drv_context *drvc;
160 struct dev_context *devc;
e495a676 161 const struct zp_model *prof;
a1bb33af 162 struct libusb_device_descriptor des;
ee4f9bb1 163 struct libusb_device_handle *hdl;
a1bb33af 164 libusb_device **devlist;
428edbe1 165 GSList *devices;
ee4f9bb1
SA
166 int ret, i, j;
167 char serial_num[64], connection_id[64];
a1bb33af 168
4ca38984 169 (void)options;
64d33dc2 170
41812aca 171 drvc = di->context;
4b97c74e 172
4ca38984
BV
173 devices = NULL;
174
8fdecced 175 /* Find all ZEROPLUS analyzers and add them to device list. */
d4abb463 176 libusb_get_device_list(drvc->sr_ctx->libusb_ctx, &devlist); /* TODO: Errors. */
fed16f06
UH
177
178 for (i = 0; devlist[i]; i++) {
2a8f2d41 179 libusb_get_device_descriptor(devlist[i], &des);
a1bb33af 180
ee4f9bb1
SA
181 if ((ret = libusb_open(devlist[i], &hdl)) < 0)
182 continue;
183
184 if (des.iSerialNumber == 0) {
185 serial_num[0] = '\0';
186 } else if ((ret = libusb_get_string_descriptor_ascii(hdl,
187 des.iSerialNumber, (unsigned char *) serial_num,
188 sizeof(serial_num))) < 0) {
189 sr_warn("Failed to get serial number string descriptor: %s.",
190 libusb_error_name(ret));
191 continue;
192 }
193
194 libusb_close(hdl);
195
196 usb_get_port_path(devlist[i], connection_id, sizeof(connection_id));
197
428edbe1
BV
198 prof = NULL;
199 for (j = 0; j < zeroplus_models[j].vid; j++) {
200 if (des.idVendor == zeroplus_models[j].vid &&
201 des.idProduct == zeroplus_models[j].pid) {
202 prof = &zeroplus_models[j];
bf43ea23 203 }
a1bb33af 204 }
ca314e06 205
428edbe1
BV
206 if (!prof)
207 continue;
e495a676 208 sr_info("Found ZEROPLUS %s.", prof->model_name);
428edbe1 209
aac29cc1 210 sdi = g_malloc0(sizeof(struct sr_dev_inst));
0af636be 211 sdi->status = SR_ST_INACTIVE;
b15ff1c9 212 sdi->vendor = g_strdup("ZEROPLUS");
0af636be 213 sdi->model = g_strdup(prof->model_name);
ee4f9bb1
SA
214 sdi->serial_num = g_strdup(serial_num);
215 sdi->connection_id = g_strdup(connection_id);
428edbe1 216
f57d8ffe 217 devc = g_malloc0(sizeof(struct dev_context));
310e9e9b 218 sdi->priv = devc;
17548571 219 devc->prof = prof;
310e9e9b 220 devc->num_channels = prof->channels;
0ab0cb94 221#ifdef ZP_EXPERIMENTAL
e93fb98b 222 devc->max_sample_depth = 128 * 1024;
0ab0cb94
TY
223 devc->max_samplerate = 200;
224#else
e93fb98b 225 devc->max_sample_depth = prof->sample_depth * 1024;
0ab0cb94
TY
226 devc->max_samplerate = prof->max_sampling_freq;
227#endif
228 devc->max_samplerate *= SR_MHZ(1);
229 devc->memory_size = MEMORY_SIZE_8K;
310e9e9b 230 // memset(devc->trigger_buffer, 0, NUM_TRIGGER_STAGES);
428edbe1 231
5e23fcab
ML
232 for (j = 0; j < devc->num_channels; j++)
233 sr_channel_new(sdi, j, SR_CHANNEL_LOGIC, TRUE,
c368e6f3 234 channel_names[j]);
428edbe1
BV
235
236 devices = g_slist_append(devices, sdi);
8111446a 237 sdi->inst_type = SR_INST_USB;
609bfd75 238 sdi->conn = sr_usb_dev_inst_new(
428edbe1
BV
239 libusb_get_bus_number(devlist[i]),
240 libusb_get_device_address(devlist[i]), NULL);
a1bb33af
UH
241 }
242 libusb_free_device_list(devlist, 1);
243
15a5bfe4 244 return std_scan_complete(di, devices);
a1bb33af
UH
245}
246
6078d2c9 247static int dev_open(struct sr_dev_inst *sdi)
a1bb33af 248{
4f840ce9 249 struct sr_dev_driver *di = sdi->driver;
310e9e9b 250 struct dev_context *devc;
e495a676 251 struct drv_context *drvc;
609bfd75 252 struct sr_usb_dev_inst *usb;
87629577 253 int ret;
a1bb33af 254
41812aca 255 drvc = di->context;
609bfd75 256 usb = sdi->conn;
61c90858 257 devc = sdi->priv;
bf43ea23 258
87629577
LPC
259 ret = sr_usb_open(drvc->sr_ctx->libusb_ctx, usb);
260 if (ret != SR_OK)
261 return ret;
428edbe1 262
609bfd75 263 ret = libusb_set_configuration(usb->devhdl, USB_CONFIGURATION);
ebc34738 264 if (ret < 0) {
6d116114 265 sr_err("Unable to set USB configuration %d: %s.",
d4928d71 266 USB_CONFIGURATION, libusb_error_name(ret));
185ae2c5
UH
267 return SR_ERR;
268 }
269
609bfd75 270 ret = libusb_claim_interface(usb->devhdl, USB_INTERFACE);
ebc34738 271 if (ret != 0) {
6d116114 272 sr_err("Unable to claim interface: %s.",
d4928d71 273 libusb_error_name(ret));
e46b8fb1 274 return SR_ERR;
a1bb33af 275 }
185ae2c5 276
e495a676 277 /* Set default configuration after power on. */
609bfd75
BV
278 if (analyzer_read_status(usb->devhdl) == 0)
279 analyzer_configure(usb->devhdl);
0ab0cb94 280
609bfd75
BV
281 analyzer_reset(usb->devhdl);
282 analyzer_initialize(usb->devhdl);
a1bb33af 283
0ab0cb94 284 //analyzer_set_memory_size(MEMORY_SIZE_512K);
fed16f06 285 // analyzer_set_freq(g_freq, g_freq_scale);
a1bb33af 286 analyzer_set_trigger_count(1);
408e7199
UH
287 // analyzer_set_ramsize_trigger_address((((100 - g_pre_trigger)
288 // * get_memory_size(g_memory_size)) / 100) >> 2);
a1bb33af 289
fed16f06
UH
290#if 0
291 if (g_double_mode == 1)
a1bb33af
UH
292 analyzer_set_compression(COMPRESSION_DOUBLE);
293 else if (g_compression == 1)
294 analyzer_set_compression(COMPRESSION_ENABLE);
fed16f06
UH
295 else
296#endif
297 analyzer_set_compression(COMPRESSION_NONE);
a1bb33af 298
310e9e9b 299 if (devc->cur_samplerate == 0) {
0ab0cb94
TY
300 /* Samplerate hasn't been set. Default to 1MHz. */
301 analyzer_set_freq(1, FREQ_SCALE_MHZ);
302 devc->cur_samplerate = SR_MHZ(1);
a1bb33af
UH
303 }
304
7142d6b9
RD
305 if (devc->cur_threshold == 0)
306 set_voltage_threshold(devc, 1.5);
307
e46b8fb1 308 return SR_OK;
a1bb33af
UH
309}
310
6078d2c9 311static int dev_close(struct sr_dev_inst *sdi)
a1bb33af 312{
609bfd75 313 struct sr_usb_dev_inst *usb;
a1bb33af 314
609bfd75 315 usb = sdi->conn;
697785d1 316
609bfd75 317 if (!usb->devhdl)
f1ba6b4b 318 return SR_ERR_BUG;
25a0f108 319
ee4f9bb1
SA
320 sr_info("Closing device on %d.%d (logical) / %s (physical) interface %d.",
321 usb->bus, usb->address, sdi->connection_id, USB_INTERFACE);
609bfd75
BV
322 libusb_release_interface(usb->devhdl, USB_INTERFACE);
323 libusb_reset_device(usb->devhdl);
324 libusb_close(usb->devhdl);
325 usb->devhdl = NULL;
697785d1
UH
326
327 return SR_OK;
a1bb33af
UH
328}
329
584560f1 330static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi,
53b4680f 331 const struct sr_channel_group *cg)
a1bb33af 332{
310e9e9b 333 struct dev_context *devc;
dcd438ee 334 GVariant *range[2];
a1bb33af 335
53b4680f 336 (void)cg;
8f996b89 337
dcd438ee
UH
338 if (!sdi)
339 return SR_ERR_ARG;
340
341 devc = sdi->priv;
342
584560f1 343 switch (key) {
123e1313 344 case SR_CONF_SAMPLERATE:
dcd438ee 345 *data = g_variant_new_uint64(devc->cur_samplerate);
bf43ea23 346 break;
05f853b5 347 case SR_CONF_CAPTURE_RATIO:
dcd438ee 348 *data = g_variant_new_uint64(devc->capture_ratio);
05f853b5 349 break;
7142d6b9 350 case SR_CONF_VOLTAGE_THRESHOLD:
dcd438ee
UH
351 range[0] = g_variant_new_double(devc->cur_threshold);
352 range[1] = g_variant_new_double(devc->cur_threshold);
353 *data = g_variant_new_tuple(range, 2);
67055d4c 354 break;
bf43ea23 355 default:
bd6fbf62 356 return SR_ERR_NA;
a1bb33af
UH
357 }
358
626409ab 359 return SR_OK;
a1bb33af
UH
360}
361
584560f1 362static int config_set(uint32_t key, GVariant *data, const struct sr_dev_inst *sdi,
53b4680f 363 const struct sr_channel_group *cg)
a1bb33af 364{
310e9e9b 365 struct dev_context *devc;
7142d6b9 366 gdouble low, high;
a1bb33af 367
53b4680f 368 (void)cg;
8f996b89 369
b0baddef 370 devc = sdi->priv;
a1bb33af 371
584560f1 372 switch (key) {
1953564a 373 case SR_CONF_SAMPLERATE:
8386096f 374 return zp_set_samplerate(devc, g_variant_get_uint64(data));
1953564a 375 case SR_CONF_LIMIT_SAMPLES:
8386096f 376 return set_limit_samples(devc, g_variant_get_uint64(data));
1953564a 377 case SR_CONF_CAPTURE_RATIO:
8386096f 378 return set_capture_ratio(devc, g_variant_get_uint64(data));
7142d6b9
RD
379 case SR_CONF_VOLTAGE_THRESHOLD:
380 g_variant_get(data, "(dd)", &low, &high);
381 return set_voltage_threshold(devc, (low + high) / 2.0);
fed16f06 382 default:
bd6fbf62 383 return SR_ERR_NA;
a1bb33af 384 }
e495a676
UH
385
386 return SR_OK;
a1bb33af
UH
387}
388
584560f1 389static int config_list(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi,
53b4680f 390 const struct sr_channel_group *cg)
a1c743fc 391{
17548571 392 struct dev_context *devc;
7bc3cfe6 393 GVariant *grange[2];
a1c743fc
BV
394
395 switch (key) {
9a6517d1 396 case SR_CONF_DEVICE_OPTIONS:
e66d1892 397 return STD_CONFIG_LIST(key, data, sdi, cg, NULL, drvopts, devopts);
a1c743fc 398 case SR_CONF_SAMPLERATE:
17548571 399 devc = sdi->priv;
463160cb 400 if (devc->prof->max_sampling_freq == 100)
53012da6 401 *data = std_gvar_samplerates(ARRAY_AND_SIZE(samplerates_100));
463160cb 402 else if (devc->prof->max_sampling_freq == 200)
53012da6 403 *data = std_gvar_samplerates(ARRAY_AND_SIZE(samplerates_200));
463160cb 404 else {
17548571
UH
405 sr_err("Internal error: Unknown max. samplerate: %d.",
406 devc->prof->max_sampling_freq);
407 return SR_ERR_ARG;
408 }
a1c743fc 409 break;
28731bab 410 case SR_CONF_TRIGGER_MATCH:
53012da6 411 *data = std_gvar_array_i32(ARRAY_AND_SIZE(trigger_matches));
c50277a6 412 break;
7142d6b9 413 case SR_CONF_VOLTAGE_THRESHOLD:
7bc3cfe6 414 *data = std_gvar_min_max_step_thresholds(-6.0, 6.0, 0.1);
7142d6b9 415 break;
f0de2dd0
BV
416 case SR_CONF_LIMIT_SAMPLES:
417 if (!sdi)
418 return SR_ERR_ARG;
419 devc = sdi->priv;
420 grange[0] = g_variant_new_uint64(0);
421 grange[1] = g_variant_new_uint64(devc->max_sample_depth);
422 *data = g_variant_new_tuple(grange, 2);
423 break;
a1c743fc 424 default:
bd6fbf62 425 return SR_ERR_NA;
a1c743fc
BV
426 }
427
428 return SR_OK;
429}
430
695dc859 431static int dev_acquisition_start(const struct sr_dev_inst *sdi)
a1bb33af 432{
609bfd75
BV
433 struct dev_context *devc;
434 struct sr_usb_dev_inst *usb;
b9c735a2 435 struct sr_datafeed_packet packet;
9c939c51 436 struct sr_datafeed_logic logic;
42ceb777 437 unsigned int samples_read;
a1bb33af 438 int res;
e495a676 439 unsigned int packet_num, n;
a1bb33af 440 unsigned char *buf;
42ceb777
RD
441 unsigned int status;
442 unsigned int stop_address;
443 unsigned int now_address;
444 unsigned int trigger_address;
445 unsigned int trigger_offset;
446 unsigned int triggerbar;
447 unsigned int ramsize_trigger;
448 unsigned int memory_size;
449 unsigned int valid_samples;
450 unsigned int discard;
451 int trigger_now;
a1bb33af 452
208c1d35 453 devc = sdi->priv;
a1bb33af 454
28731bab
BV
455 if (analyzer_add_triggers(sdi) != SR_OK) {
456 sr_err("Failed to configure triggers.");
014359e3
BV
457 return SR_ERR;
458 }
459
609bfd75
BV
460 usb = sdi->conn;
461
0ab0cb94
TY
462 set_triggerbar(devc);
463
e495a676 464 /* Push configured settings to device. */
609bfd75 465 analyzer_configure(usb->devhdl);
a143e4e5 466
609bfd75 467 analyzer_start(usb->devhdl);
6d116114 468 sr_info("Waiting for data.");
609bfd75 469 analyzer_wait_data(usb->devhdl);
a1bb33af 470
42ceb777
RD
471 status = analyzer_read_status(usb->devhdl);
472 stop_address = analyzer_get_stop_address(usb->devhdl);
473 now_address = analyzer_get_now_address(usb->devhdl);
474 trigger_address = analyzer_get_trigger_address(usb->devhdl);
475
476 triggerbar = analyzer_get_triggerbar_address();
477 ramsize_trigger = analyzer_get_ramsize_trigger_address();
478
479 n = get_memory_size(devc->memory_size);
480 memory_size = n / 4;
481
482 sr_info("Status = 0x%x.", status);
483 sr_info("Stop address = 0x%x.", stop_address);
484 sr_info("Now address = 0x%x.", now_address);
485 sr_info("Trigger address = 0x%x.", trigger_address);
486 sr_info("Triggerbar address = 0x%x.", triggerbar);
487 sr_info("Ramsize trigger = 0x%x.", ramsize_trigger);
488 sr_info("Memory size = 0x%x.", memory_size);
a1bb33af 489
bee2b016 490 std_session_send_df_header(sdi);
f366e86c 491
42ceb777
RD
492 /* Check for empty capture */
493 if ((status & STATUS_READY) && !stop_address) {
bee2b016 494 std_session_send_df_end(sdi);
42ceb777
RD
495 return SR_OK;
496 }
497
a95f142e 498 buf = g_malloc(PACKET_SIZE);
b53738ba 499
42ceb777
RD
500 /* Check if the trigger is in the samples we are throwing away */
501 trigger_now = now_address == trigger_address ||
502 ((now_address + 1) % memory_size) == trigger_address;
503
504 /*
505 * STATUS_READY doesn't clear until now_address advances past
506 * addr 0, but for our logic, clear it in that case
507 */
508 if (!now_address)
509 status &= ~STATUS_READY;
510
609bfd75 511 analyzer_read_start(usb->devhdl);
42ceb777
RD
512
513 /* Calculate how much data to discard */
514 discard = 0;
515 if (status & STATUS_READY) {
516 /*
517 * We haven't wrapped around, we need to throw away data from
518 * our current position to the end of the buffer.
519 * Additionally, the first two samples captured are always
520 * bogus.
521 */
522 discard += memory_size - now_address + 2;
523 now_address = 2;
524 }
525
526 /* If we have more samples than we need, discard them */
527 valid_samples = (stop_address - now_address) % memory_size;
528 if (valid_samples > ramsize_trigger + triggerbar) {
529 discard += valid_samples - (ramsize_trigger + triggerbar);
530 now_address += valid_samples - (ramsize_trigger + triggerbar);
531 }
532
533 sr_info("Need to discard %d samples.", discard);
534
535 /* Calculate how far in the trigger is */
536 if (trigger_now)
537 trigger_offset = 0;
538 else
539 trigger_offset = (trigger_address - now_address) % memory_size;
540
541 /* Recalculate the number of samples available */
542 valid_samples = (stop_address - now_address) % memory_size;
543
fed16f06 544 /* Send the incoming transfer to the session bus. */
42ceb777 545 samples_read = 0;
0ab0cb94 546 for (packet_num = 0; packet_num < n / PACKET_SIZE; packet_num++) {
42ceb777
RD
547 unsigned int len;
548 unsigned int buf_offset;
549
609bfd75 550 res = analyzer_read_data(usb->devhdl, buf, PACKET_SIZE);
6d116114 551 sr_info("Tried to read %d bytes, actually read %d bytes.",
b08024a8 552 PACKET_SIZE, res);
a1bb33af 553
42ceb777
RD
554 if (discard >= PACKET_SIZE / 4) {
555 discard -= PACKET_SIZE / 4;
556 continue;
557 }
558
559 len = PACKET_SIZE - discard * 4;
560 buf_offset = discard * 4;
561 discard = 0;
562
563 /* Check if we've read all the samples */
564 if (samples_read + len / 4 >= valid_samples)
565 len = (valid_samples - samples_read) * 4;
566 if (!len)
567 break;
568
569 if (samples_read < trigger_offset &&
570 samples_read + len / 4 > trigger_offset) {
571 /* Send out samples remaining before trigger */
572 packet.type = SR_DF_LOGIC;
573 packet.payload = &logic;
574 logic.length = (trigger_offset - samples_read) * 4;
575 logic.unitsize = 4;
576 logic.data = buf + buf_offset;
695dc859 577 sr_session_send(sdi, &packet);
42ceb777
RD
578 len -= logic.length;
579 samples_read += logic.length / 4;
580 buf_offset += logic.length;
581 }
582
583 if (samples_read == trigger_offset) {
584 /* Send out trigger */
585 packet.type = SR_DF_TRIGGER;
586 packet.payload = NULL;
695dc859 587 sr_session_send(sdi, &packet);
42ceb777
RD
588 }
589
590 /* Send out data (or data after trigger) */
5a2326a7 591 packet.type = SR_DF_LOGIC;
9c939c51 592 packet.payload = &logic;
42ceb777 593 logic.length = len;
9c939c51 594 logic.unitsize = 4;
42ceb777 595 logic.data = buf + buf_offset;
695dc859 596 sr_session_send(sdi, &packet);
42ceb777 597 samples_read += len / 4;
a1bb33af 598 }
609bfd75 599 analyzer_read_stop(usb->devhdl);
a1bb33af
UH
600 g_free(buf);
601
bee2b016 602 std_session_send_df_end(sdi);
a1bb33af 603
e46b8fb1 604 return SR_OK;
a1bb33af
UH
605}
606
695dc859 607static int dev_acquisition_stop(struct sr_dev_inst *sdi)
a1bb33af 608{
609bfd75 609 struct sr_usb_dev_inst *usb;
a1bb33af 610
bee2b016 611 std_session_send_df_end(sdi);
a1bb33af 612
609bfd75
BV
613 usb = sdi->conn;
614 analyzer_reset(usb->devhdl);
fed16f06 615 /* TODO: Need to cancel and free any queued up transfers. */
3010f21c
UH
616
617 return SR_OK;
a1bb33af
UH
618}
619
dd5c48a6 620static struct sr_dev_driver zeroplus_logic_cube_driver_info = {
e519ba86 621 .name = "zeroplus-logic-cube",
8fdecced 622 .longname = "ZEROPLUS Logic Cube LAP-C series",
e519ba86 623 .api_version = 1,
c2fdcc25 624 .init = std_init,
700d6b64 625 .cleanup = std_cleanup,
6078d2c9 626 .scan = scan,
c01bf34c 627 .dev_list = std_dev_list,
f778bf02 628 .dev_clear = std_dev_clear,
035a1078
BV
629 .config_get = config_get,
630 .config_set = config_set,
a1c743fc 631 .config_list = config_list,
6078d2c9
UH
632 .dev_open = dev_open,
633 .dev_close = dev_close,
634 .dev_acquisition_start = dev_acquisition_start,
635 .dev_acquisition_stop = dev_acquisition_stop,
41812aca 636 .context = NULL,
a1bb33af 637};
dd5c48a6 638SR_REGISTER_DEV_DRIVER(zeroplus_logic_cube_driver_info);