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