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