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