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