]> sigrok.org Git - libsigrok.git/blame - src/hardware/zeroplus-logic-cube/api.c
Drop unneeded std_session_send_df_header() comments.
[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
4f840ce9 259static GSList *dev_list(const struct sr_dev_driver *di)
811deee4 260{
41812aca 261 return ((struct drv_context *)(di->context))->instances;
811deee4
BV
262}
263
6078d2c9 264static int dev_open(struct sr_dev_inst *sdi)
a1bb33af 265{
4f840ce9 266 struct sr_dev_driver *di = sdi->driver;
310e9e9b 267 struct dev_context *devc;
e495a676 268 struct drv_context *drvc;
609bfd75 269 struct sr_usb_dev_inst *usb;
428edbe1 270 libusb_device **devlist, *dev;
428edbe1 271 int device_count, ret, i;
ee4f9bb1 272 char connection_id[64];
a1bb33af 273
41812aca 274 drvc = di->context;
609bfd75 275 usb = sdi->conn;
e495a676 276
310e9e9b 277 if (!(devc = sdi->priv)) {
6d116114 278 sr_err("%s: sdi->priv was NULL", __func__);
bf43ea23
UH
279 return SR_ERR_ARG;
280 }
281
d4abb463
PS
282 device_count = libusb_get_device_list(drvc->sr_ctx->libusb_ctx,
283 &devlist);
428edbe1 284 if (device_count < 0) {
6d116114 285 sr_err("Failed to retrieve device list.");
428edbe1
BV
286 return SR_ERR;
287 }
288
289 dev = NULL;
290 for (i = 0; i < device_count; i++) {
ee4f9bb1
SA
291 usb_get_port_path(devlist[i], connection_id, sizeof(connection_id));
292 if (!strcmp(sdi->connection_id, connection_id)) {
428edbe1
BV
293 dev = devlist[i];
294 break;
295 }
296 }
297 if (!dev) {
ee4f9bb1
SA
298 sr_err("Device on %d.%d (logical) / %s (physical) disappeared!",
299 usb->bus, usb->address, sdi->connection_id);
428edbe1
BV
300 return SR_ERR;
301 }
302
609bfd75 303 if (!(ret = libusb_open(dev, &(usb->devhdl)))) {
428edbe1 304 sdi->status = SR_ST_ACTIVE;
ee4f9bb1
SA
305 sr_info("Opened device on %d.%d (logical) / %s (physical) interface %d.",
306 usb->bus, usb->address, sdi->connection_id, 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
ee4f9bb1
SA
369 sr_info("Closing device on %d.%d (logical) / %s (physical) interface %d.",
370 usb->bus, usb->address, sdi->connection_id, USB_INTERFACE);
609bfd75
BV
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
4f840ce9 380static int cleanup(const struct sr_dev_driver *di)
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;
dcd438ee 389 GVariant *range[2];
a1bb33af 390
53b4680f 391 (void)cg;
8f996b89 392
dcd438ee
UH
393 if (!sdi)
394 return SR_ERR_ARG;
395
396 devc = sdi->priv;
397
584560f1 398 switch (key) {
123e1313 399 case SR_CONF_SAMPLERATE:
dcd438ee 400 *data = g_variant_new_uint64(devc->cur_samplerate);
bf43ea23 401 break;
05f853b5 402 case SR_CONF_CAPTURE_RATIO:
dcd438ee 403 *data = g_variant_new_uint64(devc->capture_ratio);
05f853b5 404 break;
7142d6b9 405 case SR_CONF_VOLTAGE_THRESHOLD:
dcd438ee
UH
406 range[0] = g_variant_new_double(devc->cur_threshold);
407 range[1] = g_variant_new_double(devc->cur_threshold);
408 *data = g_variant_new_tuple(range, 2);
67055d4c 409 break;
bf43ea23 410 default:
bd6fbf62 411 return SR_ERR_NA;
a1bb33af
UH
412 }
413
626409ab 414 return SR_OK;
a1bb33af
UH
415}
416
584560f1 417static int config_set(uint32_t key, GVariant *data, const struct sr_dev_inst *sdi,
53b4680f 418 const struct sr_channel_group *cg)
a1bb33af 419{
310e9e9b 420 struct dev_context *devc;
7142d6b9 421 gdouble low, high;
a1bb33af 422
53b4680f 423 (void)cg;
8f996b89 424
e73ffd42
BV
425 if (sdi->status != SR_ST_ACTIVE)
426 return SR_ERR_DEV_CLOSED;
0ab0cb94 427
310e9e9b 428 if (!(devc = sdi->priv)) {
6d116114 429 sr_err("%s: sdi->priv was NULL", __func__);
bf43ea23
UH
430 return SR_ERR_ARG;
431 }
a1bb33af 432
584560f1 433 switch (key) {
1953564a 434 case SR_CONF_SAMPLERATE:
8386096f 435 return zp_set_samplerate(devc, g_variant_get_uint64(data));
1953564a 436 case SR_CONF_LIMIT_SAMPLES:
8386096f 437 return set_limit_samples(devc, g_variant_get_uint64(data));
1953564a 438 case SR_CONF_CAPTURE_RATIO:
8386096f 439 return set_capture_ratio(devc, g_variant_get_uint64(data));
7142d6b9
RD
440 case SR_CONF_VOLTAGE_THRESHOLD:
441 g_variant_get(data, "(dd)", &low, &high);
442 return set_voltage_threshold(devc, (low + high) / 2.0);
fed16f06 443 default:
bd6fbf62 444 return SR_ERR_NA;
a1bb33af 445 }
e495a676
UH
446
447 return SR_OK;
a1bb33af
UH
448}
449
584560f1 450static int config_list(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi,
53b4680f 451 const struct sr_channel_group *cg)
a1c743fc 452{
17548571 453 struct dev_context *devc;
f0de2dd0 454 GVariant *gvar, *grange[2];
8386096f 455 GVariantBuilder gvb;
7142d6b9
RD
456 double v;
457 GVariant *range[2];
a1c743fc 458
53b4680f 459 (void)cg;
8f996b89 460
a1c743fc 461 switch (key) {
9a6517d1 462 case SR_CONF_DEVICE_OPTIONS:
584560f1 463 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32,
f254bc4b 464 devopts, ARRAY_SIZE(devopts), sizeof(uint32_t));
9a6517d1 465 break;
a1c743fc 466 case SR_CONF_SAMPLERATE:
17548571 467 devc = sdi->priv;
8386096f 468 g_variant_builder_init(&gvb, G_VARIANT_TYPE("a{sv}"));
17548571 469 if (devc->prof->max_sampling_freq == 100) {
8386096f
BV
470 gvar = g_variant_new_fixed_array(G_VARIANT_TYPE("t"),
471 samplerates_100, ARRAY_SIZE(samplerates_100),
472 sizeof(uint64_t));
17548571 473 } else if (devc->prof->max_sampling_freq == 200) {
8386096f
BV
474 gvar = g_variant_new_fixed_array(G_VARIANT_TYPE("t"),
475 samplerates_200, ARRAY_SIZE(samplerates_200),
476 sizeof(uint64_t));
17548571
UH
477 } else {
478 sr_err("Internal error: Unknown max. samplerate: %d.",
479 devc->prof->max_sampling_freq);
480 return SR_ERR_ARG;
481 }
8386096f
BV
482 g_variant_builder_add(&gvb, "{sv}", "samplerates", gvar);
483 *data = g_variant_builder_end(&gvb);
a1c743fc 484 break;
28731bab
BV
485 case SR_CONF_TRIGGER_MATCH:
486 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_INT32,
487 trigger_matches, ARRAY_SIZE(trigger_matches),
488 sizeof(int32_t));
c50277a6 489 break;
7142d6b9
RD
490 case SR_CONF_VOLTAGE_THRESHOLD:
491 g_variant_builder_init(&gvb, G_VARIANT_TYPE_ARRAY);
492 for (v = -6.0; v <= 6.0; v += 0.1) {
493 range[0] = g_variant_new_double(v);
494 range[1] = g_variant_new_double(v);
495 gvar = g_variant_new_tuple(range, 2);
496 g_variant_builder_add_value(&gvb, gvar);
497 }
498 *data = g_variant_builder_end(&gvb);
499 break;
f0de2dd0
BV
500 case SR_CONF_LIMIT_SAMPLES:
501 if (!sdi)
502 return SR_ERR_ARG;
503 devc = sdi->priv;
504 grange[0] = g_variant_new_uint64(0);
505 grange[1] = g_variant_new_uint64(devc->max_sample_depth);
506 *data = g_variant_new_tuple(grange, 2);
507 break;
a1c743fc 508 default:
bd6fbf62 509 return SR_ERR_NA;
a1c743fc
BV
510 }
511
512 return SR_OK;
513}
514
6078d2c9 515static int dev_acquisition_start(const struct sr_dev_inst *sdi,
3ffb6964 516 void *cb_data)
a1bb33af 517{
609bfd75
BV
518 struct dev_context *devc;
519 struct sr_usb_dev_inst *usb;
b9c735a2 520 struct sr_datafeed_packet packet;
9c939c51 521 struct sr_datafeed_logic logic;
42ceb777 522 unsigned int samples_read;
a1bb33af 523 int res;
e495a676 524 unsigned int packet_num, n;
a1bb33af 525 unsigned char *buf;
42ceb777
RD
526 unsigned int status;
527 unsigned int stop_address;
528 unsigned int now_address;
529 unsigned int trigger_address;
530 unsigned int trigger_offset;
531 unsigned int triggerbar;
532 unsigned int ramsize_trigger;
533 unsigned int memory_size;
534 unsigned int valid_samples;
535 unsigned int discard;
536 int trigger_now;
a1bb33af 537
e73ffd42
BV
538 if (sdi->status != SR_ST_ACTIVE)
539 return SR_ERR_DEV_CLOSED;
540
310e9e9b 541 if (!(devc = sdi->priv)) {
6d116114 542 sr_err("%s: sdi->priv was NULL", __func__);
bf43ea23
UH
543 return SR_ERR_ARG;
544 }
a1bb33af 545
28731bab
BV
546 if (analyzer_add_triggers(sdi) != SR_OK) {
547 sr_err("Failed to configure triggers.");
014359e3
BV
548 return SR_ERR;
549 }
550
609bfd75
BV
551 usb = sdi->conn;
552
0ab0cb94
TY
553 set_triggerbar(devc);
554
e495a676 555 /* Push configured settings to device. */
609bfd75 556 analyzer_configure(usb->devhdl);
a143e4e5 557
609bfd75 558 analyzer_start(usb->devhdl);
6d116114 559 sr_info("Waiting for data.");
609bfd75 560 analyzer_wait_data(usb->devhdl);
a1bb33af 561
42ceb777
RD
562 status = analyzer_read_status(usb->devhdl);
563 stop_address = analyzer_get_stop_address(usb->devhdl);
564 now_address = analyzer_get_now_address(usb->devhdl);
565 trigger_address = analyzer_get_trigger_address(usb->devhdl);
566
567 triggerbar = analyzer_get_triggerbar_address();
568 ramsize_trigger = analyzer_get_ramsize_trigger_address();
569
570 n = get_memory_size(devc->memory_size);
571 memory_size = n / 4;
572
573 sr_info("Status = 0x%x.", status);
574 sr_info("Stop address = 0x%x.", stop_address);
575 sr_info("Now address = 0x%x.", now_address);
576 sr_info("Trigger address = 0x%x.", trigger_address);
577 sr_info("Triggerbar address = 0x%x.", triggerbar);
578 sr_info("Ramsize trigger = 0x%x.", ramsize_trigger);
579 sr_info("Memory size = 0x%x.", memory_size);
a1bb33af 580
29a27196 581 std_session_send_df_header(cb_data, LOG_PREFIX);
f366e86c 582
42ceb777
RD
583 /* Check for empty capture */
584 if ((status & STATUS_READY) && !stop_address) {
3be42bc2 585 std_session_send_df_end(cb_data, LOG_PREFIX);
42ceb777
RD
586 return SR_OK;
587 }
588
a95f142e 589 buf = g_malloc(PACKET_SIZE);
b53738ba 590
42ceb777
RD
591 /* Check if the trigger is in the samples we are throwing away */
592 trigger_now = now_address == trigger_address ||
593 ((now_address + 1) % memory_size) == trigger_address;
594
595 /*
596 * STATUS_READY doesn't clear until now_address advances past
597 * addr 0, but for our logic, clear it in that case
598 */
599 if (!now_address)
600 status &= ~STATUS_READY;
601
609bfd75 602 analyzer_read_start(usb->devhdl);
42ceb777
RD
603
604 /* Calculate how much data to discard */
605 discard = 0;
606 if (status & STATUS_READY) {
607 /*
608 * We haven't wrapped around, we need to throw away data from
609 * our current position to the end of the buffer.
610 * Additionally, the first two samples captured are always
611 * bogus.
612 */
613 discard += memory_size - now_address + 2;
614 now_address = 2;
615 }
616
617 /* If we have more samples than we need, discard them */
618 valid_samples = (stop_address - now_address) % memory_size;
619 if (valid_samples > ramsize_trigger + triggerbar) {
620 discard += valid_samples - (ramsize_trigger + triggerbar);
621 now_address += valid_samples - (ramsize_trigger + triggerbar);
622 }
623
624 sr_info("Need to discard %d samples.", discard);
625
626 /* Calculate how far in the trigger is */
627 if (trigger_now)
628 trigger_offset = 0;
629 else
630 trigger_offset = (trigger_address - now_address) % memory_size;
631
632 /* Recalculate the number of samples available */
633 valid_samples = (stop_address - now_address) % memory_size;
634
fed16f06 635 /* Send the incoming transfer to the session bus. */
42ceb777 636 samples_read = 0;
0ab0cb94 637 for (packet_num = 0; packet_num < n / PACKET_SIZE; packet_num++) {
42ceb777
RD
638 unsigned int len;
639 unsigned int buf_offset;
640
609bfd75 641 res = analyzer_read_data(usb->devhdl, buf, PACKET_SIZE);
6d116114 642 sr_info("Tried to read %d bytes, actually read %d bytes.",
b08024a8 643 PACKET_SIZE, res);
a1bb33af 644
42ceb777
RD
645 if (discard >= PACKET_SIZE / 4) {
646 discard -= PACKET_SIZE / 4;
647 continue;
648 }
649
650 len = PACKET_SIZE - discard * 4;
651 buf_offset = discard * 4;
652 discard = 0;
653
654 /* Check if we've read all the samples */
655 if (samples_read + len / 4 >= valid_samples)
656 len = (valid_samples - samples_read) * 4;
657 if (!len)
658 break;
659
660 if (samples_read < trigger_offset &&
661 samples_read + len / 4 > trigger_offset) {
662 /* Send out samples remaining before trigger */
663 packet.type = SR_DF_LOGIC;
664 packet.payload = &logic;
665 logic.length = (trigger_offset - samples_read) * 4;
666 logic.unitsize = 4;
667 logic.data = buf + buf_offset;
668 sr_session_send(cb_data, &packet);
669 len -= logic.length;
670 samples_read += logic.length / 4;
671 buf_offset += logic.length;
672 }
673
674 if (samples_read == trigger_offset) {
675 /* Send out trigger */
676 packet.type = SR_DF_TRIGGER;
677 packet.payload = NULL;
678 sr_session_send(cb_data, &packet);
679 }
680
681 /* Send out data (or data after trigger) */
5a2326a7 682 packet.type = SR_DF_LOGIC;
9c939c51 683 packet.payload = &logic;
42ceb777 684 logic.length = len;
9c939c51 685 logic.unitsize = 4;
42ceb777 686 logic.data = buf + buf_offset;
3cd3a20b 687 sr_session_send(cb_data, &packet);
42ceb777 688 samples_read += len / 4;
a1bb33af 689 }
609bfd75 690 analyzer_read_stop(usb->devhdl);
a1bb33af
UH
691 g_free(buf);
692
3be42bc2 693 std_session_send_df_end(cb_data, LOG_PREFIX);
a1bb33af 694
e46b8fb1 695 return SR_OK;
a1bb33af
UH
696}
697
3cd3a20b 698/* TODO: This stops acquisition on ALL devices, ignoring dev_index. */
6078d2c9 699static int dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data)
a1bb33af 700{
310e9e9b 701 struct dev_context *devc;
609bfd75 702 struct sr_usb_dev_inst *usb;
a1bb33af 703
3be42bc2 704 std_session_send_df_end(cb_data, LOG_PREFIX);
a1bb33af 705
310e9e9b 706 if (!(devc = sdi->priv)) {
6d116114 707 sr_err("%s: sdi->priv was NULL", __func__);
3010f21c 708 return SR_ERR_BUG;
69890f73 709 }
a1bb33af 710
609bfd75
BV
711 usb = sdi->conn;
712 analyzer_reset(usb->devhdl);
fed16f06 713 /* TODO: Need to cancel and free any queued up transfers. */
3010f21c
UH
714
715 return SR_OK;
a1bb33af
UH
716}
717
c09f0b57 718SR_PRIV struct sr_dev_driver zeroplus_logic_cube_driver_info = {
e519ba86 719 .name = "zeroplus-logic-cube",
8fdecced 720 .longname = "ZEROPLUS Logic Cube LAP-C series",
e519ba86 721 .api_version = 1,
6078d2c9
UH
722 .init = init,
723 .cleanup = cleanup,
724 .scan = scan,
725 .dev_list = dev_list,
a6630742 726 .dev_clear = NULL,
035a1078
BV
727 .config_get = config_get,
728 .config_set = config_set,
a1c743fc 729 .config_list = config_list,
6078d2c9
UH
730 .dev_open = dev_open,
731 .dev_close = dev_close,
732 .dev_acquisition_start = dev_acquisition_start,
733 .dev_acquisition_stop = dev_acquisition_stop,
41812aca 734 .context = NULL,
a1bb33af 735};