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