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