]> sigrok.org Git - libsigrok.git/blame - src/hardware/openbench-logic-sniffer/api.c
Consistently use g_malloc0() for allocating devc.
[libsigrok.git] / src / hardware / openbench-logic-sniffer / api.c
CommitLineData
0aba65da 1/*
50985c20 2 * This file is part of the libsigrok project.
0aba65da 3 *
13d8e03c 4 * Copyright (C) 2013 Bert Vermeulen <bert@biot.com>
0aba65da
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 "protocol.h"
bf72f649 21#include <libserialport.h>
0aba65da
UH
22
23#define SERIALCOMM "115200/8n1"
24
63ea6141
BV
25static const uint32_t drvopts[] = {
26 SR_CONF_LOGIC_ANALYZER,
27};
28
a0e0bb41 29static const uint32_t scanopts[] = {
1953564a
BV
30 SR_CONF_CONN,
31 SR_CONF_SERIALCOMM,
aeabd308
UH
32};
33
f254bc4b 34static const uint32_t devopts[] = {
5827f61b
BV
35 SR_CONF_LIMIT_SAMPLES | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
36 SR_CONF_SAMPLERATE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
37 SR_CONF_TRIGGER_MATCH | SR_CONF_LIST,
38 SR_CONF_CAPTURE_RATIO | SR_CONF_GET | SR_CONF_SET,
39 SR_CONF_EXTERNAL_CLOCK | SR_CONF_SET,
40 SR_CONF_PATTERN_MODE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
41 SR_CONF_SWAP | SR_CONF_SET,
42 SR_CONF_RLE | SR_CONF_GET | SR_CONF_SET,
0aba65da
UH
43};
44
91fd0f72
BV
45static const int32_t trigger_matches[] = {
46 SR_TRIGGER_ZERO,
47 SR_TRIGGER_ONE,
48};
49
6d16fdfb
BV
50#define STR_PATTERN_NONE "None"
51#define STR_PATTERN_EXTERNAL "External"
52#define STR_PATTERN_INTERNAL "Internal"
967760a8
MR
53
54/* Supported methods of test pattern outputs */
55enum {
56 /**
57 * Capture pins 31:16 (unbuffered wing) output a test pattern
58 * that can captured on pins 0:15.
59 */
60 PATTERN_EXTERNAL,
61
62 /** Route test pattern internally to capture buffer. */
63 PATTERN_INTERNAL,
64};
65
7c07a178 66static const char *patterns[] = {
6d16fdfb 67 STR_PATTERN_NONE,
7c07a178
UH
68 STR_PATTERN_EXTERNAL,
69 STR_PATTERN_INTERNAL,
70};
71
ba7dd8bb 72/* Channels are numbered 0-31 (on the PCB silkscreen). */
3f239f08 73SR_PRIV const char *ols_channel_names[NUM_CHANNELS + 1] = {
78693401
UH
74 "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12",
75 "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23",
76 "24", "25", "26", "27", "28", "29", "30", "31",
0aba65da
UH
77 NULL,
78};
79
d3b38ad3 80/* Default supported samplerates, can be overridden by device metadata. */
e46aa4f6
BV
81static const uint64_t samplerates[] = {
82 SR_HZ(10),
83 SR_MHZ(200),
84 SR_HZ(1),
0aba65da
UH
85};
86
87SR_PRIV struct sr_dev_driver ols_driver_info;
88static struct sr_dev_driver *di = &ols_driver_info;
89
03f4de8c 90static int init(struct sr_context *sr_ctx)
0aba65da 91{
f6beaac5 92 return std_init(sr_ctx, di, LOG_PREFIX);
0aba65da
UH
93}
94
03f4de8c 95static GSList *scan(GSList *options)
0aba65da 96{
1987b8d6 97 struct sr_config *src;
0aba65da
UH
98 struct sr_dev_inst *sdi;
99 struct drv_context *drvc;
100 struct dev_context *devc;
ba7dd8bb 101 struct sr_channel *ch;
0aba65da
UH
102 struct sr_serial_dev_inst *serial;
103 GPollFD probefd;
104 GSList *l, *devices;
105 int ret, i;
106 const char *conn, *serialcomm;
107 char buf[8];
108
0aba65da 109 drvc = di->priv;
4b97c74e 110
0aba65da
UH
111 devices = NULL;
112
113 conn = serialcomm = NULL;
114 for (l = options; l; l = l->next) {
1987b8d6
BV
115 src = l->data;
116 switch (src->key) {
1953564a 117 case SR_CONF_CONN:
e46aa4f6 118 conn = g_variant_get_string(src->data, NULL);
0aba65da 119 break;
1953564a 120 case SR_CONF_SERIALCOMM:
e46aa4f6 121 serialcomm = g_variant_get_string(src->data, NULL);
0aba65da
UH
122 break;
123 }
124 }
125 if (!conn)
126 return NULL;
127
128 if (serialcomm == NULL)
129 serialcomm = SERIALCOMM;
130
131 if (!(serial = sr_serial_dev_inst_new(conn, serialcomm)))
132 return NULL;
133
134 /* The discovery procedure is like this: first send the Reset
135 * command (0x00) 5 times, since the device could be anywhere
136 * in a 5-byte command. Then send the ID command (0x02).
137 * If the device responds with 4 bytes ("OLS1" or "SLA1"), we
138 * have a match.
139 */
140 sr_info("Probing %s.", conn);
4ded59ee 141 if (serial_open(serial, SERIAL_RDWR) != SR_OK)
0aba65da
UH
142 return NULL;
143
144 ret = SR_OK;
145 for (i = 0; i < 5; i++) {
146 if ((ret = send_shortcommand(serial, CMD_RESET)) != SR_OK) {
147 sr_err("Port %s is not writable.", conn);
148 break;
149 }
150 }
151 if (ret != SR_OK) {
152 serial_close(serial);
153 sr_err("Could not use port %s. Quitting.", conn);
154 return NULL;
155 }
156 send_shortcommand(serial, CMD_ID);
157
158 /* Wait 10ms for a response. */
159 g_usleep(10000);
160
bf72f649 161 sp_get_port_handle(serial->data, &probefd.fd);
0aba65da
UH
162 probefd.events = G_IO_IN;
163 g_poll(&probefd, 1, 1);
164
165 if (probefd.revents != G_IO_IN)
166 return NULL;
f4d3a4fb 167 if (serial_read_blocking(serial, buf, 4, serial_timeout(serial, 4)) != 4)
0aba65da
UH
168 return NULL;
169 if (strncmp(buf, "1SLO", 4) && strncmp(buf, "1ALS", 4))
170 return NULL;
171
172 /* Definitely using the OLS protocol, check if it supports
173 * the metadata command.
174 */
175 send_shortcommand(serial, CMD_METADATA);
176 if (g_poll(&probefd, 1, 10) > 0) {
177 /* Got metadata. */
178 sdi = get_metadata(serial);
0aba65da
UH
179 devc = sdi->priv;
180 } else {
181 /* Not an OLS -- some other board that uses the sump protocol. */
72cd99b8 182 sr_info("Device does not support metadata.");
aac29cc1 183 sdi = g_malloc0(sizeof(struct sr_dev_inst));
0af636be
UH
184 sdi->status = SR_ST_INACTIVE;
185 sdi->vendor = g_strdup("Sump");
186 sdi->model = g_strdup("Logic Analyzer");
187 sdi->version = g_strdup("v1.0");
0aba65da 188 sdi->driver = di;
0aba65da 189 for (i = 0; i < 32; i++) {
3f239f08 190 if (!(ch = sr_channel_new(i, SR_CHANNEL_LOGIC, TRUE,
ba7dd8bb 191 ols_channel_names[i])))
0aba65da 192 return 0;
ba7dd8bb 193 sdi->channels = g_slist_append(sdi->channels, ch);
0aba65da 194 }
bf256783 195 devc = ols_dev_new();
0aba65da
UH
196 sdi->priv = devc;
197 }
bf256783
BV
198 /* Configure samplerate and divider. */
199 if (ols_set_samplerate(sdi, DEFAULT_SAMPLERATE) != SR_OK)
200 sr_dbg("Failed to set default samplerate (%"PRIu64").",
201 DEFAULT_SAMPLERATE);
459a0f26
BV
202 sdi->inst_type = SR_INST_SERIAL;
203 sdi->conn = serial;
bf256783 204
0aba65da
UH
205 drvc->instances = g_slist_append(drvc->instances, sdi);
206 devices = g_slist_append(devices, sdi);
207
208 serial_close(serial);
209
210 return devices;
211}
212
03f4de8c 213static GSList *dev_list(void)
0aba65da 214{
0e94d524 215 return ((struct drv_context *)(di->priv))->instances;
0aba65da
UH
216}
217
eea49cf1 218static int cleanup(void)
0aba65da 219{
a6630742 220 return std_dev_clear(di, NULL);
0aba65da
UH
221}
222
584560f1 223static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi,
53b4680f 224 const struct sr_channel_group *cg)
0aba65da
UH
225{
226 struct dev_context *devc;
227
53b4680f 228 (void)cg;
8f996b89 229
0c05591a
BV
230 if (!sdi)
231 return SR_ERR_ARG;
232
233 devc = sdi->priv;
584560f1 234 switch (key) {
123e1313 235 case SR_CONF_SAMPLERATE:
0c05591a
BV
236 *data = g_variant_new_uint64(devc->cur_samplerate);
237 break;
238 case SR_CONF_CAPTURE_RATIO:
239 *data = g_variant_new_uint64(devc->capture_ratio);
240 break;
241 case SR_CONF_LIMIT_SAMPLES:
242 *data = g_variant_new_uint64(devc->limit_samples);
243 break;
967760a8
MR
244 case SR_CONF_PATTERN_MODE:
245 if (devc->flag_reg & FLAG_EXTERNAL_TEST_MODE)
246 *data = g_variant_new_string(STR_PATTERN_EXTERNAL);
247 else if (devc->flag_reg & FLAG_INTERNAL_TEST_MODE)
248 *data = g_variant_new_string(STR_PATTERN_INTERNAL);
6d16fdfb
BV
249 else
250 *data = g_variant_new_string(STR_PATTERN_NONE);
967760a8 251 break;
0c05591a
BV
252 case SR_CONF_RLE:
253 *data = g_variant_new_boolean(devc->flag_reg & FLAG_RLE ? TRUE : FALSE);
7730e4f0 254 break;
0aba65da 255 default:
bd6fbf62 256 return SR_ERR_NA;
0aba65da
UH
257 }
258
259 return SR_OK;
260}
261
584560f1 262static int config_set(uint32_t key, GVariant *data, const struct sr_dev_inst *sdi,
53b4680f 263 const struct sr_channel_group *cg)
0aba65da
UH
264{
265 struct dev_context *devc;
6d16fdfb 266 uint16_t flag;
e46aa4f6 267 uint64_t tmp_u64;
6d16fdfb 268 int ret;
967760a8 269 const char *stropt;
0aba65da 270
53b4680f 271 (void)cg;
8f996b89 272
e73ffd42
BV
273 if (sdi->status != SR_ST_ACTIVE)
274 return SR_ERR_DEV_CLOSED;
275
0aba65da
UH
276 devc = sdi->priv;
277
584560f1 278 switch (key) {
1953564a 279 case SR_CONF_SAMPLERATE:
e46aa4f6
BV
280 tmp_u64 = g_variant_get_uint64(data);
281 if (tmp_u64 < samplerates[0] || tmp_u64 > samplerates[1])
282 return SR_ERR_SAMPLERATE;
283 ret = ols_set_samplerate(sdi, g_variant_get_uint64(data));
0aba65da 284 break;
1953564a 285 case SR_CONF_LIMIT_SAMPLES:
e46aa4f6
BV
286 tmp_u64 = g_variant_get_uint64(data);
287 if (tmp_u64 < MIN_NUM_SAMPLES)
0aba65da 288 return SR_ERR;
e46aa4f6 289 devc->limit_samples = tmp_u64;
0aba65da
UH
290 ret = SR_OK;
291 break;
1953564a 292 case SR_CONF_CAPTURE_RATIO:
e46aa4f6 293 devc->capture_ratio = g_variant_get_uint64(data);
0aba65da
UH
294 if (devc->capture_ratio < 0 || devc->capture_ratio > 100) {
295 devc->capture_ratio = 0;
296 ret = SR_ERR;
297 } else
298 ret = SR_OK;
299 break;
eb1b610b
MR
300 case SR_CONF_EXTERNAL_CLOCK:
301 if (g_variant_get_boolean(data)) {
302 sr_info("Enabling external clock.");
303 devc->flag_reg |= FLAG_CLOCK_EXTERNAL;
304 } else {
305 sr_info("Disabled external clock.");
306 devc->flag_reg &= ~FLAG_CLOCK_EXTERNAL;
307 }
308 ret = SR_OK;
309 break;
967760a8
MR
310 case SR_CONF_PATTERN_MODE:
311 stropt = g_variant_get_string(data, NULL);
312 ret = SR_OK;
6d16fdfb
BV
313 flag = 0xffff;
314 if (!strcmp(stropt, STR_PATTERN_NONE)) {
315 sr_info("Disabling test modes.");
316 flag = 0x0000;
317 }else if (!strcmp(stropt, STR_PATTERN_INTERNAL)) {
967760a8 318 sr_info("Enabling internal test mode.");
6d16fdfb 319 flag = FLAG_INTERNAL_TEST_MODE;
967760a8
MR
320 } else if (!strcmp(stropt, STR_PATTERN_EXTERNAL)) {
321 sr_info("Enabling external test mode.");
6d16fdfb 322 flag = FLAG_EXTERNAL_TEST_MODE;
967760a8
MR
323 } else {
324 ret = SR_ERR;
325 }
6d16fdfb
BV
326 if (flag != 0xffff) {
327 devc->flag_reg &= ~(FLAG_INTERNAL_TEST_MODE | FLAG_EXTERNAL_TEST_MODE);
328 devc->flag_reg |= flag;
329 }
967760a8 330 break;
7b0a57fd
MR
331 case SR_CONF_SWAP:
332 if (g_variant_get_boolean(data)) {
333 sr_info("Enabling channel swapping.");
3f239f08 334 devc->flag_reg |= FLAG_SWAP_CHANNELS;
7b0a57fd
MR
335 } else {
336 sr_info("Disabling channel swapping.");
3f239f08 337 devc->flag_reg &= ~FLAG_SWAP_CHANNELS;
7b0a57fd
MR
338 }
339 ret = SR_OK;
340 break;
341
1953564a 342 case SR_CONF_RLE:
e46aa4f6 343 if (g_variant_get_boolean(data)) {
0aba65da
UH
344 sr_info("Enabling RLE.");
345 devc->flag_reg |= FLAG_RLE;
aeea0572
BV
346 } else {
347 sr_info("Disabling RLE.");
348 devc->flag_reg &= ~FLAG_RLE;
0aba65da
UH
349 }
350 ret = SR_OK;
351 break;
352 default:
bd6fbf62 353 ret = SR_ERR_NA;
0aba65da
UH
354 }
355
356 return ret;
357}
358
584560f1 359static int config_list(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi,
53b4680f 360 const struct sr_channel_group *cg)
a1c743fc 361{
f0de2dd0
BV
362 struct dev_context *devc;
363 GVariant *gvar, *grange[2];
e46aa4f6 364 GVariantBuilder gvb;
91fd0f72 365 int num_ols_changrp, i;
a1c743fc 366
53b4680f 367 (void)cg;
a1c743fc
BV
368
369 switch (key) {
0d485e30 370 case SR_CONF_SCAN_OPTIONS:
584560f1 371 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32,
a0e0bb41 372 scanopts, ARRAY_SIZE(scanopts), sizeof(uint32_t));
0d485e30 373 break;
9a6517d1 374 case SR_CONF_DEVICE_OPTIONS:
63ea6141
BV
375 if (!sdi)
376 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32,
377 drvopts, ARRAY_SIZE(drvopts), sizeof(uint32_t));
378 else
379 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32,
380 devopts, ARRAY_SIZE(devopts), sizeof(uint32_t));
9a6517d1 381 break;
a1c743fc 382 case SR_CONF_SAMPLERATE:
e46aa4f6
BV
383 g_variant_builder_init(&gvb, G_VARIANT_TYPE("a{sv}"));
384 gvar = g_variant_new_fixed_array(G_VARIANT_TYPE("t"), samplerates,
385 ARRAY_SIZE(samplerates), sizeof(uint64_t));
386 g_variant_builder_add(&gvb, "{sv}", "samplerate-steps", gvar);
387 *data = g_variant_builder_end(&gvb);
a1c743fc 388 break;
91fd0f72
BV
389 case SR_CONF_TRIGGER_MATCH:
390 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_INT32,
391 trigger_matches, ARRAY_SIZE(trigger_matches),
392 sizeof(int32_t));
c50277a6 393 break;
7c07a178
UH
394 case SR_CONF_PATTERN_MODE:
395 *data = g_variant_new_strv(patterns, ARRAY_SIZE(patterns));
396 break;
f0de2dd0
BV
397 case SR_CONF_LIMIT_SAMPLES:
398 if (!sdi)
399 return SR_ERR_ARG;
400 devc = sdi->priv;
401 if (devc->flag_reg & FLAG_RLE)
402 return SR_ERR_NA;
403 if (devc->max_samples == 0)
404 /* Device didn't specify sample memory size in metadata. */
405 return SR_ERR_NA;
406 /*
ba7dd8bb 407 * Channel groups are turned off if no channels in that group are
f0de2dd0
BV
408 * enabled, making more room for samples for the enabled group.
409 */
91fd0f72
BV
410 ols_channel_mask(sdi);
411 num_ols_changrp = 0;
f0de2dd0 412 for (i = 0; i < 4; i++) {
ba7dd8bb 413 if (devc->channel_mask & (0xff << (i * 8)))
91fd0f72 414 num_ols_changrp++;
1e1dac0c 415 }
f0de2dd0 416 grange[0] = g_variant_new_uint64(MIN_NUM_SAMPLES);
91fd0f72
BV
417 if (num_ols_changrp)
418 grange[1] = g_variant_new_uint64(devc->max_samples / num_ols_changrp);
419 else
420 grange[1] = g_variant_new_uint64(MIN_NUM_SAMPLES);
f0de2dd0
BV
421 *data = g_variant_new_tuple(grange, 2);
422 break;
a1c743fc 423 default:
bd6fbf62 424 return SR_ERR_NA;
a1c743fc
BV
425 }
426
427 return SR_OK;
428}
429
016e72f3
BV
430static int set_trigger(const struct sr_dev_inst *sdi, int stage)
431{
432 struct dev_context *devc;
433 struct sr_serial_dev_inst *serial;
434 uint8_t cmd, arg[4];
435
436 devc = sdi->priv;
437 serial = sdi->conn;
438
439 cmd = CMD_SET_TRIGGER_MASK + stage * 4;
440 arg[0] = devc->trigger_mask[stage] & 0xff;
441 arg[1] = (devc->trigger_mask[stage] >> 8) & 0xff;
442 arg[2] = (devc->trigger_mask[stage] >> 16) & 0xff;
443 arg[3] = (devc->trigger_mask[stage] >> 24) & 0xff;
444 if (send_longcommand(serial, cmd, arg) != SR_OK)
445 return SR_ERR;
446
447 cmd = CMD_SET_TRIGGER_VALUE + stage * 4;
448 arg[0] = devc->trigger_value[stage] & 0xff;
449 arg[1] = (devc->trigger_value[stage] >> 8) & 0xff;
450 arg[2] = (devc->trigger_value[stage] >> 16) & 0xff;
451 arg[3] = (devc->trigger_value[stage] >> 24) & 0xff;
452 if (send_longcommand(serial, cmd, arg) != SR_OK)
453 return SR_ERR;
454
455 cmd = CMD_SET_TRIGGER_CONFIG + stage * 4;
456 arg[0] = arg[1] = arg[3] = 0x00;
457 arg[2] = stage;
458 if (stage == devc->num_stages)
459 /* Last stage, fire when this one matches. */
460 arg[3] |= TRIGGER_START;
461 if (send_longcommand(serial, cmd, arg) != SR_OK)
462 return SR_ERR;
463
464 return SR_OK;
465}
466
03f4de8c 467static int dev_acquisition_start(const struct sr_dev_inst *sdi,
0aba65da
UH
468 void *cb_data)
469{
0aba65da 470 struct dev_context *devc;
459a0f26 471 struct sr_serial_dev_inst *serial;
32f09bfd 472 uint16_t samplecount, readcount, delaycount;
91fd0f72
BV
473 uint8_t ols_changrp_mask, arg[4];
474 int num_ols_changrp;
016e72f3 475 int ret, i;
0aba65da 476
e73ffd42
BV
477 if (sdi->status != SR_ST_ACTIVE)
478 return SR_ERR_DEV_CLOSED;
479
0aba65da 480 devc = sdi->priv;
459a0f26 481 serial = sdi->conn;
0aba65da 482
91fd0f72 483 ols_channel_mask(sdi);
0aba65da 484
91fd0f72
BV
485 num_ols_changrp = 0;
486 ols_changrp_mask = 0;
0aba65da 487 for (i = 0; i < 4; i++) {
ba7dd8bb 488 if (devc->channel_mask & (0xff << (i * 8))) {
91fd0f72
BV
489 ols_changrp_mask |= (1 << i);
490 num_ols_changrp++;
0aba65da
UH
491 }
492 }
493
494 /*
495 * Limit readcount to prevent reading past the end of the hardware
496 * buffer.
497 */
91fd0f72 498 samplecount = MIN(devc->max_samples / num_ols_changrp, devc->limit_samples);
32f09bfd 499 readcount = samplecount / 4;
016e72f3
BV
500
501 /* Rather read too many samples than too few. */
502 if (samplecount % 4 != 0)
32f09bfd 503 readcount++;
0aba65da 504
016e72f3 505 /* Basic triggers. */
91fd0f72
BV
506 if (ols_convert_trigger(sdi) != SR_OK) {
507 sr_err("Failed to configure channels.");
508 return SR_ERR;
509 }
510 if (devc->num_stages > 0) {
0aba65da
UH
511 delaycount = readcount * (1 - devc->capture_ratio / 100.0);
512 devc->trigger_at = (readcount - delaycount) * 4 - devc->num_stages;
016e72f3 513 for (i = 0; i <= devc->num_stages; i++) {
91fd0f72 514 sr_dbg("Setting OLS stage %d trigger.", i);
016e72f3
BV
515 if ((ret = set_trigger(sdi, i)) != SR_OK)
516 return ret;
517 }
0aba65da 518 } else {
016e72f3
BV
519 /* No triggers configured, force trigger on first stage. */
520 sr_dbg("Forcing trigger at stage 0.");
521 if ((ret = set_trigger(sdi, 0)) != SR_OK)
522 return ret;
0aba65da
UH
523 delaycount = readcount;
524 }
525
6d16fdfb 526 /* Samplerate. */
016e72f3 527 sr_dbg("Setting samplerate to %" PRIu64 "Hz (divider %u)",
6d16fdfb 528 devc->cur_samplerate, devc->cur_samplerate_divider);
016e72f3
BV
529 arg[0] = devc->cur_samplerate_divider & 0xff;
530 arg[1] = (devc->cur_samplerate_divider & 0xff00) >> 8;
531 arg[2] = (devc->cur_samplerate_divider & 0xff0000) >> 16;
532 arg[3] = 0x00;
533 if (send_longcommand(serial, CMD_SET_DIVIDER, arg) != SR_OK)
0aba65da
UH
534 return SR_ERR;
535
536 /* Send sample limit and pre/post-trigger capture ratio. */
016e72f3 537 sr_dbg("Setting sample limit %d, trigger point at %d",
6d16fdfb 538 (readcount - 1) * 4, (delaycount - 1) * 4);
016e72f3
BV
539 arg[0] = ((readcount - 1) & 0xff);
540 arg[1] = ((readcount - 1) & 0xff00) >> 8;
541 arg[2] = ((delaycount - 1) & 0xff);
542 arg[3] = ((delaycount - 1) & 0xff00) >> 8;
543 if (send_longcommand(serial, CMD_CAPTURE_SIZE, arg) != SR_OK)
0aba65da
UH
544 return SR_ERR;
545
6d16fdfb 546 /* Flag register. */
625763e2
BV
547 sr_dbg("Setting intpat %s, extpat %s, RLE %s, noise_filter %s, demux %s",
548 devc->flag_reg & FLAG_INTERNAL_TEST_MODE ? "on": "off",
6d16fdfb 549 devc->flag_reg & FLAG_EXTERNAL_TEST_MODE ? "on": "off",
625763e2
BV
550 devc->flag_reg & FLAG_RLE ? "on" : "off",
551 devc->flag_reg & FLAG_FILTER ? "on": "off",
552 devc->flag_reg & FLAG_DEMUX ? "on" : "off");
91fd0f72
BV
553 /*
554 * Enable/disable OLS channel groups in the flag register according
555 * to the channel mask. 1 means "disable channel".
556 */
557 devc->flag_reg |= ~(ols_changrp_mask << 2) & 0x3c;
016e72f3
BV
558 arg[0] = devc->flag_reg & 0xff;
559 arg[1] = devc->flag_reg >> 8;
560 arg[2] = arg[3] = 0x00;
561 if (send_longcommand(serial, CMD_SET_FLAGS, arg) != SR_OK)
0aba65da
UH
562 return SR_ERR;
563
564 /* Start acquisition on the device. */
459a0f26 565 if (send_shortcommand(serial, CMD_RUN) != SR_OK)
0aba65da
UH
566 return SR_ERR;
567
bf256783 568 /* Reset all operational states. */
6d16fdfb
BV
569 devc->rle_count = devc->num_transfers = 0;
570 devc->num_samples = devc->num_bytes = 0;
625763e2 571 devc->cnt_bytes = devc->cnt_samples = devc->cnt_samples_rle = 0;
abb39e6b 572 memset(devc->sample, 0, 4);
bf256783 573
4afdfd46 574 /* Send header packet to the session bus. */
29a27196 575 std_session_send_df_header(cb_data, LOG_PREFIX);
4afdfd46 576
102f1239
BV
577 serial_source_add(sdi->session, serial, G_IO_IN, -1,
578 ols_receive_data, cb_data);
0aba65da 579
0aba65da
UH
580 return SR_OK;
581}
582
03f4de8c 583static int dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data)
0aba65da 584{
0aba65da
UH
585 (void)cb_data;
586
587 abort_acquisition(sdi);
588
589 return SR_OK;
590}
591
592SR_PRIV struct sr_dev_driver ols_driver_info = {
593 .name = "ols",
594 .longname = "Openbench Logic Sniffer",
595 .api_version = 1,
03f4de8c 596 .init = init,
eea49cf1 597 .cleanup = cleanup,
03f4de8c
BV
598 .scan = scan,
599 .dev_list = dev_list,
a6630742 600 .dev_clear = NULL,
035a1078
BV
601 .config_get = config_get,
602 .config_set = config_set,
a1c743fc 603 .config_list = config_list,
854434de 604 .dev_open = std_serial_dev_open,
bf2c987f 605 .dev_close = std_serial_dev_close,
03f4de8c
BV
606 .dev_acquisition_start = dev_acquisition_start,
607 .dev_acquisition_stop = dev_acquisition_stop,
0aba65da
UH
608 .priv = NULL,
609};