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