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