]> sigrok.org Git - libsigrok.git/blame - src/hardware/zeroplus-logic-cube/api.c
zeroplus-logic-cube: Fix USB device list
[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
8fdecced 23#define VENDOR_NAME "ZEROPLUS"
a1bb33af
UH
24#define USB_INTERFACE 0
25#define USB_CONFIGURATION 1
26#define NUM_TRIGGER_STAGES 4
fed16f06 27#define PACKET_SIZE 2048 /* ?? */
a1bb33af 28
0ab0cb94
TY
29//#define ZP_EXPERIMENTAL
30
e495a676
UH
31struct zp_model {
32 uint16_t vid;
33 uint16_t pid;
2c240774 34 const char *model_name;
a1bb33af 35 unsigned int channels;
fed16f06 36 unsigned int sample_depth; /* In Ksamples/channel */
a1bb33af 37 unsigned int max_sampling_freq;
e495a676 38};
a1bb33af 39
fed16f06
UH
40/*
41 * Note -- 16032, 16064 and 16128 *usually* -- but not always -- have the
42 * same 128K sample depth.
43 */
e495a676 44static const struct zp_model zeroplus_models[] = {
9e5670d0 45 {0x0c12, 0x7002, "LAP-16128U", 16, 128, 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},
e3594306 53 {0x0c12, 0x7100, "AKIP-9101", 16, 256, 200},
9e9dba7b 54 ALL_ZERO
a1bb33af
UH
55};
56
f254bc4b 57static const uint32_t devopts[] = {
1953564a 58 SR_CONF_LOGIC_ANALYZER,
5827f61b
BV
59 SR_CONF_LIMIT_SAMPLES | SR_CONF_SET | SR_CONF_LIST,
60 SR_CONF_SAMPLERATE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
61 SR_CONF_TRIGGER_MATCH | SR_CONF_LIST,
62 SR_CONF_CAPTURE_RATIO | SR_CONF_GET | SR_CONF_SET,
63 SR_CONF_VOLTAGE_THRESHOLD | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
a1bb33af
UH
64};
65
28731bab
BV
66static const int32_t trigger_matches[] = {
67 SR_TRIGGER_ZERO,
68 SR_TRIGGER_ONE,
69};
70
d261dbbf 71/*
ba7dd8bb 72 * ZEROPLUS LAP-C (16032) numbers the 16 channels A0-A7 and B0-B7.
d261dbbf
UH
73 * We currently ignore other untested/unsupported devices here.
74 */
ba7dd8bb 75static const char *channel_names[] = {
78693401
UH
76 "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7",
77 "B0", "B1", "B2", "B3", "B4", "B5", "B6", "B7",
5db0c668
RD
78 "C0", "C1", "C2", "C3", "C4", "C5", "C6", "C7",
79 "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
464d12c7
KS
80};
81
32756547 82SR_PRIV struct sr_dev_driver zeroplus_logic_cube_driver_info;
a1bb33af 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
6078d2c9 129static int dev_close(struct sr_dev_inst *sdi);
a1bb33af 130
3316e149
BV
131SR_PRIV int zp_set_samplerate(struct dev_context *devc, uint64_t samplerate)
132{
133 int i;
134
135 for (i = 0; ARRAY_SIZE(samplerates_200); i++)
136 if (samplerate == samplerates_200[i])
137 break;
138
139 if (i == ARRAY_SIZE(samplerates_200) || samplerate > devc->max_samplerate) {
140 sr_err("Unsupported samplerate: %" PRIu64 "Hz.", samplerate);
141 return SR_ERR_ARG;
142 }
143
144 sr_info("Setting samplerate to %" PRIu64 "Hz.", samplerate);
145
146 if (samplerate >= SR_MHZ(1))
147 analyzer_set_freq(samplerate / SR_MHZ(1), FREQ_SCALE_MHZ);
148 else if (samplerate >= SR_KHZ(1))
149 analyzer_set_freq(samplerate / SR_KHZ(1), FREQ_SCALE_KHZ);
150 else
151 analyzer_set_freq(samplerate, FREQ_SCALE_HZ);
152
153 devc->cur_samplerate = samplerate;
154
155 return SR_OK;
156}
157
4f840ce9 158static int init(struct sr_dev_driver *di, struct sr_context *sr_ctx)
61136ea6 159{
f6beaac5 160 return std_init(sr_ctx, di, LOG_PREFIX);
61136ea6
BV
161}
162
4f840ce9 163static GSList *scan(struct sr_dev_driver *di, GSList *options)
a1bb33af 164{
d68e2d1a 165 struct sr_dev_inst *sdi;
310e9e9b
BV
166 struct drv_context *drvc;
167 struct dev_context *devc;
e495a676 168 const struct zp_model *prof;
a1bb33af 169 struct libusb_device_descriptor des;
ee4f9bb1 170 struct libusb_device_handle *hdl;
a1bb33af 171 libusb_device **devlist;
428edbe1 172 GSList *devices;
ee4f9bb1
SA
173 int ret, i, j;
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
ee4f9bb1
SA
188 if ((ret = libusb_open(devlist[i], &hdl)) < 0)
189 continue;
190
191 if (des.iSerialNumber == 0) {
192 serial_num[0] = '\0';
193 } else if ((ret = libusb_get_string_descriptor_ascii(hdl,
194 des.iSerialNumber, (unsigned char *) serial_num,
195 sizeof(serial_num))) < 0) {
196 sr_warn("Failed to get serial number string descriptor: %s.",
197 libusb_error_name(ret));
198 continue;
199 }
200
201 libusb_close(hdl);
202
203 usb_get_port_path(devlist[i], connection_id, sizeof(connection_id));
204
428edbe1
BV
205 prof = NULL;
206 for (j = 0; j < zeroplus_models[j].vid; j++) {
207 if (des.idVendor == zeroplus_models[j].vid &&
208 des.idProduct == zeroplus_models[j].pid) {
209 prof = &zeroplus_models[j];
bf43ea23 210 }
a1bb33af 211 }
e495a676 212 /* Skip if the device was not found. */
428edbe1
BV
213 if (!prof)
214 continue;
e495a676 215 sr_info("Found ZEROPLUS %s.", prof->model_name);
428edbe1
BV
216
217 /* Register the device with libsigrok. */
aac29cc1 218 sdi = g_malloc0(sizeof(struct sr_dev_inst));
0af636be
UH
219 sdi->status = SR_ST_INACTIVE;
220 sdi->vendor = g_strdup(VENDOR_NAME);
221 sdi->model = g_strdup(prof->model_name);
a873c594 222 sdi->driver = di;
ee4f9bb1
SA
223 sdi->serial_num = g_strdup(serial_num);
224 sdi->connection_id = g_strdup(connection_id);
428edbe1
BV
225
226 /* Allocate memory for our private driver context. */
f57d8ffe 227 devc = g_malloc0(sizeof(struct dev_context));
310e9e9b 228 sdi->priv = devc;
17548571 229 devc->prof = prof;
310e9e9b 230 devc->num_channels = prof->channels;
0ab0cb94 231#ifdef ZP_EXPERIMENTAL
e93fb98b 232 devc->max_sample_depth = 128 * 1024;
0ab0cb94
TY
233 devc->max_samplerate = 200;
234#else
e93fb98b 235 devc->max_sample_depth = prof->sample_depth * 1024;
0ab0cb94
TY
236 devc->max_samplerate = prof->max_sampling_freq;
237#endif
238 devc->max_samplerate *= SR_MHZ(1);
239 devc->memory_size = MEMORY_SIZE_8K;
310e9e9b 240 // memset(devc->trigger_buffer, 0, NUM_TRIGGER_STAGES);
428edbe1 241
ba7dd8bb 242 /* Fill in channellist according to this device's profile. */
5e23fcab
ML
243 for (j = 0; j < devc->num_channels; j++)
244 sr_channel_new(sdi, j, SR_CHANNEL_LOGIC, TRUE,
c368e6f3 245 channel_names[j]);
428edbe1
BV
246
247 devices = g_slist_append(devices, sdi);
310e9e9b 248 drvc->instances = g_slist_append(drvc->instances, sdi);
8111446a 249 sdi->inst_type = SR_INST_USB;
609bfd75 250 sdi->conn = sr_usb_dev_inst_new(
428edbe1
BV
251 libusb_get_bus_number(devlist[i]),
252 libusb_get_device_address(devlist[i]), NULL);
a1bb33af
UH
253 }
254 libusb_free_device_list(devlist, 1);
255
4ca38984 256 return devices;
a1bb33af
UH
257}
258
6078d2c9 259static int dev_open(struct sr_dev_inst *sdi)
a1bb33af 260{
4f840ce9 261 struct sr_dev_driver *di = sdi->driver;
310e9e9b 262 struct dev_context *devc;
e495a676 263 struct drv_context *drvc;
609bfd75 264 struct sr_usb_dev_inst *usb;
87629577 265 int ret;
a1bb33af 266
41812aca 267 drvc = di->context;
609bfd75 268 usb = sdi->conn;
61c90858 269 devc = sdi->priv;
bf43ea23 270
87629577
LPC
271 ret = sr_usb_open(drvc->sr_ctx->libusb_ctx, usb);
272 if (ret != SR_OK)
273 return ret;
428edbe1 274
87629577 275 sdi->status = SR_ST_ACTIVE;
428edbe1 276
609bfd75 277 ret = libusb_set_configuration(usb->devhdl, USB_CONFIGURATION);
ebc34738 278 if (ret < 0) {
6d116114 279 sr_err("Unable to set USB configuration %d: %s.",
d4928d71 280 USB_CONFIGURATION, libusb_error_name(ret));
185ae2c5
UH
281 return SR_ERR;
282 }
283
609bfd75 284 ret = libusb_claim_interface(usb->devhdl, USB_INTERFACE);
ebc34738 285 if (ret != 0) {
6d116114 286 sr_err("Unable to claim interface: %s.",
d4928d71 287 libusb_error_name(ret));
e46b8fb1 288 return SR_ERR;
a1bb33af 289 }
185ae2c5 290
e495a676 291 /* Set default configuration after power on. */
609bfd75
BV
292 if (analyzer_read_status(usb->devhdl) == 0)
293 analyzer_configure(usb->devhdl);
0ab0cb94 294
609bfd75
BV
295 analyzer_reset(usb->devhdl);
296 analyzer_initialize(usb->devhdl);
a1bb33af 297
0ab0cb94 298 //analyzer_set_memory_size(MEMORY_SIZE_512K);
fed16f06 299 // analyzer_set_freq(g_freq, g_freq_scale);
a1bb33af 300 analyzer_set_trigger_count(1);
408e7199
UH
301 // analyzer_set_ramsize_trigger_address((((100 - g_pre_trigger)
302 // * get_memory_size(g_memory_size)) / 100) >> 2);
a1bb33af 303
fed16f06
UH
304#if 0
305 if (g_double_mode == 1)
a1bb33af
UH
306 analyzer_set_compression(COMPRESSION_DOUBLE);
307 else if (g_compression == 1)
308 analyzer_set_compression(COMPRESSION_ENABLE);
fed16f06
UH
309 else
310#endif
311 analyzer_set_compression(COMPRESSION_NONE);
a1bb33af 312
310e9e9b 313 if (devc->cur_samplerate == 0) {
0ab0cb94
TY
314 /* Samplerate hasn't been set. Default to 1MHz. */
315 analyzer_set_freq(1, FREQ_SCALE_MHZ);
316 devc->cur_samplerate = SR_MHZ(1);
a1bb33af
UH
317 }
318
7142d6b9
RD
319 if (devc->cur_threshold == 0)
320 set_voltage_threshold(devc, 1.5);
321
e46b8fb1 322 return SR_OK;
a1bb33af
UH
323}
324
6078d2c9 325static int dev_close(struct sr_dev_inst *sdi)
a1bb33af 326{
609bfd75 327 struct sr_usb_dev_inst *usb;
a1bb33af 328
609bfd75 329 usb = sdi->conn;
697785d1 330
609bfd75 331 if (!usb->devhdl)
25a0f108
BV
332 return SR_ERR;
333
ee4f9bb1
SA
334 sr_info("Closing device on %d.%d (logical) / %s (physical) interface %d.",
335 usb->bus, usb->address, sdi->connection_id, USB_INTERFACE);
609bfd75
BV
336 libusb_release_interface(usb->devhdl, USB_INTERFACE);
337 libusb_reset_device(usb->devhdl);
338 libusb_close(usb->devhdl);
339 usb->devhdl = NULL;
25a0f108 340 sdi->status = SR_ST_INACTIVE;
697785d1
UH
341
342 return SR_OK;
a1bb33af
UH
343}
344
584560f1 345static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi,
53b4680f 346 const struct sr_channel_group *cg)
a1bb33af 347{
310e9e9b 348 struct dev_context *devc;
dcd438ee 349 GVariant *range[2];
a1bb33af 350
53b4680f 351 (void)cg;
8f996b89 352
dcd438ee
UH
353 if (!sdi)
354 return SR_ERR_ARG;
355
356 devc = sdi->priv;
357
584560f1 358 switch (key) {
123e1313 359 case SR_CONF_SAMPLERATE:
dcd438ee 360 *data = g_variant_new_uint64(devc->cur_samplerate);
bf43ea23 361 break;
05f853b5 362 case SR_CONF_CAPTURE_RATIO:
dcd438ee 363 *data = g_variant_new_uint64(devc->capture_ratio);
05f853b5 364 break;
7142d6b9 365 case SR_CONF_VOLTAGE_THRESHOLD:
dcd438ee
UH
366 range[0] = g_variant_new_double(devc->cur_threshold);
367 range[1] = g_variant_new_double(devc->cur_threshold);
368 *data = g_variant_new_tuple(range, 2);
67055d4c 369 break;
bf43ea23 370 default:
bd6fbf62 371 return SR_ERR_NA;
a1bb33af
UH
372 }
373
626409ab 374 return SR_OK;
a1bb33af
UH
375}
376
584560f1 377static int config_set(uint32_t key, GVariant *data, const struct sr_dev_inst *sdi,
53b4680f 378 const struct sr_channel_group *cg)
a1bb33af 379{
310e9e9b 380 struct dev_context *devc;
7142d6b9 381 gdouble low, high;
a1bb33af 382
53b4680f 383 (void)cg;
8f996b89 384
e73ffd42
BV
385 if (sdi->status != SR_ST_ACTIVE)
386 return SR_ERR_DEV_CLOSED;
0ab0cb94 387
310e9e9b 388 if (!(devc = sdi->priv)) {
6d116114 389 sr_err("%s: sdi->priv was NULL", __func__);
bf43ea23
UH
390 return SR_ERR_ARG;
391 }
a1bb33af 392
584560f1 393 switch (key) {
1953564a 394 case SR_CONF_SAMPLERATE:
8386096f 395 return zp_set_samplerate(devc, g_variant_get_uint64(data));
1953564a 396 case SR_CONF_LIMIT_SAMPLES:
8386096f 397 return set_limit_samples(devc, g_variant_get_uint64(data));
1953564a 398 case SR_CONF_CAPTURE_RATIO:
8386096f 399 return set_capture_ratio(devc, g_variant_get_uint64(data));
7142d6b9
RD
400 case SR_CONF_VOLTAGE_THRESHOLD:
401 g_variant_get(data, "(dd)", &low, &high);
402 return set_voltage_threshold(devc, (low + high) / 2.0);
fed16f06 403 default:
bd6fbf62 404 return SR_ERR_NA;
a1bb33af 405 }
e495a676
UH
406
407 return SR_OK;
a1bb33af
UH
408}
409
584560f1 410static int config_list(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi,
53b4680f 411 const struct sr_channel_group *cg)
a1c743fc 412{
17548571 413 struct dev_context *devc;
f0de2dd0 414 GVariant *gvar, *grange[2];
8386096f 415 GVariantBuilder gvb;
7142d6b9
RD
416 double v;
417 GVariant *range[2];
a1c743fc 418
53b4680f 419 (void)cg;
8f996b89 420
a1c743fc 421 switch (key) {
9a6517d1 422 case SR_CONF_DEVICE_OPTIONS:
584560f1 423 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32,
f254bc4b 424 devopts, ARRAY_SIZE(devopts), sizeof(uint32_t));
9a6517d1 425 break;
a1c743fc 426 case SR_CONF_SAMPLERATE:
17548571 427 devc = sdi->priv;
8386096f 428 g_variant_builder_init(&gvb, G_VARIANT_TYPE("a{sv}"));
17548571 429 if (devc->prof->max_sampling_freq == 100) {
8386096f
BV
430 gvar = g_variant_new_fixed_array(G_VARIANT_TYPE("t"),
431 samplerates_100, ARRAY_SIZE(samplerates_100),
432 sizeof(uint64_t));
17548571 433 } else if (devc->prof->max_sampling_freq == 200) {
8386096f
BV
434 gvar = g_variant_new_fixed_array(G_VARIANT_TYPE("t"),
435 samplerates_200, ARRAY_SIZE(samplerates_200),
436 sizeof(uint64_t));
17548571
UH
437 } else {
438 sr_err("Internal error: Unknown max. samplerate: %d.",
439 devc->prof->max_sampling_freq);
440 return SR_ERR_ARG;
441 }
8386096f
BV
442 g_variant_builder_add(&gvb, "{sv}", "samplerates", gvar);
443 *data = g_variant_builder_end(&gvb);
a1c743fc 444 break;
28731bab
BV
445 case SR_CONF_TRIGGER_MATCH:
446 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_INT32,
447 trigger_matches, ARRAY_SIZE(trigger_matches),
448 sizeof(int32_t));
c50277a6 449 break;
7142d6b9
RD
450 case SR_CONF_VOLTAGE_THRESHOLD:
451 g_variant_builder_init(&gvb, G_VARIANT_TYPE_ARRAY);
452 for (v = -6.0; v <= 6.0; v += 0.1) {
453 range[0] = g_variant_new_double(v);
454 range[1] = g_variant_new_double(v);
455 gvar = g_variant_new_tuple(range, 2);
456 g_variant_builder_add_value(&gvb, gvar);
457 }
458 *data = g_variant_builder_end(&gvb);
459 break;
f0de2dd0
BV
460 case SR_CONF_LIMIT_SAMPLES:
461 if (!sdi)
462 return SR_ERR_ARG;
463 devc = sdi->priv;
464 grange[0] = g_variant_new_uint64(0);
465 grange[1] = g_variant_new_uint64(devc->max_sample_depth);
466 *data = g_variant_new_tuple(grange, 2);
467 break;
a1c743fc 468 default:
bd6fbf62 469 return SR_ERR_NA;
a1c743fc
BV
470 }
471
472 return SR_OK;
473}
474
695dc859 475static int dev_acquisition_start(const struct sr_dev_inst *sdi)
a1bb33af 476{
609bfd75
BV
477 struct dev_context *devc;
478 struct sr_usb_dev_inst *usb;
b9c735a2 479 struct sr_datafeed_packet packet;
9c939c51 480 struct sr_datafeed_logic logic;
42ceb777 481 unsigned int samples_read;
a1bb33af 482 int res;
e495a676 483 unsigned int packet_num, n;
a1bb33af 484 unsigned char *buf;
42ceb777
RD
485 unsigned int status;
486 unsigned int stop_address;
487 unsigned int now_address;
488 unsigned int trigger_address;
489 unsigned int trigger_offset;
490 unsigned int triggerbar;
491 unsigned int ramsize_trigger;
492 unsigned int memory_size;
493 unsigned int valid_samples;
494 unsigned int discard;
495 int trigger_now;
a1bb33af 496
e73ffd42
BV
497 if (sdi->status != SR_ST_ACTIVE)
498 return SR_ERR_DEV_CLOSED;
499
208c1d35 500 devc = sdi->priv;
a1bb33af 501
28731bab
BV
502 if (analyzer_add_triggers(sdi) != SR_OK) {
503 sr_err("Failed to configure triggers.");
014359e3
BV
504 return SR_ERR;
505 }
506
609bfd75
BV
507 usb = sdi->conn;
508
0ab0cb94
TY
509 set_triggerbar(devc);
510
e495a676 511 /* Push configured settings to device. */
609bfd75 512 analyzer_configure(usb->devhdl);
a143e4e5 513
609bfd75 514 analyzer_start(usb->devhdl);
6d116114 515 sr_info("Waiting for data.");
609bfd75 516 analyzer_wait_data(usb->devhdl);
a1bb33af 517
42ceb777
RD
518 status = analyzer_read_status(usb->devhdl);
519 stop_address = analyzer_get_stop_address(usb->devhdl);
520 now_address = analyzer_get_now_address(usb->devhdl);
521 trigger_address = analyzer_get_trigger_address(usb->devhdl);
522
523 triggerbar = analyzer_get_triggerbar_address();
524 ramsize_trigger = analyzer_get_ramsize_trigger_address();
525
526 n = get_memory_size(devc->memory_size);
527 memory_size = n / 4;
528
529 sr_info("Status = 0x%x.", status);
530 sr_info("Stop address = 0x%x.", stop_address);
531 sr_info("Now address = 0x%x.", now_address);
532 sr_info("Trigger address = 0x%x.", trigger_address);
533 sr_info("Triggerbar address = 0x%x.", triggerbar);
534 sr_info("Ramsize trigger = 0x%x.", ramsize_trigger);
535 sr_info("Memory size = 0x%x.", memory_size);
a1bb33af 536
695dc859 537 std_session_send_df_header(sdi, LOG_PREFIX);
f366e86c 538
42ceb777
RD
539 /* Check for empty capture */
540 if ((status & STATUS_READY) && !stop_address) {
695dc859 541 std_session_send_df_end(sdi, LOG_PREFIX);
42ceb777
RD
542 return SR_OK;
543 }
544
a95f142e 545 buf = g_malloc(PACKET_SIZE);
b53738ba 546
42ceb777
RD
547 /* Check if the trigger is in the samples we are throwing away */
548 trigger_now = now_address == trigger_address ||
549 ((now_address + 1) % memory_size) == trigger_address;
550
551 /*
552 * STATUS_READY doesn't clear until now_address advances past
553 * addr 0, but for our logic, clear it in that case
554 */
555 if (!now_address)
556 status &= ~STATUS_READY;
557
609bfd75 558 analyzer_read_start(usb->devhdl);
42ceb777
RD
559
560 /* Calculate how much data to discard */
561 discard = 0;
562 if (status & STATUS_READY) {
563 /*
564 * We haven't wrapped around, we need to throw away data from
565 * our current position to the end of the buffer.
566 * Additionally, the first two samples captured are always
567 * bogus.
568 */
569 discard += memory_size - now_address + 2;
570 now_address = 2;
571 }
572
573 /* If we have more samples than we need, discard them */
574 valid_samples = (stop_address - now_address) % memory_size;
575 if (valid_samples > ramsize_trigger + triggerbar) {
576 discard += valid_samples - (ramsize_trigger + triggerbar);
577 now_address += valid_samples - (ramsize_trigger + triggerbar);
578 }
579
580 sr_info("Need to discard %d samples.", discard);
581
582 /* Calculate how far in the trigger is */
583 if (trigger_now)
584 trigger_offset = 0;
585 else
586 trigger_offset = (trigger_address - now_address) % memory_size;
587
588 /* Recalculate the number of samples available */
589 valid_samples = (stop_address - now_address) % memory_size;
590
fed16f06 591 /* Send the incoming transfer to the session bus. */
42ceb777 592 samples_read = 0;
0ab0cb94 593 for (packet_num = 0; packet_num < n / PACKET_SIZE; packet_num++) {
42ceb777
RD
594 unsigned int len;
595 unsigned int buf_offset;
596
609bfd75 597 res = analyzer_read_data(usb->devhdl, buf, PACKET_SIZE);
6d116114 598 sr_info("Tried to read %d bytes, actually read %d bytes.",
b08024a8 599 PACKET_SIZE, res);
a1bb33af 600
42ceb777
RD
601 if (discard >= PACKET_SIZE / 4) {
602 discard -= PACKET_SIZE / 4;
603 continue;
604 }
605
606 len = PACKET_SIZE - discard * 4;
607 buf_offset = discard * 4;
608 discard = 0;
609
610 /* Check if we've read all the samples */
611 if (samples_read + len / 4 >= valid_samples)
612 len = (valid_samples - samples_read) * 4;
613 if (!len)
614 break;
615
616 if (samples_read < trigger_offset &&
617 samples_read + len / 4 > trigger_offset) {
618 /* Send out samples remaining before trigger */
619 packet.type = SR_DF_LOGIC;
620 packet.payload = &logic;
621 logic.length = (trigger_offset - samples_read) * 4;
622 logic.unitsize = 4;
623 logic.data = buf + buf_offset;
695dc859 624 sr_session_send(sdi, &packet);
42ceb777
RD
625 len -= logic.length;
626 samples_read += logic.length / 4;
627 buf_offset += logic.length;
628 }
629
630 if (samples_read == trigger_offset) {
631 /* Send out trigger */
632 packet.type = SR_DF_TRIGGER;
633 packet.payload = NULL;
695dc859 634 sr_session_send(sdi, &packet);
42ceb777
RD
635 }
636
637 /* Send out data (or data after trigger) */
5a2326a7 638 packet.type = SR_DF_LOGIC;
9c939c51 639 packet.payload = &logic;
42ceb777 640 logic.length = len;
9c939c51 641 logic.unitsize = 4;
42ceb777 642 logic.data = buf + buf_offset;
695dc859 643 sr_session_send(sdi, &packet);
42ceb777 644 samples_read += len / 4;
a1bb33af 645 }
609bfd75 646 analyzer_read_stop(usb->devhdl);
a1bb33af
UH
647 g_free(buf);
648
695dc859 649 std_session_send_df_end(sdi, LOG_PREFIX);
a1bb33af 650
e46b8fb1 651 return SR_OK;
a1bb33af
UH
652}
653
3cd3a20b 654/* TODO: This stops acquisition on ALL devices, ignoring dev_index. */
695dc859 655static int dev_acquisition_stop(struct sr_dev_inst *sdi)
a1bb33af 656{
609bfd75 657 struct sr_usb_dev_inst *usb;
a1bb33af 658
695dc859 659 std_session_send_df_end(sdi, LOG_PREFIX);
a1bb33af 660
609bfd75
BV
661 usb = sdi->conn;
662 analyzer_reset(usb->devhdl);
fed16f06 663 /* TODO: Need to cancel and free any queued up transfers. */
3010f21c
UH
664
665 return SR_OK;
a1bb33af
UH
666}
667
c09f0b57 668SR_PRIV struct sr_dev_driver zeroplus_logic_cube_driver_info = {
e519ba86 669 .name = "zeroplus-logic-cube",
8fdecced 670 .longname = "ZEROPLUS Logic Cube LAP-C series",
e519ba86 671 .api_version = 1,
6078d2c9 672 .init = init,
700d6b64 673 .cleanup = std_cleanup,
6078d2c9 674 .scan = scan,
c01bf34c 675 .dev_list = std_dev_list,
a6630742 676 .dev_clear = NULL,
035a1078
BV
677 .config_get = config_get,
678 .config_set = config_set,
a1c743fc 679 .config_list = config_list,
6078d2c9
UH
680 .dev_open = dev_open,
681 .dev_close = dev_close,
682 .dev_acquisition_start = dev_acquisition_start,
683 .dev_acquisition_stop = dev_acquisition_stop,
41812aca 684 .context = NULL,
a1bb33af 685};