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