blob: 64cb9314ad268e442299a369c0804f3c7590336f [file] [log] [blame]
Paul Cercueilbb4401d2014-02-28 16:10:49 +01001/*
2 * libiio - Library for interfacing industrial I/O (IIO) devices
3 *
4 * Copyright (C) 2014 Analog Devices, Inc.
5 * Author: Paul Cercueil <paul.cercueil@analog.com>
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * */
18
Paul Cercueil0b2ce712014-02-17 15:04:18 +010019#ifndef __IIO_PRIVATE_H__
20#define __IIO_PRIVATE_H__
21
Paul Cercueil00236242014-02-18 15:09:06 +010022/* Include public interface */
Paul Cercueil0b2ce712014-02-17 15:04:18 +010023#include "iio.h"
24
25#include <stdbool.h>
26
Paul Cercueil1ab707c2016-02-09 17:12:25 +010027#ifdef _MSC_BUILD
Paul Cercueil1fef1a52014-04-07 16:31:15 +020028#define snprintf sprintf_s
Lars-Peter Clausend1be8382016-02-24 11:13:45 +010029#define inline __inline
Paul Cercueil1ab707c2016-02-09 17:12:25 +010030#endif
31#ifdef _WIN32
Paul Cercueil1fef1a52014-04-07 16:31:15 +020032#define strerror_r(err, buf, len) strerror_s(buf, len, err)
33#endif
34
Paul Cercueil65f90e42016-02-25 16:00:10 +010035#ifdef _WIN32
36# ifdef LIBIIO_EXPORTS
37# define __api __declspec(dllexport)
38# else
39# define __api __declspec(dllimport)
40# endif
41#elif __GNUC__ >= 4
42# define __api __attribute__((visibility ("default")))
43#else
44# define __api
45#endif
46
Matt Fornero10c541a2016-12-15 15:37:56 -080047#ifdef WITH_MATLAB_BINDINGS_API
48#include "bindings/matlab/iio-wrapper.h"
49#endif
50
Paul Cercueil0967b1c2015-04-20 11:55:47 +020051#define ARRAY_SIZE(x) (sizeof(x) ? sizeof(x) / sizeof((x)[0]) : 0)
52#define BIT(x) (1 << (x))
53#define BIT_MASK(bit) BIT((bit) % 32)
Paul Cercueile1311222014-03-12 15:46:16 +010054#define BIT_WORD(bit) ((bit) / 32)
55#define TEST_BIT(addr, bit) (!!(*(((uint32_t *) addr) + BIT_WORD(bit)) \
56 & BIT_MASK(bit)))
57#define SET_BIT(addr, bit) \
58 *(((uint32_t *) addr) + BIT_WORD(bit)) |= BIT_MASK(bit)
59#define CLEAR_BIT(addr, bit) \
60 *(((uint32_t *) addr) + BIT_WORD(bit)) &= ~BIT_MASK(bit)
61
Paul Cercueil2042c902016-04-25 18:43:45 +020062
63/* ntohl/htonl are a nightmare to use in cross-platform applications,
64 * since they are defined in different headers on different platforms.
65 * iio_be32toh/iio_htobe32 are just clones of ntohl/htonl. */
66static inline uint32_t iio_be32toh(uint32_t word)
67{
68#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
69#ifdef __GNUC__
70 return __builtin_bswap32(word);
71#else
72 return ((word & 0xff) << 24) | ((word & 0xff00) << 8) |
73 ((word >> 8) & 0xff00) | ((word >> 24) & 0xff);
74#endif
75#else
76 return word;
77#endif
78}
79
80static inline uint32_t iio_htobe32(uint32_t word)
81{
82 return iio_be32toh(word);
83}
84
Lars-Peter Clausend1be8382016-02-24 11:13:45 +010085/* Allocate zeroed out memory */
86static inline void *zalloc(size_t size)
87{
88 return calloc(1, size);
89}
90
Paul Cercueil0b2ce712014-02-17 15:04:18 +010091struct iio_backend_ops {
Paul Cercueil63d5e7c2014-10-28 14:33:08 +010092 struct iio_context * (*clone)(const struct iio_context *ctx);
Paul Cercueil45c575d2014-03-20 15:14:01 +010093 ssize_t (*read)(const struct iio_device *dev, void *dst, size_t len,
94 uint32_t *mask, size_t words);
Paul Cercueilec1760d2014-02-21 11:31:20 +010095 ssize_t (*write)(const struct iio_device *dev,
96 const void *src, size_t len);
Paul Cercueil92f15c22015-04-20 11:36:51 +020097 int (*open)(const struct iio_device *dev,
98 size_t samples_count, bool cyclic);
Paul Cercueilec1760d2014-02-21 11:31:20 +010099 int (*close)(const struct iio_device *dev);
Romain Roffé6a881702015-06-30 16:25:43 +0200100 int (*get_fd)(const struct iio_device *dev);
Romain Roffé0ea038d2015-06-30 13:35:38 +0200101 int (*set_blocking_mode)(const struct iio_device *dev, bool blocking);
Paul Cercueil0b2ce712014-02-17 15:04:18 +0100102
Lars-Peter Clausen48c01602016-04-20 13:10:05 +0200103 void (*cancel)(const struct iio_device *dev);
104
Romain Roffé6c385d92015-06-30 13:36:05 +0200105 int (*set_kernel_buffers_count)(const struct iio_device *dev,
106 unsigned int nb_blocks);
Paul Cercueil93f7e1f2014-04-23 16:49:56 +0200107 ssize_t (*get_buffer)(const struct iio_device *dev,
Paul Cercueil76ca8842015-03-05 11:16:16 +0100108 void **addr_ptr, size_t bytes_used,
109 uint32_t *mask, size_t words);
Paul Cercueil93f7e1f2014-04-23 16:49:56 +0200110
Paul Cercueil167d3112014-02-18 12:23:53 +0100111 ssize_t (*read_device_attr)(const struct iio_device *dev,
Paul Cercueil50c762a2014-04-14 15:55:43 +0200112 const char *attr, char *dst, size_t len, bool is_debug);
Paul Cercueil167d3112014-02-18 12:23:53 +0100113 ssize_t (*write_device_attr)(const struct iio_device *dev,
Paul Cercueilcecda352014-05-06 18:14:29 +0200114 const char *attr, const char *src,
115 size_t len, bool is_debug);
Paul Cercueil167d3112014-02-18 12:23:53 +0100116 ssize_t (*read_channel_attr)(const struct iio_channel *chn,
117 const char *attr, char *dst, size_t len);
118 ssize_t (*write_channel_attr)(const struct iio_channel *chn,
Paul Cercueilcecda352014-05-06 18:14:29 +0200119 const char *attr, const char *src, size_t len);
Paul Cercueil0b2ce712014-02-17 15:04:18 +0100120
Paul Cercueil24ffa532014-03-10 12:39:58 +0100121 int (*get_trigger)(const struct iio_device *dev,
122 const struct iio_device **trigger);
123 int (*set_trigger)(const struct iio_device *dev,
124 const struct iio_device *trigger);
125
Paul Cercueil0b2ce712014-02-17 15:04:18 +0100126 void (*shutdown)(struct iio_context *ctx);
Paul Cercueile45f8762014-05-02 11:19:26 +0200127
Paul Cercueil9de9e9d2014-05-20 13:18:19 +0200128 int (*get_version)(const struct iio_context *ctx, unsigned int *major,
129 unsigned int *minor, char git_tag[8]);
Paul Cercueil4ca73542014-06-10 16:23:29 +0200130
131 int (*set_timeout)(struct iio_context *ctx, unsigned int timeout);
Paul Cercueil0b2ce712014-02-17 15:04:18 +0100132};
133
Paul Cercueil82b3c1c2014-02-24 13:15:56 +0100134struct iio_context_pdata;
Paul Cercueileaab6582014-02-21 09:35:59 +0100135struct iio_device_pdata;
136struct iio_channel_pdata;
Lars-Peter Clausen794ba032016-04-25 15:07:00 +0200137struct iio_scan_backend_context;
Paul Cercueil82b3c1c2014-02-24 13:15:56 +0100138
Paul Cercueilb34e0222014-05-05 15:32:38 +0200139struct iio_channel_attr {
140 char *name;
Paul Cercueil42d12352014-05-05 16:11:58 +0200141 char *filename;
Paul Cercueilb34e0222014-05-05 15:32:38 +0200142};
143
Paul Cercueil0b2ce712014-02-17 15:04:18 +0100144struct iio_context {
Paul Cercueil82b3c1c2014-02-24 13:15:56 +0100145 struct iio_context_pdata *pdata;
Paul Cercueil0b2ce712014-02-17 15:04:18 +0100146 const struct iio_backend_ops *ops;
Paul Cercueil0b2ce712014-02-17 15:04:18 +0100147 const char *name;
Paul Cercueil3ac36c12015-01-08 14:44:00 +0100148 char *description;
Paul Cercueil0b2ce712014-02-17 15:04:18 +0100149
150 struct iio_device **devices;
151 unsigned int nb_devices;
Paul Cercueil4c6729d2014-04-04 17:24:41 +0200152
153 char *xml;
Paul Cercueil60b4d1b2016-11-15 15:55:41 +0100154
155 char **attrs;
156 char **values;
157 unsigned int nb_attrs;
Paul Cercueil0b2ce712014-02-17 15:04:18 +0100158};
159
Paul Cercueil0b2ce712014-02-17 15:04:18 +0100160struct iio_channel {
Paul Cercueileaab6582014-02-21 09:35:59 +0100161 struct iio_device *dev;
162 struct iio_channel_pdata *pdata;
Paul Cercueild96e61f2014-03-07 16:13:37 +0100163 void *userdata;
Paul Cercueileaab6582014-02-21 09:35:59 +0100164
Paul Cercueil35a01312014-02-20 10:56:57 +0100165 bool is_output;
Paul Cercueil85aaf482014-04-24 16:39:09 +0200166 bool is_scan_element;
Paul Cercueilcd6ce842014-03-14 13:21:06 +0100167 struct iio_data_format format;
Paul Cercueilbb618272014-02-20 11:35:52 +0100168 char *name, *id;
Paul Cercueilae88fde2014-03-12 11:47:10 +0100169 long index;
Lars-Peter Clausen093ae462016-06-21 11:43:54 +0200170 enum iio_modifier modifier;
Lars-Peter Clausenc6f85922016-04-20 15:03:49 +0200171 enum iio_chan_type type;
Paul Cercueil0b2ce712014-02-17 15:04:18 +0100172
Paul Cercueilb34e0222014-05-05 15:32:38 +0200173 struct iio_channel_attr *attrs;
Paul Cercueil0b2ce712014-02-17 15:04:18 +0100174 unsigned int nb_attrs;
175};
176
177struct iio_device {
178 const struct iio_context *ctx;
Paul Cercueileaab6582014-02-21 09:35:59 +0100179 struct iio_device_pdata *pdata;
Paul Cercueild96e61f2014-03-07 16:13:37 +0100180 void *userdata;
Paul Cercueileaab6582014-02-21 09:35:59 +0100181
Paul Cercueilbb618272014-02-20 11:35:52 +0100182 char *name, *id;
Paul Cercueil0b2ce712014-02-17 15:04:18 +0100183
Paul Cercueilbb618272014-02-20 11:35:52 +0100184 char **attrs;
Paul Cercueil0b2ce712014-02-17 15:04:18 +0100185 unsigned int nb_attrs;
186
Paul Cercueilddaa26a2014-04-14 17:32:18 +0200187 char **debug_attrs;
188 unsigned int nb_debug_attrs;
189
Paul Cercueil0b2ce712014-02-17 15:04:18 +0100190 struct iio_channel **channels;
191 unsigned int nb_channels;
Paul Cercueilff778232014-03-24 14:23:08 +0100192
193 uint32_t *mask;
194 size_t words;
Paul Cercueil0b2ce712014-02-17 15:04:18 +0100195};
196
Paul Cercueila689cd92014-03-20 16:37:25 +0100197struct iio_buffer {
198 const struct iio_device *dev;
Paul Cercueila2d4bad2014-05-27 10:15:29 +0200199 void *buffer, *userdata;
Paul Cercueila689cd92014-03-20 16:37:25 +0100200 size_t length, data_length;
201
Paul Cercueil645ab972014-03-24 14:36:12 +0100202 uint32_t *mask;
Paul Cercueil9e5301d2014-11-19 15:34:28 +0100203 unsigned int dev_sample_size;
Paul Cercueila689cd92014-03-20 16:37:25 +0100204 unsigned int sample_size;
Paul Cercueil2a74bd72014-04-28 13:18:48 +0200205 bool is_output, dev_is_high_speed;
Paul Cercueila689cd92014-03-20 16:37:25 +0100206};
207
Lars-Peter Clausen08633732016-02-22 14:35:17 +0100208struct iio_context_info {
209 char *description;
210 char *uri;
211};
212
213struct iio_scan_result {
214 size_t size;
215 struct iio_context_info **info;
216};
217
218struct iio_context_info ** iio_scan_result_add(
219 struct iio_scan_result *scan_result, size_t num);
220
Paul Cercueil00236242014-02-18 15:09:06 +0100221void free_channel(struct iio_channel *chn);
222void free_device(struct iio_device *dev);
Paul Cercueil0b2ce712014-02-17 15:04:18 +0100223
Paul Cercueil42090d12014-02-24 12:32:23 +0100224char *iio_channel_get_xml(const struct iio_channel *chn, size_t *len);
225char *iio_device_get_xml(const struct iio_device *dev, size_t *len);
226
Paul Cercueilc1ed8482014-06-11 16:29:43 +0200227char *iio_context_create_xml(const struct iio_context *ctx);
Paul Cercueilfd387472015-08-05 10:34:19 +0200228int iio_context_init(struct iio_context *ctx);
Paul Cercueilae88fde2014-03-12 11:47:10 +0100229
Lars-Peter Clausen62bd5522015-03-27 16:06:52 +0100230bool iio_device_is_tx(const struct iio_device *dev);
Paul Cercueil6d3fb8d2014-05-27 10:04:00 +0200231int iio_device_open(const struct iio_device *dev,
232 size_t samples_count, bool cyclic);
233int iio_device_close(const struct iio_device *dev);
Romain Roffécead1da2015-06-30 13:35:51 +0200234int iio_device_set_blocking_mode(const struct iio_device *dev, bool blocking);
Paul Cercueil6d3fb8d2014-05-27 10:04:00 +0200235ssize_t iio_device_read_raw(const struct iio_device *dev,
236 void *dst, size_t len, uint32_t *mask, size_t words);
237ssize_t iio_device_write_raw(const struct iio_device *dev,
238 const void *src, size_t len);
Romain Roffé6a881702015-06-30 16:25:43 +0200239int iio_device_get_poll_fd(const struct iio_device *dev);
Paul Cercueil6d3fb8d2014-05-27 10:04:00 +0200240
Paul Cercueil542cbb42014-10-21 13:00:38 +0200241int read_double(const char *str, double *val);
Paul Cercueil225a3e12015-03-03 18:08:41 +0100242int write_double(char *buf, size_t len, double val);
Paul Cercueil542cbb42014-10-21 13:00:38 +0200243
Paul Cercueil63e52182014-12-11 12:52:48 +0100244struct iio_context * local_create_context(void);
245struct iio_context * network_create_context(const char *hostname);
246struct iio_context * xml_create_context_mem(const char *xml, size_t len);
247struct iio_context * xml_create_context(const char *xml_file);
Lars-Peter Clausen7a8e6b52016-02-22 13:25:12 +0100248struct iio_context * usb_create_context(unsigned int bus, unsigned int address,
249 unsigned int interface);
Lars-Peter Clausen60f1c9a2016-02-22 13:20:40 +0100250struct iio_context * usb_create_context_from_uri(const char *uri);
Paul Cercueilbcb04522016-03-22 17:03:29 +0100251struct iio_context * serial_create_context_from_uri(const char *uri);
Paul Cercueil63e52182014-12-11 12:52:48 +0100252
Lars-Peter Clausen3db58d62016-04-25 15:00:54 +0200253int local_context_scan(struct iio_scan_result *scan_result);
254
Lars-Peter Clausen794ba032016-04-25 15:07:00 +0200255struct iio_scan_backend_context * usb_context_scan_init(void);
256void usb_context_scan_free(struct iio_scan_backend_context *ctx);
257
258int usb_context_scan(struct iio_scan_backend_context *ctx,
259 struct iio_scan_result *scan_result);
260
Paul Cercueile98500b2014-04-10 13:31:04 +0200261/* This function is not part of the API, but is used by the IIO daemon */
Paul Cercueil59f2aa32014-04-04 16:28:51 +0200262__api ssize_t iio_device_get_sample_size_mask(const struct iio_device *dev,
Paul Cercueil92f15c22015-04-20 11:36:51 +0200263 const uint32_t *mask, size_t words);
Paul Cercueil46825942014-03-18 14:28:49 +0100264
Lars-Peter Clausenc6f85922016-04-20 15:03:49 +0200265void iio_channel_init_finalize(struct iio_channel *chn);
Lars-Peter Clausen093ae462016-06-21 11:43:54 +0200266unsigned int find_channel_modifier(const char *s, size_t *len_p);
Lars-Peter Clausenc6f85922016-04-20 15:03:49 +0200267
Paul Cercueilcaf0e712016-08-25 17:27:02 +0200268char *iio_strdup(const char *str);
269
Paul Cercueila09970b2016-11-24 17:30:07 +0100270int iio_context_add_attr(struct iio_context *ctx,
271 const char *key, const char *value);
272
Paul Cercueil65f90e42016-02-25 16:00:10 +0100273#undef __api
274
Paul Cercueil0b2ce712014-02-17 15:04:18 +0100275#endif /* __IIO_PRIVATE_H__ */