Uwe Hermann | 1483577 | 2011-01-15 15:06:58 +0100 | [diff] [blame] | 1 | /* |
Uwe Hermann | 50985c2 | 2013-04-23 22:24:30 +0200 | [diff] [blame] | 2 | * This file is part of the libsigrok project. |
Uwe Hermann | 1483577 | 2011-01-15 15:06:58 +0100 | [diff] [blame] | 3 | * |
Bert Vermeulen | 13d8e03 | 2013-03-24 11:21:00 +0100 | [diff] [blame] | 4 | * Copyright (C) 2013 Bert Vermeulen <bert@biot.com> |
Uwe Hermann | 1483577 | 2011-01-15 15:06:58 +0100 | [diff] [blame] | 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 | |
Matthias Heidbrink | 04cb915 | 2013-11-22 20:40:52 +0100 | [diff] [blame] | 20 | /** @file |
| 21 | * @internal |
| 22 | */ |
| 23 | |
Uwe Hermann | a582788 | 2013-12-10 17:39:31 +0100 | [diff] [blame] | 24 | #ifndef LIBSIGROK_LIBSIGROK_INTERNAL_H |
| 25 | #define LIBSIGROK_LIBSIGROK_INTERNAL_H |
Uwe Hermann | 1483577 | 2011-01-15 15:06:58 +0100 | [diff] [blame] | 26 | |
Uwe Hermann | b08024a | 2011-04-14 09:46:53 +0200 | [diff] [blame] | 27 | #include <stdarg.h> |
Uwe Hermann | cc8a7d2 | 2011-11-24 22:42:02 +0100 | [diff] [blame] | 28 | #include <glib.h> |
Uwe Hermann | 1a081ca | 2012-02-01 23:40:35 +0100 | [diff] [blame] | 29 | #include "config.h" /* Needed for HAVE_LIBUSB_1_0 and others. */ |
Uwe Hermann | 69890f7 | 2012-01-29 23:06:10 +0100 | [diff] [blame] | 30 | #ifdef HAVE_LIBUSB_1_0 |
| 31 | #include <libusb.h> |
| 32 | #endif |
Uwe Hermann | c4f2dfd | 2013-11-13 19:56:13 +0100 | [diff] [blame] | 33 | #ifdef HAVE_LIBSERIALPORT |
Uwe Hermann | dc99135 | 2013-11-15 09:48:34 +0100 | [diff] [blame] | 34 | #include <libserialport.h> |
Uwe Hermann | c4f2dfd | 2013-11-13 19:56:13 +0100 | [diff] [blame] | 35 | #endif |
Uwe Hermann | b08024a | 2011-04-14 09:46:53 +0200 | [diff] [blame] | 36 | |
Uwe Hermann | 393fb9c | 2012-10-22 00:30:12 +0200 | [diff] [blame] | 37 | /** |
| 38 | * @file |
| 39 | * |
| 40 | * libsigrok private header file, only to be used internally. |
| 41 | */ |
| 42 | |
Uwe Hermann | 4cea9eb | 2011-02-20 18:29:05 +0100 | [diff] [blame] | 43 | /*--- Macros ----------------------------------------------------------------*/ |
| 44 | |
| 45 | #ifndef ARRAY_SIZE |
| 46 | #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) |
| 47 | #endif |
| 48 | |
| 49 | #ifndef ARRAY_AND_SIZE |
| 50 | #define ARRAY_AND_SIZE(a) (a), ARRAY_SIZE(a) |
| 51 | #endif |
| 52 | |
Aurelien Jacobs | e28ef28 | 2013-12-12 00:20:47 +0100 | [diff] [blame] | 53 | /** |
Bert Vermeulen | 5bf0dd6 | 2014-08-26 22:45:38 +0200 | [diff] [blame] | 54 | * Read a 8 bits unsigned integer out of memory. |
Aurelien Jacobs | a4f9c35 | 2014-02-02 21:29:34 +0100 | [diff] [blame] | 55 | * @param x a pointer to the input memory |
Bert Vermeulen | 5bf0dd6 | 2014-08-26 22:45:38 +0200 | [diff] [blame] | 56 | * @return the corresponding unsigned integer |
Aurelien Jacobs | a4f9c35 | 2014-02-02 21:29:34 +0100 | [diff] [blame] | 57 | */ |
| 58 | #define R8(x) ((unsigned)((const uint8_t*)(x))[0]) |
| 59 | |
| 60 | /** |
Bert Vermeulen | 5bf0dd6 | 2014-08-26 22:45:38 +0200 | [diff] [blame] | 61 | * Read a 16 bits big endian unsigned integer out of memory. |
Aurelien Jacobs | e28ef28 | 2013-12-12 00:20:47 +0100 | [diff] [blame] | 62 | * @param x a pointer to the input memory |
Bert Vermeulen | 5bf0dd6 | 2014-08-26 22:45:38 +0200 | [diff] [blame] | 63 | * @return the corresponding unsigned integer |
Aurelien Jacobs | e28ef28 | 2013-12-12 00:20:47 +0100 | [diff] [blame] | 64 | */ |
Aurelien Jacobs | 79a1176 | 2013-12-30 19:23:54 +0100 | [diff] [blame] | 65 | #define RB16(x) (((unsigned)((const uint8_t*)(x))[0] << 8) | \ |
| 66 | (unsigned)((const uint8_t*)(x))[1]) |
Aurelien Jacobs | e28ef28 | 2013-12-12 00:20:47 +0100 | [diff] [blame] | 67 | |
| 68 | /** |
Bert Vermeulen | 5bf0dd6 | 2014-08-26 22:45:38 +0200 | [diff] [blame] | 69 | * Read a 16 bits little endian unsigned integer out of memory. |
Aurelien Jacobs | e28ef28 | 2013-12-12 00:20:47 +0100 | [diff] [blame] | 70 | * @param x a pointer to the input memory |
Bert Vermeulen | 5bf0dd6 | 2014-08-26 22:45:38 +0200 | [diff] [blame] | 71 | * @return the corresponding unsigned integer |
Aurelien Jacobs | e28ef28 | 2013-12-12 00:20:47 +0100 | [diff] [blame] | 72 | */ |
Aurelien Jacobs | 79a1176 | 2013-12-30 19:23:54 +0100 | [diff] [blame] | 73 | #define RL16(x) (((unsigned)((const uint8_t*)(x))[1] << 8) | \ |
| 74 | (unsigned)((const uint8_t*)(x))[0]) |
Aurelien Jacobs | e28ef28 | 2013-12-12 00:20:47 +0100 | [diff] [blame] | 75 | |
| 76 | /** |
Bert Vermeulen | 5bf0dd6 | 2014-08-26 22:45:38 +0200 | [diff] [blame] | 77 | * Read a 16 bits little endian signed integer out of memory. |
Aurelien Jacobs | e28ef28 | 2013-12-12 00:20:47 +0100 | [diff] [blame] | 78 | * @param x a pointer to the input memory |
Bert Vermeulen | 5bf0dd6 | 2014-08-26 22:45:38 +0200 | [diff] [blame] | 79 | * @return the corresponding signed integer |
| 80 | */ |
| 81 | #define RL16S(x) ((int16_t) \ |
Uwe Hermann | af945a6 | 2014-09-19 01:03:32 +0200 | [diff] [blame] | 82 | (((unsigned)((const uint8_t*)(x))[1] << 8) | \ |
Bert Vermeulen | 5bf0dd6 | 2014-08-26 22:45:38 +0200 | [diff] [blame] | 83 | (unsigned)((const uint8_t*)(x))[0])) |
| 84 | |
| 85 | /** |
| 86 | * Read a 32 bits big endian unsigned integer out of memory. |
| 87 | * @param x a pointer to the input memory |
| 88 | * @return the corresponding unsigned integer |
Aurelien Jacobs | e28ef28 | 2013-12-12 00:20:47 +0100 | [diff] [blame] | 89 | */ |
Aurelien Jacobs | 79a1176 | 2013-12-30 19:23:54 +0100 | [diff] [blame] | 90 | #define RB32(x) (((unsigned)((const uint8_t*)(x))[0] << 24) | \ |
| 91 | ((unsigned)((const uint8_t*)(x))[1] << 16) | \ |
| 92 | ((unsigned)((const uint8_t*)(x))[2] << 8) | \ |
| 93 | (unsigned)((const uint8_t*)(x))[3]) |
Aurelien Jacobs | e28ef28 | 2013-12-12 00:20:47 +0100 | [diff] [blame] | 94 | |
| 95 | /** |
Bert Vermeulen | 5bf0dd6 | 2014-08-26 22:45:38 +0200 | [diff] [blame] | 96 | * Read a 32 bits little endian unsigned integer out of memory. |
Aurelien Jacobs | e28ef28 | 2013-12-12 00:20:47 +0100 | [diff] [blame] | 97 | * @param x a pointer to the input memory |
Bert Vermeulen | 5bf0dd6 | 2014-08-26 22:45:38 +0200 | [diff] [blame] | 98 | * @return the corresponding unsigned integer |
Aurelien Jacobs | e28ef28 | 2013-12-12 00:20:47 +0100 | [diff] [blame] | 99 | */ |
Aurelien Jacobs | 79a1176 | 2013-12-30 19:23:54 +0100 | [diff] [blame] | 100 | #define RL32(x) (((unsigned)((const uint8_t*)(x))[3] << 24) | \ |
| 101 | ((unsigned)((const uint8_t*)(x))[2] << 16) | \ |
| 102 | ((unsigned)((const uint8_t*)(x))[1] << 8) | \ |
| 103 | (unsigned)((const uint8_t*)(x))[0]) |
Aurelien Jacobs | e28ef28 | 2013-12-12 00:20:47 +0100 | [diff] [blame] | 104 | |
Aurelien Jacobs | ea2d6d9 | 2014-02-02 21:33:09 +0100 | [diff] [blame] | 105 | /** |
Bert Vermeulen | 5bf0dd6 | 2014-08-26 22:45:38 +0200 | [diff] [blame] | 106 | * Read a 32 bits little endian signed integer out of memory. |
| 107 | * @param x a pointer to the input memory |
| 108 | * @return the corresponding signed integer |
| 109 | */ |
| 110 | #define RL32S(x) ((int32_t) \ |
| 111 | (((unsigned)((const uint8_t*)(x))[3] << 24) | \ |
| 112 | ((unsigned)((const uint8_t*)(x))[2] << 16) | \ |
| 113 | ((unsigned)((const uint8_t*)(x))[1] << 8) | \ |
| 114 | (unsigned)((const uint8_t*)(x))[0])) |
| 115 | |
| 116 | /** |
| 117 | * Write a 8 bits unsigned integer to memory. |
Aurelien Jacobs | ea2d6d9 | 2014-02-02 21:33:09 +0100 | [diff] [blame] | 118 | * @param p a pointer to the output memory |
Bert Vermeulen | 5bf0dd6 | 2014-08-26 22:45:38 +0200 | [diff] [blame] | 119 | * @param x the input unsigned integer |
Aurelien Jacobs | ea2d6d9 | 2014-02-02 21:33:09 +0100 | [diff] [blame] | 120 | */ |
| 121 | #define W8(p, x) do { ((uint8_t*)(p))[0] = (uint8_t) (x); } while(0) |
| 122 | |
| 123 | /** |
Bert Vermeulen | 5bf0dd6 | 2014-08-26 22:45:38 +0200 | [diff] [blame] | 124 | * Write a 16 bits unsigned integer to memory stored as big endian. |
Aurelien Jacobs | ea2d6d9 | 2014-02-02 21:33:09 +0100 | [diff] [blame] | 125 | * @param p a pointer to the output memory |
Bert Vermeulen | 5bf0dd6 | 2014-08-26 22:45:38 +0200 | [diff] [blame] | 126 | * @param x the input unsigned integer |
Aurelien Jacobs | ea2d6d9 | 2014-02-02 21:33:09 +0100 | [diff] [blame] | 127 | */ |
| 128 | #define WB16(p, x) do { ((uint8_t*)(p))[1] = (uint8_t) (x); \ |
| 129 | ((uint8_t*)(p))[0] = (uint8_t)((x)>>8); } while(0) |
| 130 | |
| 131 | /** |
Bert Vermeulen | 5bf0dd6 | 2014-08-26 22:45:38 +0200 | [diff] [blame] | 132 | * Write a 16 bits unsigned integer to memory stored as little endian. |
Aurelien Jacobs | ea2d6d9 | 2014-02-02 21:33:09 +0100 | [diff] [blame] | 133 | * @param p a pointer to the output memory |
Bert Vermeulen | 5bf0dd6 | 2014-08-26 22:45:38 +0200 | [diff] [blame] | 134 | * @param x the input unsigned integer |
Aurelien Jacobs | ea2d6d9 | 2014-02-02 21:33:09 +0100 | [diff] [blame] | 135 | */ |
| 136 | #define WL16(p, x) do { ((uint8_t*)(p))[0] = (uint8_t) (x); \ |
| 137 | ((uint8_t*)(p))[1] = (uint8_t)((x)>>8); } while(0) |
| 138 | |
| 139 | /** |
Bert Vermeulen | 5bf0dd6 | 2014-08-26 22:45:38 +0200 | [diff] [blame] | 140 | * Write a 32 bits unsigned integer to memory stored as big endian. |
Aurelien Jacobs | ea2d6d9 | 2014-02-02 21:33:09 +0100 | [diff] [blame] | 141 | * @param p a pointer to the output memory |
Bert Vermeulen | 5bf0dd6 | 2014-08-26 22:45:38 +0200 | [diff] [blame] | 142 | * @param x the input unsigned integer |
Aurelien Jacobs | ea2d6d9 | 2014-02-02 21:33:09 +0100 | [diff] [blame] | 143 | */ |
| 144 | #define WB32(p, x) do { ((uint8_t*)(p))[3] = (uint8_t) (x); \ |
| 145 | ((uint8_t*)(p))[2] = (uint8_t)((x)>>8); \ |
| 146 | ((uint8_t*)(p))[1] = (uint8_t)((x)>>16); \ |
| 147 | ((uint8_t*)(p))[0] = (uint8_t)((x)>>24); } while(0) |
| 148 | |
| 149 | /** |
Bert Vermeulen | 5bf0dd6 | 2014-08-26 22:45:38 +0200 | [diff] [blame] | 150 | * Write a 32 bits unsigned integer to memory stored as little endian. |
Aurelien Jacobs | ea2d6d9 | 2014-02-02 21:33:09 +0100 | [diff] [blame] | 151 | * @param p a pointer to the output memory |
Bert Vermeulen | 5bf0dd6 | 2014-08-26 22:45:38 +0200 | [diff] [blame] | 152 | * @param x the input unsigned integer |
Aurelien Jacobs | ea2d6d9 | 2014-02-02 21:33:09 +0100 | [diff] [blame] | 153 | */ |
| 154 | #define WL32(p, x) do { ((uint8_t*)(p))[0] = (uint8_t) (x); \ |
| 155 | ((uint8_t*)(p))[1] = (uint8_t)((x)>>8); \ |
| 156 | ((uint8_t*)(p))[2] = (uint8_t)((x)>>16); \ |
| 157 | ((uint8_t*)(p))[3] = (uint8_t)((x)>>24); } while(0) |
| 158 | |
Uwe Hermann | 6bf4273 | 2013-10-28 22:59:32 +0100 | [diff] [blame] | 159 | /* Portability fixes for FreeBSD. */ |
| 160 | #ifdef __FreeBSD__ |
| 161 | #define LIBUSB_CLASS_APPLICATION 0xfe |
| 162 | #define libusb_handle_events_timeout_completed(ctx, tv, c) \ |
| 163 | libusb_handle_events_timeout(ctx, tv) |
| 164 | #endif |
| 165 | |
Bert Vermeulen | 1685c27 | 2014-08-26 01:48:27 +0200 | [diff] [blame] | 166 | /* Static definitions of structs ending with an all-zero entry are a |
| 167 | * problem when compiling with -Wmissing-field-initializers: GCC |
| 168 | * suppresses the warning only with { 0 }, clang wants { } */ |
| 169 | #ifdef __clang__ |
| 170 | #define ALL_ZERO { } |
| 171 | #else |
| 172 | #define ALL_ZERO { 0 } |
| 173 | #endif |
| 174 | |
Peter Stuge | b807270 | 2012-10-21 20:23:14 +0200 | [diff] [blame] | 175 | struct sr_context { |
Peter Stuge | 785b9ff | 2012-10-21 20:23:36 +0200 | [diff] [blame] | 176 | #ifdef HAVE_LIBUSB_1_0 |
| 177 | libusb_context *libusb_ctx; |
Martin Ling | 6640324 | 2013-12-22 17:27:13 +0000 | [diff] [blame] | 178 | gboolean usb_source_present; |
Martin Ling | 5321ac6 | 2013-12-22 07:16:56 +0000 | [diff] [blame] | 179 | #ifdef _WIN32 |
| 180 | GThread *usb_thread; |
| 181 | gboolean usb_thread_running; |
| 182 | GMutex usb_mutex; |
| 183 | HANDLE usb_event; |
| 184 | GPollFD usb_pollfd; |
Uwe Hermann | 144f666 | 2014-05-03 22:14:01 +0200 | [diff] [blame] | 185 | sr_receive_data_callback usb_cb; |
Martin Ling | 5321ac6 | 2013-12-22 07:16:56 +0000 | [diff] [blame] | 186 | void *usb_cb_data; |
| 187 | #endif |
Peter Stuge | 785b9ff | 2012-10-21 20:23:36 +0200 | [diff] [blame] | 188 | #endif |
Peter Stuge | b807270 | 2012-10-21 20:23:14 +0200 | [diff] [blame] | 189 | }; |
| 190 | |
Bert Vermeulen | 20e8882 | 2014-08-15 19:59:38 +0200 | [diff] [blame] | 191 | /** Input module metadata keys. */ |
| 192 | enum sr_input_meta_keys { |
| 193 | /** The input filename, if there is one. */ |
| 194 | SR_INPUT_META_FILENAME = 0x01, |
| 195 | /** The input file's size in bytes. */ |
| 196 | SR_INPUT_META_FILESIZE = 0x02, |
| 197 | /** The first 128 bytes of the file, provided as a GString. */ |
| 198 | SR_INPUT_META_HEADER = 0x04, |
| 199 | /** The file's MIME type. */ |
| 200 | SR_INPUT_META_MIMETYPE = 0x08, |
| 201 | |
| 202 | /** The module cannot identify a file without this metadata. */ |
| 203 | SR_INPUT_META_REQUIRED = 0x80, |
| 204 | }; |
| 205 | |
Bert Vermeulen | d514d35 | 2014-08-03 15:12:49 +0200 | [diff] [blame] | 206 | /** Input (file) module struct. */ |
| 207 | struct sr_input { |
| 208 | /** |
| 209 | * A pointer to this input module's 'struct sr_input_module'. |
Bert Vermeulen | d514d35 | 2014-08-03 15:12:49 +0200 | [diff] [blame] | 210 | */ |
Bert Vermeulen | 17bfaca | 2014-08-10 16:57:04 +0200 | [diff] [blame] | 211 | const struct sr_input_module *module; |
| 212 | GString *buf; |
Bert Vermeulen | d514d35 | 2014-08-03 15:12:49 +0200 | [diff] [blame] | 213 | struct sr_dev_inst *sdi; |
Bert Vermeulen | d018181 | 2014-09-22 15:22:41 +0200 | [diff] [blame] | 214 | gboolean sdi_ready; |
Bert Vermeulen | 17bfaca | 2014-08-10 16:57:04 +0200 | [diff] [blame] | 215 | void *priv; |
Bert Vermeulen | d514d35 | 2014-08-03 15:12:49 +0200 | [diff] [blame] | 216 | }; |
| 217 | |
| 218 | /** Input (file) module driver. */ |
| 219 | struct sr_input_module { |
Bert Vermeulen | d514d35 | 2014-08-03 15:12:49 +0200 | [diff] [blame] | 220 | /** |
Bert Vermeulen | d65fcbc | 2014-08-15 23:31:39 +0200 | [diff] [blame] | 221 | * A unique ID for this input module, suitable for use in command-line |
Bert Vermeulen | 17bfaca | 2014-08-10 16:57:04 +0200 | [diff] [blame] | 222 | * clients, [a-z0-9-]. Must not be NULL. |
Bert Vermeulen | d514d35 | 2014-08-03 15:12:49 +0200 | [diff] [blame] | 223 | */ |
Bert Vermeulen | 17bfaca | 2014-08-10 16:57:04 +0200 | [diff] [blame] | 224 | const char *id; |
Bert Vermeulen | d514d35 | 2014-08-03 15:12:49 +0200 | [diff] [blame] | 225 | |
| 226 | /** |
Bert Vermeulen | d65fcbc | 2014-08-15 23:31:39 +0200 | [diff] [blame] | 227 | * A unique name for this input module, suitable for use in GUI |
Bert Vermeulen | 17bfaca | 2014-08-10 16:57:04 +0200 | [diff] [blame] | 228 | * clients, can contain UTF-8. Must not be NULL. |
| 229 | */ |
| 230 | const char *name; |
| 231 | |
| 232 | /** |
Bert Vermeulen | d65fcbc | 2014-08-15 23:31:39 +0200 | [diff] [blame] | 233 | * A short description of the input module. Must not be NULL. |
Bert Vermeulen | d514d35 | 2014-08-03 15:12:49 +0200 | [diff] [blame] | 234 | * |
Bert Vermeulen | d65fcbc | 2014-08-15 23:31:39 +0200 | [diff] [blame] | 235 | * This can be displayed by frontends, e.g. when selecting the input |
Bert Vermeulen | 17bfaca | 2014-08-10 16:57:04 +0200 | [diff] [blame] | 236 | * module for saving a file. |
| 237 | */ |
| 238 | const char *desc; |
| 239 | |
| 240 | /** |
| 241 | * Zero-terminated list of metadata items the module needs to be able |
| 242 | * to identify an input stream. Can be all-zero, if the module cannot |
| 243 | * identify streams at all, i.e. has to be forced into use. |
| 244 | * |
| 245 | * Each item is one of: |
| 246 | * SR_INPUT_META_FILENAME |
| 247 | * SR_INPUT_META_FILESIZE |
| 248 | * SR_INPUT_META_HEADER |
| 249 | * SR_INPUT_META_MIMETYPE |
| 250 | * |
| 251 | * If the high bit (SR_INPUT META_REQUIRED) is set, the module cannot |
| 252 | * identify a stream without the given metadata. |
| 253 | */ |
| 254 | const uint8_t metadata[8]; |
| 255 | |
| 256 | /** |
| 257 | * Returns a NULL-terminated list of options this module can take. |
| 258 | * Can be NULL, if the module has no options. |
| 259 | */ |
| 260 | struct sr_option *(*options) (void); |
| 261 | |
| 262 | /** |
| 263 | * Check if this input module can load and parse the specified stream. |
| 264 | * |
| 265 | * @param[in] metadata Metadata the module can use to identify the stream. |
Bert Vermeulen | d514d35 | 2014-08-03 15:12:49 +0200 | [diff] [blame] | 266 | * |
Bert Vermeulen | 4f97911 | 2014-08-28 00:22:13 +0200 | [diff] [blame] | 267 | * @retval SR_OK This module knows the format. |
Bert Vermeulen | 753793e | 2014-09-23 12:05:31 +0200 | [diff] [blame] | 268 | * @retval SR_ERR_NA There wasn't enough data for this module to |
Bert Vermeulen | 4f97911 | 2014-08-28 00:22:13 +0200 | [diff] [blame] | 269 | * positively identify the format. |
| 270 | * @retval SR_ERR_DATA This module knows the format, but cannot handle it. |
| 271 | * This means the stream is either corrupt, or indicates a feature |
| 272 | * that the module does not support. |
| 273 | * @retval SR_ERR This module does not know the format. |
Bert Vermeulen | d514d35 | 2014-08-03 15:12:49 +0200 | [diff] [blame] | 274 | */ |
Bert Vermeulen | 17bfaca | 2014-08-10 16:57:04 +0200 | [diff] [blame] | 275 | int (*format_match) (GHashTable *metadata); |
Bert Vermeulen | d514d35 | 2014-08-03 15:12:49 +0200 | [diff] [blame] | 276 | |
| 277 | /** |
| 278 | * Initialize the input module. |
| 279 | * |
Bert Vermeulen | d514d35 | 2014-08-03 15:12:49 +0200 | [diff] [blame] | 280 | * @retval SR_OK Success |
| 281 | * @retval other Negative error code. |
| 282 | */ |
Bert Vermeulen | 17bfaca | 2014-08-10 16:57:04 +0200 | [diff] [blame] | 283 | int (*init) (struct sr_input *in, GHashTable *options); |
Bert Vermeulen | d514d35 | 2014-08-03 15:12:49 +0200 | [diff] [blame] | 284 | |
| 285 | /** |
Bert Vermeulen | 753793e | 2014-09-23 12:05:31 +0200 | [diff] [blame] | 286 | * Send data to the specified input instance. |
Bert Vermeulen | d514d35 | 2014-08-03 15:12:49 +0200 | [diff] [blame] | 287 | * |
Bert Vermeulen | 753793e | 2014-09-23 12:05:31 +0200 | [diff] [blame] | 288 | * When an input module instance is created with sr_input_new(), this |
| 289 | * function is used to feed data to the instance. |
Bert Vermeulen | d514d35 | 2014-08-03 15:12:49 +0200 | [diff] [blame] | 290 | * |
Bert Vermeulen | 753793e | 2014-09-23 12:05:31 +0200 | [diff] [blame] | 291 | * As enough data gets fed into this function to completely populate |
| 292 | * the device instance associated with this input instance, this is |
| 293 | * guaranteed to return the moment it's ready. This gives the caller |
| 294 | * the chance to examine the device instance, attach session callbacks |
| 295 | * and so on. |
Bert Vermeulen | d514d35 | 2014-08-03 15:12:49 +0200 | [diff] [blame] | 296 | * |
| 297 | * @retval SR_OK Success |
| 298 | * @retval other Negative error code. |
| 299 | */ |
Bert Vermeulen | d018181 | 2014-09-22 15:22:41 +0200 | [diff] [blame] | 300 | int (*receive) (struct sr_input *in, GString *buf); |
Bert Vermeulen | 17bfaca | 2014-08-10 16:57:04 +0200 | [diff] [blame] | 301 | |
Bert Vermeulen | 753793e | 2014-09-23 12:05:31 +0200 | [diff] [blame] | 302 | /** |
| 303 | * Signal the input module no more data will come. |
| 304 | * |
| 305 | * This will cause the module to process any data it may have buffered. |
| 306 | * The SR_DF_END packet will also typically be sent at this time. |
| 307 | */ |
Bert Vermeulen | 7066fd4 | 2014-09-23 11:12:33 +0200 | [diff] [blame] | 308 | int (*end) (struct sr_input *in); |
| 309 | |
Bert Vermeulen | 17bfaca | 2014-08-10 16:57:04 +0200 | [diff] [blame] | 310 | /** |
| 311 | * This function is called after the caller is finished using |
| 312 | * the input module, and can be used to free any internal |
| 313 | * resources the module may keep. |
| 314 | * |
Bert Vermeulen | 753793e | 2014-09-23 12:05:31 +0200 | [diff] [blame] | 315 | * This function is optional. |
| 316 | * |
Bert Vermeulen | 17bfaca | 2014-08-10 16:57:04 +0200 | [diff] [blame] | 317 | * @retval SR_OK Success |
| 318 | * @retval other Negative error code. |
| 319 | */ |
Bert Vermeulen | d5cc282 | 2014-09-23 11:27:50 +0200 | [diff] [blame] | 320 | void (*cleanup) (struct sr_input *in); |
Bert Vermeulen | d514d35 | 2014-08-03 15:12:49 +0200 | [diff] [blame] | 321 | }; |
| 322 | |
Bert Vermeulen | a755b0e | 2014-07-25 05:56:52 +0200 | [diff] [blame] | 323 | /** Output module instance. */ |
| 324 | struct sr_output { |
| 325 | /** A pointer to this output's module. */ |
| 326 | const struct sr_output_module *module; |
| 327 | |
| 328 | /** |
| 329 | * The device for which this output module is creating output. This |
| 330 | * can be used by the module to find out channel names and numbers. |
| 331 | */ |
| 332 | const struct sr_dev_inst *sdi; |
| 333 | |
| 334 | /** |
| 335 | * A generic pointer which can be used by the module to keep internal |
| 336 | * state between calls into its callback functions. |
| 337 | * |
| 338 | * For example, the module might store a pointer to a chunk of output |
| 339 | * there, and only flush it when it reaches a certain size. |
| 340 | */ |
Bert Vermeulen | d686c5e | 2014-07-28 15:56:17 +0200 | [diff] [blame] | 341 | void *priv; |
Bert Vermeulen | a755b0e | 2014-07-25 05:56:52 +0200 | [diff] [blame] | 342 | }; |
| 343 | |
| 344 | /** Output module driver. */ |
| 345 | struct sr_output_module { |
| 346 | /** |
| 347 | * A unique ID for this output module, suitable for use in command-line |
| 348 | * clients, [a-z0-9-]. Must not be NULL. |
| 349 | */ |
| 350 | char *id; |
| 351 | |
| 352 | /** |
| 353 | * A unique name for this output module, suitable for use in GUI |
| 354 | * clients, can contain UTF-8. Must not be NULL. |
| 355 | */ |
| 356 | const char *name; |
| 357 | |
| 358 | /** |
| 359 | * A short description of the output module. Must not be NULL. |
| 360 | * |
| 361 | * This can be displayed by frontends, e.g. when selecting the output |
| 362 | * module for saving a file. |
| 363 | */ |
| 364 | char *desc; |
| 365 | |
| 366 | /** |
| 367 | * Returns a NULL-terminated list of options this module can take. |
| 368 | * Can be NULL, if the module has no options. |
Bert Vermeulen | a755b0e | 2014-07-25 05:56:52 +0200 | [diff] [blame] | 369 | */ |
Bert Vermeulen | af7d656 | 2014-08-15 20:21:50 +0200 | [diff] [blame] | 370 | const struct sr_option *(*options) (void); |
Bert Vermeulen | a755b0e | 2014-07-25 05:56:52 +0200 | [diff] [blame] | 371 | |
| 372 | /** |
| 373 | * This function is called once, at the beginning of an output stream. |
| 374 | * |
| 375 | * The device struct will be available in the output struct passed in, |
| 376 | * as well as the param field -- which may be NULL or an empty string, |
| 377 | * if no parameter was passed. |
| 378 | * |
| 379 | * The module can use this to initialize itself, create a struct for |
| 380 | * keeping state and storing it in the <code>internal</code> field. |
| 381 | * |
| 382 | * @param o Pointer to the respective 'struct sr_output'. |
| 383 | * |
| 384 | * @retval SR_OK Success |
| 385 | * @retval other Negative error code. |
| 386 | */ |
| 387 | int (*init) (struct sr_output *o, GHashTable *options); |
| 388 | |
| 389 | /** |
| 390 | * This function is passed a copy of every packed in the data feed. |
| 391 | * Any output generated by the output module in response to the |
| 392 | * packet should be returned in a newly allocated GString |
| 393 | * <code>out</code>, which will be freed by the caller. |
| 394 | * |
| 395 | * Packets not of interest to the output module can just be ignored, |
| 396 | * and the <code>out</code> parameter set to NULL. |
| 397 | * |
| 398 | * @param o Pointer to the respective 'struct sr_output'. |
| 399 | * @param sdi The device instance that generated the packet. |
| 400 | * @param packet The complete packet. |
| 401 | * @param out A pointer where a GString * should be stored if |
| 402 | * the module generates output, or NULL if not. |
| 403 | * |
| 404 | * @retval SR_OK Success |
| 405 | * @retval other Negative error code. |
| 406 | */ |
| 407 | int (*receive) (const struct sr_output *o, |
| 408 | const struct sr_datafeed_packet *packet, GString **out); |
| 409 | |
| 410 | /** |
| 411 | * This function is called after the caller is finished using |
| 412 | * the output module, and can be used to free any internal |
| 413 | * resources the module may keep. |
| 414 | * |
| 415 | * @retval SR_OK Success |
| 416 | * @retval other Negative error code. |
| 417 | */ |
| 418 | int (*cleanup) (struct sr_output *o); |
| 419 | }; |
| 420 | |
Uwe Hermann | 69890f7 | 2012-01-29 23:06:10 +0100 | [diff] [blame] | 421 | #ifdef HAVE_LIBUSB_1_0 |
Matthias Heidbrink | 04cb915 | 2013-11-22 20:40:52 +0100 | [diff] [blame] | 422 | /** USB device instance */ |
Uwe Hermann | d68e2d1 | 2012-02-17 21:02:52 +0100 | [diff] [blame] | 423 | struct sr_usb_dev_inst { |
Bert Vermeulen | 98582bf | 2013-12-09 22:49:12 +0100 | [diff] [blame] | 424 | /** USB bus */ |
| 425 | uint8_t bus; |
| 426 | /** Device address on USB bus */ |
| 427 | uint8_t address; |
| 428 | /** libusb device handle */ |
| 429 | struct libusb_device_handle *devhdl; |
Uwe Hermann | 69890f7 | 2012-01-29 23:06:10 +0100 | [diff] [blame] | 430 | }; |
| 431 | #endif |
| 432 | |
Uwe Hermann | c4f2dfd | 2013-11-13 19:56:13 +0100 | [diff] [blame] | 433 | #ifdef HAVE_LIBSERIALPORT |
Martin Ling | a9bce5a | 2013-10-27 15:51:24 +0000 | [diff] [blame] | 434 | #define SERIAL_PARITY_NONE SP_PARITY_NONE |
| 435 | #define SERIAL_PARITY_EVEN SP_PARITY_EVEN |
| 436 | #define SERIAL_PARITY_ODD SP_PARITY_ODD |
Uwe Hermann | d68e2d1 | 2012-02-17 21:02:52 +0100 | [diff] [blame] | 437 | struct sr_serial_dev_inst { |
Bert Vermeulen | 98582bf | 2013-12-09 22:49:12 +0100 | [diff] [blame] | 438 | /** Port name, e.g. '/dev/tty42'. */ |
| 439 | char *port; |
| 440 | /** Comm params for serial_set_paramstr(). */ |
| 441 | char *serialcomm; |
Bert Vermeulen | 98582bf | 2013-12-09 22:49:12 +0100 | [diff] [blame] | 442 | /** libserialport port handle */ |
| 443 | struct sp_port *data; |
Martin Ling | ba1949f | 2013-12-20 17:45:46 +0000 | [diff] [blame] | 444 | /** libserialport event set */ |
| 445 | struct sp_event_set *event_set; |
| 446 | /** GPollFDs for event polling */ |
| 447 | GPollFD *pollfds; |
Uwe Hermann | 69890f7 | 2012-01-29 23:06:10 +0100 | [diff] [blame] | 448 | }; |
Uwe Hermann | c4f2dfd | 2013-11-13 19:56:13 +0100 | [diff] [blame] | 449 | #endif |
Uwe Hermann | 69890f7 | 2012-01-29 23:06:10 +0100 | [diff] [blame] | 450 | |
Martin Ling | ae67644 | 2013-11-29 00:48:42 +0000 | [diff] [blame] | 451 | struct sr_usbtmc_dev_inst { |
| 452 | char *device; |
| 453 | int fd; |
| 454 | }; |
| 455 | |
Uwe Hermann | 026c822 | 2012-10-19 10:35:11 +0200 | [diff] [blame] | 456 | /* Private driver context. */ |
| 457 | struct drv_context { |
Bert Vermeulen | 98582bf | 2013-12-09 22:49:12 +0100 | [diff] [blame] | 458 | /** sigrok context */ |
| 459 | struct sr_context *sr_ctx; |
Uwe Hermann | 026c822 | 2012-10-19 10:35:11 +0200 | [diff] [blame] | 460 | GSList *instances; |
| 461 | }; |
| 462 | |
Bert Vermeulen | 48a486c | 2012-07-25 00:20:06 +0200 | [diff] [blame] | 463 | /*--- log.c -----------------------------------------------------------------*/ |
| 464 | |
| 465 | SR_PRIV int sr_log(int loglevel, const char *format, ...); |
| 466 | SR_PRIV int sr_spew(const char *format, ...); |
| 467 | SR_PRIV int sr_dbg(const char *format, ...); |
| 468 | SR_PRIV int sr_info(const char *format, ...); |
| 469 | SR_PRIV int sr_warn(const char *format, ...); |
| 470 | SR_PRIV int sr_err(const char *format, ...); |
| 471 | |
Martin Ling | 3544f84 | 2013-12-23 03:38:35 +0000 | [diff] [blame] | 472 | /* Message logging helpers with subsystem-specific prefix string. */ |
| 473 | #ifndef NO_LOG_WRAPPERS |
| 474 | #define sr_log(l, s, args...) sr_log(l, "%s: " s, LOG_PREFIX, ## args) |
| 475 | #define sr_spew(s, args...) sr_spew("%s: " s, LOG_PREFIX, ## args) |
| 476 | #define sr_dbg(s, args...) sr_dbg("%s: " s, LOG_PREFIX, ## args) |
| 477 | #define sr_info(s, args...) sr_info("%s: " s, LOG_PREFIX, ## args) |
| 478 | #define sr_warn(s, args...) sr_warn("%s: " s, LOG_PREFIX, ## args) |
| 479 | #define sr_err(s, args...) sr_err("%s: " s, LOG_PREFIX, ## args) |
| 480 | #endif |
| 481 | |
Bert Vermeulen | 48a486c | 2012-07-25 00:20:06 +0200 | [diff] [blame] | 482 | /*--- device.c --------------------------------------------------------------*/ |
| 483 | |
Uwe Hermann | f3ca73e | 2014-03-24 16:05:42 +0100 | [diff] [blame] | 484 | /** Values for the changes argument of sr_dev_driver.config_channel_set. */ |
Daniel Elstner | 2a854d7 | 2014-01-19 20:39:11 +0100 | [diff] [blame] | 485 | enum { |
Uwe Hermann | fca75cb | 2014-03-24 16:11:45 +0100 | [diff] [blame] | 486 | /** The enabled state of the channel has been changed. */ |
Uwe Hermann | 3f239f0 | 2014-03-24 22:39:42 +0100 | [diff] [blame] | 487 | SR_CHANNEL_SET_ENABLED = 1 << 0, |
Daniel Elstner | 2a854d7 | 2014-01-19 20:39:11 +0100 | [diff] [blame] | 488 | }; |
| 489 | |
Uwe Hermann | 56d0d24 | 2014-03-24 21:36:04 +0100 | [diff] [blame] | 490 | SR_PRIV struct sr_channel *sr_channel_new(int index, int type, |
Bert Vermeulen | 48a486c | 2012-07-25 00:20:06 +0200 | [diff] [blame] | 491 | gboolean enabled, const char *name); |
| 492 | |
| 493 | /* Generic device instances */ |
Soeren Apel | 1b9e567 | 2014-09-27 22:20:51 +0200 | [diff] [blame] | 494 | SR_PRIV struct sr_dev_inst *sr_dev_inst_new(int status, |
Bert Vermeulen | 48a486c | 2012-07-25 00:20:06 +0200 | [diff] [blame] | 495 | const char *vendor, const char *model, const char *version); |
| 496 | SR_PRIV void sr_dev_inst_free(struct sr_dev_inst *sdi); |
Bert Vermeulen | 48a486c | 2012-07-25 00:20:06 +0200 | [diff] [blame] | 497 | |
Uwe Hermann | 545f978 | 2012-10-24 00:41:21 +0200 | [diff] [blame] | 498 | #ifdef HAVE_LIBUSB_1_0 |
Uwe Hermann | 69890f7 | 2012-01-29 23:06:10 +0100 | [diff] [blame] | 499 | /* USB-specific instances */ |
Uwe Hermann | d68e2d1 | 2012-02-17 21:02:52 +0100 | [diff] [blame] | 500 | SR_PRIV struct sr_usb_dev_inst *sr_usb_dev_inst_new(uint8_t bus, |
Uwe Hermann | 69890f7 | 2012-01-29 23:06:10 +0100 | [diff] [blame] | 501 | uint8_t address, struct libusb_device_handle *hdl); |
Uwe Hermann | d68e2d1 | 2012-02-17 21:02:52 +0100 | [diff] [blame] | 502 | SR_PRIV void sr_usb_dev_inst_free(struct sr_usb_dev_inst *usb); |
Uwe Hermann | 69890f7 | 2012-01-29 23:06:10 +0100 | [diff] [blame] | 503 | #endif |
| 504 | |
Uwe Hermann | c4f2dfd | 2013-11-13 19:56:13 +0100 | [diff] [blame] | 505 | #ifdef HAVE_LIBSERIALPORT |
Uwe Hermann | 69890f7 | 2012-01-29 23:06:10 +0100 | [diff] [blame] | 506 | /* Serial-specific instances */ |
Bert Vermeulen | 299bdb2 | 2012-11-11 20:38:47 +0100 | [diff] [blame] | 507 | SR_PRIV struct sr_serial_dev_inst *sr_serial_dev_inst_new(const char *port, |
| 508 | const char *serialcomm); |
Uwe Hermann | d68e2d1 | 2012-02-17 21:02:52 +0100 | [diff] [blame] | 509 | SR_PRIV void sr_serial_dev_inst_free(struct sr_serial_dev_inst *serial); |
Uwe Hermann | c4f2dfd | 2013-11-13 19:56:13 +0100 | [diff] [blame] | 510 | #endif |
Uwe Hermann | 69890f7 | 2012-01-29 23:06:10 +0100 | [diff] [blame] | 511 | |
Martin Ling | ae67644 | 2013-11-29 00:48:42 +0000 | [diff] [blame] | 512 | /* USBTMC-specific instances */ |
| 513 | SR_PRIV struct sr_usbtmc_dev_inst *sr_usbtmc_dev_inst_new(const char *device); |
| 514 | SR_PRIV void sr_usbtmc_dev_inst_free(struct sr_usbtmc_dev_inst *usbtmc); |
Uwe Hermann | b08024a | 2011-04-14 09:46:53 +0200 | [diff] [blame] | 515 | |
Uwe Hermann | c09f0b5 | 2012-02-28 23:52:30 +0100 | [diff] [blame] | 516 | /*--- hwdriver.c ------------------------------------------------------------*/ |
Bert Vermeulen | 996b0c7 | 2012-02-13 02:13:51 +0100 | [diff] [blame] | 517 | |
Martin Ling | 13fef1e | 2014-09-14 04:47:12 +0100 | [diff] [blame] | 518 | SR_PRIV const GVariantType *sr_variant_type_get(int datatype); |
Bert Vermeulen | 584560f | 2014-09-16 17:49:20 +0200 | [diff] [blame] | 519 | SR_PRIV int sr_variant_type_check(uint32_t key, GVariant *data); |
Bert Vermeulen | 93a04e3 | 2012-02-15 03:18:48 +0100 | [diff] [blame] | 520 | SR_PRIV void sr_hw_cleanup_all(void); |
Bert Vermeulen | 584560f | 2014-09-16 17:49:20 +0200 | [diff] [blame] | 521 | SR_PRIV struct sr_config *sr_config_new(uint32_t key, GVariant *data); |
Bert Vermeulen | 722db13 | 2013-03-25 20:23:13 +0100 | [diff] [blame] | 522 | SR_PRIV void sr_config_free(struct sr_config *src); |
Bert Vermeulen | 48a486c | 2012-07-25 00:20:06 +0200 | [diff] [blame] | 523 | SR_PRIV int sr_source_remove(int fd); |
Martin Ling | 0812c40 | 2014-05-04 23:07:00 +0100 | [diff] [blame] | 524 | SR_PRIV int sr_source_remove_pollfd(GPollFD *pollfd); |
| 525 | SR_PRIV int sr_source_remove_channel(GIOChannel *channel); |
Bert Vermeulen | 48a486c | 2012-07-25 00:20:06 +0200 | [diff] [blame] | 526 | SR_PRIV int sr_source_add(int fd, int events, int timeout, |
Uwe Hermann | 144f666 | 2014-05-03 22:14:01 +0200 | [diff] [blame] | 527 | sr_receive_data_callback cb, void *cb_data); |
Martin Ling | 0812c40 | 2014-05-04 23:07:00 +0100 | [diff] [blame] | 528 | SR_PRIV int sr_source_add_pollfd(GPollFD *pollfd, int timeout, |
| 529 | sr_receive_data_callback cb, void *cb_data); |
| 530 | SR_PRIV int sr_source_add_channel(GIOChannel *channel, int events, int timeout, |
| 531 | sr_receive_data_callback cb, void *cb_data); |
Bert Vermeulen | 996b0c7 | 2012-02-13 02:13:51 +0100 | [diff] [blame] | 532 | |
Bert Vermeulen | a1645fc | 2012-02-13 03:36:32 +0100 | [diff] [blame] | 533 | /*--- session.c -------------------------------------------------------------*/ |
| 534 | |
Uwe Hermann | e2b2382 | 2013-11-22 15:02:12 +0100 | [diff] [blame] | 535 | struct sr_session { |
Martin Ling | c0e3ba4 | 2014-10-12 15:39:36 +0100 | [diff] [blame] | 536 | /** List of struct sr_dev_inst pointers. */ |
Uwe Hermann | e2b2382 | 2013-11-22 15:02:12 +0100 | [diff] [blame] | 537 | GSList *devs; |
Martin Ling | 1de3cce | 2014-10-12 15:56:36 +0100 | [diff] [blame] | 538 | /** List of struct sr_dev_inst pointers owned by this session. */ |
| 539 | GSList *owned_devs; |
Uwe Hermann | e2b2382 | 2013-11-22 15:02:12 +0100 | [diff] [blame] | 540 | /** List of struct datafeed_callback pointers. */ |
| 541 | GSList *datafeed_callbacks; |
Bert Vermeulen | 7b5e6d2 | 2014-05-23 01:21:58 +0200 | [diff] [blame] | 542 | struct sr_trigger *trigger; |
Uwe Hermann | e2b2382 | 2013-11-22 15:02:12 +0100 | [diff] [blame] | 543 | GTimeVal starttime; |
| 544 | gboolean running; |
| 545 | |
| 546 | unsigned int num_sources; |
| 547 | |
| 548 | /* |
| 549 | * Both "sources" and "pollfds" are of the same size and contain pairs |
| 550 | * of descriptor and callback function. We can not embed the GPollFD |
| 551 | * into the source struct since we want to be able to pass the array |
| 552 | * of all poll descriptors to g_poll(). |
| 553 | */ |
| 554 | struct source *sources; |
| 555 | GPollFD *pollfds; |
| 556 | int source_timeout; |
| 557 | |
| 558 | /* |
| 559 | * These are our synchronization primitives for stopping the session in |
| 560 | * an async fashion. We need to make sure the session is stopped from |
| 561 | * within the session thread itself. |
| 562 | */ |
Bert Vermeulen | 98582bf | 2013-12-09 22:49:12 +0100 | [diff] [blame] | 563 | /** Mutex protecting access to abort_session. */ |
| 564 | GMutex stop_mutex; |
| 565 | /** Abort current session. See sr_session_stop(). */ |
Uwe Hermann | e2b2382 | 2013-11-22 15:02:12 +0100 | [diff] [blame] | 566 | gboolean abort_session; |
| 567 | }; |
| 568 | |
Bert Vermeulen | de4d3f9 | 2012-07-22 15:31:56 +0200 | [diff] [blame] | 569 | SR_PRIV int sr_session_send(const struct sr_dev_inst *sdi, |
Bert Vermeulen | ae5859f | 2013-04-17 00:41:01 +0200 | [diff] [blame] | 570 | const struct sr_datafeed_packet *packet); |
Martin Ling | 0812c40 | 2014-05-04 23:07:00 +0100 | [diff] [blame] | 571 | SR_PRIV int sr_session_stop_sync(struct sr_session *session); |
Bert Vermeulen | f438e0c | 2013-09-18 13:28:07 +0200 | [diff] [blame] | 572 | SR_PRIV int sr_sessionfile_check(const char *filename); |
Bert Vermeulen | 8143cfd | 2014-09-26 01:33:15 +0200 | [diff] [blame] | 573 | SR_PRIV int sr_packet_copy(const struct sr_datafeed_packet *packet, |
| 574 | struct sr_datafeed_packet **copy); |
| 575 | SR_PRIV void sr_packet_free(struct sr_datafeed_packet *packet); |
Bert Vermeulen | a1645fc | 2012-02-13 03:36:32 +0100 | [diff] [blame] | 576 | |
Uwe Hermann | 063e7ae | 2013-01-29 12:55:00 +0100 | [diff] [blame] | 577 | /*--- std.c -----------------------------------------------------------------*/ |
| 578 | |
Uwe Hermann | 144f666 | 2014-05-03 22:14:01 +0200 | [diff] [blame] | 579 | typedef int (*dev_close_callback)(struct sr_dev_inst *sdi); |
| 580 | typedef void (*std_dev_clear_callback)(void *priv); |
Uwe Hermann | cd2f0fe | 2013-02-01 23:45:32 +0100 | [diff] [blame] | 581 | |
Uwe Hermann | f6beaac | 2013-05-31 15:46:57 +0200 | [diff] [blame] | 582 | SR_PRIV int std_init(struct sr_context *sr_ctx, struct sr_dev_driver *di, |
Bert Vermeulen | ae5859f | 2013-04-17 00:41:01 +0200 | [diff] [blame] | 583 | const char *prefix); |
Uwe Hermann | c4f2dfd | 2013-11-13 19:56:13 +0100 | [diff] [blame] | 584 | #ifdef HAVE_LIBSERIALPORT |
Bert Vermeulen | 23dc666 | 2013-12-07 20:26:15 +0100 | [diff] [blame] | 585 | SR_PRIV int std_serial_dev_open(struct sr_dev_inst *sdi); |
Bert Vermeulen | d43b090 | 2013-12-07 20:39:55 +0100 | [diff] [blame] | 586 | SR_PRIV int std_serial_dev_acquisition_stop(struct sr_dev_inst *sdi, |
Uwe Hermann | 144f666 | 2014-05-03 22:14:01 +0200 | [diff] [blame] | 587 | void *cb_data, dev_close_callback dev_close_fn, |
Bert Vermeulen | ae5859f | 2013-04-17 00:41:01 +0200 | [diff] [blame] | 588 | struct sr_serial_dev_inst *serial, const char *prefix); |
Uwe Hermann | c4f2dfd | 2013-11-13 19:56:13 +0100 | [diff] [blame] | 589 | #endif |
Uwe Hermann | 4afdfd4 | 2013-02-06 19:57:32 +0100 | [diff] [blame] | 590 | SR_PRIV int std_session_send_df_header(const struct sr_dev_inst *sdi, |
Bert Vermeulen | ae5859f | 2013-04-17 00:41:01 +0200 | [diff] [blame] | 591 | const char *prefix); |
| 592 | SR_PRIV int std_dev_clear(const struct sr_dev_driver *driver, |
Uwe Hermann | 144f666 | 2014-05-03 22:14:01 +0200 | [diff] [blame] | 593 | std_dev_clear_callback clear_private); |
Martin Ling | 043e899 | 2013-12-07 18:41:09 +0000 | [diff] [blame] | 594 | SR_PRIV int std_serial_dev_close(struct sr_dev_inst *sdi); |
Uwe Hermann | 4afdfd4 | 2013-02-06 19:57:32 +0100 | [diff] [blame] | 595 | |
Uwe Hermann | 8d558c7 | 2013-12-03 17:16:59 +0100 | [diff] [blame] | 596 | /*--- strutil.c -------------------------------------------------------------*/ |
| 597 | |
| 598 | SR_PRIV int sr_atol(const char *str, long *ret); |
| 599 | SR_PRIV int sr_atoi(const char *str, int *ret); |
| 600 | SR_PRIV int sr_atod(const char *str, double *ret); |
| 601 | SR_PRIV int sr_atof(const char *str, float *ret); |
poljar (Damir Jelić) | 9806c2d | 2014-01-16 15:28:48 +0100 | [diff] [blame] | 602 | SR_PRIV int sr_atof_ascii(const char *str, float *ret); |
Uwe Hermann | 8d558c7 | 2013-12-03 17:16:59 +0100 | [diff] [blame] | 603 | |
Bert Vermeulen | ac136b5 | 2014-05-28 15:53:27 +0200 | [diff] [blame] | 604 | /*--- soft-trigger.c --------------------------------------------------------*/ |
| 605 | |
| 606 | struct soft_trigger_logic { |
| 607 | const struct sr_dev_inst *sdi; |
| 608 | const struct sr_trigger *trigger; |
| 609 | int count; |
| 610 | int unitsize; |
| 611 | int cur_stage; |
| 612 | uint8_t *prev_sample; |
| 613 | }; |
| 614 | |
| 615 | SR_PRIV struct soft_trigger_logic *soft_trigger_logic_new( |
| 616 | const struct sr_dev_inst *sdi, struct sr_trigger *trigger); |
| 617 | SR_PRIV void soft_trigger_logic_free(struct soft_trigger_logic *st); |
| 618 | SR_PRIV int soft_trigger_logic_check(struct soft_trigger_logic *st, uint8_t *buf, |
| 619 | int len); |
| 620 | |
Uwe Hermann | 3ea4611 | 2014-10-13 01:06:09 +0200 | [diff] [blame] | 621 | /*--- hardware/serial.c -----------------------------------------------------*/ |
Uwe Hermann | 058b703 | 2011-01-19 01:16:19 +0100 | [diff] [blame] | 622 | |
Uwe Hermann | c4f2dfd | 2013-11-13 19:56:13 +0100 | [diff] [blame] | 623 | #ifdef HAVE_LIBSERIALPORT |
Uwe Hermann | a54dd31 | 2012-12-02 12:45:54 +0100 | [diff] [blame] | 624 | enum { |
| 625 | SERIAL_RDWR = 1, |
| 626 | SERIAL_RDONLY = 2, |
Uwe Hermann | a54dd31 | 2012-12-02 12:45:54 +0100 | [diff] [blame] | 627 | }; |
| 628 | |
Uwe Hermann | 144f666 | 2014-05-03 22:14:01 +0200 | [diff] [blame] | 629 | typedef gboolean (*packet_valid_callback)(const uint8_t *buf); |
Uwe Hermann | 766456b | 2012-11-14 18:35:37 +0100 | [diff] [blame] | 630 | |
Bert Vermeulen | 299bdb2 | 2012-11-11 20:38:47 +0100 | [diff] [blame] | 631 | SR_PRIV int serial_open(struct sr_serial_dev_inst *serial, int flags); |
| 632 | SR_PRIV int serial_close(struct sr_serial_dev_inst *serial); |
| 633 | SR_PRIV int serial_flush(struct sr_serial_dev_inst *serial); |
Martin Ling | 9a47421 | 2013-12-30 03:52:17 +0100 | [diff] [blame] | 634 | SR_PRIV int serial_write_blocking(struct sr_serial_dev_inst *serial, |
Martin Ling | eead278 | 2014-09-28 13:05:33 +0100 | [diff] [blame] | 635 | const void *buf, size_t count, unsigned int timeout_ms); |
Martin Ling | 9a47421 | 2013-12-30 03:52:17 +0100 | [diff] [blame] | 636 | SR_PRIV int serial_write_nonblocking(struct sr_serial_dev_inst *serial, |
| 637 | const void *buf, size_t count); |
Martin Ling | 9a47421 | 2013-12-30 03:52:17 +0100 | [diff] [blame] | 638 | SR_PRIV int serial_read_blocking(struct sr_serial_dev_inst *serial, void *buf, |
Martin Ling | eead278 | 2014-09-28 13:05:33 +0100 | [diff] [blame] | 639 | size_t count, unsigned int timeout_ms); |
Martin Ling | 9a47421 | 2013-12-30 03:52:17 +0100 | [diff] [blame] | 640 | SR_PRIV int serial_read_nonblocking(struct sr_serial_dev_inst *serial, void *buf, |
| 641 | size_t count); |
Bert Vermeulen | 299bdb2 | 2012-11-11 20:38:47 +0100 | [diff] [blame] | 642 | SR_PRIV int serial_set_params(struct sr_serial_dev_inst *serial, int baudrate, |
Bert Vermeulen | 71caaad | 2012-11-27 00:50:51 +0100 | [diff] [blame] | 643 | int bits, int parity, int stopbits, int flowcontrol, int rts, int dtr); |
Bert Vermeulen | 299bdb2 | 2012-11-11 20:38:47 +0100 | [diff] [blame] | 644 | SR_PRIV int serial_set_paramstr(struct sr_serial_dev_inst *serial, |
| 645 | const char *paramstr); |
| 646 | SR_PRIV int serial_readline(struct sr_serial_dev_inst *serial, char **buf, |
| 647 | int *buflen, gint64 timeout_ms); |
Uwe Hermann | 766456b | 2012-11-14 18:35:37 +0100 | [diff] [blame] | 648 | SR_PRIV int serial_stream_detect(struct sr_serial_dev_inst *serial, |
| 649 | uint8_t *buf, size_t *buflen, |
Uwe Hermann | 144f666 | 2014-05-03 22:14:01 +0200 | [diff] [blame] | 650 | size_t packet_size, |
| 651 | packet_valid_callback is_valid, |
Uwe Hermann | 766456b | 2012-11-14 18:35:37 +0100 | [diff] [blame] | 652 | uint64_t timeout_ms, int baudrate); |
poljar (Damir Jelić) | 1bd9e67 | 2013-10-25 18:13:20 +0200 | [diff] [blame] | 653 | SR_PRIV int sr_serial_extract_options(GSList *options, const char **serial_device, |
| 654 | const char **serial_options); |
Bert Vermeulen | 102f123 | 2014-07-21 14:35:27 +0200 | [diff] [blame] | 655 | SR_PRIV int serial_source_add(struct sr_session *session, |
| 656 | struct sr_serial_dev_inst *serial, int events, int timeout, |
| 657 | sr_receive_data_callback cb, void *cb_data); |
| 658 | SR_PRIV int serial_source_remove(struct sr_session *session, |
| 659 | struct sr_serial_dev_inst *serial); |
Aurelien Jacobs | b541f83 | 2014-02-02 21:47:45 +0100 | [diff] [blame] | 660 | SR_PRIV GSList *sr_serial_find_usb(uint16_t vendor_id, uint16_t product_id); |
Bert Vermeulen | c5cfc73 | 2014-10-06 12:10:25 +0200 | [diff] [blame] | 661 | SR_PRIV int serial_timeout(struct sr_serial_dev_inst *port, int num_bytes); |
Uwe Hermann | c4f2dfd | 2013-11-13 19:56:13 +0100 | [diff] [blame] | 662 | #endif |
Uwe Hermann | 1483577 | 2011-01-15 15:06:58 +0100 | [diff] [blame] | 663 | |
Uwe Hermann | 3ea4611 | 2014-10-13 01:06:09 +0200 | [diff] [blame] | 664 | /*--- hardware/ezusb.c ------------------------------------------------------*/ |
Uwe Hermann | 058b703 | 2011-01-19 01:16:19 +0100 | [diff] [blame] | 665 | |
Uwe Hermann | 22b0238 | 2011-02-02 10:25:52 +0100 | [diff] [blame] | 666 | #ifdef HAVE_LIBUSB_1_0 |
Uwe Hermann | 1a081ca | 2012-02-01 23:40:35 +0100 | [diff] [blame] | 667 | SR_PRIV int ezusb_reset(struct libusb_device_handle *hdl, int set_clear); |
| 668 | SR_PRIV int ezusb_install_firmware(libusb_device_handle *hdl, |
| 669 | const char *filename); |
| 670 | SR_PRIV int ezusb_upload_firmware(libusb_device *dev, int configuration, |
| 671 | const char *filename); |
Uwe Hermann | 22b0238 | 2011-02-02 10:25:52 +0100 | [diff] [blame] | 672 | #endif |
Uwe Hermann | 058b703 | 2011-01-19 01:16:19 +0100 | [diff] [blame] | 673 | |
Uwe Hermann | 3ea4611 | 2014-10-13 01:06:09 +0200 | [diff] [blame] | 674 | /*--- hardware/usb.c --------------------------------------------------------*/ |
Uwe Hermann | 0c632d3 | 2012-11-02 21:04:21 +0100 | [diff] [blame] | 675 | |
| 676 | #ifdef HAVE_LIBUSB_1_0 |
Bert Vermeulen | 7ae6a75 | 2012-12-04 23:25:11 +0100 | [diff] [blame] | 677 | SR_PRIV GSList *sr_usb_find(libusb_context *usb_ctx, const char *conn); |
Uwe Hermann | 0c632d3 | 2012-11-02 21:04:21 +0100 | [diff] [blame] | 678 | SR_PRIV int sr_usb_open(libusb_context *usb_ctx, struct sr_usb_dev_inst *usb); |
Bert Vermeulen | 102f123 | 2014-07-21 14:35:27 +0200 | [diff] [blame] | 679 | SR_PRIV int usb_source_add(struct sr_session *session, struct sr_context *ctx, |
| 680 | int timeout, sr_receive_data_callback cb, void *cb_data); |
| 681 | SR_PRIV int usb_source_remove(struct sr_session *session, struct sr_context *ctx); |
Aurelien Jacobs | 76bc5f6 | 2014-10-07 00:02:10 +0200 | [diff] [blame] | 682 | SR_PRIV int usb_get_port_path(libusb_device *dev, char *path, int path_len); |
Uwe Hermann | 0c632d3 | 2012-11-02 21:04:21 +0100 | [diff] [blame] | 683 | #endif |
| 684 | |
Uwe Hermann | 3ea4611 | 2014-10-13 01:06:09 +0200 | [diff] [blame] | 685 | /*--- hardware/scpi.c -------------------------------------------------------*/ |
poljar (Damir Jelić) | 7b9d732 | 2013-10-29 12:15:47 +0100 | [diff] [blame] | 686 | |
poljar (Damir Jelić) | 7b9d732 | 2013-10-29 12:15:47 +0100 | [diff] [blame] | 687 | #define SCPI_CMD_IDN "*IDN?" |
| 688 | #define SCPI_CMD_OPC "*OPC?" |
| 689 | |
| 690 | enum { |
| 691 | SCPI_CMD_SET_TRIGGER_SOURCE, |
| 692 | SCPI_CMD_SET_TIMEBASE, |
| 693 | SCPI_CMD_SET_VERTICAL_DIV, |
| 694 | SCPI_CMD_SET_TRIGGER_SLOPE, |
| 695 | SCPI_CMD_SET_COUPLING, |
| 696 | SCPI_CMD_SET_HORIZ_TRIGGERPOS, |
| 697 | SCPI_CMD_GET_ANALOG_CHAN_STATE, |
| 698 | SCPI_CMD_GET_DIG_CHAN_STATE, |
| 699 | SCPI_CMD_GET_TIMEBASE, |
| 700 | SCPI_CMD_GET_VERTICAL_DIV, |
| 701 | SCPI_CMD_GET_VERTICAL_OFFSET, |
| 702 | SCPI_CMD_GET_TRIGGER_SOURCE, |
| 703 | SCPI_CMD_GET_HORIZ_TRIGGERPOS, |
| 704 | SCPI_CMD_GET_TRIGGER_SLOPE, |
| 705 | SCPI_CMD_GET_COUPLING, |
| 706 | SCPI_CMD_SET_ANALOG_CHAN_STATE, |
| 707 | SCPI_CMD_SET_DIG_CHAN_STATE, |
| 708 | SCPI_CMD_GET_DIG_POD_STATE, |
| 709 | SCPI_CMD_SET_DIG_POD_STATE, |
| 710 | SCPI_CMD_GET_ANALOG_DATA, |
| 711 | SCPI_CMD_GET_DIG_DATA, |
poljar (Damir Jelić) | c09392d | 2014-01-16 15:28:54 +0100 | [diff] [blame] | 712 | SCPI_CMD_GET_SAMPLE_RATE, |
| 713 | SCPI_CMD_GET_SAMPLE_RATE_LIVE, |
poljar (Damir Jelić) | 7b9d732 | 2013-10-29 12:15:47 +0100 | [diff] [blame] | 714 | }; |
| 715 | |
| 716 | struct sr_scpi_hw_info { |
| 717 | char *manufacturer; |
| 718 | char *model; |
| 719 | char *serial_number; |
| 720 | char *firmware_version; |
| 721 | }; |
| 722 | |
Martin Ling | 23f43df | 2013-12-03 20:40:19 +0000 | [diff] [blame] | 723 | struct sr_scpi_dev_inst { |
Aurelien Jacobs | f754c14 | 2014-01-12 00:05:02 +0100 | [diff] [blame] | 724 | const char *name; |
| 725 | const char *prefix; |
| 726 | int priv_size; |
Aurelien Jacobs | b541f83 | 2014-02-02 21:47:45 +0100 | [diff] [blame] | 727 | GSList *(*scan)(struct drv_context *drvc); |
Aurelien Jacobs | 17bdda5 | 2014-01-17 10:47:42 +0100 | [diff] [blame] | 728 | int (*dev_inst_new)(void *priv, struct drv_context *drvc, |
| 729 | const char *resource, char **params, const char *serialcomm); |
Martin Ling | 23f43df | 2013-12-03 20:40:19 +0000 | [diff] [blame] | 730 | int (*open)(void *priv); |
Bert Vermeulen | 102f123 | 2014-07-21 14:35:27 +0200 | [diff] [blame] | 731 | int (*source_add)(struct sr_session *session, void *priv, int events, |
Uwe Hermann | 144f666 | 2014-05-03 22:14:01 +0200 | [diff] [blame] | 732 | int timeout, sr_receive_data_callback cb, void *cb_data); |
Bert Vermeulen | 102f123 | 2014-07-21 14:35:27 +0200 | [diff] [blame] | 733 | int (*source_remove)(struct sr_session *session, void *priv); |
Martin Ling | 23f43df | 2013-12-03 20:40:19 +0000 | [diff] [blame] | 734 | int (*send)(void *priv, const char *command); |
Martin Ling | 05c644e | 2013-12-29 02:36:49 +0100 | [diff] [blame] | 735 | int (*read_begin)(void *priv); |
| 736 | int (*read_data)(void *priv, char *buf, int maxlen); |
| 737 | int (*read_complete)(void *priv); |
Martin Ling | 23f43df | 2013-12-03 20:40:19 +0000 | [diff] [blame] | 738 | int (*close)(void *priv); |
| 739 | void (*free)(void *priv); |
Martin Ling | 9092e66 | 2014-09-28 14:30:20 +0100 | [diff] [blame] | 740 | unsigned int read_timeout_ms; |
Martin Ling | 23f43df | 2013-12-03 20:40:19 +0000 | [diff] [blame] | 741 | void *priv; |
| 742 | }; |
| 743 | |
Aurelien Jacobs | b541f83 | 2014-02-02 21:47:45 +0100 | [diff] [blame] | 744 | SR_PRIV GSList *sr_scpi_scan(struct drv_context *drvc, GSList *options, |
| 745 | struct sr_dev_inst *(*probe_device)(struct sr_scpi_dev_inst *scpi)); |
Aurelien Jacobs | 17bdda5 | 2014-01-17 10:47:42 +0100 | [diff] [blame] | 746 | SR_PRIV struct sr_scpi_dev_inst *scpi_dev_inst_new(struct drv_context *drvc, |
| 747 | const char *resource, const char *serialcomm); |
Martin Ling | 23f43df | 2013-12-03 20:40:19 +0000 | [diff] [blame] | 748 | SR_PRIV int sr_scpi_open(struct sr_scpi_dev_inst *scpi); |
Bert Vermeulen | 102f123 | 2014-07-21 14:35:27 +0200 | [diff] [blame] | 749 | SR_PRIV int sr_scpi_source_add(struct sr_session *session, |
| 750 | struct sr_scpi_dev_inst *scpi, int events, int timeout, |
| 751 | sr_receive_data_callback cb, void *cb_data); |
| 752 | SR_PRIV int sr_scpi_source_remove(struct sr_session *session, |
| 753 | struct sr_scpi_dev_inst *scpi); |
Martin Ling | 23f43df | 2013-12-03 20:40:19 +0000 | [diff] [blame] | 754 | SR_PRIV int sr_scpi_send(struct sr_scpi_dev_inst *scpi, |
Martin Ling | 504f40a | 2013-12-04 10:24:52 +0000 | [diff] [blame] | 755 | const char *format, ...); |
Martin Ling | 87c4108 | 2013-12-04 10:53:51 +0000 | [diff] [blame] | 756 | SR_PRIV int sr_scpi_send_variadic(struct sr_scpi_dev_inst *scpi, |
| 757 | const char *format, va_list args); |
Martin Ling | 05c644e | 2013-12-29 02:36:49 +0100 | [diff] [blame] | 758 | SR_PRIV int sr_scpi_read_begin(struct sr_scpi_dev_inst *scpi); |
| 759 | SR_PRIV int sr_scpi_read_data(struct sr_scpi_dev_inst *scpi, char *buf, int maxlen); |
| 760 | SR_PRIV int sr_scpi_read_complete(struct sr_scpi_dev_inst *scpi); |
Martin Ling | 23f43df | 2013-12-03 20:40:19 +0000 | [diff] [blame] | 761 | SR_PRIV int sr_scpi_close(struct sr_scpi_dev_inst *scpi); |
| 762 | SR_PRIV void sr_scpi_free(struct sr_scpi_dev_inst *scpi); |
| 763 | |
| 764 | SR_PRIV int sr_scpi_get_string(struct sr_scpi_dev_inst *scpi, |
| 765 | const char *command, char **scpi_response); |
| 766 | SR_PRIV int sr_scpi_get_bool(struct sr_scpi_dev_inst *scpi, |
| 767 | const char *command, gboolean *scpi_response); |
| 768 | SR_PRIV int sr_scpi_get_int(struct sr_scpi_dev_inst *scpi, |
| 769 | const char *command, int *scpi_response); |
| 770 | SR_PRIV int sr_scpi_get_float(struct sr_scpi_dev_inst *scpi, |
| 771 | const char *command, float *scpi_response); |
| 772 | SR_PRIV int sr_scpi_get_double(struct sr_scpi_dev_inst *scpi, |
| 773 | const char *command, double *scpi_response); |
| 774 | SR_PRIV int sr_scpi_get_opc(struct sr_scpi_dev_inst *scpi); |
| 775 | SR_PRIV int sr_scpi_get_floatv(struct sr_scpi_dev_inst *scpi, |
| 776 | const char *command, GArray **scpi_response); |
| 777 | SR_PRIV int sr_scpi_get_uint8v(struct sr_scpi_dev_inst *scpi, |
| 778 | const char *command, GArray **scpi_response); |
| 779 | SR_PRIV int sr_scpi_get_hw_id(struct sr_scpi_dev_inst *scpi, |
| 780 | struct sr_scpi_hw_info **scpi_response); |
poljar (Damir Jelić) | 7b9d732 | 2013-10-29 12:15:47 +0100 | [diff] [blame] | 781 | SR_PRIV void sr_scpi_hw_info_free(struct sr_scpi_hw_info *hw_info); |
| 782 | |
Uwe Hermann | 3ea4611 | 2014-10-13 01:06:09 +0200 | [diff] [blame] | 783 | /*--- hardware/dmm/es519xx.c ------------------------------------------------*/ |
Aurelien Jacobs | c01bdeb | 2013-10-03 22:00:22 +0200 | [diff] [blame] | 784 | |
Aurelien Jacobs | bfb926c | 2013-10-10 23:11:06 +0200 | [diff] [blame] | 785 | /** |
| 786 | * All 11-byte es519xx chips repeat each block twice for each conversion cycle |
| 787 | * so always read 2 blocks at a time. |
| 788 | */ |
| 789 | #define ES519XX_11B_PACKET_SIZE (11 * 2) |
Uwe Hermann | 72e1672 | 2013-10-06 14:59:10 +0200 | [diff] [blame] | 790 | #define ES519XX_14B_PACKET_SIZE 14 |
Aurelien Jacobs | c01bdeb | 2013-10-03 22:00:22 +0200 | [diff] [blame] | 791 | |
| 792 | struct es519xx_info { |
| 793 | gboolean is_judge, is_voltage, is_auto, is_micro, is_current; |
| 794 | gboolean is_milli, is_resistance, is_continuity, is_diode; |
| 795 | gboolean is_frequency, is_rpm, is_capacitance, is_duty_cycle; |
| 796 | gboolean is_temperature, is_celsius, is_fahrenheit; |
| 797 | gboolean is_adp0, is_adp1, is_adp2, is_adp3; |
| 798 | gboolean is_sign, is_batt, is_ol, is_pmax, is_pmin, is_apo; |
| 799 | gboolean is_dc, is_ac, is_vahz, is_min, is_max, is_rel, is_hold; |
| 800 | gboolean is_digit4, is_ul, is_vasel, is_vbar, is_lpf1, is_lpf0, is_rmr; |
| 801 | uint32_t baudrate; |
| 802 | int packet_size; |
| 803 | gboolean alt_functions, fivedigits, clampmeter, selectable_lpf; |
| 804 | }; |
| 805 | |
Uwe Hermann | 72e1672 | 2013-10-06 14:59:10 +0200 | [diff] [blame] | 806 | SR_PRIV gboolean sr_es519xx_2400_11b_packet_valid(const uint8_t *buf); |
| 807 | SR_PRIV int sr_es519xx_2400_11b_parse(const uint8_t *buf, float *floatval, |
| 808 | struct sr_datafeed_analog *analog, void *info); |
Aurelien Jacobs | 2588e50 | 2014-01-14 23:24:47 +0100 | [diff] [blame] | 809 | SR_PRIV gboolean sr_es519xx_2400_11b_altfn_packet_valid(const uint8_t *buf); |
| 810 | SR_PRIV int sr_es519xx_2400_11b_altfn_parse(const uint8_t *buf, |
| 811 | float *floatval, struct sr_datafeed_analog *analog, void *info); |
Uwe Hermann | 72e1672 | 2013-10-06 14:59:10 +0200 | [diff] [blame] | 812 | SR_PRIV gboolean sr_es519xx_19200_11b_5digits_packet_valid(const uint8_t *buf); |
Uwe Hermann | 93d719c | 2013-10-07 00:24:44 +0200 | [diff] [blame] | 813 | SR_PRIV int sr_es519xx_19200_11b_5digits_parse(const uint8_t *buf, |
Uwe Hermann | 72e1672 | 2013-10-06 14:59:10 +0200 | [diff] [blame] | 814 | float *floatval, struct sr_datafeed_analog *analog, void *info); |
| 815 | SR_PRIV gboolean sr_es519xx_19200_11b_clamp_packet_valid(const uint8_t *buf); |
| 816 | SR_PRIV int sr_es519xx_19200_11b_clamp_parse(const uint8_t *buf, |
| 817 | float *floatval, struct sr_datafeed_analog *analog, void *info); |
| 818 | SR_PRIV gboolean sr_es519xx_19200_11b_packet_valid(const uint8_t *buf); |
| 819 | SR_PRIV int sr_es519xx_19200_11b_parse(const uint8_t *buf, float *floatval, |
| 820 | struct sr_datafeed_analog *analog, void *info); |
| 821 | SR_PRIV gboolean sr_es519xx_19200_14b_packet_valid(const uint8_t *buf); |
| 822 | SR_PRIV int sr_es519xx_19200_14b_parse(const uint8_t *buf, float *floatval, |
| 823 | struct sr_datafeed_analog *analog, void *info); |
| 824 | SR_PRIV gboolean sr_es519xx_19200_14b_sel_lpf_packet_valid(const uint8_t *buf); |
| 825 | SR_PRIV int sr_es519xx_19200_14b_sel_lpf_parse(const uint8_t *buf, |
| 826 | float *floatval, struct sr_datafeed_analog *analog, void *info); |
Aurelien Jacobs | c01bdeb | 2013-10-03 22:00:22 +0200 | [diff] [blame] | 827 | |
Uwe Hermann | 3ea4611 | 2014-10-13 01:06:09 +0200 | [diff] [blame] | 828 | /*--- hardware/dmm/fs9922.c -------------------------------------------------*/ |
Uwe Hermann | 79081ec | 2012-10-27 22:41:50 +0200 | [diff] [blame] | 829 | |
Uwe Hermann | 913abe8 | 2012-12-19 22:47:26 +0100 | [diff] [blame] | 830 | #define FS9922_PACKET_SIZE 14 |
| 831 | |
| 832 | struct fs9922_info { |
| 833 | gboolean is_auto, is_dc, is_ac, is_rel, is_hold, is_bpn, is_z1, is_z2; |
| 834 | gboolean is_max, is_min, is_apo, is_bat, is_nano, is_z3, is_micro; |
| 835 | gboolean is_milli, is_kilo, is_mega, is_beep, is_diode, is_percent; |
| 836 | gboolean is_z4, is_volt, is_ampere, is_ohm, is_hfe, is_hertz, is_farad; |
| 837 | gboolean is_celsius, is_fahrenheit; |
| 838 | int bargraph_sign, bargraph_value; |
| 839 | }; |
| 840 | |
Uwe Hermann | 913abe8 | 2012-12-19 22:47:26 +0100 | [diff] [blame] | 841 | SR_PRIV gboolean sr_fs9922_packet_valid(const uint8_t *buf); |
| 842 | SR_PRIV int sr_fs9922_parse(const uint8_t *buf, float *floatval, |
| 843 | struct sr_datafeed_analog *analog, void *info); |
Uwe Hermann | e52bb9b | 2013-09-01 13:10:54 +0200 | [diff] [blame] | 844 | SR_PRIV void sr_fs9922_z1_diode(struct sr_datafeed_analog *analog, void *info); |
Uwe Hermann | 79081ec | 2012-10-27 22:41:50 +0200 | [diff] [blame] | 845 | |
Uwe Hermann | 3ea4611 | 2014-10-13 01:06:09 +0200 | [diff] [blame] | 846 | /*--- hardware/dmm/fs9721.c -------------------------------------------------*/ |
Uwe Hermann | 6c70147 | 2012-10-29 12:02:05 +0100 | [diff] [blame] | 847 | |
Uwe Hermann | 8c1adf3 | 2012-11-01 15:58:09 +0100 | [diff] [blame] | 848 | #define FS9721_PACKET_SIZE 14 |
| 849 | |
| 850 | struct fs9721_info { |
| 851 | gboolean is_ac, is_dc, is_auto, is_rs232, is_micro, is_nano, is_kilo; |
| 852 | gboolean is_diode, is_milli, is_percent, is_mega, is_beep, is_farad; |
| 853 | gboolean is_ohm, is_rel, is_hold, is_ampere, is_volt, is_hz, is_bat; |
| 854 | gboolean is_c2c1_11, is_c2c1_10, is_c2c1_01, is_c2c1_00, is_sign; |
| 855 | }; |
| 856 | |
Uwe Hermann | 8c1adf3 | 2012-11-01 15:58:09 +0100 | [diff] [blame] | 857 | SR_PRIV gboolean sr_fs9721_packet_valid(const uint8_t *buf); |
| 858 | SR_PRIV int sr_fs9721_parse(const uint8_t *buf, float *floatval, |
Uwe Hermann | 93357bc | 2012-12-01 18:50:35 +0100 | [diff] [blame] | 859 | struct sr_datafeed_analog *analog, void *info); |
Uwe Hermann | 2451a20 | 2013-05-01 02:10:56 +0200 | [diff] [blame] | 860 | SR_PRIV void sr_fs9721_00_temp_c(struct sr_datafeed_analog *analog, void *info); |
| 861 | SR_PRIV void sr_fs9721_01_temp_c(struct sr_datafeed_analog *analog, void *info); |
| 862 | SR_PRIV void sr_fs9721_10_temp_c(struct sr_datafeed_analog *analog, void *info); |
| 863 | SR_PRIV void sr_fs9721_01_10_temp_f_c(struct sr_datafeed_analog *analog, void *info); |
Uwe Hermann | d327972 | 2014-01-02 01:34:21 +0100 | [diff] [blame] | 864 | SR_PRIV void sr_fs9721_max_c_min(struct sr_datafeed_analog *analog, void *info); |
Uwe Hermann | 6c70147 | 2012-10-29 12:02:05 +0100 | [diff] [blame] | 865 | |
Uwe Hermann | 3ea4611 | 2014-10-13 01:06:09 +0200 | [diff] [blame] | 866 | /*--- hardware/dmm/m2110.c --------------------------------------------------*/ |
Matthias Heidbrink | 825da8b | 2013-12-18 23:37:42 +0100 | [diff] [blame] | 867 | |
| 868 | #define BBCGM_M2110_PACKET_SIZE 9 |
| 869 | |
| 870 | SR_PRIV gboolean sr_m2110_packet_valid(const uint8_t *buf); |
| 871 | SR_PRIV int sr_m2110_parse(const uint8_t *buf, float *floatval, |
| 872 | struct sr_datafeed_analog *analog, void *info); |
| 873 | |
Uwe Hermann | 3ea4611 | 2014-10-13 01:06:09 +0200 | [diff] [blame] | 874 | /*--- hardware/dmm/metex14.c ------------------------------------------------*/ |
Uwe Hermann | ac913e5 | 2012-11-14 18:38:26 +0100 | [diff] [blame] | 875 | |
| 876 | #define METEX14_PACKET_SIZE 14 |
| 877 | |
| 878 | struct metex14_info { |
| 879 | gboolean is_ac, is_dc, is_resistance, is_capacity, is_temperature; |
| 880 | gboolean is_diode, is_frequency, is_ampere, is_volt, is_farad; |
Uwe Hermann | c02dc3e | 2013-10-23 18:41:13 +0200 | [diff] [blame] | 881 | gboolean is_hertz, is_ohm, is_celsius, is_pico, is_nano, is_micro; |
| 882 | gboolean is_milli, is_kilo, is_mega, is_gain, is_decibel, is_hfe; |
Matthias Heidbrink | e83437a | 2014-03-24 21:50:07 +0100 | [diff] [blame] | 883 | gboolean is_unitless, is_logic; |
Uwe Hermann | ac913e5 | 2012-11-14 18:38:26 +0100 | [diff] [blame] | 884 | }; |
| 885 | |
Uwe Hermann | c4f2dfd | 2013-11-13 19:56:13 +0100 | [diff] [blame] | 886 | #ifdef HAVE_LIBSERIALPORT |
Uwe Hermann | ce3777a | 2012-12-02 14:22:15 +0100 | [diff] [blame] | 887 | SR_PRIV int sr_metex14_packet_request(struct sr_serial_dev_inst *serial); |
Uwe Hermann | c4f2dfd | 2013-11-13 19:56:13 +0100 | [diff] [blame] | 888 | #endif |
Uwe Hermann | ac913e5 | 2012-11-14 18:38:26 +0100 | [diff] [blame] | 889 | SR_PRIV gboolean sr_metex14_packet_valid(const uint8_t *buf); |
| 890 | SR_PRIV int sr_metex14_parse(const uint8_t *buf, float *floatval, |
Uwe Hermann | 1fbab46 | 2012-12-01 19:01:07 +0100 | [diff] [blame] | 891 | struct sr_datafeed_analog *analog, void *info); |
Uwe Hermann | ac913e5 | 2012-11-14 18:38:26 +0100 | [diff] [blame] | 892 | |
Uwe Hermann | 3ea4611 | 2014-10-13 01:06:09 +0200 | [diff] [blame] | 893 | /*--- hardware/dmm/rs9lcd.c -------------------------------------------------*/ |
Alexandru Gagniuc | 05f134a | 2012-12-02 12:58:30 -0600 | [diff] [blame] | 894 | |
Alexandru Gagniuc | 21829e6 | 2012-12-02 13:15:21 -0600 | [diff] [blame] | 895 | #define RS9LCD_PACKET_SIZE 9 |
Alexandru Gagniuc | 05f134a | 2012-12-02 12:58:30 -0600 | [diff] [blame] | 896 | |
Alexandru Gagniuc | e7ed87a | 2012-12-13 12:35:06 -0600 | [diff] [blame] | 897 | /* Dummy info struct. The parser does not use it. */ |
Uwe Hermann | bf6f839 | 2013-02-02 12:14:26 +0100 | [diff] [blame] | 898 | struct rs9lcd_info { int dummy; }; |
Alexandru Gagniuc | e7ed87a | 2012-12-13 12:35:06 -0600 | [diff] [blame] | 899 | |
Alexandru Gagniuc | 05f134a | 2012-12-02 12:58:30 -0600 | [diff] [blame] | 900 | SR_PRIV gboolean sr_rs9lcd_packet_valid(const uint8_t *buf); |
| 901 | SR_PRIV int sr_rs9lcd_parse(const uint8_t *buf, float *floatval, |
| 902 | struct sr_datafeed_analog *analog, void *info); |
| 903 | |
Uwe Hermann | 3ea4611 | 2014-10-13 01:06:09 +0200 | [diff] [blame] | 904 | /*--- hardware/dmm/bm25x.c --------------------------------------------------*/ |
Janne Huttunen | a24c3f4 | 2014-07-30 10:28:58 +0300 | [diff] [blame] | 905 | |
| 906 | #define BRYMEN_BM25X_PACKET_SIZE 15 |
| 907 | |
| 908 | /* Dummy info struct. The parser does not use it. */ |
| 909 | struct bm25x_info { int dummy; }; |
| 910 | |
| 911 | SR_PRIV gboolean sr_brymen_bm25x_packet_valid(const uint8_t *buf); |
| 912 | SR_PRIV int sr_brymen_bm25x_parse(const uint8_t *buf, float *floatval, |
| 913 | struct sr_datafeed_analog *analog, void *info); |
| 914 | |
Uwe Hermann | 3ea4611 | 2014-10-13 01:06:09 +0200 | [diff] [blame] | 915 | /*--- hardware/lcr/es51919.c ------------------------------------------------*/ |
Janne Huttunen | 6bcb3ee | 2014-10-11 15:47:34 +0300 | [diff] [blame] | 916 | |
| 917 | SR_PRIV void es51919_serial_clean(void *priv); |
| 918 | SR_PRIV struct sr_dev_inst *es51919_serial_scan(GSList *options, |
| 919 | const char *vendor, |
| 920 | const char *model); |
| 921 | SR_PRIV int es51919_serial_config_get(uint32_t key, GVariant **data, |
| 922 | const struct sr_dev_inst *sdi, |
| 923 | const struct sr_channel_group *cg); |
| 924 | SR_PRIV int es51919_serial_config_set(uint32_t key, GVariant *data, |
| 925 | const struct sr_dev_inst *sdi, |
| 926 | const struct sr_channel_group *cg); |
| 927 | SR_PRIV int es51919_serial_config_list(uint32_t key, GVariant **data, |
| 928 | const struct sr_dev_inst *sdi, |
| 929 | const struct sr_channel_group *cg); |
| 930 | SR_PRIV int es51919_serial_acquisition_start(const struct sr_dev_inst *sdi, |
| 931 | void *cb_data); |
| 932 | SR_PRIV int es51919_serial_acquisition_stop(struct sr_dev_inst *sdi, |
| 933 | void *cb_data); |
| 934 | |
Uwe Hermann | 1483577 | 2011-01-15 15:06:58 +0100 | [diff] [blame] | 935 | #endif |