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