Paul Cercueil / libiio

Dependencies:   libserialport libxml2

Committer:
pcercuei
Date:
Mon Jan 30 13:00:39 2017 +0000
Revision:
3:d147beabba0e
Parent:
0:df031b60ca29
Child:
4:ad69b39bf124
Update to libiio v0.9

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pcercuei 0:df031b60ca29 1 /*
pcercuei 0:df031b60ca29 2 * libiio - Library for interfacing industrial I/O (IIO) devices
pcercuei 0:df031b60ca29 3 *
pcercuei 0:df031b60ca29 4 * Copyright (C) 2014 Analog Devices, Inc.
pcercuei 0:df031b60ca29 5 * Author: Paul Cercueil <paul.cercueil@analog.com>
pcercuei 0:df031b60ca29 6 *
pcercuei 0:df031b60ca29 7 * This library is free software; you can redistribute it and/or
pcercuei 0:df031b60ca29 8 * modify it under the terms of the GNU Lesser General Public
pcercuei 0:df031b60ca29 9 * License as published by the Free Software Foundation; either
pcercuei 0:df031b60ca29 10 * version 2.1 of the License, or (at your option) any later version.
pcercuei 0:df031b60ca29 11 *
pcercuei 0:df031b60ca29 12 * This library is distributed in the hope that it will be useful,
pcercuei 0:df031b60ca29 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
pcercuei 0:df031b60ca29 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
pcercuei 0:df031b60ca29 15 * Lesser General Public License for more details.
pcercuei 0:df031b60ca29 16 *
pcercuei 0:df031b60ca29 17 * */
pcercuei 0:df031b60ca29 18
pcercuei 0:df031b60ca29 19 #ifndef __IIO_PRIVATE_H__
pcercuei 0:df031b60ca29 20 #define __IIO_PRIVATE_H__
pcercuei 0:df031b60ca29 21
pcercuei 0:df031b60ca29 22 /* Include public interface */
pcercuei 0:df031b60ca29 23 #include "iio.h"
pcercuei 0:df031b60ca29 24
pcercuei 3:d147beabba0e 25 #include "iio-config.h"
pcercuei 3:d147beabba0e 26
pcercuei 0:df031b60ca29 27 #include <stdbool.h>
pcercuei 0:df031b60ca29 28
pcercuei 0:df031b60ca29 29 #ifdef _MSC_BUILD
pcercuei 0:df031b60ca29 30 #define inline __inline
pcercuei 3:d147beabba0e 31 #define iio_snprintf sprintf_s
pcercuei 3:d147beabba0e 32 #else
pcercuei 3:d147beabba0e 33 #define iio_snprintf snprintf
pcercuei 0:df031b60ca29 34 #endif
pcercuei 0:df031b60ca29 35
pcercuei 0:df031b60ca29 36 #ifdef _WIN32
pcercuei 0:df031b60ca29 37 # ifdef LIBIIO_EXPORTS
pcercuei 0:df031b60ca29 38 # define __api __declspec(dllexport)
pcercuei 0:df031b60ca29 39 # else
pcercuei 0:df031b60ca29 40 # define __api __declspec(dllimport)
pcercuei 0:df031b60ca29 41 # endif
pcercuei 0:df031b60ca29 42 #elif __GNUC__ >= 4
pcercuei 0:df031b60ca29 43 # define __api __attribute__((visibility ("default")))
pcercuei 0:df031b60ca29 44 #else
pcercuei 0:df031b60ca29 45 # define __api
pcercuei 0:df031b60ca29 46 #endif
pcercuei 0:df031b60ca29 47
pcercuei 3:d147beabba0e 48 #ifdef WITH_MATLAB_BINDINGS_API
pcercuei 3:d147beabba0e 49 #include "bindings/matlab/iio-wrapper.h"
pcercuei 3:d147beabba0e 50 #endif
pcercuei 3:d147beabba0e 51
pcercuei 0:df031b60ca29 52 #define ARRAY_SIZE(x) (sizeof(x) ? sizeof(x) / sizeof((x)[0]) : 0)
pcercuei 0:df031b60ca29 53 #define BIT(x) (1 << (x))
pcercuei 0:df031b60ca29 54 #define BIT_MASK(bit) BIT((bit) % 32)
pcercuei 0:df031b60ca29 55 #define BIT_WORD(bit) ((bit) / 32)
pcercuei 0:df031b60ca29 56 #define TEST_BIT(addr, bit) (!!(*(((uint32_t *) addr) + BIT_WORD(bit)) \
pcercuei 0:df031b60ca29 57 & BIT_MASK(bit)))
pcercuei 0:df031b60ca29 58 #define SET_BIT(addr, bit) \
pcercuei 0:df031b60ca29 59 *(((uint32_t *) addr) + BIT_WORD(bit)) |= BIT_MASK(bit)
pcercuei 0:df031b60ca29 60 #define CLEAR_BIT(addr, bit) \
pcercuei 0:df031b60ca29 61 *(((uint32_t *) addr) + BIT_WORD(bit)) &= ~BIT_MASK(bit)
pcercuei 0:df031b60ca29 62
pcercuei 0:df031b60ca29 63
pcercuei 0:df031b60ca29 64 /* ntohl/htonl are a nightmare to use in cross-platform applications,
pcercuei 0:df031b60ca29 65 * since they are defined in different headers on different platforms.
pcercuei 0:df031b60ca29 66 * iio_be32toh/iio_htobe32 are just clones of ntohl/htonl. */
pcercuei 0:df031b60ca29 67 static inline uint32_t iio_be32toh(uint32_t word)
pcercuei 0:df031b60ca29 68 {
pcercuei 0:df031b60ca29 69 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
pcercuei 0:df031b60ca29 70 #ifdef __GNUC__
pcercuei 0:df031b60ca29 71 return __builtin_bswap32(word);
pcercuei 0:df031b60ca29 72 #else
pcercuei 0:df031b60ca29 73 return ((word & 0xff) << 24) | ((word & 0xff00) << 8) |
pcercuei 0:df031b60ca29 74 ((word >> 8) & 0xff00) | ((word >> 24) & 0xff);
pcercuei 0:df031b60ca29 75 #endif
pcercuei 0:df031b60ca29 76 #else
pcercuei 0:df031b60ca29 77 return word;
pcercuei 0:df031b60ca29 78 #endif
pcercuei 0:df031b60ca29 79 }
pcercuei 0:df031b60ca29 80
pcercuei 0:df031b60ca29 81 static inline uint32_t iio_htobe32(uint32_t word)
pcercuei 0:df031b60ca29 82 {
pcercuei 0:df031b60ca29 83 return iio_be32toh(word);
pcercuei 0:df031b60ca29 84 }
pcercuei 0:df031b60ca29 85
pcercuei 0:df031b60ca29 86 /* Allocate zeroed out memory */
pcercuei 0:df031b60ca29 87 static inline void *zalloc(size_t size)
pcercuei 0:df031b60ca29 88 {
pcercuei 0:df031b60ca29 89 return calloc(1, size);
pcercuei 0:df031b60ca29 90 }
pcercuei 0:df031b60ca29 91
pcercuei 0:df031b60ca29 92 struct iio_backend_ops {
pcercuei 0:df031b60ca29 93 struct iio_context * (*clone)(const struct iio_context *ctx);
pcercuei 0:df031b60ca29 94 ssize_t (*read)(const struct iio_device *dev, void *dst, size_t len,
pcercuei 0:df031b60ca29 95 uint32_t *mask, size_t words);
pcercuei 0:df031b60ca29 96 ssize_t (*write)(const struct iio_device *dev,
pcercuei 0:df031b60ca29 97 const void *src, size_t len);
pcercuei 0:df031b60ca29 98 int (*open)(const struct iio_device *dev,
pcercuei 0:df031b60ca29 99 size_t samples_count, bool cyclic);
pcercuei 0:df031b60ca29 100 int (*close)(const struct iio_device *dev);
pcercuei 0:df031b60ca29 101 int (*get_fd)(const struct iio_device *dev);
pcercuei 0:df031b60ca29 102 int (*set_blocking_mode)(const struct iio_device *dev, bool blocking);
pcercuei 0:df031b60ca29 103
pcercuei 0:df031b60ca29 104 void (*cancel)(const struct iio_device *dev);
pcercuei 0:df031b60ca29 105
pcercuei 0:df031b60ca29 106 int (*set_kernel_buffers_count)(const struct iio_device *dev,
pcercuei 0:df031b60ca29 107 unsigned int nb_blocks);
pcercuei 0:df031b60ca29 108 ssize_t (*get_buffer)(const struct iio_device *dev,
pcercuei 0:df031b60ca29 109 void **addr_ptr, size_t bytes_used,
pcercuei 0:df031b60ca29 110 uint32_t *mask, size_t words);
pcercuei 0:df031b60ca29 111
pcercuei 0:df031b60ca29 112 ssize_t (*read_device_attr)(const struct iio_device *dev,
pcercuei 0:df031b60ca29 113 const char *attr, char *dst, size_t len, bool is_debug);
pcercuei 0:df031b60ca29 114 ssize_t (*write_device_attr)(const struct iio_device *dev,
pcercuei 0:df031b60ca29 115 const char *attr, const char *src,
pcercuei 0:df031b60ca29 116 size_t len, bool is_debug);
pcercuei 0:df031b60ca29 117 ssize_t (*read_channel_attr)(const struct iio_channel *chn,
pcercuei 0:df031b60ca29 118 const char *attr, char *dst, size_t len);
pcercuei 0:df031b60ca29 119 ssize_t (*write_channel_attr)(const struct iio_channel *chn,
pcercuei 0:df031b60ca29 120 const char *attr, const char *src, size_t len);
pcercuei 0:df031b60ca29 121
pcercuei 0:df031b60ca29 122 int (*get_trigger)(const struct iio_device *dev,
pcercuei 0:df031b60ca29 123 const struct iio_device **trigger);
pcercuei 0:df031b60ca29 124 int (*set_trigger)(const struct iio_device *dev,
pcercuei 0:df031b60ca29 125 const struct iio_device *trigger);
pcercuei 0:df031b60ca29 126
pcercuei 0:df031b60ca29 127 void (*shutdown)(struct iio_context *ctx);
pcercuei 0:df031b60ca29 128
pcercuei 0:df031b60ca29 129 int (*get_version)(const struct iio_context *ctx, unsigned int *major,
pcercuei 0:df031b60ca29 130 unsigned int *minor, char git_tag[8]);
pcercuei 0:df031b60ca29 131
pcercuei 0:df031b60ca29 132 int (*set_timeout)(struct iio_context *ctx, unsigned int timeout);
pcercuei 0:df031b60ca29 133 };
pcercuei 0:df031b60ca29 134
pcercuei 0:df031b60ca29 135 struct iio_context_pdata;
pcercuei 0:df031b60ca29 136 struct iio_device_pdata;
pcercuei 0:df031b60ca29 137 struct iio_channel_pdata;
pcercuei 0:df031b60ca29 138 struct iio_scan_backend_context;
pcercuei 0:df031b60ca29 139
pcercuei 0:df031b60ca29 140 struct iio_channel_attr {
pcercuei 0:df031b60ca29 141 char *name;
pcercuei 0:df031b60ca29 142 char *filename;
pcercuei 0:df031b60ca29 143 };
pcercuei 0:df031b60ca29 144
pcercuei 0:df031b60ca29 145 struct iio_context {
pcercuei 0:df031b60ca29 146 struct iio_context_pdata *pdata;
pcercuei 0:df031b60ca29 147 const struct iio_backend_ops *ops;
pcercuei 0:df031b60ca29 148 const char *name;
pcercuei 0:df031b60ca29 149 char *description;
pcercuei 0:df031b60ca29 150
pcercuei 0:df031b60ca29 151 struct iio_device **devices;
pcercuei 0:df031b60ca29 152 unsigned int nb_devices;
pcercuei 0:df031b60ca29 153
pcercuei 0:df031b60ca29 154 char *xml;
pcercuei 3:d147beabba0e 155
pcercuei 3:d147beabba0e 156 char **attrs;
pcercuei 3:d147beabba0e 157 char **values;
pcercuei 3:d147beabba0e 158 unsigned int nb_attrs;
pcercuei 0:df031b60ca29 159 };
pcercuei 0:df031b60ca29 160
pcercuei 0:df031b60ca29 161 struct iio_channel {
pcercuei 0:df031b60ca29 162 struct iio_device *dev;
pcercuei 0:df031b60ca29 163 struct iio_channel_pdata *pdata;
pcercuei 0:df031b60ca29 164 void *userdata;
pcercuei 0:df031b60ca29 165
pcercuei 0:df031b60ca29 166 bool is_output;
pcercuei 0:df031b60ca29 167 bool is_scan_element;
pcercuei 0:df031b60ca29 168 struct iio_data_format format;
pcercuei 0:df031b60ca29 169 char *name, *id;
pcercuei 0:df031b60ca29 170 long index;
pcercuei 0:df031b60ca29 171 enum iio_modifier modifier;
pcercuei 0:df031b60ca29 172 enum iio_chan_type type;
pcercuei 0:df031b60ca29 173
pcercuei 0:df031b60ca29 174 struct iio_channel_attr *attrs;
pcercuei 0:df031b60ca29 175 unsigned int nb_attrs;
pcercuei 0:df031b60ca29 176 };
pcercuei 0:df031b60ca29 177
pcercuei 0:df031b60ca29 178 struct iio_device {
pcercuei 0:df031b60ca29 179 const struct iio_context *ctx;
pcercuei 0:df031b60ca29 180 struct iio_device_pdata *pdata;
pcercuei 0:df031b60ca29 181 void *userdata;
pcercuei 0:df031b60ca29 182
pcercuei 0:df031b60ca29 183 char *name, *id;
pcercuei 0:df031b60ca29 184
pcercuei 0:df031b60ca29 185 char **attrs;
pcercuei 0:df031b60ca29 186 unsigned int nb_attrs;
pcercuei 0:df031b60ca29 187
pcercuei 0:df031b60ca29 188 char **debug_attrs;
pcercuei 0:df031b60ca29 189 unsigned int nb_debug_attrs;
pcercuei 0:df031b60ca29 190
pcercuei 0:df031b60ca29 191 struct iio_channel **channels;
pcercuei 0:df031b60ca29 192 unsigned int nb_channels;
pcercuei 0:df031b60ca29 193
pcercuei 0:df031b60ca29 194 uint32_t *mask;
pcercuei 0:df031b60ca29 195 size_t words;
pcercuei 0:df031b60ca29 196 };
pcercuei 0:df031b60ca29 197
pcercuei 0:df031b60ca29 198 struct iio_buffer {
pcercuei 0:df031b60ca29 199 const struct iio_device *dev;
pcercuei 0:df031b60ca29 200 void *buffer, *userdata;
pcercuei 0:df031b60ca29 201 size_t length, data_length;
pcercuei 0:df031b60ca29 202
pcercuei 0:df031b60ca29 203 uint32_t *mask;
pcercuei 0:df031b60ca29 204 unsigned int dev_sample_size;
pcercuei 0:df031b60ca29 205 unsigned int sample_size;
pcercuei 0:df031b60ca29 206 bool is_output, dev_is_high_speed;
pcercuei 0:df031b60ca29 207 };
pcercuei 0:df031b60ca29 208
pcercuei 0:df031b60ca29 209 struct iio_context_info {
pcercuei 0:df031b60ca29 210 char *description;
pcercuei 0:df031b60ca29 211 char *uri;
pcercuei 0:df031b60ca29 212 };
pcercuei 0:df031b60ca29 213
pcercuei 0:df031b60ca29 214 struct iio_scan_result {
pcercuei 0:df031b60ca29 215 size_t size;
pcercuei 0:df031b60ca29 216 struct iio_context_info **info;
pcercuei 0:df031b60ca29 217 };
pcercuei 0:df031b60ca29 218
pcercuei 0:df031b60ca29 219 struct iio_context_info ** iio_scan_result_add(
pcercuei 0:df031b60ca29 220 struct iio_scan_result *scan_result, size_t num);
pcercuei 0:df031b60ca29 221
pcercuei 0:df031b60ca29 222 void free_channel(struct iio_channel *chn);
pcercuei 0:df031b60ca29 223 void free_device(struct iio_device *dev);
pcercuei 0:df031b60ca29 224
pcercuei 0:df031b60ca29 225 char *iio_channel_get_xml(const struct iio_channel *chn, size_t *len);
pcercuei 0:df031b60ca29 226 char *iio_device_get_xml(const struct iio_device *dev, size_t *len);
pcercuei 0:df031b60ca29 227
pcercuei 0:df031b60ca29 228 char *iio_context_create_xml(const struct iio_context *ctx);
pcercuei 0:df031b60ca29 229 int iio_context_init(struct iio_context *ctx);
pcercuei 0:df031b60ca29 230
pcercuei 0:df031b60ca29 231 bool iio_device_is_tx(const struct iio_device *dev);
pcercuei 0:df031b60ca29 232 int iio_device_open(const struct iio_device *dev,
pcercuei 0:df031b60ca29 233 size_t samples_count, bool cyclic);
pcercuei 0:df031b60ca29 234 int iio_device_close(const struct iio_device *dev);
pcercuei 0:df031b60ca29 235 int iio_device_set_blocking_mode(const struct iio_device *dev, bool blocking);
pcercuei 0:df031b60ca29 236 ssize_t iio_device_read_raw(const struct iio_device *dev,
pcercuei 0:df031b60ca29 237 void *dst, size_t len, uint32_t *mask, size_t words);
pcercuei 0:df031b60ca29 238 ssize_t iio_device_write_raw(const struct iio_device *dev,
pcercuei 0:df031b60ca29 239 const void *src, size_t len);
pcercuei 0:df031b60ca29 240 int iio_device_get_poll_fd(const struct iio_device *dev);
pcercuei 0:df031b60ca29 241
pcercuei 0:df031b60ca29 242 int read_double(const char *str, double *val);
pcercuei 0:df031b60ca29 243 int write_double(char *buf, size_t len, double val);
pcercuei 0:df031b60ca29 244
pcercuei 0:df031b60ca29 245 struct iio_context * local_create_context(void);
pcercuei 0:df031b60ca29 246 struct iio_context * network_create_context(const char *hostname);
pcercuei 0:df031b60ca29 247 struct iio_context * xml_create_context_mem(const char *xml, size_t len);
pcercuei 0:df031b60ca29 248 struct iio_context * xml_create_context(const char *xml_file);
pcercuei 0:df031b60ca29 249 struct iio_context * usb_create_context(unsigned int bus, unsigned int address,
pcercuei 0:df031b60ca29 250 unsigned int interface);
pcercuei 0:df031b60ca29 251 struct iio_context * usb_create_context_from_uri(const char *uri);
pcercuei 0:df031b60ca29 252 struct iio_context * serial_create_context_from_uri(const char *uri);
pcercuei 0:df031b60ca29 253
pcercuei 0:df031b60ca29 254 int local_context_scan(struct iio_scan_result *scan_result);
pcercuei 0:df031b60ca29 255
pcercuei 0:df031b60ca29 256 struct iio_scan_backend_context * usb_context_scan_init(void);
pcercuei 0:df031b60ca29 257 void usb_context_scan_free(struct iio_scan_backend_context *ctx);
pcercuei 0:df031b60ca29 258
pcercuei 0:df031b60ca29 259 int usb_context_scan(struct iio_scan_backend_context *ctx,
pcercuei 0:df031b60ca29 260 struct iio_scan_result *scan_result);
pcercuei 0:df031b60ca29 261
pcercuei 0:df031b60ca29 262 /* This function is not part of the API, but is used by the IIO daemon */
pcercuei 0:df031b60ca29 263 __api ssize_t iio_device_get_sample_size_mask(const struct iio_device *dev,
pcercuei 0:df031b60ca29 264 const uint32_t *mask, size_t words);
pcercuei 0:df031b60ca29 265
pcercuei 0:df031b60ca29 266 void iio_channel_init_finalize(struct iio_channel *chn);
pcercuei 0:df031b60ca29 267 unsigned int find_channel_modifier(const char *s, size_t *len_p);
pcercuei 0:df031b60ca29 268
pcercuei 0:df031b60ca29 269 char *iio_strdup(const char *str);
pcercuei 0:df031b60ca29 270
pcercuei 3:d147beabba0e 271 int iio_context_add_attr(struct iio_context *ctx,
pcercuei 3:d147beabba0e 272 const char *key, const char *value);
pcercuei 3:d147beabba0e 273
pcercuei 0:df031b60ca29 274 #undef __api
pcercuei 0:df031b60ca29 275
pcercuei 0:df031b60ca29 276 #endif /* __IIO_PRIVATE_H__ */
pcercuei 0:df031b60ca29 277