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