Paul Cercueil / libiio

Dependencies:   libserialport libxml2

Committer:
pcercuei
Date:
Thu Aug 25 15:54:09 2016 +0000
Revision:
0:df031b60ca29
Child:
3:d147beabba0e
Add first version of libiio, from upsteam commit 775b9f6 unmodified.

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 0:df031b60ca29 25 #include <stdbool.h>
pcercuei 0:df031b60ca29 26
pcercuei 0:df031b60ca29 27 #ifdef _MSC_BUILD
pcercuei 0:df031b60ca29 28 #define snprintf sprintf_s
pcercuei 0:df031b60ca29 29 #define inline __inline
pcercuei 0:df031b60ca29 30 #endif
pcercuei 0:df031b60ca29 31 #ifdef _WIN32
pcercuei 0:df031b60ca29 32 #define strerror_r(err, buf, len) strerror_s(buf, len, err)
pcercuei 0:df031b60ca29 33 #endif
pcercuei 0:df031b60ca29 34
pcercuei 0:df031b60ca29 35 #ifdef _WIN32
pcercuei 0:df031b60ca29 36 # ifdef LIBIIO_EXPORTS
pcercuei 0:df031b60ca29 37 # define __api __declspec(dllexport)
pcercuei 0:df031b60ca29 38 # else
pcercuei 0:df031b60ca29 39 # define __api __declspec(dllimport)
pcercuei 0:df031b60ca29 40 # endif
pcercuei 0:df031b60ca29 41 #elif __GNUC__ >= 4
pcercuei 0:df031b60ca29 42 # define __api __attribute__((visibility ("default")))
pcercuei 0:df031b60ca29 43 #else
pcercuei 0:df031b60ca29 44 # define __api
pcercuei 0:df031b60ca29 45 #endif
pcercuei 0:df031b60ca29 46
pcercuei 0:df031b60ca29 47 #define ARRAY_SIZE(x) (sizeof(x) ? sizeof(x) / sizeof((x)[0]) : 0)
pcercuei 0:df031b60ca29 48 #define BIT(x) (1 << (x))
pcercuei 0:df031b60ca29 49 #define BIT_MASK(bit) BIT((bit) % 32)
pcercuei 0:df031b60ca29 50 #define BIT_WORD(bit) ((bit) / 32)
pcercuei 0:df031b60ca29 51 #define TEST_BIT(addr, bit) (!!(*(((uint32_t *) addr) + BIT_WORD(bit)) \
pcercuei 0:df031b60ca29 52 & BIT_MASK(bit)))
pcercuei 0:df031b60ca29 53 #define SET_BIT(addr, bit) \
pcercuei 0:df031b60ca29 54 *(((uint32_t *) addr) + BIT_WORD(bit)) |= BIT_MASK(bit)
pcercuei 0:df031b60ca29 55 #define CLEAR_BIT(addr, bit) \
pcercuei 0:df031b60ca29 56 *(((uint32_t *) addr) + BIT_WORD(bit)) &= ~BIT_MASK(bit)
pcercuei 0:df031b60ca29 57
pcercuei 0:df031b60ca29 58
pcercuei 0:df031b60ca29 59 /* ntohl/htonl are a nightmare to use in cross-platform applications,
pcercuei 0:df031b60ca29 60 * since they are defined in different headers on different platforms.
pcercuei 0:df031b60ca29 61 * iio_be32toh/iio_htobe32 are just clones of ntohl/htonl. */
pcercuei 0:df031b60ca29 62 static inline uint32_t iio_be32toh(uint32_t word)
pcercuei 0:df031b60ca29 63 {
pcercuei 0:df031b60ca29 64 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
pcercuei 0:df031b60ca29 65 #ifdef __GNUC__
pcercuei 0:df031b60ca29 66 return __builtin_bswap32(word);
pcercuei 0:df031b60ca29 67 #else
pcercuei 0:df031b60ca29 68 return ((word & 0xff) << 24) | ((word & 0xff00) << 8) |
pcercuei 0:df031b60ca29 69 ((word >> 8) & 0xff00) | ((word >> 24) & 0xff);
pcercuei 0:df031b60ca29 70 #endif
pcercuei 0:df031b60ca29 71 #else
pcercuei 0:df031b60ca29 72 return word;
pcercuei 0:df031b60ca29 73 #endif
pcercuei 0:df031b60ca29 74 }
pcercuei 0:df031b60ca29 75
pcercuei 0:df031b60ca29 76 static inline uint32_t iio_htobe32(uint32_t word)
pcercuei 0:df031b60ca29 77 {
pcercuei 0:df031b60ca29 78 return iio_be32toh(word);
pcercuei 0:df031b60ca29 79 }
pcercuei 0:df031b60ca29 80
pcercuei 0:df031b60ca29 81 /* Allocate zeroed out memory */
pcercuei 0:df031b60ca29 82 static inline void *zalloc(size_t size)
pcercuei 0:df031b60ca29 83 {
pcercuei 0:df031b60ca29 84 return calloc(1, size);
pcercuei 0:df031b60ca29 85 }
pcercuei 0:df031b60ca29 86
pcercuei 0:df031b60ca29 87 struct iio_backend_ops {
pcercuei 0:df031b60ca29 88 struct iio_context * (*clone)(const struct iio_context *ctx);
pcercuei 0:df031b60ca29 89 ssize_t (*read)(const struct iio_device *dev, void *dst, size_t len,
pcercuei 0:df031b60ca29 90 uint32_t *mask, size_t words);
pcercuei 0:df031b60ca29 91 ssize_t (*write)(const struct iio_device *dev,
pcercuei 0:df031b60ca29 92 const void *src, size_t len);
pcercuei 0:df031b60ca29 93 int (*open)(const struct iio_device *dev,
pcercuei 0:df031b60ca29 94 size_t samples_count, bool cyclic);
pcercuei 0:df031b60ca29 95 int (*close)(const struct iio_device *dev);
pcercuei 0:df031b60ca29 96 int (*get_fd)(const struct iio_device *dev);
pcercuei 0:df031b60ca29 97 int (*set_blocking_mode)(const struct iio_device *dev, bool blocking);
pcercuei 0:df031b60ca29 98
pcercuei 0:df031b60ca29 99 void (*cancel)(const struct iio_device *dev);
pcercuei 0:df031b60ca29 100
pcercuei 0:df031b60ca29 101 int (*set_kernel_buffers_count)(const struct iio_device *dev,
pcercuei 0:df031b60ca29 102 unsigned int nb_blocks);
pcercuei 0:df031b60ca29 103 ssize_t (*get_buffer)(const struct iio_device *dev,
pcercuei 0:df031b60ca29 104 void **addr_ptr, size_t bytes_used,
pcercuei 0:df031b60ca29 105 uint32_t *mask, size_t words);
pcercuei 0:df031b60ca29 106
pcercuei 0:df031b60ca29 107 ssize_t (*read_device_attr)(const struct iio_device *dev,
pcercuei 0:df031b60ca29 108 const char *attr, char *dst, size_t len, bool is_debug);
pcercuei 0:df031b60ca29 109 ssize_t (*write_device_attr)(const struct iio_device *dev,
pcercuei 0:df031b60ca29 110 const char *attr, const char *src,
pcercuei 0:df031b60ca29 111 size_t len, bool is_debug);
pcercuei 0:df031b60ca29 112 ssize_t (*read_channel_attr)(const struct iio_channel *chn,
pcercuei 0:df031b60ca29 113 const char *attr, char *dst, size_t len);
pcercuei 0:df031b60ca29 114 ssize_t (*write_channel_attr)(const struct iio_channel *chn,
pcercuei 0:df031b60ca29 115 const char *attr, const char *src, size_t len);
pcercuei 0:df031b60ca29 116
pcercuei 0:df031b60ca29 117 int (*get_trigger)(const struct iio_device *dev,
pcercuei 0:df031b60ca29 118 const struct iio_device **trigger);
pcercuei 0:df031b60ca29 119 int (*set_trigger)(const struct iio_device *dev,
pcercuei 0:df031b60ca29 120 const struct iio_device *trigger);
pcercuei 0:df031b60ca29 121
pcercuei 0:df031b60ca29 122 void (*shutdown)(struct iio_context *ctx);
pcercuei 0:df031b60ca29 123
pcercuei 0:df031b60ca29 124 int (*get_version)(const struct iio_context *ctx, unsigned int *major,
pcercuei 0:df031b60ca29 125 unsigned int *minor, char git_tag[8]);
pcercuei 0:df031b60ca29 126
pcercuei 0:df031b60ca29 127 int (*set_timeout)(struct iio_context *ctx, unsigned int timeout);
pcercuei 0:df031b60ca29 128 };
pcercuei 0:df031b60ca29 129
pcercuei 0:df031b60ca29 130 struct iio_context_pdata;
pcercuei 0:df031b60ca29 131 struct iio_device_pdata;
pcercuei 0:df031b60ca29 132 struct iio_channel_pdata;
pcercuei 0:df031b60ca29 133 struct iio_scan_backend_context;
pcercuei 0:df031b60ca29 134
pcercuei 0:df031b60ca29 135 struct iio_channel_attr {
pcercuei 0:df031b60ca29 136 char *name;
pcercuei 0:df031b60ca29 137 char *filename;
pcercuei 0:df031b60ca29 138 };
pcercuei 0:df031b60ca29 139
pcercuei 0:df031b60ca29 140 struct iio_context {
pcercuei 0:df031b60ca29 141 struct iio_context_pdata *pdata;
pcercuei 0:df031b60ca29 142 const struct iio_backend_ops *ops;
pcercuei 0:df031b60ca29 143 const char *name;
pcercuei 0:df031b60ca29 144 char *description;
pcercuei 0:df031b60ca29 145
pcercuei 0:df031b60ca29 146 struct iio_device **devices;
pcercuei 0:df031b60ca29 147 unsigned int nb_devices;
pcercuei 0:df031b60ca29 148
pcercuei 0:df031b60ca29 149 char *xml;
pcercuei 0:df031b60ca29 150 };
pcercuei 0:df031b60ca29 151
pcercuei 0:df031b60ca29 152 struct iio_channel {
pcercuei 0:df031b60ca29 153 struct iio_device *dev;
pcercuei 0:df031b60ca29 154 struct iio_channel_pdata *pdata;
pcercuei 0:df031b60ca29 155 void *userdata;
pcercuei 0:df031b60ca29 156
pcercuei 0:df031b60ca29 157 bool is_output;
pcercuei 0:df031b60ca29 158 bool is_scan_element;
pcercuei 0:df031b60ca29 159 struct iio_data_format format;
pcercuei 0:df031b60ca29 160 char *name, *id;
pcercuei 0:df031b60ca29 161 long index;
pcercuei 0:df031b60ca29 162 enum iio_modifier modifier;
pcercuei 0:df031b60ca29 163 enum iio_chan_type type;
pcercuei 0:df031b60ca29 164
pcercuei 0:df031b60ca29 165 struct iio_channel_attr *attrs;
pcercuei 0:df031b60ca29 166 unsigned int nb_attrs;
pcercuei 0:df031b60ca29 167 };
pcercuei 0:df031b60ca29 168
pcercuei 0:df031b60ca29 169 struct iio_device {
pcercuei 0:df031b60ca29 170 const struct iio_context *ctx;
pcercuei 0:df031b60ca29 171 struct iio_device_pdata *pdata;
pcercuei 0:df031b60ca29 172 void *userdata;
pcercuei 0:df031b60ca29 173
pcercuei 0:df031b60ca29 174 char *name, *id;
pcercuei 0:df031b60ca29 175
pcercuei 0:df031b60ca29 176 char **attrs;
pcercuei 0:df031b60ca29 177 unsigned int nb_attrs;
pcercuei 0:df031b60ca29 178
pcercuei 0:df031b60ca29 179 char **debug_attrs;
pcercuei 0:df031b60ca29 180 unsigned int nb_debug_attrs;
pcercuei 0:df031b60ca29 181
pcercuei 0:df031b60ca29 182 struct iio_channel **channels;
pcercuei 0:df031b60ca29 183 unsigned int nb_channels;
pcercuei 0:df031b60ca29 184
pcercuei 0:df031b60ca29 185 uint32_t *mask;
pcercuei 0:df031b60ca29 186 size_t words;
pcercuei 0:df031b60ca29 187 };
pcercuei 0:df031b60ca29 188
pcercuei 0:df031b60ca29 189 struct iio_buffer {
pcercuei 0:df031b60ca29 190 const struct iio_device *dev;
pcercuei 0:df031b60ca29 191 void *buffer, *userdata;
pcercuei 0:df031b60ca29 192 size_t length, data_length;
pcercuei 0:df031b60ca29 193
pcercuei 0:df031b60ca29 194 uint32_t *mask;
pcercuei 0:df031b60ca29 195 unsigned int dev_sample_size;
pcercuei 0:df031b60ca29 196 unsigned int sample_size;
pcercuei 0:df031b60ca29 197 bool is_output, dev_is_high_speed;
pcercuei 0:df031b60ca29 198 };
pcercuei 0:df031b60ca29 199
pcercuei 0:df031b60ca29 200 struct iio_context_info {
pcercuei 0:df031b60ca29 201 char *description;
pcercuei 0:df031b60ca29 202 char *uri;
pcercuei 0:df031b60ca29 203 };
pcercuei 0:df031b60ca29 204
pcercuei 0:df031b60ca29 205 struct iio_scan_result {
pcercuei 0:df031b60ca29 206 size_t size;
pcercuei 0:df031b60ca29 207 struct iio_context_info **info;
pcercuei 0:df031b60ca29 208 };
pcercuei 0:df031b60ca29 209
pcercuei 0:df031b60ca29 210 struct iio_context_info ** iio_scan_result_add(
pcercuei 0:df031b60ca29 211 struct iio_scan_result *scan_result, size_t num);
pcercuei 0:df031b60ca29 212
pcercuei 0:df031b60ca29 213 void free_channel(struct iio_channel *chn);
pcercuei 0:df031b60ca29 214 void free_device(struct iio_device *dev);
pcercuei 0:df031b60ca29 215
pcercuei 0:df031b60ca29 216 char *iio_channel_get_xml(const struct iio_channel *chn, size_t *len);
pcercuei 0:df031b60ca29 217 char *iio_device_get_xml(const struct iio_device *dev, size_t *len);
pcercuei 0:df031b60ca29 218
pcercuei 0:df031b60ca29 219 char *iio_context_create_xml(const struct iio_context *ctx);
pcercuei 0:df031b60ca29 220 int iio_context_init(struct iio_context *ctx);
pcercuei 0:df031b60ca29 221
pcercuei 0:df031b60ca29 222 bool iio_device_is_tx(const struct iio_device *dev);
pcercuei 0:df031b60ca29 223 int iio_device_open(const struct iio_device *dev,
pcercuei 0:df031b60ca29 224 size_t samples_count, bool cyclic);
pcercuei 0:df031b60ca29 225 int iio_device_close(const struct iio_device *dev);
pcercuei 0:df031b60ca29 226 int iio_device_set_blocking_mode(const struct iio_device *dev, bool blocking);
pcercuei 0:df031b60ca29 227 ssize_t iio_device_read_raw(const struct iio_device *dev,
pcercuei 0:df031b60ca29 228 void *dst, size_t len, uint32_t *mask, size_t words);
pcercuei 0:df031b60ca29 229 ssize_t iio_device_write_raw(const struct iio_device *dev,
pcercuei 0:df031b60ca29 230 const void *src, size_t len);
pcercuei 0:df031b60ca29 231 int iio_device_get_poll_fd(const struct iio_device *dev);
pcercuei 0:df031b60ca29 232
pcercuei 0:df031b60ca29 233 int read_double(const char *str, double *val);
pcercuei 0:df031b60ca29 234 int write_double(char *buf, size_t len, double val);
pcercuei 0:df031b60ca29 235
pcercuei 0:df031b60ca29 236 struct iio_context * local_create_context(void);
pcercuei 0:df031b60ca29 237 struct iio_context * network_create_context(const char *hostname);
pcercuei 0:df031b60ca29 238 struct iio_context * xml_create_context_mem(const char *xml, size_t len);
pcercuei 0:df031b60ca29 239 struct iio_context * xml_create_context(const char *xml_file);
pcercuei 0:df031b60ca29 240 struct iio_context * usb_create_context(unsigned int bus, unsigned int address,
pcercuei 0:df031b60ca29 241 unsigned int interface);
pcercuei 0:df031b60ca29 242 struct iio_context * usb_create_context_from_uri(const char *uri);
pcercuei 0:df031b60ca29 243 struct iio_context * serial_create_context_from_uri(const char *uri);
pcercuei 0:df031b60ca29 244
pcercuei 0:df031b60ca29 245 int local_context_scan(struct iio_scan_result *scan_result);
pcercuei 0:df031b60ca29 246
pcercuei 0:df031b60ca29 247 struct iio_scan_backend_context * usb_context_scan_init(void);
pcercuei 0:df031b60ca29 248 void usb_context_scan_free(struct iio_scan_backend_context *ctx);
pcercuei 0:df031b60ca29 249
pcercuei 0:df031b60ca29 250 int usb_context_scan(struct iio_scan_backend_context *ctx,
pcercuei 0:df031b60ca29 251 struct iio_scan_result *scan_result);
pcercuei 0:df031b60ca29 252
pcercuei 0:df031b60ca29 253 /* This function is not part of the API, but is used by the IIO daemon */
pcercuei 0:df031b60ca29 254 __api ssize_t iio_device_get_sample_size_mask(const struct iio_device *dev,
pcercuei 0:df031b60ca29 255 const uint32_t *mask, size_t words);
pcercuei 0:df031b60ca29 256
pcercuei 0:df031b60ca29 257 void iio_channel_init_finalize(struct iio_channel *chn);
pcercuei 0:df031b60ca29 258 unsigned int find_channel_modifier(const char *s, size_t *len_p);
pcercuei 0:df031b60ca29 259
pcercuei 0:df031b60ca29 260 char *iio_strdup(const char *str);
pcercuei 0:df031b60ca29 261
pcercuei 0:df031b60ca29 262 #undef __api
pcercuei 0:df031b60ca29 263
pcercuei 0:df031b60ca29 264 #endif /* __IIO_PRIVATE_H__ */
pcercuei 0:df031b60ca29 265