]> sigrok.org Git - libsigrok.git/blame - src/hardware/zeroplus-logic-cube/api.c
drivers: Remove some unneeded 'ret' variables.
[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
dd7a72ea
UH
330static int config_get(uint32_t key, GVariant **data,
331 const struct sr_dev_inst *sdi, const struct sr_channel_group *cg)
a1bb33af 332{
310e9e9b 333 struct dev_context *devc;
a1bb33af 334
53b4680f 335 (void)cg;
8f996b89 336
dcd438ee
UH
337 if (!sdi)
338 return SR_ERR_ARG;
339
340 devc = sdi->priv;
341
584560f1 342 switch (key) {
123e1313 343 case SR_CONF_SAMPLERATE:
dcd438ee 344 *data = g_variant_new_uint64(devc->cur_samplerate);
bf43ea23 345 break;
05f853b5 346 case SR_CONF_CAPTURE_RATIO:
dcd438ee 347 *data = g_variant_new_uint64(devc->capture_ratio);
05f853b5 348 break;
7142d6b9 349 case SR_CONF_VOLTAGE_THRESHOLD:
43995cda 350 *data = std_gvar_tuple_double(devc->cur_threshold, devc->cur_threshold);
67055d4c 351 break;
bf43ea23 352 default:
bd6fbf62 353 return SR_ERR_NA;
a1bb33af
UH
354 }
355
626409ab 356 return SR_OK;
a1bb33af
UH
357}
358
dd7a72ea
UH
359static int config_set(uint32_t key, GVariant *data,
360 const struct sr_dev_inst *sdi, const struct sr_channel_group *cg)
a1bb33af 361{
310e9e9b 362 struct dev_context *devc;
7142d6b9 363 gdouble low, high;
a1bb33af 364
53b4680f 365 (void)cg;
8f996b89 366
b0baddef 367 devc = sdi->priv;
a1bb33af 368
584560f1 369 switch (key) {
1953564a 370 case SR_CONF_SAMPLERATE:
8386096f 371 return zp_set_samplerate(devc, g_variant_get_uint64(data));
1953564a 372 case SR_CONF_LIMIT_SAMPLES:
8386096f 373 return set_limit_samples(devc, g_variant_get_uint64(data));
1953564a 374 case SR_CONF_CAPTURE_RATIO:
8386096f 375 return set_capture_ratio(devc, g_variant_get_uint64(data));
7142d6b9
RD
376 case SR_CONF_VOLTAGE_THRESHOLD:
377 g_variant_get(data, "(dd)", &low, &high);
378 return set_voltage_threshold(devc, (low + high) / 2.0);
fed16f06 379 default:
bd6fbf62 380 return SR_ERR_NA;
a1bb33af 381 }
e495a676
UH
382
383 return SR_OK;
a1bb33af
UH
384}
385
dd7a72ea
UH
386static int config_list(uint32_t key, GVariant **data,
387 const struct sr_dev_inst *sdi, const struct sr_channel_group *cg)
a1c743fc 388{
17548571 389 struct dev_context *devc;
a1c743fc
BV
390
391 switch (key) {
9a6517d1 392 case SR_CONF_DEVICE_OPTIONS:
e66d1892 393 return STD_CONFIG_LIST(key, data, sdi, cg, NULL, drvopts, devopts);
a1c743fc 394 case SR_CONF_SAMPLERATE:
17548571 395 devc = sdi->priv;
463160cb 396 if (devc->prof->max_sampling_freq == 100)
53012da6 397 *data = std_gvar_samplerates(ARRAY_AND_SIZE(samplerates_100));
463160cb 398 else if (devc->prof->max_sampling_freq == 200)
53012da6 399 *data = std_gvar_samplerates(ARRAY_AND_SIZE(samplerates_200));
463160cb 400 else {
17548571
UH
401 sr_err("Internal error: Unknown max. samplerate: %d.",
402 devc->prof->max_sampling_freq);
403 return SR_ERR_ARG;
404 }
a1c743fc 405 break;
28731bab 406 case SR_CONF_TRIGGER_MATCH:
53012da6 407 *data = std_gvar_array_i32(ARRAY_AND_SIZE(trigger_matches));
c50277a6 408 break;
7142d6b9 409 case SR_CONF_VOLTAGE_THRESHOLD:
7bc3cfe6 410 *data = std_gvar_min_max_step_thresholds(-6.0, 6.0, 0.1);
7142d6b9 411 break;
f0de2dd0
BV
412 case SR_CONF_LIMIT_SAMPLES:
413 if (!sdi)
414 return SR_ERR_ARG;
415 devc = sdi->priv;
a162eeb2 416 *data = std_gvar_tuple_u64(0, devc->max_sample_depth);
f0de2dd0 417 break;
a1c743fc 418 default:
bd6fbf62 419 return SR_ERR_NA;
a1c743fc
BV
420 }
421
422 return SR_OK;
423}
424
695dc859 425static int dev_acquisition_start(const struct sr_dev_inst *sdi)
a1bb33af 426{
609bfd75
BV
427 struct dev_context *devc;
428 struct sr_usb_dev_inst *usb;
b9c735a2 429 struct sr_datafeed_packet packet;
9c939c51 430 struct sr_datafeed_logic logic;
42ceb777 431 unsigned int samples_read;
a1bb33af 432 int res;
e495a676 433 unsigned int packet_num, n;
a1bb33af 434 unsigned char *buf;
42ceb777
RD
435 unsigned int status;
436 unsigned int stop_address;
437 unsigned int now_address;
438 unsigned int trigger_address;
439 unsigned int trigger_offset;
440 unsigned int triggerbar;
441 unsigned int ramsize_trigger;
442 unsigned int memory_size;
443 unsigned int valid_samples;
444 unsigned int discard;
445 int trigger_now;
a1bb33af 446
208c1d35 447 devc = sdi->priv;
a1bb33af 448
28731bab
BV
449 if (analyzer_add_triggers(sdi) != SR_OK) {
450 sr_err("Failed to configure triggers.");
014359e3
BV
451 return SR_ERR;
452 }
453
609bfd75
BV
454 usb = sdi->conn;
455
0ab0cb94
TY
456 set_triggerbar(devc);
457
e495a676 458 /* Push configured settings to device. */
609bfd75 459 analyzer_configure(usb->devhdl);
a143e4e5 460
609bfd75 461 analyzer_start(usb->devhdl);
6d116114 462 sr_info("Waiting for data.");
609bfd75 463 analyzer_wait_data(usb->devhdl);
a1bb33af 464
42ceb777
RD
465 status = analyzer_read_status(usb->devhdl);
466 stop_address = analyzer_get_stop_address(usb->devhdl);
467 now_address = analyzer_get_now_address(usb->devhdl);
468 trigger_address = analyzer_get_trigger_address(usb->devhdl);
469
470 triggerbar = analyzer_get_triggerbar_address();
471 ramsize_trigger = analyzer_get_ramsize_trigger_address();
472
473 n = get_memory_size(devc->memory_size);
474 memory_size = n / 4;
475
476 sr_info("Status = 0x%x.", status);
477 sr_info("Stop address = 0x%x.", stop_address);
478 sr_info("Now address = 0x%x.", now_address);
479 sr_info("Trigger address = 0x%x.", trigger_address);
480 sr_info("Triggerbar address = 0x%x.", triggerbar);
481 sr_info("Ramsize trigger = 0x%x.", ramsize_trigger);
482 sr_info("Memory size = 0x%x.", memory_size);
a1bb33af 483
bee2b016 484 std_session_send_df_header(sdi);
f366e86c 485
42ceb777
RD
486 /* Check for empty capture */
487 if ((status & STATUS_READY) && !stop_address) {
bee2b016 488 std_session_send_df_end(sdi);
42ceb777
RD
489 return SR_OK;
490 }
491
a95f142e 492 buf = g_malloc(PACKET_SIZE);
b53738ba 493
42ceb777
RD
494 /* Check if the trigger is in the samples we are throwing away */
495 trigger_now = now_address == trigger_address ||
496 ((now_address + 1) % memory_size) == trigger_address;
497
498 /*
499 * STATUS_READY doesn't clear until now_address advances past
500 * addr 0, but for our logic, clear it in that case
501 */
502 if (!now_address)
503 status &= ~STATUS_READY;
504
609bfd75 505 analyzer_read_start(usb->devhdl);
42ceb777
RD
506
507 /* Calculate how much data to discard */
508 discard = 0;
509 if (status & STATUS_READY) {
510 /*
511 * We haven't wrapped around, we need to throw away data from
512 * our current position to the end of the buffer.
513 * Additionally, the first two samples captured are always
514 * bogus.
515 */
516 discard += memory_size - now_address + 2;
517 now_address = 2;
518 }
519
520 /* If we have more samples than we need, discard them */
521 valid_samples = (stop_address - now_address) % memory_size;
522 if (valid_samples > ramsize_trigger + triggerbar) {
523 discard += valid_samples - (ramsize_trigger + triggerbar);
524 now_address += valid_samples - (ramsize_trigger + triggerbar);
525 }
526
527 sr_info("Need to discard %d samples.", discard);
528
529 /* Calculate how far in the trigger is */
530 if (trigger_now)
531 trigger_offset = 0;
532 else
533 trigger_offset = (trigger_address - now_address) % memory_size;
534
535 /* Recalculate the number of samples available */
536 valid_samples = (stop_address - now_address) % memory_size;
537
fed16f06 538 /* Send the incoming transfer to the session bus. */
42ceb777 539 samples_read = 0;
0ab0cb94 540 for (packet_num = 0; packet_num < n / PACKET_SIZE; packet_num++) {
42ceb777
RD
541 unsigned int len;
542 unsigned int buf_offset;
543
609bfd75 544 res = analyzer_read_data(usb->devhdl, buf, PACKET_SIZE);
6d116114 545 sr_info("Tried to read %d bytes, actually read %d bytes.",
b08024a8 546 PACKET_SIZE, res);
a1bb33af 547
42ceb777
RD
548 if (discard >= PACKET_SIZE / 4) {
549 discard -= PACKET_SIZE / 4;
550 continue;
551 }
552
553 len = PACKET_SIZE - discard * 4;
554 buf_offset = discard * 4;
555 discard = 0;
556
557 /* Check if we've read all the samples */
558 if (samples_read + len / 4 >= valid_samples)
559 len = (valid_samples - samples_read) * 4;
560 if (!len)
561 break;
562
563 if (samples_read < trigger_offset &&
564 samples_read + len / 4 > trigger_offset) {
565 /* Send out samples remaining before trigger */
566 packet.type = SR_DF_LOGIC;
567 packet.payload = &logic;
568 logic.length = (trigger_offset - samples_read) * 4;
569 logic.unitsize = 4;
570 logic.data = buf + buf_offset;
695dc859 571 sr_session_send(sdi, &packet);
42ceb777
RD
572 len -= logic.length;
573 samples_read += logic.length / 4;
574 buf_offset += logic.length;
575 }
576
577 if (samples_read == trigger_offset) {
578 /* Send out trigger */
579 packet.type = SR_DF_TRIGGER;
580 packet.payload = NULL;
695dc859 581 sr_session_send(sdi, &packet);
42ceb777
RD
582 }
583
584 /* Send out data (or data after trigger) */
5a2326a7 585 packet.type = SR_DF_LOGIC;
9c939c51 586 packet.payload = &logic;
42ceb777 587 logic.length = len;
9c939c51 588 logic.unitsize = 4;
42ceb777 589 logic.data = buf + buf_offset;
695dc859 590 sr_session_send(sdi, &packet);
42ceb777 591 samples_read += len / 4;
a1bb33af 592 }
609bfd75 593 analyzer_read_stop(usb->devhdl);
a1bb33af
UH
594 g_free(buf);
595
bee2b016 596 std_session_send_df_end(sdi);
a1bb33af 597
e46b8fb1 598 return SR_OK;
a1bb33af
UH
599}
600
695dc859 601static int dev_acquisition_stop(struct sr_dev_inst *sdi)
a1bb33af 602{
609bfd75 603 struct sr_usb_dev_inst *usb;
a1bb33af 604
bee2b016 605 std_session_send_df_end(sdi);
a1bb33af 606
609bfd75
BV
607 usb = sdi->conn;
608 analyzer_reset(usb->devhdl);
fed16f06 609 /* TODO: Need to cancel and free any queued up transfers. */
3010f21c
UH
610
611 return SR_OK;
a1bb33af
UH
612}
613
dd5c48a6 614static struct sr_dev_driver zeroplus_logic_cube_driver_info = {
e519ba86 615 .name = "zeroplus-logic-cube",
8fdecced 616 .longname = "ZEROPLUS Logic Cube LAP-C series",
e519ba86 617 .api_version = 1,
c2fdcc25 618 .init = std_init,
700d6b64 619 .cleanup = std_cleanup,
6078d2c9 620 .scan = scan,
c01bf34c 621 .dev_list = std_dev_list,
f778bf02 622 .dev_clear = std_dev_clear,
035a1078
BV
623 .config_get = config_get,
624 .config_set = config_set,
a1c743fc 625 .config_list = config_list,
6078d2c9
UH
626 .dev_open = dev_open,
627 .dev_close = dev_close,
628 .dev_acquisition_start = dev_acquisition_start,
629 .dev_acquisition_stop = dev_acquisition_stop,
41812aca 630 .context = NULL,
a1bb33af 631};
dd5c48a6 632SR_REGISTER_DEV_DRIVER(zeroplus_logic_cube_driver_info);