]> sigrok.org Git - libsigrok.git/blame - src/hardware/zeroplus-logic-cube/api.c
Change sr_dev_inst_new() to take no parameters.
[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 51 {0x0c12, 0x7016, "LAP-C(162000)", 16, 2048, 200},
e3594306 52 {0x0c12, 0x7100, "AKIP-9101", 16, 256, 200},
428edbe1 53 { 0, 0, 0, 0, 0, 0 }
a1bb33af
UH
54};
55
f254bc4b 56static const uint32_t devopts[] = {
1953564a 57 SR_CONF_LOGIC_ANALYZER,
5827f61b
BV
58 SR_CONF_LIMIT_SAMPLES | SR_CONF_SET | SR_CONF_LIST,
59 SR_CONF_SAMPLERATE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
60 SR_CONF_TRIGGER_MATCH | SR_CONF_LIST,
61 SR_CONF_CAPTURE_RATIO | SR_CONF_GET | SR_CONF_SET,
62 SR_CONF_VOLTAGE_THRESHOLD | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
a1bb33af
UH
63};
64
28731bab
BV
65static const int32_t trigger_matches[] = {
66 SR_TRIGGER_ZERO,
67 SR_TRIGGER_ONE,
68};
69
d261dbbf 70/*
ba7dd8bb 71 * ZEROPLUS LAP-C (16032) numbers the 16 channels A0-A7 and B0-B7.
d261dbbf
UH
72 * We currently ignore other untested/unsupported devices here.
73 */
ba7dd8bb 74static const char *channel_names[] = {
78693401
UH
75 "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7",
76 "B0", "B1", "B2", "B3", "B4", "B5", "B6", "B7",
5db0c668
RD
77 "C0", "C1", "C2", "C3", "C4", "C5", "C6", "C7",
78 "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
464d12c7
KS
79 NULL,
80};
81
32756547 82SR_PRIV struct sr_dev_driver zeroplus_logic_cube_driver_info;
a873c594 83static struct sr_dev_driver *di = &zeroplus_logic_cube_driver_info;
a1bb33af 84
fed16f06
UH
85/*
86 * The hardware supports more samplerates than these, but these are the
87 * options hardcoded into the vendor's Windows GUI.
88 */
a1bb33af 89
8386096f 90static const uint64_t samplerates_100[] = {
17548571
UH
91 SR_HZ(100),
92 SR_HZ(500),
93 SR_KHZ(1),
94 SR_KHZ(5),
95 SR_KHZ(25),
96 SR_KHZ(50),
97 SR_KHZ(100),
98 SR_KHZ(200),
99 SR_KHZ(400),
100 SR_KHZ(800),
101 SR_MHZ(1),
102 SR_MHZ(10),
103 SR_MHZ(25),
104 SR_MHZ(50),
105 SR_MHZ(80),
106 SR_MHZ(100),
17548571
UH
107};
108
8386096f 109const uint64_t samplerates_200[] = {
c9140419
UH
110 SR_HZ(100),
111 SR_HZ(500),
59df0c77
UH
112 SR_KHZ(1),
113 SR_KHZ(5),
114 SR_KHZ(25),
115 SR_KHZ(50),
116 SR_KHZ(100),
117 SR_KHZ(200),
118 SR_KHZ(400),
119 SR_KHZ(800),
120 SR_MHZ(1),
121 SR_MHZ(10),
122 SR_MHZ(25),
123 SR_MHZ(50),
124 SR_MHZ(80),
125 SR_MHZ(100),
126 SR_MHZ(150),
127 SR_MHZ(200),
bf43ea23 128};
a1bb33af 129
6078d2c9 130static int dev_close(struct sr_dev_inst *sdi);
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
6078d2c9 159static int init(struct sr_context *sr_ctx)
61136ea6 160{
f6beaac5 161 return std_init(sr_ctx, di, LOG_PREFIX);
61136ea6
BV
162}
163
6078d2c9 164static GSList *scan(GSList *options)
a1bb33af 165{
d68e2d1a 166 struct sr_dev_inst *sdi;
ba7dd8bb 167 struct sr_channel *ch;
310e9e9b
BV
168 struct drv_context *drvc;
169 struct dev_context *devc;
e495a676 170 const struct zp_model *prof;
a1bb33af 171 struct libusb_device_descriptor des;
ee4f9bb1 172 struct libusb_device_handle *hdl;
a1bb33af 173 libusb_device **devlist;
428edbe1 174 GSList *devices;
ee4f9bb1
SA
175 int ret, i, j;
176 char serial_num[64], connection_id[64];
a1bb33af 177
4ca38984 178 (void)options;
64d33dc2 179
a873c594 180 drvc = di->priv;
4b97c74e 181
4ca38984
BV
182 devices = NULL;
183
8fdecced 184 /* Find all ZEROPLUS analyzers and add them to device list. */
d4abb463 185 libusb_get_device_list(drvc->sr_ctx->libusb_ctx, &devlist); /* TODO: Errors. */
fed16f06
UH
186
187 for (i = 0; devlist[i]; i++) {
ebc34738
UH
188 ret = libusb_get_device_descriptor(devlist[i], &des);
189 if (ret != 0) {
6d116114 190 sr_err("Failed to get device descriptor: %s.",
d4928d71 191 libusb_error_name(ret));
a1bb33af
UH
192 continue;
193 }
194
ee4f9bb1
SA
195 if ((ret = libusb_open(devlist[i], &hdl)) < 0)
196 continue;
197
198 if (des.iSerialNumber == 0) {
199 serial_num[0] = '\0';
200 } else if ((ret = libusb_get_string_descriptor_ascii(hdl,
201 des.iSerialNumber, (unsigned char *) serial_num,
202 sizeof(serial_num))) < 0) {
203 sr_warn("Failed to get serial number string descriptor: %s.",
204 libusb_error_name(ret));
205 continue;
206 }
207
208 libusb_close(hdl);
209
210 usb_get_port_path(devlist[i], connection_id, sizeof(connection_id));
211
428edbe1
BV
212 prof = NULL;
213 for (j = 0; j < zeroplus_models[j].vid; j++) {
214 if (des.idVendor == zeroplus_models[j].vid &&
215 des.idProduct == zeroplus_models[j].pid) {
216 prof = &zeroplus_models[j];
bf43ea23 217 }
a1bb33af 218 }
e495a676 219 /* Skip if the device was not found. */
428edbe1
BV
220 if (!prof)
221 continue;
e495a676 222 sr_info("Found ZEROPLUS %s.", prof->model_name);
428edbe1
BV
223
224 /* Register the device with libsigrok. */
0af636be
UH
225 sdi = sr_dev_inst_new();
226 sdi->status = SR_ST_INACTIVE;
227 sdi->vendor = g_strdup(VENDOR_NAME);
228 sdi->model = g_strdup(prof->model_name);
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};