]> sigrok.org Git - libsigrok.git/blame - hardware/zeroplus-logic-cube/zeroplus.c
sr/drivers: obsolete SR_HWCAP_PROBECONFIG
[libsigrok.git] / hardware / zeroplus-logic-cube / zeroplus.c
CommitLineData
a1bb33af
UH
1/*
2 * This file is part of the sigrok project.
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
20#include <stdio.h>
21#include <stdlib.h>
c31e9ef4 22#include <string.h>
a1bb33af
UH
23#include <sys/time.h>
24#include <inttypes.h>
25#include <glib.h>
26#include <libusb.h>
c31e9ef4 27#include "config.h"
45c59c8b
BV
28#include "libsigrok.h"
29#include "libsigrok-internal.h"
a1bb33af
UH
30#include "analyzer.h"
31
fed16f06 32#define USB_VENDOR 0x0c12
8fdecced
UH
33
34#define VENDOR_NAME "ZEROPLUS"
35#define MODEL_NAME "Logic Cube LAP-C"
36#define MODEL_VERSION NULL
a1bb33af 37
6752905e 38#define NUM_PROBES 16
a1bb33af
UH
39#define USB_INTERFACE 0
40#define USB_CONFIGURATION 1
41#define NUM_TRIGGER_STAGES 4
42#define TRIGGER_TYPES "01"
43
fed16f06 44#define PACKET_SIZE 2048 /* ?? */
a1bb33af
UH
45
46typedef struct {
428edbe1 47 unsigned short vid;
a1bb33af 48 unsigned short pid;
428edbe1 49 char *model_name;
a1bb33af 50 unsigned int channels;
fed16f06 51 unsigned int sample_depth; /* In Ksamples/channel */
a1bb33af
UH
52 unsigned int max_sampling_freq;
53} model_t;
54
fed16f06
UH
55/*
56 * Note -- 16032, 16064 and 16128 *usually* -- but not always -- have the
57 * same 128K sample depth.
58 */
29cbfeaf 59static model_t zeroplus_models[] = {
428edbe1
BV
60 {0x0c12, 0x7009, "LAP-C(16064)", 16, 64, 100},
61 {0x0c12, 0x700A, "LAP-C(16128)", 16, 128, 200},
3f848bb7 62 /* TODO: we don't know anything about these
428edbe1
BV
63 {0x0c12, 0x700B, "LAP-C(32128)", 32, 128, 200},
64 {0x0c12, 0x700C, "LAP-C(321000)", 32, 1024, 200},
65 {0x0c12, 0x700D, "LAP-C(322000)", 32, 2048, 200},
3f848bb7 66 */
428edbe1
BV
67 {0x0c12, 0x700E, "LAP-C(16032)", 16, 32, 100},
68 {0x0c12, 0x7016, "LAP-C(162000)", 16, 2048, 200},
69 { 0, 0, 0, 0, 0, 0 }
a1bb33af
UH
70};
71
915f7cc8 72static const int hwcaps[] = {
5a2326a7
UH
73 SR_HWCAP_LOGIC_ANALYZER,
74 SR_HWCAP_SAMPLERATE,
5a2326a7 75 SR_HWCAP_CAPTURE_RATIO,
a1bb33af 76
fed16f06 77 /* These are really implemented in the driver, not the hardware. */
5a2326a7 78 SR_HWCAP_LIMIT_SAMPLES,
fed16f06 79 0,
a1bb33af
UH
80};
81
d261dbbf
UH
82/*
83 * ZEROPLUS LAP-C (16032) numbers the 16 probes A0-A7 and B0-B7.
84 * We currently ignore other untested/unsupported devices here.
85 */
6752905e 86static const char *probe_names[NUM_PROBES + 1] = {
d261dbbf
UH
87 "A0",
88 "A1",
89 "A2",
90 "A3",
91 "A4",
92 "A5",
93 "A6",
94 "A7",
95 "B0",
96 "B1",
97 "B2",
98 "B3",
99 "B4",
100 "B5",
101 "B6",
102 "B7",
464d12c7
KS
103 NULL,
104};
105
e7eb703f 106/* List of struct sr_dev_inst, maintained by dev_open()/dev_close(). */
32756547
BV
107SR_PRIV struct sr_dev_driver zeroplus_logic_cube_driver_info;
108static struct sr_dev_driver *zdi = &zeroplus_logic_cube_driver_info;
a1bb33af
UH
109
110static libusb_context *usb_context = NULL;
111
fed16f06
UH
112/*
113 * The hardware supports more samplerates than these, but these are the
114 * options hardcoded into the vendor's Windows GUI.
115 */
a1bb33af 116
fed16f06
UH
117/*
118 * TODO: We shouldn't support 150MHz and 200MHz on devices that don't go up
119 * that high.
120 */
a533743d 121static const uint64_t supported_samplerates[] = {
c9140419
UH
122 SR_HZ(100),
123 SR_HZ(500),
59df0c77
UH
124 SR_KHZ(1),
125 SR_KHZ(5),
126 SR_KHZ(25),
127 SR_KHZ(50),
128 SR_KHZ(100),
129 SR_KHZ(200),
130 SR_KHZ(400),
131 SR_KHZ(800),
132 SR_MHZ(1),
133 SR_MHZ(10),
134 SR_MHZ(25),
135 SR_MHZ(50),
136 SR_MHZ(80),
137 SR_MHZ(100),
138 SR_MHZ(150),
139 SR_MHZ(200),
fed16f06 140 0,
a1bb33af
UH
141};
142
a533743d 143static const struct sr_samplerates samplerates = {
590b9f9a
UH
144 0,
145 0,
146 0,
fed16f06 147 supported_samplerates,
a1bb33af
UH
148};
149
310e9e9b
BV
150/* Private driver context. */
151struct drv_context {
152 GSList *instances;
153};
154
ea9cfed7 155/* Private, per-device-instance driver context. */
310e9e9b 156struct dev_context {
bf43ea23 157 uint64_t cur_samplerate;
bf43ea23
UH
158 uint64_t limit_samples;
159 int num_channels; /* TODO: This isn't initialized before it's needed :( */
160 uint64_t memory_size;
161 uint8_t probe_mask;
162 uint8_t trigger_mask[NUM_TRIGGER_STAGES];
163 uint8_t trigger_value[NUM_TRIGGER_STAGES];
164 // uint8_t trigger_buffer[NUM_TRIGGER_STAGES];
69890f73 165
7da6f9d5 166 /* TODO: this belongs in the device instance */
d68e2d1a 167 struct sr_usb_dev_inst *usb;
bf43ea23 168};
a1bb33af 169
6f4b1868
BV
170static int hw_dev_config_set(const struct sr_dev_inst *sdi, int hwcap,
171 const void *value);
25a0f108 172static int hw_dev_close(struct sr_dev_inst *sdi);
a1bb33af
UH
173
174static unsigned int get_memory_size(int type)
175{
fed16f06
UH
176 if (type == MEMORY_SIZE_8K)
177 return 8 * 1024;
178 else if (type == MEMORY_SIZE_64K)
179 return 64 * 1024;
180 else if (type == MEMORY_SIZE_128K)
181 return 128 * 1024;
182 else if (type == MEMORY_SIZE_512K)
183 return 512 * 1024;
184 else
185 return 0;
a1bb33af
UH
186}
187
014359e3 188static int configure_probes(const struct sr_dev_inst *sdi)
a1bb33af 189{
310e9e9b 190 struct dev_context *devc;
1b79df2f
JH
191 const struct sr_probe *probe;
192 const GSList *l;
a1bb33af
UH
193 int probe_bit, stage, i;
194 char *tc;
195
bf43ea23 196 /* Note: sdi and sdi->priv are non-NULL, the caller checked this. */
310e9e9b 197 devc = sdi->priv;
bf43ea23 198
310e9e9b 199 devc->probe_mask = 0;
fed16f06 200 for (i = 0; i < NUM_TRIGGER_STAGES; i++) {
310e9e9b
BV
201 devc->trigger_mask[i] = 0;
202 devc->trigger_value[i] = 0;
a1bb33af
UH
203 }
204
205 stage = -1;
014359e3 206 for (l = sdi->probes; l; l = l->next) {
1afe8989 207 probe = (struct sr_probe *)l->data;
fed16f06 208 if (probe->enabled == FALSE)
a1bb33af 209 continue;
b35c8293 210 probe_bit = 1 << (probe->index);
310e9e9b 211 devc->probe_mask |= probe_bit;
fed16f06
UH
212
213 if (probe->trigger) {
a1bb33af 214 stage = 0;
fed16f06 215 for (tc = probe->trigger; *tc; tc++) {
310e9e9b 216 devc->trigger_mask[stage] |= probe_bit;
fed16f06 217 if (*tc == '1')
310e9e9b 218 devc->trigger_value[stage] |= probe_bit;
a1bb33af 219 stage++;
fed16f06 220 if (stage > NUM_TRIGGER_STAGES)
e46b8fb1 221 return SR_ERR;
a1bb33af
UH
222 }
223 }
224 }
225
e46b8fb1 226 return SR_OK;
a1bb33af
UH
227}
228
7da6f9d5
BV
229static void clear_instances(void)
230{
231 GSList *l;
232 struct sr_dev_inst *sdi;
310e9e9b 233 struct drv_context *drvc;
fabe59b3 234 struct dev_context *devc;
7da6f9d5 235
310e9e9b
BV
236 drvc = zdi->priv;
237 for (l = drvc->instances; l; l = l->next) {
7da6f9d5 238 sdi = l->data;
fabe59b3
BV
239 if (!(devc = sdi->priv)) {
240 /* Log error, but continue cleaning up the rest. */
241 sr_err("zeroplus: %s: sdi->priv was NULL, continuing", __func__);
242 continue;
243 }
244 sr_usb_dev_inst_free(devc->usb);
7da6f9d5 245 /* Properly close all devices... */
25a0f108 246 hw_dev_close(sdi);
7da6f9d5
BV
247 /* ...and free all their memory. */
248 sr_dev_inst_free(sdi);
249 }
310e9e9b
BV
250 g_slist_free(drvc->instances);
251 drvc->instances = NULL;
7da6f9d5
BV
252
253}
254
a1bb33af
UH
255/*
256 * API callbacks
257 */
258
40dda2c3 259static int hw_init(void)
61136ea6 260{
310e9e9b
BV
261 struct drv_context *drvc;
262
263 if (!(drvc = g_try_malloc0(sizeof(struct drv_context)))) {
264 sr_err("zeroplus: driver context malloc failed.");
265 return SR_ERR;
266 }
267 zdi->priv = drvc;
61136ea6 268
7da6f9d5
BV
269 if (libusb_init(&usb_context) != 0) {
270 sr_err("zp: Failed to initialize USB.");
271 return 0;
272 }
61136ea6
BV
273
274 return SR_OK;
275}
276
4ca38984 277static GSList *hw_scan(GSList *options)
a1bb33af 278{
d68e2d1a 279 struct sr_dev_inst *sdi;
428edbe1 280 struct sr_probe *probe;
310e9e9b
BV
281 struct drv_context *drvc;
282 struct dev_context *devc;
428edbe1 283 model_t *prof;
a1bb33af
UH
284 struct libusb_device_descriptor des;
285 libusb_device **devlist;
428edbe1
BV
286 GSList *devices;
287 int ret, devcnt, i, j;
a1bb33af 288
4ca38984 289 (void)options;
310e9e9b 290 drvc = zdi->priv;
4ca38984
BV
291 devices = NULL;
292
7da6f9d5
BV
293 clear_instances();
294
8fdecced 295 /* Find all ZEROPLUS analyzers and add them to device list. */
a1bb33af 296 devcnt = 0;
185ae2c5 297 libusb_get_device_list(usb_context, &devlist); /* TODO: Errors. */
fed16f06
UH
298
299 for (i = 0; devlist[i]; i++) {
ebc34738
UH
300 ret = libusb_get_device_descriptor(devlist[i], &des);
301 if (ret != 0) {
302 sr_err("zp: failed to get device descriptor: %d", ret);
a1bb33af
UH
303 continue;
304 }
305
428edbe1
BV
306 prof = NULL;
307 for (j = 0; j < zeroplus_models[j].vid; j++) {
308 if (des.idVendor == zeroplus_models[j].vid &&
309 des.idProduct == zeroplus_models[j].pid) {
310 prof = &zeroplus_models[j];
bf43ea23 311 }
a1bb33af 312 }
428edbe1
BV
313 /* Skip if the device was not found */
314 if (!prof)
315 continue;
316 sr_info("zp: Found ZEROPLUS model %s", prof->model_name);
317
318 /* Register the device with libsigrok. */
319 if (!(sdi = sr_dev_inst_new(devcnt, SR_ST_INACTIVE,
320 VENDOR_NAME, prof->model_name, NULL))) {
321 sr_err("zp: %s: sr_dev_inst_new failed", __func__);
322 return NULL;
323 }
324 sdi->driver = zdi;
325
326 /* Allocate memory for our private driver context. */
310e9e9b
BV
327 if (!(devc = g_try_malloc0(sizeof(struct dev_context)))) {
328 sr_err("zp: %s: devc malloc failed", __func__);
428edbe1
BV
329 return 0;
330 }
310e9e9b
BV
331 sdi->priv = devc;
332 devc->num_channels = prof->channels;
333 devc->memory_size = prof->sample_depth * 1024;
334 // memset(devc->trigger_buffer, 0, NUM_TRIGGER_STAGES);
428edbe1
BV
335
336 /* Fill in probelist according to this device's profile. */
310e9e9b 337 for (j = 0; j < devc->num_channels; j++) {
428edbe1
BV
338 if (!(probe = sr_probe_new(j, SR_PROBE_LOGIC, TRUE,
339 probe_names[j])))
340 return NULL;
341 sdi->probes = g_slist_append(sdi->probes, probe);
342 }
343
344 devices = g_slist_append(devices, sdi);
310e9e9b
BV
345 drvc->instances = g_slist_append(drvc->instances, sdi);
346 devc->usb = sr_usb_dev_inst_new(
428edbe1
BV
347 libusb_get_bus_number(devlist[i]),
348 libusb_get_device_address(devlist[i]), NULL);
349 devcnt++;
350
a1bb33af
UH
351 }
352 libusb_free_device_list(devlist, 1);
353
4ca38984 354 return devices;
a1bb33af
UH
355}
356
25a0f108 357static int hw_dev_open(struct sr_dev_inst *sdi)
a1bb33af 358{
310e9e9b 359 struct dev_context *devc;
428edbe1
BV
360 libusb_device **devlist, *dev;
361 struct libusb_device_descriptor des;
362 int device_count, ret, i;
a1bb33af 363
310e9e9b 364 if (!(devc = sdi->priv)) {
bf43ea23
UH
365 sr_err("zp: %s: sdi->priv was NULL", __func__);
366 return SR_ERR_ARG;
367 }
368
428edbe1
BV
369 device_count = libusb_get_device_list(usb_context, &devlist);
370 if (device_count < 0) {
371 sr_err("zp: Failed to retrieve device list");
372 return SR_ERR;
373 }
374
375 dev = NULL;
376 for (i = 0; i < device_count; i++) {
377 if ((ret = libusb_get_device_descriptor(devlist[i], &des))) {
378 sr_err("fx2lafw: Failed to get device descriptor: %d.",
379 ret);
380 continue;
381 }
310e9e9b
BV
382 if (libusb_get_bus_number(devlist[i]) == devc->usb->bus
383 && libusb_get_device_address(devlist[i]) == devc->usb->address) {
428edbe1
BV
384 dev = devlist[i];
385 break;
386 }
387 }
388 if (!dev) {
389 sr_err("device on bus %d address %d disappeared!",
310e9e9b 390 devc->usb->bus, devc->usb->address);
428edbe1
BV
391 return SR_ERR;
392 }
393
310e9e9b 394 if (!(ret = libusb_open(dev, &(devc->usb->devhdl)))) {
428edbe1
BV
395 sdi->status = SR_ST_ACTIVE;
396 sr_info("zp: opened device %d on %d.%d interface %d",
310e9e9b
BV
397 sdi->index, devc->usb->bus,
398 devc->usb->address, USB_INTERFACE);
428edbe1
BV
399 } else {
400 sr_err("zp: failed to open device: %d", ret);
401 return SR_ERR;
402 }
403
310e9e9b 404 ret = libusb_set_configuration(devc->usb->devhdl, USB_CONFIGURATION);
ebc34738 405 if (ret < 0) {
133a37bf 406 sr_err("zp: Unable to set USB configuration %d: %d",
ebc34738 407 USB_CONFIGURATION, ret);
185ae2c5
UH
408 return SR_ERR;
409 }
410
310e9e9b 411 ret = libusb_claim_interface(devc->usb->devhdl, USB_INTERFACE);
ebc34738
UH
412 if (ret != 0) {
413 sr_err("zp: Unable to claim interface: %d", ret);
e46b8fb1 414 return SR_ERR;
a1bb33af 415 }
185ae2c5 416
310e9e9b
BV
417 analyzer_reset(devc->usb->devhdl);
418 analyzer_initialize(devc->usb->devhdl);
a1bb33af
UH
419
420 analyzer_set_memory_size(MEMORY_SIZE_512K);
fed16f06 421 // analyzer_set_freq(g_freq, g_freq_scale);
a1bb33af 422 analyzer_set_trigger_count(1);
408e7199
UH
423 // analyzer_set_ramsize_trigger_address((((100 - g_pre_trigger)
424 // * get_memory_size(g_memory_size)) / 100) >> 2);
fed16f06
UH
425 analyzer_set_ramsize_trigger_address(
426 (100 * get_memory_size(MEMORY_SIZE_512K) / 100) >> 2);
a1bb33af 427
fed16f06
UH
428#if 0
429 if (g_double_mode == 1)
a1bb33af
UH
430 analyzer_set_compression(COMPRESSION_DOUBLE);
431 else if (g_compression == 1)
432 analyzer_set_compression(COMPRESSION_ENABLE);
fed16f06
UH
433 else
434#endif
435 analyzer_set_compression(COMPRESSION_NONE);
a1bb33af 436
310e9e9b 437 if (devc->cur_samplerate == 0) {
408e7199 438 /* Samplerate hasn't been set. Default to the slowest one. */
6f4b1868 439 if (hw_dev_config_set(sdi, SR_HWCAP_SAMPLERATE,
73017cf9 440 &samplerates.list[0]) == SR_ERR)
e46b8fb1 441 return SR_ERR;
a1bb33af
UH
442 }
443
e46b8fb1 444 return SR_OK;
a1bb33af
UH
445}
446
25a0f108 447static int hw_dev_close(struct sr_dev_inst *sdi)
a1bb33af 448{
310e9e9b 449 struct dev_context *devc;
a1bb33af 450
310e9e9b 451 if (!(devc = sdi->priv)) {
25a0f108
BV
452 sr_err("zp: %s: sdi->priv was NULL", __func__);
453 return SR_ERR;
697785d1
UH
454 }
455
310e9e9b 456 if (!devc->usb->devhdl)
25a0f108
BV
457 return SR_ERR;
458
459 sr_info("zp: closing device %d on %d.%d interface %d", sdi->index,
310e9e9b
BV
460 devc->usb->bus, devc->usb->address, USB_INTERFACE);
461 libusb_release_interface(devc->usb->devhdl, USB_INTERFACE);
462 libusb_reset_device(devc->usb->devhdl);
463 libusb_close(devc->usb->devhdl);
464 devc->usb->devhdl = NULL;
25a0f108 465 sdi->status = SR_ST_INACTIVE;
697785d1
UH
466
467 return SR_OK;
a1bb33af
UH
468}
469
57ab7d9f 470static int hw_cleanup(void)
a1bb33af 471{
310e9e9b
BV
472 struct drv_context *drvc;
473
474 if (!(drvc = zdi->priv))
475 return SR_OK;
a1bb33af 476
7da6f9d5 477 clear_instances();
a1bb33af 478
fed16f06 479 if (usb_context)
a1bb33af
UH
480 libusb_exit(usb_context);
481 usb_context = NULL;
57ab7d9f
UH
482
483 return SR_OK;
a1bb33af
UH
484}
485
626409ab
BV
486static int hw_info_get(int info_id, const void **data,
487 const struct sr_dev_inst *sdi)
a1bb33af 488{
310e9e9b 489 struct dev_context *devc;
a1bb33af 490
626409ab 491 switch (info_id) {
444adea2
BV
492 case SR_DI_HWCAPS:
493 *data = hwcaps;
494 break;
5a2326a7 495 case SR_DI_NUM_PROBES:
626409ab 496 if (sdi) {
310e9e9b
BV
497 devc = sdi->priv;
498 *data = GINT_TO_POINTER(devc->num_channels);
626409ab 499 sr_spew("zp: %s: Returning number of channels: %d.",
310e9e9b 500 __func__, devc->num_channels);
626409ab
BV
501 } else
502 return SR_ERR;
a1bb33af 503 break;
464d12c7 504 case SR_DI_PROBE_NAMES:
626409ab 505 *data = probe_names;
6752905e 506 sr_spew("zp: %s: Returning probenames.", __func__);
464d12c7 507 break;
5a2326a7 508 case SR_DI_SAMPLERATES:
626409ab 509 *data = &samplerates;
6752905e 510 sr_spew("zp: %s: Returning samplerates.", __func__);
a1bb33af 511 break;
5a2326a7 512 case SR_DI_TRIGGER_TYPES:
626409ab
BV
513 *data = TRIGGER_TYPES;
514 sr_spew("zp: %s: Returning triggertypes: %s.", __func__, TRIGGER_TYPES);
a1bb33af 515 break;
5a2326a7 516 case SR_DI_CUR_SAMPLERATE:
626409ab 517 if (sdi) {
310e9e9b
BV
518 devc = sdi->priv;
519 *data = &devc->cur_samplerate;
626409ab 520 sr_spew("zp: %s: Returning samplerate: %" PRIu64 "Hz.",
310e9e9b 521 __func__, devc->cur_samplerate);
626409ab
BV
522 } else
523 return SR_ERR;
bf43ea23
UH
524 break;
525 default:
626409ab 526 return SR_ERR_ARG;
a1bb33af
UH
527 }
528
626409ab 529 return SR_OK;
a1bb33af
UH
530}
531
6f4b1868 532static int set_samplerate(const struct sr_dev_inst *sdi, uint64_t samplerate)
a1bb33af 533{
310e9e9b 534 struct dev_context *devc;
bf43ea23
UH
535
536 if (!sdi) {
537 sr_err("zp: %s: sdi was NULL", __func__);
538 return SR_ERR_ARG;
539 }
540
310e9e9b 541 if (!(devc = sdi->priv)) {
bf43ea23
UH
542 sr_err("zp: %s: sdi->priv was NULL", __func__);
543 return SR_ERR_ARG;
544 }
545
73017cf9
UH
546 sr_info("zp: Setting samplerate to %" PRIu64 "Hz.", samplerate);
547
59df0c77
UH
548 if (samplerate > SR_MHZ(1))
549 analyzer_set_freq(samplerate / SR_MHZ(1), FREQ_SCALE_MHZ);
550 else if (samplerate > SR_KHZ(1))
551 analyzer_set_freq(samplerate / SR_KHZ(1), FREQ_SCALE_KHZ);
a1bb33af 552 else
fed16f06 553 analyzer_set_freq(samplerate, FREQ_SCALE_HZ);
a1bb33af 554
310e9e9b 555 devc->cur_samplerate = samplerate;
a1bb33af 556
e46b8fb1 557 return SR_OK;
a1bb33af
UH
558}
559
6f4b1868
BV
560static int hw_dev_config_set(const struct sr_dev_inst *sdi, int hwcap,
561 const void *value)
a1bb33af 562{
310e9e9b 563 struct dev_context *devc;
a1bb33af 564
310e9e9b 565 if (!(devc = sdi->priv)) {
bf43ea23
UH
566 sr_err("zp: %s: sdi->priv was NULL", __func__);
567 return SR_ERR_ARG;
568 }
a1bb33af 569
ffedd0bf 570 switch (hwcap) {
5a2326a7 571 case SR_HWCAP_SAMPLERATE:
1b79df2f 572 return set_samplerate(sdi, *(const uint64_t *)value);
5a2326a7 573 case SR_HWCAP_LIMIT_SAMPLES:
310e9e9b 574 devc->limit_samples = *(const uint64_t *)value;
e46b8fb1 575 return SR_OK;
fed16f06 576 default:
e46b8fb1 577 return SR_ERR;
a1bb33af
UH
578 }
579}
580
3ffb6964
BV
581static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi,
582 void *cb_data)
a1bb33af 583{
b9c735a2 584 struct sr_datafeed_packet packet;
9c939c51 585 struct sr_datafeed_logic logic;
b9c735a2 586 struct sr_datafeed_header header;
f366e86c 587 struct sr_datafeed_meta_logic meta;
9c939c51 588 uint64_t samples_read;
a1bb33af 589 int res;
afc8e4de 590 unsigned int packet_num;
a1bb33af 591 unsigned char *buf;
310e9e9b 592 struct dev_context *devc;
a1bb33af 593
310e9e9b 594 if (!(devc = sdi->priv)) {
bf43ea23
UH
595 sr_err("zp: %s: sdi->priv was NULL", __func__);
596 return SR_ERR_ARG;
597 }
a1bb33af 598
014359e3
BV
599 if (configure_probes(sdi) != SR_OK) {
600 sr_err("zp: failed to configured probes");
601 return SR_ERR;
602 }
603
a143e4e5 604 /* push configured settings to device */
310e9e9b 605 analyzer_configure(devc->usb->devhdl);
a143e4e5 606
310e9e9b 607 analyzer_start(devc->usb->devhdl);
7b48d6e1 608 sr_info("zp: Waiting for data");
310e9e9b 609 analyzer_wait_data(devc->usb->devhdl);
a1bb33af 610
7b48d6e1 611 sr_info("zp: Stop address = 0x%x",
310e9e9b 612 analyzer_get_stop_address(devc->usb->devhdl));
7b48d6e1 613 sr_info("zp: Now address = 0x%x",
310e9e9b 614 analyzer_get_now_address(devc->usb->devhdl));
7b48d6e1 615 sr_info("zp: Trigger address = 0x%x",
310e9e9b 616 analyzer_get_trigger_address(devc->usb->devhdl));
a1bb33af 617
5a2326a7 618 packet.type = SR_DF_HEADER;
9c939c51 619 packet.payload = &header;
a1bb33af
UH
620 header.feed_version = 1;
621 gettimeofday(&header.starttime, NULL);
f366e86c
BV
622 sr_session_send(cb_data, &packet);
623
624 /* Send metadata about the SR_DF_LOGIC packets to come. */
625 packet.type = SR_DF_META_LOGIC;
626 packet.payload = &meta;
310e9e9b
BV
627 meta.samplerate = devc->cur_samplerate;
628 meta.num_probes = devc->num_channels;
3cd3a20b 629 sr_session_send(cb_data, &packet);
a1bb33af 630
b53738ba 631 if (!(buf = g_try_malloc(PACKET_SIZE))) {
bf43ea23 632 sr_err("zp: %s: buf malloc failed", __func__);
b53738ba
UH
633 return SR_ERR_MALLOC;
634 }
635
9c939c51 636 samples_read = 0;
310e9e9b 637 analyzer_read_start(devc->usb->devhdl);
fed16f06 638 /* Send the incoming transfer to the session bus. */
310e9e9b 639 for (packet_num = 0; packet_num < (devc->memory_size * 4 / PACKET_SIZE);
fed16f06 640 packet_num++) {
310e9e9b 641 res = analyzer_read_data(devc->usb->devhdl, buf, PACKET_SIZE);
7b48d6e1 642 sr_info("zp: Tried to read %llx bytes, actually read %x bytes",
b08024a8 643 PACKET_SIZE, res);
a1bb33af 644
5a2326a7 645 packet.type = SR_DF_LOGIC;
9c939c51
BV
646 packet.payload = &logic;
647 logic.length = PACKET_SIZE;
648 logic.unitsize = 4;
649 logic.data = buf;
3cd3a20b 650 sr_session_send(cb_data, &packet);
9c939c51 651 samples_read += res / 4;
a1bb33af 652 }
310e9e9b 653 analyzer_read_stop(devc->usb->devhdl);
a1bb33af
UH
654 g_free(buf);
655
5a2326a7 656 packet.type = SR_DF_END;
3cd3a20b 657 sr_session_send(cb_data, &packet);
a1bb33af 658
e46b8fb1 659 return SR_OK;
a1bb33af
UH
660}
661
3cd3a20b 662/* TODO: This stops acquisition on ALL devices, ignoring dev_index. */
3ffb6964
BV
663static int hw_dev_acquisition_stop(const struct sr_dev_inst *sdi,
664 void *cb_data)
a1bb33af 665{
b9c735a2 666 struct sr_datafeed_packet packet;
310e9e9b 667 struct dev_context *devc;
a1bb33af 668
5a2326a7 669 packet.type = SR_DF_END;
3cd3a20b 670 sr_session_send(cb_data, &packet);
a1bb33af 671
310e9e9b 672 if (!(devc = sdi->priv)) {
69890f73 673 sr_err("zp: %s: sdi->priv was NULL", __func__);
3010f21c 674 return SR_ERR_BUG;
69890f73 675 }
a1bb33af 676
310e9e9b 677 analyzer_reset(devc->usb->devhdl);
fed16f06 678 /* TODO: Need to cancel and free any queued up transfers. */
3010f21c
UH
679
680 return SR_OK;
a1bb33af
UH
681}
682
c09f0b57 683SR_PRIV struct sr_dev_driver zeroplus_logic_cube_driver_info = {
e519ba86 684 .name = "zeroplus-logic-cube",
8fdecced 685 .longname = "ZEROPLUS Logic Cube LAP-C series",
e519ba86
UH
686 .api_version = 1,
687 .init = hw_init,
688 .cleanup = hw_cleanup,
61136ea6 689 .scan = hw_scan,
e7eb703f
UH
690 .dev_open = hw_dev_open,
691 .dev_close = hw_dev_close,
626409ab 692 .info_get = hw_info_get,
a9a245b4 693 .dev_config_set = hw_dev_config_set,
69040b7c
UH
694 .dev_acquisition_start = hw_dev_acquisition_start,
695 .dev_acquisition_stop = hw_dev_acquisition_stop,
310e9e9b 696 .priv = NULL,
a1bb33af 697};