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