]> sigrok.org Git - libsigrok.git/blame - src/hardware/pipistrello-ols/api.c
sr_dev_open(): Set status to SR_ST_ACTIVE upon success.
[libsigrok.git] / src / hardware / pipistrello-ols / api.c
CommitLineData
4bd80e12 1/*
2 * This file is part of the libsigrok project.
3 *
4 * Copyright (C) 2013 Bert Vermeulen <bert@biot.com>
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>
4bd80e12 21#include "protocol.h"
22
f254bc4b 23static const uint32_t devopts[] = {
4bd80e12 24 SR_CONF_LOGIC_ANALYZER,
5827f61b
BV
25 SR_CONF_LIMIT_SAMPLES | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
26 SR_CONF_SAMPLERATE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
27 SR_CONF_TRIGGER_MATCH | SR_CONF_LIST,
28 SR_CONF_CAPTURE_RATIO | SR_CONF_GET | SR_CONF_SET,
29 SR_CONF_PATTERN_MODE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
30 SR_CONF_EXTERNAL_CLOCK | SR_CONF_GET | SR_CONF_SET,
31 SR_CONF_SWAP | SR_CONF_SET,
32 SR_CONF_RLE | SR_CONF_GET | SR_CONF_SET,
4bd80e12 33};
34
acc885c7
BV
35static const int32_t trigger_matches[] = {
36 SR_TRIGGER_ZERO,
37 SR_TRIGGER_ONE,
38 SR_TRIGGER_RISING,
39 SR_TRIGGER_FALLING,
40};
41
4bd80e12 42#define STR_PATTERN_NONE "None"
43#define STR_PATTERN_EXTERNAL "External"
44#define STR_PATTERN_INTERNAL "Internal"
45
46/* Supported methods of test pattern outputs */
47enum {
48 /**
49 * Capture pins 31:16 (unbuffered wing) output a test pattern
50 * that can captured on pins 0:15.
51 */
52 PATTERN_EXTERNAL,
53
54 /** Route test pattern internally to capture buffer. */
55 PATTERN_INTERNAL,
56};
57
58static const char *patterns[] = {
59 STR_PATTERN_NONE,
60 STR_PATTERN_EXTERNAL,
61 STR_PATTERN_INTERNAL,
62};
63
64/* Channels are numbered 0-31 (on the PCB silkscreen). */
53cda65a 65SR_PRIV const char *p_ols_channel_names[] = {
4bd80e12 66 "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12",
67 "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23",
68 "24", "25", "26", "27", "28", "29", "30", "31",
4bd80e12 69};
70
71/* Default supported samplerates, can be overridden by device metadata. */
72static const uint64_t samplerates[] = {
73 SR_HZ(10),
74 SR_MHZ(200),
75 SR_HZ(1),
76};
77
4f840ce9 78static GSList *scan(struct sr_dev_driver *di, GSList *options)
4bd80e12 79{
80 struct sr_dev_inst *sdi;
4bd80e12 81 struct dev_context *devc;
82 GSList *devices;
83 int ret, i;
84 char buf[70];
85 int bytes_read;
86
87 (void)options;
88
4bd80e12 89 devices = NULL;
90
91 /* Allocate memory for our private device context. */
f57d8ffe 92 devc = g_malloc0(sizeof(struct dev_context));
4bd80e12 93
94 /* Device-specific settings */
b94cff40 95 devc->max_samplebytes = devc->max_samplerate = devc->protocol_version = 0;
4bd80e12 96
97 /* Acquisition settings */
98 devc->limit_samples = devc->capture_ratio = 0;
99 devc->trigger_at = -1;
100 devc->channel_mask = 0xffffffff;
101 devc->flag_reg = 0;
102
103 /* Allocate memory for the incoming ftdi data. */
a95f142e 104 devc->ftdi_buf = g_malloc0(FTDI_BUF_SIZE);
4bd80e12 105
106 /* Allocate memory for the FTDI context (ftdic) and initialize it. */
107 if (!(devc->ftdic = ftdi_new())) {
108 sr_err("Failed to initialize libftdi.");
109 goto err_free_ftdi_buf;;
110 }
111
112 /* Try to open the FTDI device */
113 if (p_ols_open(devc) != SR_OK) {
114 goto err_free_ftdic;
115 }
176d785d 116
4bd80e12 117 /* The discovery procedure is like this: first send the Reset
118 * command (0x00) 5 times, since the device could be anywhere
119 * in a 5-byte command. Then send the ID command (0x02).
120 * If the device responds with 4 bytes ("OLS1" or "SLA1"), we
121 * have a match.
122 */
123
124 ret = SR_OK;
125 for (i = 0; i < 5; i++) {
126 if ((ret = write_shortcommand(devc, CMD_RESET)) != SR_OK) {
127 break;
128 }
129 }
130 if (ret != SR_OK) {
131 sr_err("Could not reset device. Quitting.");
132 goto err_close_ftdic;
133 }
134 write_shortcommand(devc, CMD_ID);
135
136 /* Read the response data. */
137 bytes_read = ftdi_read_data(devc->ftdic, (uint8_t *)buf, 4);
138 if (bytes_read < 0) {
139 sr_err("Failed to read FTDI data (%d): %s.",
140 bytes_read, ftdi_get_error_string(devc->ftdic));
141 goto err_close_ftdic;
142 }
143 if (bytes_read == 0) {
144 goto err_close_ftdic;
145 }
146
147 if (strncmp(buf, "1SLO", 4) && strncmp(buf, "1ALS", 4))
148 goto err_close_ftdic;
149
150 /* Definitely using the OLS protocol, check if it supports
151 * the metadata command.
152 */
153 write_shortcommand(devc, CMD_METADATA);
154
155 /* Read the metadata. */
156 bytes_read = ftdi_read_data(devc->ftdic, (uint8_t *)buf, 64);
157 if (bytes_read < 0) {
158 sr_err("Failed to read FTDI data (%d): %s.",
159 bytes_read, ftdi_get_error_string(devc->ftdic));
160 goto err_close_ftdic;
161 }
162 if (bytes_read == 0) {
163 goto err_close_ftdic;
164 }
165
166 /* Close device. We'll reopen it again when we need it. */
167 p_ols_close(devc);
168
169 /* Parse the metadata. */
170 sdi = p_ols_get_metadata((uint8_t *)buf, bytes_read, devc);
4bd80e12 171
172 /* Configure samplerate and divider. */
173 if (p_ols_set_samplerate(sdi, DEFAULT_SAMPLERATE) != SR_OK)
174 sr_dbg("Failed to set default samplerate (%"PRIu64").",
175 DEFAULT_SAMPLERATE);
4bd80e12 176
4bd80e12 177 devices = g_slist_append(devices, sdi);
178
15a5bfe4 179 return std_scan_complete(di, devices);
4bd80e12 180
181err_close_ftdic:
182 p_ols_close(devc);
183err_free_ftdic:
184 ftdi_free(devc->ftdic); /* NOT free() or g_free()! */
185err_free_ftdi_buf:
186 g_free(devc->ftdi_buf);
4bd80e12 187 g_free(devc);
4bd80e12 188
189 return NULL;
190}
191
4bd80e12 192static void clear_helper(void *priv)
193{
194 struct dev_context *devc;
195
196 devc = priv;
197
198 ftdi_free(devc->ftdic);
199 g_free(devc->ftdi_buf);
200}
201
4f840ce9 202static int dev_clear(const struct sr_dev_driver *di)
4bd80e12 203{
204 return std_dev_clear(di, clear_helper);
205}
206
584560f1 207static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi,
4bd80e12 208 const struct sr_channel_group *cg)
209{
210 struct dev_context *devc;
211
212 (void)cg;
213
214 if (!sdi)
215 return SR_ERR_ARG;
216
217 devc = sdi->priv;
584560f1 218 switch (key) {
4bd80e12 219 case SR_CONF_SAMPLERATE:
220 *data = g_variant_new_uint64(devc->cur_samplerate);
221 break;
222 case SR_CONF_CAPTURE_RATIO:
223 *data = g_variant_new_uint64(devc->capture_ratio);
224 break;
225 case SR_CONF_LIMIT_SAMPLES:
226 *data = g_variant_new_uint64(devc->limit_samples);
227 break;
228 case SR_CONF_PATTERN_MODE:
229 if (devc->flag_reg & FLAG_EXTERNAL_TEST_MODE)
230 *data = g_variant_new_string(STR_PATTERN_EXTERNAL);
231 else if (devc->flag_reg & FLAG_INTERNAL_TEST_MODE)
232 *data = g_variant_new_string(STR_PATTERN_INTERNAL);
233 else
234 *data = g_variant_new_string(STR_PATTERN_NONE);
235 break;
236 case SR_CONF_RLE:
237 *data = g_variant_new_boolean(devc->flag_reg & FLAG_RLE ? TRUE : FALSE);
238 break;
239 case SR_CONF_EXTERNAL_CLOCK:
240 *data = g_variant_new_boolean(devc->flag_reg & FLAG_CLOCK_EXTERNAL ? TRUE : FALSE);
241 break;
242 default:
243 return SR_ERR_NA;
244 }
245
246 return SR_OK;
247}
248
584560f1 249static int config_set(uint32_t key, GVariant *data, const struct sr_dev_inst *sdi,
4bd80e12 250 const struct sr_channel_group *cg)
251{
252 struct dev_context *devc;
253 uint16_t flag;
254 uint64_t tmp_u64;
255 int ret;
256 const char *stropt;
257
258 (void)cg;
259
4bd80e12 260 devc = sdi->priv;
261
584560f1 262 switch (key) {
4bd80e12 263 case SR_CONF_SAMPLERATE:
264 tmp_u64 = g_variant_get_uint64(data);
265 if (tmp_u64 < samplerates[0] || tmp_u64 > samplerates[1])
266 return SR_ERR_SAMPLERATE;
267 ret = p_ols_set_samplerate(sdi, g_variant_get_uint64(data));
268 break;
269 case SR_CONF_LIMIT_SAMPLES:
270 tmp_u64 = g_variant_get_uint64(data);
271 if (tmp_u64 < MIN_NUM_SAMPLES)
272 return SR_ERR;
273 devc->limit_samples = tmp_u64;
274 ret = SR_OK;
275 break;
276 case SR_CONF_CAPTURE_RATIO:
277 devc->capture_ratio = g_variant_get_uint64(data);
a5c38703 278 if (devc->capture_ratio < 0 || devc->capture_ratio > 100)
4bd80e12 279 ret = SR_ERR;
a5c38703 280 else
4bd80e12 281 ret = SR_OK;
282 break;
283 case SR_CONF_EXTERNAL_CLOCK:
284 if (g_variant_get_boolean(data)) {
285 sr_info("Enabling external clock.");
286 devc->flag_reg |= FLAG_CLOCK_EXTERNAL;
287 } else {
288 sr_info("Disabled external clock.");
289 devc->flag_reg &= ~FLAG_CLOCK_EXTERNAL;
290 }
291 ret = SR_OK;
292 break;
293 case SR_CONF_PATTERN_MODE:
294 stropt = g_variant_get_string(data, NULL);
295 ret = SR_OK;
296 flag = 0xffff;
297 if (!strcmp(stropt, STR_PATTERN_NONE)) {
298 sr_info("Disabling test modes.");
299 flag = 0x0000;
300 }else if (!strcmp(stropt, STR_PATTERN_INTERNAL)) {
301 sr_info("Enabling internal test mode.");
302 flag = FLAG_INTERNAL_TEST_MODE;
303 } else if (!strcmp(stropt, STR_PATTERN_EXTERNAL)) {
304 sr_info("Enabling external test mode.");
305 flag = FLAG_EXTERNAL_TEST_MODE;
306 } else {
307 ret = SR_ERR;
308 }
309 if (flag != 0xffff) {
310 devc->flag_reg &= ~(FLAG_INTERNAL_TEST_MODE | FLAG_EXTERNAL_TEST_MODE);
311 devc->flag_reg |= flag;
312 }
313 break;
314 case SR_CONF_SWAP:
315 if (g_variant_get_boolean(data)) {
316 sr_info("Enabling channel swapping.");
317 devc->flag_reg |= FLAG_SWAP_CHANNELS;
318 } else {
319 sr_info("Disabling channel swapping.");
320 devc->flag_reg &= ~FLAG_SWAP_CHANNELS;
321 }
322 ret = SR_OK;
323 break;
324
325 case SR_CONF_RLE:
326 if (g_variant_get_boolean(data)) {
327 sr_info("Enabling RLE.");
328 devc->flag_reg |= FLAG_RLE;
329 } else {
330 sr_info("Disabling RLE.");
331 devc->flag_reg &= ~FLAG_RLE;
332 }
333 ret = SR_OK;
334 break;
335 default:
336 ret = SR_ERR_NA;
337 }
338
339 return ret;
340}
341
584560f1 342static int config_list(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi,
4bd80e12 343 const struct sr_channel_group *cg)
344{
345 struct dev_context *devc;
346 GVariant *gvar, *grange[2];
347 GVariantBuilder gvb;
acc885c7 348 int num_pols_changrp, i;
4bd80e12 349
350 (void)cg;
351
352 switch (key) {
353 case SR_CONF_DEVICE_OPTIONS:
584560f1 354 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32,
f254bc4b 355 devopts, ARRAY_SIZE(devopts), sizeof(uint32_t));
4bd80e12 356 break;
357 case SR_CONF_SAMPLERATE:
358 g_variant_builder_init(&gvb, G_VARIANT_TYPE("a{sv}"));
359 gvar = g_variant_new_fixed_array(G_VARIANT_TYPE("t"), samplerates,
360 ARRAY_SIZE(samplerates), sizeof(uint64_t));
361 g_variant_builder_add(&gvb, "{sv}", "samplerate-steps", gvar);
362 *data = g_variant_builder_end(&gvb);
363 break;
acc885c7
BV
364 case SR_CONF_TRIGGER_MATCH:
365 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_INT32,
366 trigger_matches, ARRAY_SIZE(trigger_matches),
367 sizeof(int32_t));
4bd80e12 368 break;
369 case SR_CONF_PATTERN_MODE:
370 *data = g_variant_new_strv(patterns, ARRAY_SIZE(patterns));
371 break;
372 case SR_CONF_LIMIT_SAMPLES:
373 if (!sdi)
374 return SR_ERR_ARG;
375 devc = sdi->priv;
376 if (devc->flag_reg & FLAG_RLE)
377 return SR_ERR_NA;
b94cff40 378 if (devc->max_samplebytes == 0)
4bd80e12 379 /* Device didn't specify sample memory size in metadata. */
380 return SR_ERR_NA;
381 /*
382 * Channel groups are turned off if no channels in that group are
383 * enabled, making more room for samples for the enabled group.
384 */
acc885c7
BV
385 pols_channel_mask(sdi);
386 num_pols_changrp = 0;
4bd80e12 387 for (i = 0; i < 4; i++) {
388 if (devc->channel_mask & (0xff << (i * 8)))
acc885c7 389 num_pols_changrp++;
4bd80e12 390 }
b94cff40 391 /* 3 channel groups takes as many bytes as 4 channel groups */
acc885c7
BV
392 if (num_pols_changrp == 3)
393 num_pols_changrp = 4;
4bd80e12 394 grange[0] = g_variant_new_uint64(MIN_NUM_SAMPLES);
acc885c7
BV
395 if (num_pols_changrp)
396 grange[1] = g_variant_new_uint64(devc->max_samplebytes / num_pols_changrp);
397 else
398 grange[1] = g_variant_new_uint64(MIN_NUM_SAMPLES);
4bd80e12 399 *data = g_variant_new_tuple(grange, 2);
400 break;
401 default:
402 return SR_ERR_NA;
403 }
404
405 return SR_OK;
406}
407
408static int dev_open(struct sr_dev_inst *sdi)
409{
410 struct dev_context *devc;
4bd80e12 411
412 devc = sdi->priv;
413
7e463623 414 return p_ols_open(devc);
4bd80e12 415}
416
417static int dev_close(struct sr_dev_inst *sdi)
418{
4bd80e12 419 struct dev_context *devc;
420
4bd80e12 421 devc = sdi->priv;
422
4bd80e12 423 sdi->status = SR_ST_INACTIVE;
424
093e1cba 425 return p_ols_close(devc);
4bd80e12 426}
427
4bd80e12 428static int set_trigger(const struct sr_dev_inst *sdi, int stage)
429{
430 struct dev_context *devc;
431 uint8_t cmd, arg[4];
432
433 devc = sdi->priv;
434
435 cmd = CMD_SET_TRIGGER_MASK + stage * 4;
436 arg[0] = devc->trigger_mask[stage] & 0xff;
437 arg[1] = (devc->trigger_mask[stage] >> 8) & 0xff;
438 arg[2] = (devc->trigger_mask[stage] >> 16) & 0xff;
439 arg[3] = (devc->trigger_mask[stage] >> 24) & 0xff;
440 if (write_longcommand(devc, cmd, arg) != SR_OK)
441 return SR_ERR;
442
443 cmd = CMD_SET_TRIGGER_VALUE + stage * 4;
444 arg[0] = devc->trigger_value[stage] & 0xff;
445 arg[1] = (devc->trigger_value[stage] >> 8) & 0xff;
446 arg[2] = (devc->trigger_value[stage] >> 16) & 0xff;
447 arg[3] = (devc->trigger_value[stage] >> 24) & 0xff;
448 if (write_longcommand(devc, cmd, arg) != SR_OK)
449 return SR_ERR;
450
451 cmd = CMD_SET_TRIGGER_CONFIG + stage * 4;
452 arg[0] = arg[1] = arg[3] = 0x00;
453 arg[2] = stage;
454 if (stage == devc->num_stages)
455 /* Last stage, fire when this one matches. */
456 arg[3] |= TRIGGER_START;
457 if (write_longcommand(devc, cmd, arg) != SR_OK)
458 return SR_ERR;
459
1e0de846 460 cmd = CMD_SET_TRIGGER_EDGE + stage * 4;
461 arg[0] = devc->trigger_edge[stage] & 0xff;
462 arg[1] = (devc->trigger_edge[stage] >> 8) & 0xff;
463 arg[2] = (devc->trigger_edge[stage] >> 16) & 0xff;
464 arg[3] = (devc->trigger_edge[stage] >> 24) & 0xff;
465 if (write_longcommand(devc, cmd, arg) != SR_OK)
466 return SR_ERR;
467
4bd80e12 468 return SR_OK;
469}
470
84cbaf77
BV
471static int disable_trigger(const struct sr_dev_inst *sdi, int stage)
472{
473 struct dev_context *devc;
474 uint8_t cmd, arg[4];
475
476 devc = sdi->priv;
477
478 cmd = CMD_SET_TRIGGER_MASK + stage * 4;
479 arg[0] = arg[1] = arg[2] = arg[3] = 0x00;
480 if (write_longcommand(devc, cmd, arg) != SR_OK)
481 return SR_ERR;
482
483 cmd = CMD_SET_TRIGGER_VALUE + stage * 4;
484 if (write_longcommand(devc, cmd, arg) != SR_OK)
485 return SR_ERR;
486
487 cmd = CMD_SET_TRIGGER_CONFIG + stage * 4;
488 arg[2] = 0x03;
489 if (write_longcommand(devc, cmd, arg) != SR_OK)
490 return SR_ERR;
491
492 cmd = CMD_SET_TRIGGER_EDGE + stage * 4;
493 arg[2] = 0x00;
494 if (write_longcommand(devc, cmd, arg) != SR_OK)
495 return SR_ERR;
496
497 return SR_OK;
498}
499
695dc859 500static int dev_acquisition_start(const struct sr_dev_inst *sdi)
4bd80e12 501{
502 struct dev_context *devc;
503 uint32_t samplecount, readcount, delaycount;
acc885c7 504 uint8_t pols_changrp_mask, arg[4];
b94cff40 505 uint16_t flag_tmp;
acc885c7 506 int num_pols_changrp, samplespercount;
4bd80e12 507 int ret, i;
508
4bd80e12 509 devc = sdi->priv;
510
acc885c7 511 pols_channel_mask(sdi);
4bd80e12 512
513 /*
514 * Enable/disable channel groups in the flag register according to the
acc885c7
BV
515 * channel mask. Calculate this here, because num_pols_changrp is
516 * needed to limit readcount.
4bd80e12 517 */
acc885c7
BV
518 pols_changrp_mask = 0;
519 num_pols_changrp = 0;
4bd80e12 520 for (i = 0; i < 4; i++) {
521 if (devc->channel_mask & (0xff << (i * 8))) {
acc885c7
BV
522 pols_changrp_mask |= (1 << i);
523 num_pols_changrp++;
4bd80e12 524 }
525 }
b94cff40 526 /* 3 channel groups takes as many bytes as 4 channel groups */
acc885c7
BV
527 if (num_pols_changrp == 3)
528 num_pols_changrp = 4;
b94cff40 529 /* maximum number of samples (or RLE counts) the buffer memory can hold */
acc885c7 530 devc->max_samples = devc->max_samplebytes / num_pols_changrp;
4bd80e12 531
532 /*
533 * Limit readcount to prevent reading past the end of the hardware
534 * buffer.
535 */
536 sr_dbg("max_samples = %d", devc->max_samples);
6433156c 537 sr_dbg("limit_samples = %" PRIu64, devc->limit_samples);
b94cff40 538 samplecount = MIN(devc->max_samples, devc->limit_samples);
4bd80e12 539 sr_dbg("Samplecount = %d", samplecount);
540
b94cff40 541 /* In demux mode the OLS is processing two samples per clock */
542 if (devc->flag_reg & FLAG_DEMUX) {
543 samplespercount = 8;
544 }
545 else {
546 samplespercount = 4;
547 }
548
549 readcount = samplecount / samplespercount;
550
4bd80e12 551 /* Rather read too many samples than too few. */
b94cff40 552 if (samplecount % samplespercount != 0)
4bd80e12 553 readcount++;
554
555 /* Basic triggers. */
acc885c7
BV
556 if (pols_convert_trigger(sdi) != SR_OK) {
557 sr_err("Failed to configure channels.");
558 return SR_ERR;
559 }
84cbaf77 560
acc885c7 561 if (devc->num_stages > 0) {
4bd80e12 562 delaycount = readcount * (1 - devc->capture_ratio / 100.0);
b94cff40 563 devc->trigger_at = (readcount - delaycount) * samplespercount - devc->num_stages;
84cbaf77
BV
564 for (i = 0; i < NUM_TRIGGER_STAGES; i++) {
565 if (i <= devc->num_stages) {
566 sr_dbg("Setting p-ols stage %d trigger.", i);
567 if ((ret = set_trigger(sdi, i)) != SR_OK)
568 return ret;
569 }
570 else {
571 sr_dbg("Disabling p-ols stage %d trigger.", i);
572 if ((ret = disable_trigger(sdi, i)) != SR_OK)
573 return ret;
574 }
4bd80e12 575 }
576 } else {
577 /* No triggers configured, force trigger on first stage. */
578 sr_dbg("Forcing trigger at stage 0.");
579 if ((ret = set_trigger(sdi, 0)) != SR_OK)
580 return ret;
581 delaycount = readcount;
582 }
583
584 /* Samplerate. */
585 sr_dbg("Setting samplerate to %" PRIu64 "Hz (divider %u)",
586 devc->cur_samplerate, devc->cur_samplerate_divider);
587 arg[0] = devc->cur_samplerate_divider & 0xff;
588 arg[1] = (devc->cur_samplerate_divider & 0xff00) >> 8;
589 arg[2] = (devc->cur_samplerate_divider & 0xff0000) >> 16;
590 arg[3] = 0x00;
591 if (write_longcommand(devc, CMD_SET_DIVIDER, arg) != SR_OK)
592 return SR_ERR;
acc885c7 593
4bd80e12 594 /* Send extended sample limit and pre/post-trigger capture ratio. */
595 arg[0] = ((readcount - 1) & 0xff);
596 arg[1] = ((readcount - 1) & 0xff00) >> 8;
597 arg[2] = ((readcount - 1) & 0xff0000) >> 16;
598 arg[3] = ((readcount - 1) & 0xff000000) >> 24;
1e0de846 599 if (write_longcommand(devc, CMD_CAPTURE_DELAY, arg) != SR_OK)
4bd80e12 600 return SR_ERR;
601 arg[0] = ((delaycount - 1) & 0xff);
602 arg[1] = ((delaycount - 1) & 0xff00) >> 8;
603 arg[2] = ((delaycount - 1) & 0xff0000) >> 16;
604 arg[3] = ((delaycount - 1) & 0xff000000) >> 24;
1e0de846 605 if (write_longcommand(devc, CMD_CAPTURE_COUNT, arg) != SR_OK)
4bd80e12 606 return SR_ERR;
acc885c7 607
4bd80e12 608 /* Flag register. */
609 sr_dbg("Setting intpat %s, extpat %s, RLE %s, noise_filter %s, demux %s",
610 devc->flag_reg & FLAG_INTERNAL_TEST_MODE ? "on": "off",
611 devc->flag_reg & FLAG_EXTERNAL_TEST_MODE ? "on": "off",
612 devc->flag_reg & FLAG_RLE ? "on" : "off",
613 devc->flag_reg & FLAG_FILTER ? "on": "off",
614 devc->flag_reg & FLAG_DEMUX ? "on" : "off");
615
b94cff40 616 /*
617 * Enable/disable OLS channel groups in the flag register according
618 * to the channel mask. 1 means "disable channel".
619 */
620 devc->flag_reg &= ~0x3c;
acc885c7 621 devc->flag_reg |= ~(pols_changrp_mask << 2) & 0x3c;
b94cff40 622 sr_dbg("flag_reg = %x", devc->flag_reg);
623
624 /*
176d785d
UH
625 * In demux mode the OLS is processing two 8-bit or 16-bit samples
626 * in parallel and for this to work the lower two bits of the four
b94cff40 627 * "channel_disable" bits must be replicated to the upper two bits.
628 */
629 flag_tmp = devc->flag_reg;
630 if (devc->flag_reg & FLAG_DEMUX) {
631 flag_tmp &= ~0x30;
acc885c7 632 flag_tmp |= ~(pols_changrp_mask << 4) & 0x30;
b94cff40 633 }
634 arg[0] = flag_tmp & 0xff;
635 arg[1] = flag_tmp >> 8;
4bd80e12 636 arg[2] = arg[3] = 0x00;
637 if (write_longcommand(devc, CMD_SET_FLAGS, arg) != SR_OK)
638 return SR_ERR;
639
640 /* Start acquisition on the device. */
641 if (write_shortcommand(devc, CMD_RUN) != SR_OK)
642 return SR_ERR;
643
644 /* Reset all operational states. */
645 devc->rle_count = devc->num_transfers = 0;
646 devc->num_samples = devc->num_bytes = 0;
647 devc->cnt_bytes = devc->cnt_samples = devc->cnt_samples_rle = 0;
648 memset(devc->sample, 0, 4);
649
bee2b016 650 std_session_send_df_header(sdi);
4bd80e12 651
652 /* Hook up a dummy handler to receive data from the device. */
c650d3ec 653 sr_session_source_add(sdi->session, -1, 0, 10, p_ols_receive_data,
695dc859 654 (struct sr_dev_inst *)sdi);
4bd80e12 655
656 return SR_OK;
657}
658
695dc859 659static int dev_acquisition_stop(struct sr_dev_inst *sdi)
4bd80e12 660{
661 struct dev_context *devc;
4bd80e12 662
663 devc = sdi->priv;
664
4bd80e12 665 write_shortcommand(devc, CMD_RESET);
666 write_shortcommand(devc, CMD_RESET);
667 write_shortcommand(devc, CMD_RESET);
668 write_shortcommand(devc, CMD_RESET);
669 write_shortcommand(devc, CMD_RESET);
670
dd7a4a71 671 sr_session_source_remove(sdi->session, -1);
4bd80e12 672
bee2b016 673 std_session_send_df_end(sdi);
4bd80e12 674
675 return SR_OK;
676}
677
678SR_PRIV struct sr_dev_driver p_ols_driver_info = {
acc885c7 679 .name = "p-ols",
4bd80e12 680 .longname = "Pipistrello OLS",
681 .api_version = 1,
c2fdcc25 682 .init = std_init,
700d6b64 683 .cleanup = std_cleanup,
4bd80e12 684 .scan = scan,
c01bf34c 685 .dev_list = std_dev_list,
4bd80e12 686 .dev_clear = dev_clear,
687 .config_get = config_get,
688 .config_set = config_set,
689 .config_list = config_list,
690 .dev_open = dev_open,
691 .dev_close = dev_close,
692 .dev_acquisition_start = dev_acquisition_start,
693 .dev_acquisition_stop = dev_acquisition_stop,
41812aca 694 .context = NULL,
4bd80e12 695};
dd5c48a6 696SR_REGISTER_DEV_DRIVER(p_ols_driver_info);