]> sigrok.org Git - libsigrok.git/blame - hardware/openbench-logic-sniffer/api.c
std: Add std_serial_dev_open().
[libsigrok.git] / 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
e46aa4f6 25static const int32_t hwopts[] = {
1953564a
BV
26 SR_CONF_CONN,
27 SR_CONF_SERIALCOMM,
aeabd308
UH
28};
29
e46aa4f6 30static const int32_t hwcaps[] = {
1953564a
BV
31 SR_CONF_LOGIC_ANALYZER,
32 SR_CONF_SAMPLERATE,
0c05591a 33 SR_CONF_TRIGGER_TYPE,
1953564a
BV
34 SR_CONF_CAPTURE_RATIO,
35 SR_CONF_LIMIT_SAMPLES,
eb1b610b 36 SR_CONF_EXTERNAL_CLOCK,
967760a8 37 SR_CONF_PATTERN_MODE,
7b0a57fd 38 SR_CONF_SWAP,
1953564a 39 SR_CONF_RLE,
0aba65da
UH
40};
41
967760a8
MR
42#define STR_PATTERN_EXTERNAL "external"
43#define STR_PATTERN_INTERNAL "internal"
44
45/* Supported methods of test pattern outputs */
46enum {
47 /**
48 * Capture pins 31:16 (unbuffered wing) output a test pattern
49 * that can captured on pins 0:15.
50 */
51 PATTERN_EXTERNAL,
52
53 /** Route test pattern internally to capture buffer. */
54 PATTERN_INTERNAL,
55};
56
7c07a178
UH
57static const char *patterns[] = {
58 STR_PATTERN_EXTERNAL,
59 STR_PATTERN_INTERNAL,
60};
61
0aba65da
UH
62/* Probes are numbered 0-31 (on the PCB silkscreen). */
63SR_PRIV const char *ols_probe_names[NUM_PROBES + 1] = {
78693401
UH
64 "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12",
65 "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23",
66 "24", "25", "26", "27", "28", "29", "30", "31",
0aba65da
UH
67 NULL,
68};
69
d3b38ad3 70/* Default supported samplerates, can be overridden by device metadata. */
e46aa4f6
BV
71static const uint64_t samplerates[] = {
72 SR_HZ(10),
73 SR_MHZ(200),
74 SR_HZ(1),
0aba65da
UH
75};
76
77SR_PRIV struct sr_dev_driver ols_driver_info;
78static struct sr_dev_driver *di = &ols_driver_info;
79
eea49cf1
UH
80static int dev_clear(void)
81{
82 return std_dev_clear(di, NULL);
83}
84
03f4de8c 85static int init(struct sr_context *sr_ctx)
0aba65da 86{
f6beaac5 87 return std_init(sr_ctx, di, LOG_PREFIX);
0aba65da
UH
88}
89
03f4de8c 90static GSList *scan(GSList *options)
0aba65da 91{
1987b8d6 92 struct sr_config *src;
0aba65da
UH
93 struct sr_dev_inst *sdi;
94 struct drv_context *drvc;
95 struct dev_context *devc;
96 struct sr_probe *probe;
97 struct sr_serial_dev_inst *serial;
98 GPollFD probefd;
99 GSList *l, *devices;
100 int ret, i;
101 const char *conn, *serialcomm;
102 char buf[8];
103
0aba65da 104 drvc = di->priv;
4b97c74e 105
0aba65da
UH
106 devices = NULL;
107
108 conn = serialcomm = NULL;
109 for (l = options; l; l = l->next) {
1987b8d6
BV
110 src = l->data;
111 switch (src->key) {
1953564a 112 case SR_CONF_CONN:
e46aa4f6 113 conn = g_variant_get_string(src->data, NULL);
0aba65da 114 break;
1953564a 115 case SR_CONF_SERIALCOMM:
e46aa4f6 116 serialcomm = g_variant_get_string(src->data, NULL);
0aba65da
UH
117 break;
118 }
119 }
120 if (!conn)
121 return NULL;
122
123 if (serialcomm == NULL)
124 serialcomm = SERIALCOMM;
125
126 if (!(serial = sr_serial_dev_inst_new(conn, serialcomm)))
127 return NULL;
128
129 /* The discovery procedure is like this: first send the Reset
130 * command (0x00) 5 times, since the device could be anywhere
131 * in a 5-byte command. Then send the ID command (0x02).
132 * If the device responds with 4 bytes ("OLS1" or "SLA1"), we
133 * have a match.
134 */
135 sr_info("Probing %s.", conn);
136 if (serial_open(serial, SERIAL_RDWR | SERIAL_NONBLOCK) != SR_OK)
137 return NULL;
138
139 ret = SR_OK;
140 for (i = 0; i < 5; i++) {
141 if ((ret = send_shortcommand(serial, CMD_RESET)) != SR_OK) {
142 sr_err("Port %s is not writable.", conn);
143 break;
144 }
145 }
146 if (ret != SR_OK) {
147 serial_close(serial);
148 sr_err("Could not use port %s. Quitting.", conn);
149 return NULL;
150 }
151 send_shortcommand(serial, CMD_ID);
152
153 /* Wait 10ms for a response. */
154 g_usleep(10000);
155
bf72f649 156 sp_get_port_handle(serial->data, &probefd.fd);
0aba65da
UH
157 probefd.events = G_IO_IN;
158 g_poll(&probefd, 1, 1);
159
160 if (probefd.revents != G_IO_IN)
161 return NULL;
162 if (serial_read(serial, buf, 4) != 4)
163 return NULL;
164 if (strncmp(buf, "1SLO", 4) && strncmp(buf, "1ALS", 4))
165 return NULL;
166
167 /* Definitely using the OLS protocol, check if it supports
168 * the metadata command.
169 */
170 send_shortcommand(serial, CMD_METADATA);
171 if (g_poll(&probefd, 1, 10) > 0) {
172 /* Got metadata. */
173 sdi = get_metadata(serial);
174 sdi->index = 0;
175 devc = sdi->priv;
176 } else {
177 /* Not an OLS -- some other board that uses the sump protocol. */
72cd99b8 178 sr_info("Device does not support metadata.");
0aba65da
UH
179 sdi = sr_dev_inst_new(0, SR_ST_INACTIVE,
180 "Sump", "Logic Analyzer", "v1.0");
181 sdi->driver = di;
0aba65da
UH
182 for (i = 0; i < 32; i++) {
183 if (!(probe = sr_probe_new(i, SR_PROBE_LOGIC, TRUE,
184 ols_probe_names[i])))
185 return 0;
186 sdi->probes = g_slist_append(sdi->probes, probe);
187 }
bf256783 188 devc = ols_dev_new();
0aba65da
UH
189 sdi->priv = devc;
190 }
bf256783
BV
191 /* Configure samplerate and divider. */
192 if (ols_set_samplerate(sdi, DEFAULT_SAMPLERATE) != SR_OK)
193 sr_dbg("Failed to set default samplerate (%"PRIu64").",
194 DEFAULT_SAMPLERATE);
195 /* Clear trigger masks, values and stages. */
196 ols_configure_probes(sdi);
459a0f26
BV
197 sdi->inst_type = SR_INST_SERIAL;
198 sdi->conn = serial;
bf256783 199
0aba65da
UH
200 drvc->instances = g_slist_append(drvc->instances, sdi);
201 devices = g_slist_append(devices, sdi);
202
203 serial_close(serial);
204
205 return devices;
206}
207
03f4de8c 208static GSList *dev_list(void)
0aba65da 209{
0e94d524 210 return ((struct drv_context *)(di->priv))->instances;
0aba65da
UH
211}
212
03f4de8c 213static int dev_open(struct sr_dev_inst *sdi)
0aba65da 214{
459a0f26 215 struct sr_serial_dev_inst *serial;
0aba65da 216
459a0f26 217 serial = sdi->conn;
4403c39f 218 if (serial_open(serial, SERIAL_RDWR | SERIAL_NONBLOCK) != SR_OK)
0aba65da
UH
219 return SR_ERR;
220
221 sdi->status = SR_ST_ACTIVE;
222
223 return SR_OK;
224}
225
eea49cf1 226static int cleanup(void)
0aba65da 227{
eea49cf1 228 return dev_clear();
0aba65da
UH
229}
230
8f996b89
ML
231static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi,
232 const struct sr_probe_group *probe_group)
0aba65da
UH
233{
234 struct dev_context *devc;
235
8f996b89
ML
236 (void)probe_group;
237
0c05591a
BV
238 if (!sdi)
239 return SR_ERR_ARG;
240
241 devc = sdi->priv;
035a1078 242 switch (id) {
123e1313 243 case SR_CONF_SAMPLERATE:
0c05591a
BV
244 *data = g_variant_new_uint64(devc->cur_samplerate);
245 break;
246 case SR_CONF_CAPTURE_RATIO:
247 *data = g_variant_new_uint64(devc->capture_ratio);
248 break;
249 case SR_CONF_LIMIT_SAMPLES:
250 *data = g_variant_new_uint64(devc->limit_samples);
251 break;
967760a8
MR
252 case SR_CONF_PATTERN_MODE:
253 if (devc->flag_reg & FLAG_EXTERNAL_TEST_MODE)
254 *data = g_variant_new_string(STR_PATTERN_EXTERNAL);
255 else if (devc->flag_reg & FLAG_INTERNAL_TEST_MODE)
256 *data = g_variant_new_string(STR_PATTERN_INTERNAL);
257 break;
0c05591a
BV
258 case SR_CONF_RLE:
259 *data = g_variant_new_boolean(devc->flag_reg & FLAG_RLE ? TRUE : FALSE);
0aba65da
UH
260 break;
261 default:
bd6fbf62 262 return SR_ERR_NA;
0aba65da
UH
263 }
264
265 return SR_OK;
266}
267
8f996b89
ML
268static int config_set(int id, GVariant *data, const struct sr_dev_inst *sdi,
269 const struct sr_probe_group *probe_group)
0aba65da
UH
270{
271 struct dev_context *devc;
272 int ret;
e46aa4f6 273 uint64_t tmp_u64;
967760a8 274 const char *stropt;
0aba65da 275
8f996b89
ML
276 (void)probe_group;
277
e73ffd42
BV
278 if (sdi->status != SR_ST_ACTIVE)
279 return SR_ERR_DEV_CLOSED;
280
0aba65da
UH
281 devc = sdi->priv;
282
035a1078 283 switch (id) {
1953564a 284 case SR_CONF_SAMPLERATE:
e46aa4f6
BV
285 tmp_u64 = g_variant_get_uint64(data);
286 if (tmp_u64 < samplerates[0] || tmp_u64 > samplerates[1])
287 return SR_ERR_SAMPLERATE;
288 ret = ols_set_samplerate(sdi, g_variant_get_uint64(data));
0aba65da 289 break;
1953564a 290 case SR_CONF_LIMIT_SAMPLES:
e46aa4f6
BV
291 tmp_u64 = g_variant_get_uint64(data);
292 if (tmp_u64 < MIN_NUM_SAMPLES)
0aba65da 293 return SR_ERR;
e46aa4f6 294 devc->limit_samples = tmp_u64;
0aba65da
UH
295 ret = SR_OK;
296 break;
1953564a 297 case SR_CONF_CAPTURE_RATIO:
e46aa4f6 298 devc->capture_ratio = g_variant_get_uint64(data);
0aba65da
UH
299 if (devc->capture_ratio < 0 || devc->capture_ratio > 100) {
300 devc->capture_ratio = 0;
301 ret = SR_ERR;
302 } else
303 ret = SR_OK;
304 break;
eb1b610b
MR
305 case SR_CONF_EXTERNAL_CLOCK:
306 if (g_variant_get_boolean(data)) {
307 sr_info("Enabling external clock.");
308 devc->flag_reg |= FLAG_CLOCK_EXTERNAL;
309 } else {
310 sr_info("Disabled external clock.");
311 devc->flag_reg &= ~FLAG_CLOCK_EXTERNAL;
312 }
313 ret = SR_OK;
314 break;
967760a8
MR
315 case SR_CONF_PATTERN_MODE:
316 stropt = g_variant_get_string(data, NULL);
317 ret = SR_OK;
318 if (!strcmp(stropt, STR_PATTERN_INTERNAL)) {
319 sr_info("Enabling internal test mode.");
320 devc->flag_reg |= FLAG_INTERNAL_TEST_MODE;
321 } else if (!strcmp(stropt, STR_PATTERN_EXTERNAL)) {
322 sr_info("Enabling external test mode.");
323 devc->flag_reg |= FLAG_EXTERNAL_TEST_MODE;
324 } else {
325 ret = SR_ERR;
326 }
327 break;
7b0a57fd
MR
328 case SR_CONF_SWAP:
329 if (g_variant_get_boolean(data)) {
330 sr_info("Enabling channel swapping.");
331 devc->flag_reg |= FLAG_SWAP_PROBES;
332 } else {
333 sr_info("Disabling channel swapping.");
334 devc->flag_reg &= ~FLAG_SWAP_PROBES;
335 }
336 ret = SR_OK;
337 break;
338
1953564a 339 case SR_CONF_RLE:
e46aa4f6 340 if (g_variant_get_boolean(data)) {
0aba65da
UH
341 sr_info("Enabling RLE.");
342 devc->flag_reg |= FLAG_RLE;
aeea0572
BV
343 } else {
344 sr_info("Disabling RLE.");
345 devc->flag_reg &= ~FLAG_RLE;
0aba65da
UH
346 }
347 ret = SR_OK;
348 break;
349 default:
bd6fbf62 350 ret = SR_ERR_NA;
0aba65da
UH
351 }
352
353 return ret;
354}
355
8f996b89
ML
356static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi,
357 const struct sr_probe_group *probe_group)
a1c743fc 358{
e46aa4f6
BV
359 GVariant *gvar;
360 GVariantBuilder gvb;
a1c743fc
BV
361
362 (void)sdi;
8f996b89 363 (void)probe_group;
a1c743fc
BV
364
365 switch (key) {
0d485e30 366 case SR_CONF_SCAN_OPTIONS:
e46aa4f6
BV
367 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_INT32,
368 hwopts, ARRAY_SIZE(hwopts), sizeof(int32_t));
0d485e30 369 break;
9a6517d1 370 case SR_CONF_DEVICE_OPTIONS:
e46aa4f6
BV
371 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_INT32,
372 hwcaps, ARRAY_SIZE(hwcaps), sizeof(int32_t));
9a6517d1 373 break;
a1c743fc 374 case SR_CONF_SAMPLERATE:
e46aa4f6
BV
375 g_variant_builder_init(&gvb, G_VARIANT_TYPE("a{sv}"));
376 gvar = g_variant_new_fixed_array(G_VARIANT_TYPE("t"), samplerates,
377 ARRAY_SIZE(samplerates), sizeof(uint64_t));
378 g_variant_builder_add(&gvb, "{sv}", "samplerate-steps", gvar);
379 *data = g_variant_builder_end(&gvb);
a1c743fc 380 break;
c50277a6 381 case SR_CONF_TRIGGER_TYPE:
e46aa4f6 382 *data = g_variant_new_string(TRIGGER_TYPE);
c50277a6 383 break;
7c07a178
UH
384 case SR_CONF_PATTERN_MODE:
385 *data = g_variant_new_strv(patterns, ARRAY_SIZE(patterns));
386 break;
a1c743fc 387 default:
bd6fbf62 388 return SR_ERR_NA;
a1c743fc
BV
389 }
390
391 return SR_OK;
392}
393
03f4de8c 394static int dev_acquisition_start(const struct sr_dev_inst *sdi,
0aba65da
UH
395 void *cb_data)
396{
0aba65da 397 struct dev_context *devc;
459a0f26 398 struct sr_serial_dev_inst *serial;
0aba65da
UH
399 uint32_t trigger_config[4];
400 uint32_t data;
401 uint16_t readcount, delaycount;
402 uint8_t changrp_mask;
403 int num_channels;
404 int i;
405
e73ffd42
BV
406 if (sdi->status != SR_ST_ACTIVE)
407 return SR_ERR_DEV_CLOSED;
408
0aba65da 409 devc = sdi->priv;
459a0f26 410 serial = sdi->conn;
0aba65da 411
0aba65da
UH
412 if (ols_configure_probes(sdi) != SR_OK) {
413 sr_err("Failed to configure probes.");
414 return SR_ERR;
415 }
416
417 /*
418 * Enable/disable channel groups in the flag register according to the
419 * probe mask. Calculate this here, because num_channels is needed
420 * to limit readcount.
421 */
422 changrp_mask = 0;
423 num_channels = 0;
424 for (i = 0; i < 4; i++) {
425 if (devc->probe_mask & (0xff << (i * 8))) {
426 changrp_mask |= (1 << i);
427 num_channels++;
428 }
429 }
430
431 /*
432 * Limit readcount to prevent reading past the end of the hardware
433 * buffer.
434 */
435 readcount = MIN(devc->max_samples / num_channels, devc->limit_samples) / 4;
436
437 memset(trigger_config, 0, 16);
2e5b73c0 438 trigger_config[devc->num_stages] |= 0x08;
0aba65da
UH
439 if (devc->trigger_mask[0]) {
440 delaycount = readcount * (1 - devc->capture_ratio / 100.0);
441 devc->trigger_at = (readcount - delaycount) * 4 - devc->num_stages;
442
459a0f26 443 if (send_longcommand(serial, CMD_SET_TRIGGER_MASK_0,
0aba65da
UH
444 reverse32(devc->trigger_mask[0])) != SR_OK)
445 return SR_ERR;
459a0f26 446 if (send_longcommand(serial, CMD_SET_TRIGGER_VALUE_0,
0aba65da
UH
447 reverse32(devc->trigger_value[0])) != SR_OK)
448 return SR_ERR;
459a0f26 449 if (send_longcommand(serial, CMD_SET_TRIGGER_CONFIG_0,
0aba65da
UH
450 trigger_config[0]) != SR_OK)
451 return SR_ERR;
452
459a0f26 453 if (send_longcommand(serial, CMD_SET_TRIGGER_MASK_1,
0aba65da
UH
454 reverse32(devc->trigger_mask[1])) != SR_OK)
455 return SR_ERR;
459a0f26 456 if (send_longcommand(serial, CMD_SET_TRIGGER_VALUE_1,
0aba65da
UH
457 reverse32(devc->trigger_value[1])) != SR_OK)
458 return SR_ERR;
459a0f26 459 if (send_longcommand(serial, CMD_SET_TRIGGER_CONFIG_1,
0aba65da
UH
460 trigger_config[1]) != SR_OK)
461 return SR_ERR;
462
459a0f26 463 if (send_longcommand(serial, CMD_SET_TRIGGER_MASK_2,
0aba65da
UH
464 reverse32(devc->trigger_mask[2])) != SR_OK)
465 return SR_ERR;
459a0f26 466 if (send_longcommand(serial, CMD_SET_TRIGGER_VALUE_2,
0aba65da
UH
467 reverse32(devc->trigger_value[2])) != SR_OK)
468 return SR_ERR;
459a0f26 469 if (send_longcommand(serial, CMD_SET_TRIGGER_CONFIG_2,
0aba65da
UH
470 trigger_config[2]) != SR_OK)
471 return SR_ERR;
472
459a0f26 473 if (send_longcommand(serial, CMD_SET_TRIGGER_MASK_3,
0aba65da
UH
474 reverse32(devc->trigger_mask[3])) != SR_OK)
475 return SR_ERR;
459a0f26 476 if (send_longcommand(serial, CMD_SET_TRIGGER_VALUE_3,
0aba65da
UH
477 reverse32(devc->trigger_value[3])) != SR_OK)
478 return SR_ERR;
459a0f26 479 if (send_longcommand(serial, CMD_SET_TRIGGER_CONFIG_3,
0aba65da
UH
480 trigger_config[3]) != SR_OK)
481 return SR_ERR;
482 } else {
459a0f26 483 if (send_longcommand(serial, CMD_SET_TRIGGER_MASK_0,
0aba65da
UH
484 devc->trigger_mask[0]) != SR_OK)
485 return SR_ERR;
459a0f26 486 if (send_longcommand(serial, CMD_SET_TRIGGER_VALUE_0,
0aba65da
UH
487 devc->trigger_value[0]) != SR_OK)
488 return SR_ERR;
459a0f26 489 if (send_longcommand(serial, CMD_SET_TRIGGER_CONFIG_0,
0aba65da
UH
490 0x00000008) != SR_OK)
491 return SR_ERR;
492 delaycount = readcount;
493 }
494
495 sr_info("Setting samplerate to %" PRIu64 "Hz (divider %u, "
de524099
MR
496 "demux %s, noise_filter %s)", devc->cur_samplerate,
497 devc->cur_samplerate_divider,
498 devc->flag_reg & FLAG_DEMUX ? "on" : "off",
499 devc->flag_reg & FLAG_FILTER ? "on": "off");
459a0f26 500 if (send_longcommand(serial, CMD_SET_DIVIDER,
0aba65da
UH
501 reverse32(devc->cur_samplerate_divider)) != SR_OK)
502 return SR_ERR;
503
504 /* Send sample limit and pre/post-trigger capture ratio. */
505 data = ((readcount - 1) & 0xffff) << 16;
506 data |= (delaycount - 1) & 0xffff;
459a0f26 507 if (send_longcommand(serial, CMD_CAPTURE_SIZE, reverse16(data)) != SR_OK)
0aba65da
UH
508 return SR_ERR;
509
510 /* The flag register wants them here, and 1 means "disable channel". */
511 devc->flag_reg |= ~(changrp_mask << 2) & 0x3c;
0aba65da
UH
512 devc->rle_count = 0;
513 data = (devc->flag_reg << 24) | ((devc->flag_reg << 8) & 0xff0000);
459a0f26 514 if (send_longcommand(serial, CMD_SET_FLAGS, data) != SR_OK)
0aba65da
UH
515 return SR_ERR;
516
517 /* Start acquisition on the device. */
459a0f26 518 if (send_shortcommand(serial, CMD_RUN) != SR_OK)
0aba65da
UH
519 return SR_ERR;
520
bf256783
BV
521 /* Reset all operational states. */
522 devc->num_transfers = devc->num_samples = devc->num_bytes = 0;
abb39e6b 523 memset(devc->sample, 0, 4);
bf256783 524
4afdfd46 525 /* Send header packet to the session bus. */
29a27196 526 std_session_send_df_header(cb_data, LOG_PREFIX);
4afdfd46 527
abc4b335 528 serial_source_add(serial, G_IO_IN, -1, ols_receive_data, cb_data);
0aba65da 529
0aba65da
UH
530 return SR_OK;
531}
532
03f4de8c 533static int dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data)
0aba65da 534{
0aba65da
UH
535 (void)cb_data;
536
537 abort_acquisition(sdi);
538
539 return SR_OK;
540}
541
542SR_PRIV struct sr_dev_driver ols_driver_info = {
543 .name = "ols",
544 .longname = "Openbench Logic Sniffer",
545 .api_version = 1,
03f4de8c 546 .init = init,
eea49cf1 547 .cleanup = cleanup,
03f4de8c
BV
548 .scan = scan,
549 .dev_list = dev_list,
550 .dev_clear = dev_clear,
035a1078
BV
551 .config_get = config_get,
552 .config_set = config_set,
a1c743fc 553 .config_list = config_list,
03f4de8c 554 .dev_open = dev_open,
bf2c987f 555 .dev_close = std_serial_dev_close,
03f4de8c
BV
556 .dev_acquisition_start = dev_acquisition_start,
557 .dev_acquisition_stop = dev_acquisition_stop,
0aba65da
UH
558 .priv = NULL,
559};