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