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