]> sigrok.org Git - libsigrok.git/blame - hardware/zeroplus-logic-cube/zeroplus.c
hw_init(): Save struct sr_context * parameter in struct drv_context
[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>
45c59c8b
BV
27#include "libsigrok.h"
28#include "libsigrok-internal.h"
a1bb33af
UH
29#include "analyzer.h"
30
fed16f06 31#define USB_VENDOR 0x0c12
8fdecced
UH
32
33#define VENDOR_NAME "ZEROPLUS"
34#define MODEL_NAME "Logic Cube LAP-C"
35#define MODEL_VERSION NULL
a1bb33af 36
6752905e 37#define NUM_PROBES 16
a1bb33af
UH
38#define USB_INTERFACE 0
39#define USB_CONFIGURATION 1
40#define NUM_TRIGGER_STAGES 4
41#define TRIGGER_TYPES "01"
42
fed16f06 43#define PACKET_SIZE 2048 /* ?? */
a1bb33af 44
0ab0cb94
TY
45//#define ZP_EXPERIMENTAL
46
a1bb33af 47typedef struct {
428edbe1 48 unsigned short vid;
a1bb33af 49 unsigned short pid;
428edbe1 50 char *model_name;
a1bb33af 51 unsigned int channels;
fed16f06 52 unsigned int sample_depth; /* In Ksamples/channel */
a1bb33af
UH
53 unsigned int max_sampling_freq;
54} model_t;
55
fed16f06
UH
56/*
57 * Note -- 16032, 16064 and 16128 *usually* -- but not always -- have the
58 * same 128K sample depth.
59 */
29cbfeaf 60static model_t zeroplus_models[] = {
428edbe1
BV
61 {0x0c12, 0x7009, "LAP-C(16064)", 16, 64, 100},
62 {0x0c12, 0x700A, "LAP-C(16128)", 16, 128, 200},
3f848bb7 63 /* TODO: we don't know anything about these
428edbe1
BV
64 {0x0c12, 0x700B, "LAP-C(32128)", 32, 128, 200},
65 {0x0c12, 0x700C, "LAP-C(321000)", 32, 1024, 200},
66 {0x0c12, 0x700D, "LAP-C(322000)", 32, 2048, 200},
3f848bb7 67 */
428edbe1
BV
68 {0x0c12, 0x700E, "LAP-C(16032)", 16, 32, 100},
69 {0x0c12, 0x7016, "LAP-C(162000)", 16, 2048, 200},
70 { 0, 0, 0, 0, 0, 0 }
a1bb33af
UH
71};
72
915f7cc8 73static const int hwcaps[] = {
5a2326a7
UH
74 SR_HWCAP_LOGIC_ANALYZER,
75 SR_HWCAP_SAMPLERATE,
5a2326a7 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
ea9cfed7 151/* Private, per-device-instance driver context. */
310e9e9b 152struct dev_context {
bf43ea23 153 uint64_t cur_samplerate;
0ab0cb94 154 uint64_t max_samplerate;
bf43ea23
UH
155 uint64_t limit_samples;
156 int num_channels; /* TODO: This isn't initialized before it's needed :( */
0ab0cb94
TY
157 int memory_size;
158 unsigned int max_memory_size;
159 //uint8_t probe_mask;
160 //uint8_t trigger_mask[NUM_TRIGGER_STAGES];
161 //uint8_t trigger_value[NUM_TRIGGER_STAGES];
bf43ea23 162 // uint8_t trigger_buffer[NUM_TRIGGER_STAGES];
0ab0cb94
TY
163 int trigger;
164 unsigned int capture_ratio;
69890f73 165
7da6f9d5 166 /* TODO: this belongs in the device instance */
d68e2d1a 167 struct sr_usb_dev_inst *usb;
bf43ea23 168};
a1bb33af 169
25a0f108 170static int hw_dev_close(struct sr_dev_inst *sdi);
a1bb33af
UH
171
172static unsigned int get_memory_size(int type)
173{
fed16f06
UH
174 if (type == MEMORY_SIZE_8K)
175 return 8 * 1024;
176 else if (type == MEMORY_SIZE_64K)
177 return 64 * 1024;
178 else if (type == MEMORY_SIZE_128K)
179 return 128 * 1024;
180 else if (type == MEMORY_SIZE_512K)
181 return 512 * 1024;
182 else
183 return 0;
a1bb33af
UH
184}
185
0ab0cb94 186#if 0
014359e3 187static int configure_probes(const struct sr_dev_inst *sdi)
a1bb33af 188{
310e9e9b 189 struct dev_context *devc;
1b79df2f
JH
190 const struct sr_probe *probe;
191 const GSList *l;
a1bb33af
UH
192 int probe_bit, stage, i;
193 char *tc;
194
bf43ea23 195 /* Note: sdi and sdi->priv are non-NULL, the caller checked this. */
310e9e9b 196 devc = sdi->priv;
bf43ea23 197
310e9e9b 198 devc->probe_mask = 0;
fed16f06 199 for (i = 0; i < NUM_TRIGGER_STAGES; i++) {
310e9e9b
BV
200 devc->trigger_mask[i] = 0;
201 devc->trigger_value[i] = 0;
a1bb33af
UH
202 }
203
204 stage = -1;
014359e3 205 for (l = sdi->probes; l; l = l->next) {
1afe8989 206 probe = (struct sr_probe *)l->data;
fed16f06 207 if (probe->enabled == FALSE)
a1bb33af 208 continue;
b35c8293 209 probe_bit = 1 << (probe->index);
310e9e9b 210 devc->probe_mask |= probe_bit;
fed16f06
UH
211
212 if (probe->trigger) {
a1bb33af 213 stage = 0;
fed16f06 214 for (tc = probe->trigger; *tc; tc++) {
310e9e9b 215 devc->trigger_mask[stage] |= probe_bit;
fed16f06 216 if (*tc == '1')
310e9e9b 217 devc->trigger_value[stage] |= probe_bit;
a1bb33af 218 stage++;
fed16f06 219 if (stage > NUM_TRIGGER_STAGES)
e46b8fb1 220 return SR_ERR;
a1bb33af
UH
221 }
222 }
223 }
224
e46b8fb1 225 return SR_OK;
a1bb33af 226}
0ab0cb94
TY
227#endif
228
229static int configure_probes(const struct sr_dev_inst *sdi)
230{
231 struct dev_context *devc;
232 const GSList *l;
233 const struct sr_probe *probe;
234 char *tc;
235 int type;
236
237 /* Note: sdi and sdi->priv are non-NULL, the caller checked this. */
238 devc = sdi->priv;
239
240 for (l = sdi->probes; l; l = l->next) {
241 probe = (struct sr_probe *)l->data;
242 if (probe->enabled == FALSE)
243 continue;
244
245 if ((tc = probe->trigger)) {
246 switch (*tc) {
247 case '1':
248 type = TRIGGER_HIGH;
249 break;
250 case '0':
251 type = TRIGGER_LOW;
252 break;
253#if 0
254 case 'r':
255 type = TRIGGER_POSEDGE;
256 break;
257 case 'f':
258 type = TRIGGER_NEGEDGE;
259 break;
260 case 'c':
261 type = TRIGGER_ANYEDGE;
262 break;
263#endif
264 default:
265 return SR_ERR;
266 }
267 analyzer_add_trigger(probe->index, type);
268 devc->trigger = 1;
269 }
270 }
271
272 return SR_OK;
273}
a1bb33af 274
811deee4 275static int clear_instances(void)
7da6f9d5
BV
276{
277 GSList *l;
278 struct sr_dev_inst *sdi;
310e9e9b 279 struct drv_context *drvc;
fabe59b3 280 struct dev_context *devc;
7da6f9d5 281
310e9e9b
BV
282 drvc = zdi->priv;
283 for (l = drvc->instances; l; l = l->next) {
7da6f9d5 284 sdi = l->data;
fabe59b3
BV
285 if (!(devc = sdi->priv)) {
286 /* Log error, but continue cleaning up the rest. */
287 sr_err("zeroplus: %s: sdi->priv was NULL, continuing", __func__);
288 continue;
289 }
290 sr_usb_dev_inst_free(devc->usb);
7da6f9d5 291 /* Properly close all devices... */
25a0f108 292 hw_dev_close(sdi);
7da6f9d5
BV
293 /* ...and free all their memory. */
294 sr_dev_inst_free(sdi);
295 }
310e9e9b
BV
296 g_slist_free(drvc->instances);
297 drvc->instances = NULL;
7da6f9d5 298
811deee4 299 return SR_OK;
7da6f9d5
BV
300}
301
a1bb33af
UH
302/*
303 * API callbacks
304 */
305
34f06b90 306static int hw_init(struct sr_context *sr_ctx)
61136ea6 307{
310e9e9b
BV
308 struct drv_context *drvc;
309
310 if (!(drvc = g_try_malloc0(sizeof(struct drv_context)))) {
311 sr_err("zeroplus: driver context malloc failed.");
886a52b6 312 return SR_ERR_MALLOC;
310e9e9b 313 }
1ebe4b4e 314 drvc->sr_ctx = sr_ctx;
310e9e9b 315 zdi->priv = drvc;
61136ea6 316
7da6f9d5
BV
317 if (libusb_init(&usb_context) != 0) {
318 sr_err("zp: Failed to initialize USB.");
319 return 0;
320 }
61136ea6
BV
321
322 return SR_OK;
323}
324
4ca38984 325static GSList *hw_scan(GSList *options)
a1bb33af 326{
d68e2d1a 327 struct sr_dev_inst *sdi;
428edbe1 328 struct sr_probe *probe;
310e9e9b
BV
329 struct drv_context *drvc;
330 struct dev_context *devc;
428edbe1 331 model_t *prof;
a1bb33af
UH
332 struct libusb_device_descriptor des;
333 libusb_device **devlist;
428edbe1
BV
334 GSList *devices;
335 int ret, devcnt, i, j;
a1bb33af 336
4ca38984 337 (void)options;
64d33dc2 338
310e9e9b 339 drvc = zdi->priv;
4ca38984
BV
340 devices = NULL;
341
7da6f9d5
BV
342 clear_instances();
343
8fdecced 344 /* Find all ZEROPLUS analyzers and add them to device list. */
a1bb33af 345 devcnt = 0;
185ae2c5 346 libusb_get_device_list(usb_context, &devlist); /* TODO: Errors. */
fed16f06
UH
347
348 for (i = 0; devlist[i]; i++) {
ebc34738
UH
349 ret = libusb_get_device_descriptor(devlist[i], &des);
350 if (ret != 0) {
351 sr_err("zp: failed to get device descriptor: %d", ret);
a1bb33af
UH
352 continue;
353 }
354
428edbe1
BV
355 prof = NULL;
356 for (j = 0; j < zeroplus_models[j].vid; j++) {
357 if (des.idVendor == zeroplus_models[j].vid &&
358 des.idProduct == zeroplus_models[j].pid) {
359 prof = &zeroplus_models[j];
bf43ea23 360 }
a1bb33af 361 }
428edbe1
BV
362 /* Skip if the device was not found */
363 if (!prof)
364 continue;
365 sr_info("zp: Found ZEROPLUS model %s", prof->model_name);
366
367 /* Register the device with libsigrok. */
368 if (!(sdi = sr_dev_inst_new(devcnt, SR_ST_INACTIVE,
369 VENDOR_NAME, prof->model_name, NULL))) {
370 sr_err("zp: %s: sr_dev_inst_new failed", __func__);
371 return NULL;
372 }
373 sdi->driver = zdi;
374
375 /* Allocate memory for our private driver context. */
310e9e9b
BV
376 if (!(devc = g_try_malloc0(sizeof(struct dev_context)))) {
377 sr_err("zp: %s: devc malloc failed", __func__);
886a52b6 378 return NULL;
428edbe1 379 }
310e9e9b
BV
380 sdi->priv = devc;
381 devc->num_channels = prof->channels;
0ab0cb94
TY
382#ifdef ZP_EXPERIMENTAL
383 devc->max_memory_size = 128 * 1024;
384 devc->max_samplerate = 200;
385#else
386 devc->max_memory_size = prof->sample_depth * 1024;
387 devc->max_samplerate = prof->max_sampling_freq;
388#endif
389 devc->max_samplerate *= SR_MHZ(1);
390 devc->memory_size = MEMORY_SIZE_8K;
310e9e9b 391 // memset(devc->trigger_buffer, 0, NUM_TRIGGER_STAGES);
428edbe1
BV
392
393 /* Fill in probelist according to this device's profile. */
310e9e9b 394 for (j = 0; j < devc->num_channels; j++) {
428edbe1
BV
395 if (!(probe = sr_probe_new(j, SR_PROBE_LOGIC, TRUE,
396 probe_names[j])))
397 return NULL;
398 sdi->probes = g_slist_append(sdi->probes, probe);
399 }
400
401 devices = g_slist_append(devices, sdi);
310e9e9b
BV
402 drvc->instances = g_slist_append(drvc->instances, sdi);
403 devc->usb = sr_usb_dev_inst_new(
428edbe1
BV
404 libusb_get_bus_number(devlist[i]),
405 libusb_get_device_address(devlist[i]), NULL);
406 devcnt++;
407
a1bb33af
UH
408 }
409 libusb_free_device_list(devlist, 1);
410
4ca38984 411 return devices;
a1bb33af
UH
412}
413
811deee4
BV
414static GSList *hw_dev_list(void)
415{
416 struct drv_context *drvc;
417
418 drvc = zdi->priv;
419
420 return drvc->instances;
421}
422
25a0f108 423static int hw_dev_open(struct sr_dev_inst *sdi)
a1bb33af 424{
310e9e9b 425 struct dev_context *devc;
428edbe1
BV
426 libusb_device **devlist, *dev;
427 struct libusb_device_descriptor des;
428 int device_count, ret, i;
a1bb33af 429
310e9e9b 430 if (!(devc = sdi->priv)) {
bf43ea23
UH
431 sr_err("zp: %s: sdi->priv was NULL", __func__);
432 return SR_ERR_ARG;
433 }
434
428edbe1
BV
435 device_count = libusb_get_device_list(usb_context, &devlist);
436 if (device_count < 0) {
437 sr_err("zp: Failed to retrieve device list");
438 return SR_ERR;
439 }
440
441 dev = NULL;
442 for (i = 0; i < device_count; i++) {
443 if ((ret = libusb_get_device_descriptor(devlist[i], &des))) {
444 sr_err("fx2lafw: Failed to get device descriptor: %d.",
445 ret);
446 continue;
447 }
310e9e9b
BV
448 if (libusb_get_bus_number(devlist[i]) == devc->usb->bus
449 && libusb_get_device_address(devlist[i]) == devc->usb->address) {
428edbe1
BV
450 dev = devlist[i];
451 break;
452 }
453 }
454 if (!dev) {
455 sr_err("device on bus %d address %d disappeared!",
310e9e9b 456 devc->usb->bus, devc->usb->address);
428edbe1
BV
457 return SR_ERR;
458 }
459
310e9e9b 460 if (!(ret = libusb_open(dev, &(devc->usb->devhdl)))) {
428edbe1
BV
461 sdi->status = SR_ST_ACTIVE;
462 sr_info("zp: opened device %d on %d.%d interface %d",
310e9e9b
BV
463 sdi->index, devc->usb->bus,
464 devc->usb->address, USB_INTERFACE);
428edbe1
BV
465 } else {
466 sr_err("zp: failed to open device: %d", ret);
467 return SR_ERR;
468 }
469
310e9e9b 470 ret = libusb_set_configuration(devc->usb->devhdl, USB_CONFIGURATION);
ebc34738 471 if (ret < 0) {
133a37bf 472 sr_err("zp: Unable to set USB configuration %d: %d",
ebc34738 473 USB_CONFIGURATION, ret);
185ae2c5
UH
474 return SR_ERR;
475 }
476
310e9e9b 477 ret = libusb_claim_interface(devc->usb->devhdl, USB_INTERFACE);
ebc34738
UH
478 if (ret != 0) {
479 sr_err("zp: Unable to claim interface: %d", ret);
e46b8fb1 480 return SR_ERR;
a1bb33af 481 }
185ae2c5 482
0ab0cb94
TY
483 /* Set default configuration after power on */
484 if (analyzer_read_status(devc->usb->devhdl) == 0)
485 analyzer_configure(devc->usb->devhdl);
486
310e9e9b
BV
487 analyzer_reset(devc->usb->devhdl);
488 analyzer_initialize(devc->usb->devhdl);
a1bb33af 489
0ab0cb94 490 //analyzer_set_memory_size(MEMORY_SIZE_512K);
fed16f06 491 // analyzer_set_freq(g_freq, g_freq_scale);
a1bb33af 492 analyzer_set_trigger_count(1);
408e7199
UH
493 // analyzer_set_ramsize_trigger_address((((100 - g_pre_trigger)
494 // * get_memory_size(g_memory_size)) / 100) >> 2);
a1bb33af 495
fed16f06
UH
496#if 0
497 if (g_double_mode == 1)
a1bb33af
UH
498 analyzer_set_compression(COMPRESSION_DOUBLE);
499 else if (g_compression == 1)
500 analyzer_set_compression(COMPRESSION_ENABLE);
fed16f06
UH
501 else
502#endif
503 analyzer_set_compression(COMPRESSION_NONE);
a1bb33af 504
310e9e9b 505 if (devc->cur_samplerate == 0) {
0ab0cb94
TY
506 /* Samplerate hasn't been set. Default to 1MHz. */
507 analyzer_set_freq(1, FREQ_SCALE_MHZ);
508 devc->cur_samplerate = SR_MHZ(1);
a1bb33af
UH
509 }
510
e46b8fb1 511 return SR_OK;
a1bb33af
UH
512}
513
25a0f108 514static int hw_dev_close(struct sr_dev_inst *sdi)
a1bb33af 515{
310e9e9b 516 struct dev_context *devc;
a1bb33af 517
310e9e9b 518 if (!(devc = sdi->priv)) {
25a0f108
BV
519 sr_err("zp: %s: sdi->priv was NULL", __func__);
520 return SR_ERR;
697785d1
UH
521 }
522
310e9e9b 523 if (!devc->usb->devhdl)
25a0f108
BV
524 return SR_ERR;
525
526 sr_info("zp: closing device %d on %d.%d interface %d", sdi->index,
310e9e9b
BV
527 devc->usb->bus, devc->usb->address, USB_INTERFACE);
528 libusb_release_interface(devc->usb->devhdl, USB_INTERFACE);
529 libusb_reset_device(devc->usb->devhdl);
530 libusb_close(devc->usb->devhdl);
531 devc->usb->devhdl = NULL;
25a0f108 532 sdi->status = SR_ST_INACTIVE;
697785d1
UH
533
534 return SR_OK;
a1bb33af
UH
535}
536
57ab7d9f 537static int hw_cleanup(void)
a1bb33af 538{
310e9e9b
BV
539 struct drv_context *drvc;
540
541 if (!(drvc = zdi->priv))
542 return SR_OK;
a1bb33af 543
7da6f9d5 544 clear_instances();
a1bb33af 545
fed16f06 546 if (usb_context)
a1bb33af
UH
547 libusb_exit(usb_context);
548 usb_context = NULL;
57ab7d9f
UH
549
550 return SR_OK;
a1bb33af
UH
551}
552
626409ab
BV
553static int hw_info_get(int info_id, const void **data,
554 const struct sr_dev_inst *sdi)
a1bb33af 555{
310e9e9b 556 struct dev_context *devc;
a1bb33af 557
626409ab 558 switch (info_id) {
444adea2
BV
559 case SR_DI_HWCAPS:
560 *data = hwcaps;
561 break;
5a2326a7 562 case SR_DI_NUM_PROBES:
626409ab 563 if (sdi) {
310e9e9b
BV
564 devc = sdi->priv;
565 *data = GINT_TO_POINTER(devc->num_channels);
626409ab 566 sr_spew("zp: %s: Returning number of channels: %d.",
310e9e9b 567 __func__, devc->num_channels);
626409ab
BV
568 } else
569 return SR_ERR;
a1bb33af 570 break;
464d12c7 571 case SR_DI_PROBE_NAMES:
626409ab 572 *data = probe_names;
6752905e 573 sr_spew("zp: %s: Returning probenames.", __func__);
464d12c7 574 break;
5a2326a7 575 case SR_DI_SAMPLERATES:
626409ab 576 *data = &samplerates;
6752905e 577 sr_spew("zp: %s: Returning samplerates.", __func__);
a1bb33af 578 break;
5a2326a7 579 case SR_DI_TRIGGER_TYPES:
626409ab
BV
580 *data = TRIGGER_TYPES;
581 sr_spew("zp: %s: Returning triggertypes: %s.", __func__, TRIGGER_TYPES);
a1bb33af 582 break;
5a2326a7 583 case SR_DI_CUR_SAMPLERATE:
626409ab 584 if (sdi) {
310e9e9b
BV
585 devc = sdi->priv;
586 *data = &devc->cur_samplerate;
626409ab 587 sr_spew("zp: %s: Returning samplerate: %" PRIu64 "Hz.",
310e9e9b 588 __func__, devc->cur_samplerate);
626409ab
BV
589 } else
590 return SR_ERR;
bf43ea23
UH
591 break;
592 default:
626409ab 593 return SR_ERR_ARG;
a1bb33af
UH
594 }
595
626409ab 596 return SR_OK;
a1bb33af
UH
597}
598
0ab0cb94 599static int set_samplerate(struct dev_context *devc, uint64_t samplerate)
a1bb33af 600{
0ab0cb94 601 int i;
bf43ea23 602
0ab0cb94
TY
603 for (i = 0; supported_samplerates[i]; i++)
604 if (samplerate == supported_samplerates[i])
605 break;
606 if (!supported_samplerates[i] || samplerate > devc->max_samplerate) {
607 sr_err("zp: %s: unsupported samplerate", __func__);
bf43ea23
UH
608 return SR_ERR_ARG;
609 }
610
73017cf9
UH
611 sr_info("zp: Setting samplerate to %" PRIu64 "Hz.", samplerate);
612
0ab0cb94 613 if (samplerate >= SR_MHZ(1))
59df0c77 614 analyzer_set_freq(samplerate / SR_MHZ(1), FREQ_SCALE_MHZ);
0ab0cb94 615 else if (samplerate >= SR_KHZ(1))
59df0c77 616 analyzer_set_freq(samplerate / SR_KHZ(1), FREQ_SCALE_KHZ);
a1bb33af 617 else
fed16f06 618 analyzer_set_freq(samplerate, FREQ_SCALE_HZ);
a1bb33af 619
310e9e9b 620 devc->cur_samplerate = samplerate;
a1bb33af 621
e46b8fb1 622 return SR_OK;
a1bb33af
UH
623}
624
0ab0cb94
TY
625static int set_limit_samples(struct dev_context *devc, uint64_t samples)
626{
627 devc->limit_samples = samples;
628
629 if (samples <= 2 * 1024)
630 devc->memory_size = MEMORY_SIZE_8K;
631 else if (samples <= 16 * 1024)
632 devc->memory_size = MEMORY_SIZE_64K;
633 else if (samples <= 32 * 1024 ||
634 devc->max_memory_size <= 32 * 1024)
635 devc->memory_size = MEMORY_SIZE_128K;
636 else
637 devc->memory_size = MEMORY_SIZE_512K;
638
639 sr_info("zp: Setting memory size to %dK.",
640 get_memory_size(devc->memory_size) / 1024);
641
642 analyzer_set_memory_size(devc->memory_size);
643
644 return SR_OK;
645}
646
647static int set_capture_ratio(struct dev_context *devc, uint64_t ratio)
648{
649 if (ratio > 100) {
650 sr_err("zp: %s: invalid capture ratio", __func__);
651 return SR_ERR_ARG;
652 }
653
654 devc->capture_ratio = ratio;
655
656 sr_info("zp: Setting capture ratio to %d%%.", devc->capture_ratio);
657
658 return SR_OK;
659}
660
6f4b1868 661static int hw_dev_config_set(const struct sr_dev_inst *sdi, int hwcap,
0ab0cb94 662 const void *value)
a1bb33af 663{
310e9e9b 664 struct dev_context *devc;
a1bb33af 665
0ab0cb94
TY
666 if (!sdi) {
667 sr_err("zp: %s: sdi was NULL", __func__);
668 return SR_ERR_ARG;
669 }
670
310e9e9b 671 if (!(devc = sdi->priv)) {
bf43ea23
UH
672 sr_err("zp: %s: sdi->priv was NULL", __func__);
673 return SR_ERR_ARG;
674 }
a1bb33af 675
ffedd0bf 676 switch (hwcap) {
5a2326a7 677 case SR_HWCAP_SAMPLERATE:
0ab0cb94 678 return set_samplerate(devc, *(const uint64_t *)value);
5a2326a7 679 case SR_HWCAP_LIMIT_SAMPLES:
0ab0cb94
TY
680 return set_limit_samples(devc, *(const uint64_t *)value);
681 case SR_HWCAP_CAPTURE_RATIO:
682 return set_capture_ratio(devc, *(const uint64_t *)value);
fed16f06 683 default:
e46b8fb1 684 return SR_ERR;
a1bb33af
UH
685 }
686}
687
0ab0cb94
TY
688static void set_triggerbar(struct dev_context *devc)
689{
690 unsigned int ramsize;
691 unsigned int n;
692 unsigned int triggerbar;
693
694 ramsize = get_memory_size(devc->memory_size) / 4;
695 if (devc->trigger) {
696 n = ramsize;
697 if (devc->max_memory_size < n)
698 n = devc->max_memory_size;
699 if (devc->limit_samples < n)
700 n = devc->limit_samples;
701 n = n * devc->capture_ratio / 100;
702 if (n > ramsize - 8)
703 triggerbar = ramsize - 8;
704 else
705 triggerbar = n;
706 } else {
707 triggerbar = 0;
708 }
709 analyzer_set_triggerbar_address(triggerbar);
710 analyzer_set_ramsize_trigger_address(ramsize - triggerbar);
711
712 sr_dbg("zp: triggerbar_address = %d(0x%x)", triggerbar, triggerbar);
713 sr_dbg("zp: ramsize_triggerbar_address = %d(0x%x)",
714 ramsize - triggerbar, ramsize - triggerbar);
715}
716
3ffb6964
BV
717static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi,
718 void *cb_data)
a1bb33af 719{
b9c735a2 720 struct sr_datafeed_packet packet;
9c939c51 721 struct sr_datafeed_logic logic;
b9c735a2 722 struct sr_datafeed_header header;
f366e86c 723 struct sr_datafeed_meta_logic meta;
0ab0cb94 724 //uint64_t samples_read;
a1bb33af 725 int res;
afc8e4de 726 unsigned int packet_num;
0ab0cb94 727 unsigned int n;
a1bb33af 728 unsigned char *buf;
310e9e9b 729 struct dev_context *devc;
a1bb33af 730
310e9e9b 731 if (!(devc = sdi->priv)) {
bf43ea23
UH
732 sr_err("zp: %s: sdi->priv was NULL", __func__);
733 return SR_ERR_ARG;
734 }
a1bb33af 735
014359e3
BV
736 if (configure_probes(sdi) != SR_OK) {
737 sr_err("zp: failed to configured probes");
738 return SR_ERR;
739 }
740
0ab0cb94
TY
741 set_triggerbar(devc);
742
a143e4e5 743 /* push configured settings to device */
310e9e9b 744 analyzer_configure(devc->usb->devhdl);
a143e4e5 745
310e9e9b 746 analyzer_start(devc->usb->devhdl);
7b48d6e1 747 sr_info("zp: Waiting for data");
310e9e9b 748 analyzer_wait_data(devc->usb->devhdl);
a1bb33af 749
7b48d6e1 750 sr_info("zp: Stop address = 0x%x",
310e9e9b 751 analyzer_get_stop_address(devc->usb->devhdl));
7b48d6e1 752 sr_info("zp: Now address = 0x%x",
310e9e9b 753 analyzer_get_now_address(devc->usb->devhdl));
7b48d6e1 754 sr_info("zp: Trigger address = 0x%x",
310e9e9b 755 analyzer_get_trigger_address(devc->usb->devhdl));
a1bb33af 756
5a2326a7 757 packet.type = SR_DF_HEADER;
9c939c51 758 packet.payload = &header;
a1bb33af
UH
759 header.feed_version = 1;
760 gettimeofday(&header.starttime, NULL);
f366e86c
BV
761 sr_session_send(cb_data, &packet);
762
763 /* Send metadata about the SR_DF_LOGIC packets to come. */
764 packet.type = SR_DF_META_LOGIC;
765 packet.payload = &meta;
310e9e9b
BV
766 meta.samplerate = devc->cur_samplerate;
767 meta.num_probes = devc->num_channels;
3cd3a20b 768 sr_session_send(cb_data, &packet);
a1bb33af 769
b53738ba 770 if (!(buf = g_try_malloc(PACKET_SIZE))) {
bf43ea23 771 sr_err("zp: %s: buf malloc failed", __func__);
b53738ba
UH
772 return SR_ERR_MALLOC;
773 }
774
0ab0cb94 775 //samples_read = 0;
310e9e9b 776 analyzer_read_start(devc->usb->devhdl);
fed16f06 777 /* Send the incoming transfer to the session bus. */
0ab0cb94
TY
778 n = get_memory_size(devc->memory_size);
779 if (devc->max_memory_size * 4 < n)
780 n = devc->max_memory_size * 4;
781 for (packet_num = 0; packet_num < n / PACKET_SIZE; packet_num++) {
310e9e9b 782 res = analyzer_read_data(devc->usb->devhdl, buf, PACKET_SIZE);
0ab0cb94 783 sr_info("zp: Tried to read %d bytes, actually read %d bytes",
b08024a8 784 PACKET_SIZE, res);
a1bb33af 785
5a2326a7 786 packet.type = SR_DF_LOGIC;
9c939c51
BV
787 packet.payload = &logic;
788 logic.length = PACKET_SIZE;
789 logic.unitsize = 4;
790 logic.data = buf;
3cd3a20b 791 sr_session_send(cb_data, &packet);
0ab0cb94 792 //samples_read += res / 4;
a1bb33af 793 }
310e9e9b 794 analyzer_read_stop(devc->usb->devhdl);
a1bb33af
UH
795 g_free(buf);
796
5a2326a7 797 packet.type = SR_DF_END;
3cd3a20b 798 sr_session_send(cb_data, &packet);
a1bb33af 799
e46b8fb1 800 return SR_OK;
a1bb33af
UH
801}
802
3cd3a20b 803/* TODO: This stops acquisition on ALL devices, ignoring dev_index. */
69b07d14 804static int hw_dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data)
a1bb33af 805{
b9c735a2 806 struct sr_datafeed_packet packet;
310e9e9b 807 struct dev_context *devc;
a1bb33af 808
5a2326a7 809 packet.type = SR_DF_END;
3cd3a20b 810 sr_session_send(cb_data, &packet);
a1bb33af 811
310e9e9b 812 if (!(devc = sdi->priv)) {
69890f73 813 sr_err("zp: %s: sdi->priv was NULL", __func__);
3010f21c 814 return SR_ERR_BUG;
69890f73 815 }
a1bb33af 816
310e9e9b 817 analyzer_reset(devc->usb->devhdl);
fed16f06 818 /* TODO: Need to cancel and free any queued up transfers. */
3010f21c
UH
819
820 return SR_OK;
a1bb33af
UH
821}
822
c09f0b57 823SR_PRIV struct sr_dev_driver zeroplus_logic_cube_driver_info = {
e519ba86 824 .name = "zeroplus-logic-cube",
8fdecced 825 .longname = "ZEROPLUS Logic Cube LAP-C series",
e519ba86
UH
826 .api_version = 1,
827 .init = hw_init,
828 .cleanup = hw_cleanup,
61136ea6 829 .scan = hw_scan,
811deee4
BV
830 .dev_list = hw_dev_list,
831 .dev_clear = hw_cleanup,
e7eb703f
UH
832 .dev_open = hw_dev_open,
833 .dev_close = hw_dev_close,
626409ab 834 .info_get = hw_info_get,
a9a245b4 835 .dev_config_set = hw_dev_config_set,
69040b7c
UH
836 .dev_acquisition_start = hw_dev_acquisition_start,
837 .dev_acquisition_stop = hw_dev_acquisition_stop,
310e9e9b 838 .priv = NULL,
a1bb33af 839};