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