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