]> sigrok.org Git - libsigrok.git/blame - src/hardware/zeroplus-logic-cube/api.c
output/csv: use intermediate time_t var, silence compiler warning
[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;
076d59b7
GS
172 int ret;
173 size_t i, j;
174 uint8_t bus, addr;
fd86380b 175 const struct zp_model *check;
ee4f9bb1 176 char serial_num[64], connection_id[64];
a1bb33af 177
4ca38984 178 (void)options;
64d33dc2 179
41812aca 180 drvc = di->context;
4b97c74e 181
4ca38984
BV
182 devices = NULL;
183
8fdecced 184 /* Find all ZEROPLUS analyzers and add them to device list. */
d4abb463 185 libusb_get_device_list(drvc->sr_ctx->libusb_ctx, &devlist); /* TODO: Errors. */
fed16f06 186 for (i = 0; devlist[i]; i++) {
2a8f2d41 187 libusb_get_device_descriptor(devlist[i], &des);
a1bb33af 188
fd86380b
GS
189 /*
190 * Check for expected VID:PID first as soon as we got
191 * the descriptor's content. This avoids access to flaky
192 * unrelated devices which trouble the application even
193 * if they are unrelated to measurement purposes.
194 *
195 * See https://sigrok.org/bugzilla/show_bug.cgi?id=1115
196 * and https://github.com/sigrokproject/libsigrok/pull/165
197 * for a discussion.
198 */
199 prof = NULL;
200 for (j = 0; zeroplus_models[j].vid; j++) {
201 check = &zeroplus_models[j];
202 if (des.idVendor != check->vid)
203 continue;
204 if (des.idProduct != check->pid)
205 continue;
206 prof = check;
207 break;
208 }
209 if (!prof)
210 continue;
211
212 /* Get the device's serial number from USB strings. */
076d59b7
GS
213 ret = libusb_open(devlist[i], &hdl);
214 if (ret < 0)
ee4f9bb1
SA
215 continue;
216
076d59b7
GS
217 serial_num[0] = '\0';
218 if (des.iSerialNumber != 0) {
219 ret = libusb_get_string_descriptor_ascii(hdl,
220 des.iSerialNumber,
221 (uint8_t *)serial_num, sizeof(serial_num));
222 if (ret < 0) {
223 sr_warn("Cannot get USB serial number: %s.",
224 libusb_error_name(ret));
225 continue;
226 }
ee4f9bb1
SA
227 }
228
229 libusb_close(hdl);
230
6c1a76d1
RT
231 if (usb_get_port_path(devlist[i], connection_id, sizeof(connection_id)) < 0)
232 continue;
ee4f9bb1 233
e495a676 234 sr_info("Found ZEROPLUS %s.", prof->model_name);
428edbe1 235
076d59b7 236 sdi = g_malloc0(sizeof(*sdi));
0af636be 237 sdi->status = SR_ST_INACTIVE;
b15ff1c9 238 sdi->vendor = g_strdup("ZEROPLUS");
0af636be 239 sdi->model = g_strdup(prof->model_name);
ee4f9bb1
SA
240 sdi->serial_num = g_strdup(serial_num);
241 sdi->connection_id = g_strdup(connection_id);
428edbe1 242
076d59b7
GS
243 bus = libusb_get_bus_number(devlist[i]);
244 addr = libusb_get_device_address(devlist[i]);
245 sdi->inst_type = SR_INST_USB;
246 sdi->conn = sr_usb_dev_inst_new(bus, addr, NULL);
247
248 devc = g_malloc0(sizeof(*devc));
310e9e9b 249 sdi->priv = devc;
17548571 250 devc->prof = prof;
310e9e9b 251 devc->num_channels = prof->channels;
0ab0cb94 252#ifdef ZP_EXPERIMENTAL
e93fb98b 253 devc->max_sample_depth = 128 * 1024;
0ab0cb94
TY
254 devc->max_samplerate = 200;
255#else
e93fb98b 256 devc->max_sample_depth = prof->sample_depth * 1024;
0ab0cb94
TY
257 devc->max_samplerate = prof->max_sampling_freq;
258#endif
259 devc->max_samplerate *= SR_MHZ(1);
260 devc->memory_size = MEMORY_SIZE_8K;
428edbe1 261
076d59b7 262 for (j = 0; j < devc->num_channels; j++) {
5e23fcab 263 sr_channel_new(sdi, j, SR_CHANNEL_LOGIC, TRUE,
c368e6f3 264 channel_names[j]);
076d59b7 265 }
428edbe1
BV
266
267 devices = g_slist_append(devices, sdi);
a1bb33af
UH
268 }
269 libusb_free_device_list(devlist, 1);
270
15a5bfe4 271 return std_scan_complete(di, devices);
a1bb33af
UH
272}
273
6078d2c9 274static int dev_open(struct sr_dev_inst *sdi)
a1bb33af 275{
4f840ce9 276 struct sr_dev_driver *di = sdi->driver;
310e9e9b 277 struct dev_context *devc;
e495a676 278 struct drv_context *drvc;
609bfd75 279 struct sr_usb_dev_inst *usb;
87629577 280 int ret;
a1bb33af 281
41812aca 282 drvc = di->context;
609bfd75 283 usb = sdi->conn;
61c90858 284 devc = sdi->priv;
bf43ea23 285
87629577
LPC
286 ret = sr_usb_open(drvc->sr_ctx->libusb_ctx, usb);
287 if (ret != SR_OK)
288 return ret;
428edbe1 289
609bfd75 290 ret = libusb_set_configuration(usb->devhdl, USB_CONFIGURATION);
ebc34738 291 if (ret < 0) {
6d116114 292 sr_err("Unable to set USB configuration %d: %s.",
d4928d71 293 USB_CONFIGURATION, libusb_error_name(ret));
185ae2c5
UH
294 return SR_ERR;
295 }
296
609bfd75 297 ret = libusb_claim_interface(usb->devhdl, USB_INTERFACE);
ebc34738 298 if (ret != 0) {
6d116114 299 sr_err("Unable to claim interface: %s.",
d4928d71 300 libusb_error_name(ret));
e46b8fb1 301 return SR_ERR;
a1bb33af 302 }
185ae2c5 303
e495a676 304 /* Set default configuration after power on. */
609bfd75
BV
305 if (analyzer_read_status(usb->devhdl) == 0)
306 analyzer_configure(usb->devhdl);
0ab0cb94 307
609bfd75
BV
308 analyzer_reset(usb->devhdl);
309 analyzer_initialize(usb->devhdl);
a1bb33af 310
0ab0cb94 311 //analyzer_set_memory_size(MEMORY_SIZE_512K);
fed16f06 312 // analyzer_set_freq(g_freq, g_freq_scale);
a1bb33af 313 analyzer_set_trigger_count(1);
408e7199
UH
314 // analyzer_set_ramsize_trigger_address((((100 - g_pre_trigger)
315 // * get_memory_size(g_memory_size)) / 100) >> 2);
a1bb33af 316
fed16f06
UH
317#if 0
318 if (g_double_mode == 1)
a1bb33af
UH
319 analyzer_set_compression(COMPRESSION_DOUBLE);
320 else if (g_compression == 1)
321 analyzer_set_compression(COMPRESSION_ENABLE);
fed16f06
UH
322 else
323#endif
324 analyzer_set_compression(COMPRESSION_NONE);
a1bb33af 325
310e9e9b 326 if (devc->cur_samplerate == 0) {
0ab0cb94
TY
327 /* Samplerate hasn't been set. Default to 1MHz. */
328 analyzer_set_freq(1, FREQ_SCALE_MHZ);
329 devc->cur_samplerate = SR_MHZ(1);
a1bb33af
UH
330 }
331
7142d6b9
RD
332 if (devc->cur_threshold == 0)
333 set_voltage_threshold(devc, 1.5);
334
e46b8fb1 335 return SR_OK;
a1bb33af
UH
336}
337
6078d2c9 338static int dev_close(struct sr_dev_inst *sdi)
a1bb33af 339{
609bfd75 340 struct sr_usb_dev_inst *usb;
a1bb33af 341
609bfd75 342 usb = sdi->conn;
697785d1 343
609bfd75 344 if (!usb->devhdl)
f1ba6b4b 345 return SR_ERR_BUG;
25a0f108 346
ee4f9bb1
SA
347 sr_info("Closing device on %d.%d (logical) / %s (physical) interface %d.",
348 usb->bus, usb->address, sdi->connection_id, USB_INTERFACE);
609bfd75
BV
349 libusb_release_interface(usb->devhdl, USB_INTERFACE);
350 libusb_reset_device(usb->devhdl);
351 libusb_close(usb->devhdl);
352 usb->devhdl = NULL;
697785d1
UH
353
354 return SR_OK;
a1bb33af
UH
355}
356
dd7a72ea
UH
357static int config_get(uint32_t key, GVariant **data,
358 const struct sr_dev_inst *sdi, const struct sr_channel_group *cg)
a1bb33af 359{
310e9e9b 360 struct dev_context *devc;
a1bb33af 361
53b4680f 362 (void)cg;
8f996b89 363
dcd438ee
UH
364 if (!sdi)
365 return SR_ERR_ARG;
366
367 devc = sdi->priv;
368
584560f1 369 switch (key) {
123e1313 370 case SR_CONF_SAMPLERATE:
dcd438ee 371 *data = g_variant_new_uint64(devc->cur_samplerate);
bf43ea23 372 break;
05f853b5 373 case SR_CONF_CAPTURE_RATIO:
dcd438ee 374 *data = g_variant_new_uint64(devc->capture_ratio);
05f853b5 375 break;
7142d6b9 376 case SR_CONF_VOLTAGE_THRESHOLD:
43995cda 377 *data = std_gvar_tuple_double(devc->cur_threshold, devc->cur_threshold);
67055d4c 378 break;
bf43ea23 379 default:
bd6fbf62 380 return SR_ERR_NA;
a1bb33af
UH
381 }
382
626409ab 383 return SR_OK;
a1bb33af
UH
384}
385
dd7a72ea
UH
386static int config_set(uint32_t key, GVariant *data,
387 const struct sr_dev_inst *sdi, const struct sr_channel_group *cg)
a1bb33af 388{
310e9e9b 389 struct dev_context *devc;
7142d6b9 390 gdouble low, high;
a1bb33af 391
53b4680f 392 (void)cg;
8f996b89 393
b0baddef 394 devc = sdi->priv;
a1bb33af 395
584560f1 396 switch (key) {
1953564a 397 case SR_CONF_SAMPLERATE:
8386096f 398 return zp_set_samplerate(devc, g_variant_get_uint64(data));
1953564a 399 case SR_CONF_LIMIT_SAMPLES:
8386096f 400 return set_limit_samples(devc, g_variant_get_uint64(data));
1953564a 401 case SR_CONF_CAPTURE_RATIO:
efad7ccc
UH
402 devc->capture_ratio = g_variant_get_uint64(data);
403 break;
7142d6b9
RD
404 case SR_CONF_VOLTAGE_THRESHOLD:
405 g_variant_get(data, "(dd)", &low, &high);
406 return set_voltage_threshold(devc, (low + high) / 2.0);
fed16f06 407 default:
bd6fbf62 408 return SR_ERR_NA;
a1bb33af 409 }
e495a676
UH
410
411 return SR_OK;
a1bb33af
UH
412}
413
dd7a72ea
UH
414static int config_list(uint32_t key, GVariant **data,
415 const struct sr_dev_inst *sdi, const struct sr_channel_group *cg)
a1c743fc 416{
17548571 417 struct dev_context *devc;
a1c743fc
BV
418
419 switch (key) {
9a6517d1 420 case SR_CONF_DEVICE_OPTIONS:
23772462 421 return STD_CONFIG_LIST(key, data, sdi, cg, NO_OPTS, drvopts, devopts);
a1c743fc 422 case SR_CONF_SAMPLERATE:
17548571 423 devc = sdi->priv;
463160cb 424 if (devc->prof->max_sampling_freq == 100)
53012da6 425 *data = std_gvar_samplerates(ARRAY_AND_SIZE(samplerates_100));
463160cb 426 else if (devc->prof->max_sampling_freq == 200)
53012da6 427 *data = std_gvar_samplerates(ARRAY_AND_SIZE(samplerates_200));
463160cb 428 else {
17548571
UH
429 sr_err("Internal error: Unknown max. samplerate: %d.",
430 devc->prof->max_sampling_freq);
431 return SR_ERR_ARG;
432 }
a1c743fc 433 break;
28731bab 434 case SR_CONF_TRIGGER_MATCH:
53012da6 435 *data = std_gvar_array_i32(ARRAY_AND_SIZE(trigger_matches));
c50277a6 436 break;
7142d6b9 437 case SR_CONF_VOLTAGE_THRESHOLD:
7bc3cfe6 438 *data = std_gvar_min_max_step_thresholds(-6.0, 6.0, 0.1);
7142d6b9 439 break;
f0de2dd0
BV
440 case SR_CONF_LIMIT_SAMPLES:
441 if (!sdi)
442 return SR_ERR_ARG;
443 devc = sdi->priv;
a162eeb2 444 *data = std_gvar_tuple_u64(0, devc->max_sample_depth);
f0de2dd0 445 break;
a1c743fc 446 default:
bd6fbf62 447 return SR_ERR_NA;
a1c743fc
BV
448 }
449
450 return SR_OK;
451}
452
695dc859 453static int dev_acquisition_start(const struct sr_dev_inst *sdi)
a1bb33af 454{
609bfd75
BV
455 struct dev_context *devc;
456 struct sr_usb_dev_inst *usb;
b9c735a2 457 struct sr_datafeed_packet packet;
9c939c51 458 struct sr_datafeed_logic logic;
42ceb777 459 unsigned int samples_read;
a1bb33af 460 int res;
e495a676 461 unsigned int packet_num, n;
a1bb33af 462 unsigned char *buf;
42ceb777
RD
463 unsigned int status;
464 unsigned int stop_address;
465 unsigned int now_address;
466 unsigned int trigger_address;
467 unsigned int trigger_offset;
468 unsigned int triggerbar;
469 unsigned int ramsize_trigger;
470 unsigned int memory_size;
471 unsigned int valid_samples;
472 unsigned int discard;
473 int trigger_now;
a1bb33af 474
208c1d35 475 devc = sdi->priv;
a1bb33af 476
28731bab
BV
477 if (analyzer_add_triggers(sdi) != SR_OK) {
478 sr_err("Failed to configure triggers.");
014359e3
BV
479 return SR_ERR;
480 }
481
609bfd75
BV
482 usb = sdi->conn;
483
0ab0cb94
TY
484 set_triggerbar(devc);
485
e495a676 486 /* Push configured settings to device. */
609bfd75 487 analyzer_configure(usb->devhdl);
a143e4e5 488
609bfd75 489 analyzer_start(usb->devhdl);
6d116114 490 sr_info("Waiting for data.");
609bfd75 491 analyzer_wait_data(usb->devhdl);
a1bb33af 492
42ceb777
RD
493 status = analyzer_read_status(usb->devhdl);
494 stop_address = analyzer_get_stop_address(usb->devhdl);
495 now_address = analyzer_get_now_address(usb->devhdl);
496 trigger_address = analyzer_get_trigger_address(usb->devhdl);
497
498 triggerbar = analyzer_get_triggerbar_address();
499 ramsize_trigger = analyzer_get_ramsize_trigger_address();
500
501 n = get_memory_size(devc->memory_size);
502 memory_size = n / 4;
503
504 sr_info("Status = 0x%x.", status);
505 sr_info("Stop address = 0x%x.", stop_address);
506 sr_info("Now address = 0x%x.", now_address);
507 sr_info("Trigger address = 0x%x.", trigger_address);
508 sr_info("Triggerbar address = 0x%x.", triggerbar);
509 sr_info("Ramsize trigger = 0x%x.", ramsize_trigger);
510 sr_info("Memory size = 0x%x.", memory_size);
a1bb33af 511
bee2b016 512 std_session_send_df_header(sdi);
f366e86c 513
42ceb777
RD
514 /* Check for empty capture */
515 if ((status & STATUS_READY) && !stop_address) {
bee2b016 516 std_session_send_df_end(sdi);
42ceb777
RD
517 return SR_OK;
518 }
519
a95f142e 520 buf = g_malloc(PACKET_SIZE);
b53738ba 521
42ceb777
RD
522 /* Check if the trigger is in the samples we are throwing away */
523 trigger_now = now_address == trigger_address ||
524 ((now_address + 1) % memory_size) == trigger_address;
525
526 /*
527 * STATUS_READY doesn't clear until now_address advances past
528 * addr 0, but for our logic, clear it in that case
529 */
530 if (!now_address)
531 status &= ~STATUS_READY;
532
609bfd75 533 analyzer_read_start(usb->devhdl);
42ceb777
RD
534
535 /* Calculate how much data to discard */
536 discard = 0;
537 if (status & STATUS_READY) {
538 /*
539 * We haven't wrapped around, we need to throw away data from
540 * our current position to the end of the buffer.
541 * Additionally, the first two samples captured are always
542 * bogus.
543 */
544 discard += memory_size - now_address + 2;
545 now_address = 2;
546 }
547
548 /* If we have more samples than we need, discard them */
549 valid_samples = (stop_address - now_address) % memory_size;
550 if (valid_samples > ramsize_trigger + triggerbar) {
551 discard += valid_samples - (ramsize_trigger + triggerbar);
552 now_address += valid_samples - (ramsize_trigger + triggerbar);
553 }
554
555 sr_info("Need to discard %d samples.", discard);
556
557 /* Calculate how far in the trigger is */
558 if (trigger_now)
559 trigger_offset = 0;
560 else
561 trigger_offset = (trigger_address - now_address) % memory_size;
562
563 /* Recalculate the number of samples available */
564 valid_samples = (stop_address - now_address) % memory_size;
565
fed16f06 566 /* Send the incoming transfer to the session bus. */
42ceb777 567 samples_read = 0;
0ab0cb94 568 for (packet_num = 0; packet_num < n / PACKET_SIZE; packet_num++) {
42ceb777
RD
569 unsigned int len;
570 unsigned int buf_offset;
571
609bfd75 572 res = analyzer_read_data(usb->devhdl, buf, PACKET_SIZE);
11cf4921
UH
573 if (res != PACKET_SIZE)
574 sr_warn("Tried to read %d bytes, actually read %d.",
575 PACKET_SIZE, res);
a1bb33af 576
42ceb777
RD
577 if (discard >= PACKET_SIZE / 4) {
578 discard -= PACKET_SIZE / 4;
579 continue;
580 }
581
582 len = PACKET_SIZE - discard * 4;
583 buf_offset = discard * 4;
584 discard = 0;
585
586 /* Check if we've read all the samples */
587 if (samples_read + len / 4 >= valid_samples)
588 len = (valid_samples - samples_read) * 4;
589 if (!len)
590 break;
591
592 if (samples_read < trigger_offset &&
593 samples_read + len / 4 > trigger_offset) {
594 /* Send out samples remaining before trigger */
595 packet.type = SR_DF_LOGIC;
596 packet.payload = &logic;
597 logic.length = (trigger_offset - samples_read) * 4;
598 logic.unitsize = 4;
599 logic.data = buf + buf_offset;
695dc859 600 sr_session_send(sdi, &packet);
42ceb777
RD
601 len -= logic.length;
602 samples_read += logic.length / 4;
603 buf_offset += logic.length;
604 }
605
0fa71943
UH
606 if (samples_read == trigger_offset)
607 std_session_send_df_trigger(sdi);
42ceb777
RD
608
609 /* Send out data (or data after trigger) */
5a2326a7 610 packet.type = SR_DF_LOGIC;
9c939c51 611 packet.payload = &logic;
42ceb777 612 logic.length = len;
9c939c51 613 logic.unitsize = 4;
42ceb777 614 logic.data = buf + buf_offset;
695dc859 615 sr_session_send(sdi, &packet);
42ceb777 616 samples_read += len / 4;
a1bb33af 617 }
609bfd75 618 analyzer_read_stop(usb->devhdl);
a1bb33af
UH
619 g_free(buf);
620
bee2b016 621 std_session_send_df_end(sdi);
a1bb33af 622
e46b8fb1 623 return SR_OK;
a1bb33af
UH
624}
625
695dc859 626static int dev_acquisition_stop(struct sr_dev_inst *sdi)
a1bb33af 627{
609bfd75 628 struct sr_usb_dev_inst *usb;
a1bb33af 629
bee2b016 630 std_session_send_df_end(sdi);
a1bb33af 631
609bfd75
BV
632 usb = sdi->conn;
633 analyzer_reset(usb->devhdl);
fed16f06 634 /* TODO: Need to cancel and free any queued up transfers. */
3010f21c
UH
635
636 return SR_OK;
a1bb33af
UH
637}
638
dd5c48a6 639static struct sr_dev_driver zeroplus_logic_cube_driver_info = {
e519ba86 640 .name = "zeroplus-logic-cube",
8fdecced 641 .longname = "ZEROPLUS Logic Cube LAP-C series",
e519ba86 642 .api_version = 1,
c2fdcc25 643 .init = std_init,
700d6b64 644 .cleanup = std_cleanup,
6078d2c9 645 .scan = scan,
c01bf34c 646 .dev_list = std_dev_list,
f778bf02 647 .dev_clear = std_dev_clear,
035a1078
BV
648 .config_get = config_get,
649 .config_set = config_set,
a1c743fc 650 .config_list = config_list,
6078d2c9
UH
651 .dev_open = dev_open,
652 .dev_close = dev_close,
653 .dev_acquisition_start = dev_acquisition_start,
654 .dev_acquisition_stop = dev_acquisition_stop,
41812aca 655 .context = NULL,
a1bb33af 656};
dd5c48a6 657SR_REGISTER_DEV_DRIVER(zeroplus_logic_cube_driver_info);