blob: fe938aa3785328a9ef8aa294e3b37c6ecf8eb759 [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
Paul Cercueil0967b1c2015-04-20 11:55:47 +020047#define ARRAY_SIZE(x) (sizeof(x) ? sizeof(x) / sizeof((x)[0]) : 0)
48#define BIT(x) (1 << (x))
49#define BIT_MASK(bit) BIT((bit) % 32)
Paul Cercueile1311222014-03-12 15:46:16 +010050#define BIT_WORD(bit) ((bit) / 32)
51#define TEST_BIT(addr, bit) (!!(*(((uint32_t *) addr) + BIT_WORD(bit)) \
52 & BIT_MASK(bit)))
53#define SET_BIT(addr, bit) \
54 *(((uint32_t *) addr) + BIT_WORD(bit)) |= BIT_MASK(bit)
55#define CLEAR_BIT(addr, bit) \
56 *(((uint32_t *) addr) + BIT_WORD(bit)) &= ~BIT_MASK(bit)
57
Paul Cercueil2042c902016-04-25 18:43:45 +020058
59/* ntohl/htonl are a nightmare to use in cross-platform applications,
60 * since they are defined in different headers on different platforms.
61 * iio_be32toh/iio_htobe32 are just clones of ntohl/htonl. */
62static inline uint32_t iio_be32toh(uint32_t word)
63{
64#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
65#ifdef __GNUC__
66 return __builtin_bswap32(word);
67#else
68 return ((word & 0xff) << 24) | ((word & 0xff00) << 8) |
69 ((word >> 8) & 0xff00) | ((word >> 24) & 0xff);
70#endif
71#else
72 return word;
73#endif
74}
75
76static inline uint32_t iio_htobe32(uint32_t word)
77{
78 return iio_be32toh(word);
79}
80
Lars-Peter Clausend1be8382016-02-24 11:13:45 +010081/* Allocate zeroed out memory */
82static inline void *zalloc(size_t size)
83{
84 return calloc(1, size);
85}
86
Paul Cercueil0b2ce712014-02-17 15:04:18 +010087struct iio_backend_ops {
Paul Cercueil63d5e7c2014-10-28 14:33:08 +010088 struct iio_context * (*clone)(const struct iio_context *ctx);
Paul Cercueil45c575d2014-03-20 15:14:01 +010089 ssize_t (*read)(const struct iio_device *dev, void *dst, size_t len,
90 uint32_t *mask, size_t words);
Paul Cercueilec1760d2014-02-21 11:31:20 +010091 ssize_t (*write)(const struct iio_device *dev,
92 const void *src, size_t len);
Paul Cercueil92f15c22015-04-20 11:36:51 +020093 int (*open)(const struct iio_device *dev,
94 size_t samples_count, bool cyclic);
Paul Cercueilec1760d2014-02-21 11:31:20 +010095 int (*close)(const struct iio_device *dev);
Romain Roffé6a881702015-06-30 16:25:43 +020096 int (*get_fd)(const struct iio_device *dev);
Romain Roffé0ea038d2015-06-30 13:35:38 +020097 int (*set_blocking_mode)(const struct iio_device *dev, bool blocking);
Paul Cercueil0b2ce712014-02-17 15:04:18 +010098
Lars-Peter Clausen48c01602016-04-20 13:10:05 +020099 void (*cancel)(const struct iio_device *dev);
100
Romain Roffé6c385d92015-06-30 13:36:05 +0200101 int (*set_kernel_buffers_count)(const struct iio_device *dev,
102 unsigned int nb_blocks);
Paul Cercueil93f7e1f2014-04-23 16:49:56 +0200103 ssize_t (*get_buffer)(const struct iio_device *dev,
Paul Cercueil76ca8842015-03-05 11:16:16 +0100104 void **addr_ptr, size_t bytes_used,
105 uint32_t *mask, size_t words);
Paul Cercueil93f7e1f2014-04-23 16:49:56 +0200106
Paul Cercueil167d3112014-02-18 12:23:53 +0100107 ssize_t (*read_device_attr)(const struct iio_device *dev,
Paul Cercueil50c762a2014-04-14 15:55:43 +0200108 const char *attr, char *dst, size_t len, bool is_debug);
Paul Cercueil167d3112014-02-18 12:23:53 +0100109 ssize_t (*write_device_attr)(const struct iio_device *dev,
Paul Cercueilcecda352014-05-06 18:14:29 +0200110 const char *attr, const char *src,
111 size_t len, bool is_debug);
Paul Cercueil167d3112014-02-18 12:23:53 +0100112 ssize_t (*read_channel_attr)(const struct iio_channel *chn,
113 const char *attr, char *dst, size_t len);
114 ssize_t (*write_channel_attr)(const struct iio_channel *chn,
Paul Cercueilcecda352014-05-06 18:14:29 +0200115 const char *attr, const char *src, size_t len);
Paul Cercueil0b2ce712014-02-17 15:04:18 +0100116
Paul Cercueil24ffa532014-03-10 12:39:58 +0100117 int (*get_trigger)(const struct iio_device *dev,
118 const struct iio_device **trigger);
119 int (*set_trigger)(const struct iio_device *dev,
120 const struct iio_device *trigger);
121
Paul Cercueil0b2ce712014-02-17 15:04:18 +0100122 void (*shutdown)(struct iio_context *ctx);
Paul Cercueile45f8762014-05-02 11:19:26 +0200123
Paul Cercueil9de9e9d2014-05-20 13:18:19 +0200124 int (*get_version)(const struct iio_context *ctx, unsigned int *major,
125 unsigned int *minor, char git_tag[8]);
Paul Cercueil4ca73542014-06-10 16:23:29 +0200126
127 int (*set_timeout)(struct iio_context *ctx, unsigned int timeout);
Paul Cercueil0b2ce712014-02-17 15:04:18 +0100128};
129
Paul Cercueil82b3c1c2014-02-24 13:15:56 +0100130struct iio_context_pdata;
Paul Cercueileaab6582014-02-21 09:35:59 +0100131struct iio_device_pdata;
132struct iio_channel_pdata;
Lars-Peter Clausen794ba032016-04-25 15:07:00 +0200133struct iio_scan_backend_context;
Paul Cercueil82b3c1c2014-02-24 13:15:56 +0100134
Paul Cercueilb34e0222014-05-05 15:32:38 +0200135struct iio_channel_attr {
136 char *name;
Paul Cercueil42d12352014-05-05 16:11:58 +0200137 char *filename;
Paul Cercueilb34e0222014-05-05 15:32:38 +0200138};
139
Paul Cercueil0b2ce712014-02-17 15:04:18 +0100140struct iio_context {
Paul Cercueil82b3c1c2014-02-24 13:15:56 +0100141 struct iio_context_pdata *pdata;
Paul Cercueil0b2ce712014-02-17 15:04:18 +0100142 const struct iio_backend_ops *ops;
Paul Cercueil0b2ce712014-02-17 15:04:18 +0100143 const char *name;
Paul Cercueil3ac36c12015-01-08 14:44:00 +0100144 char *description;
Paul Cercueil0b2ce712014-02-17 15:04:18 +0100145
146 struct iio_device **devices;
147 unsigned int nb_devices;
Paul Cercueil4c6729d2014-04-04 17:24:41 +0200148
149 char *xml;
Paul Cercueil60b4d1b2016-11-15 15:55:41 +0100150
151 char **attrs;
152 char **values;
153 unsigned int nb_attrs;
Paul Cercueil0b2ce712014-02-17 15:04:18 +0100154};
155
Paul Cercueil0b2ce712014-02-17 15:04:18 +0100156struct iio_channel {
Paul Cercueileaab6582014-02-21 09:35:59 +0100157 struct iio_device *dev;
158 struct iio_channel_pdata *pdata;
Paul Cercueild96e61f2014-03-07 16:13:37 +0100159 void *userdata;
Paul Cercueileaab6582014-02-21 09:35:59 +0100160
Paul Cercueil35a01312014-02-20 10:56:57 +0100161 bool is_output;
Paul Cercueil85aaf482014-04-24 16:39:09 +0200162 bool is_scan_element;
Paul Cercueilcd6ce842014-03-14 13:21:06 +0100163 struct iio_data_format format;
Paul Cercueilbb618272014-02-20 11:35:52 +0100164 char *name, *id;
Paul Cercueilae88fde2014-03-12 11:47:10 +0100165 long index;
Lars-Peter Clausen093ae462016-06-21 11:43:54 +0200166 enum iio_modifier modifier;
Lars-Peter Clausenc6f85922016-04-20 15:03:49 +0200167 enum iio_chan_type type;
Paul Cercueil0b2ce712014-02-17 15:04:18 +0100168
Paul Cercueilb34e0222014-05-05 15:32:38 +0200169 struct iio_channel_attr *attrs;
Paul Cercueil0b2ce712014-02-17 15:04:18 +0100170 unsigned int nb_attrs;
171};
172
173struct iio_device {
174 const struct iio_context *ctx;
Paul Cercueileaab6582014-02-21 09:35:59 +0100175 struct iio_device_pdata *pdata;
Paul Cercueild96e61f2014-03-07 16:13:37 +0100176 void *userdata;
Paul Cercueileaab6582014-02-21 09:35:59 +0100177
Paul Cercueilbb618272014-02-20 11:35:52 +0100178 char *name, *id;
Paul Cercueil0b2ce712014-02-17 15:04:18 +0100179
Paul Cercueilbb618272014-02-20 11:35:52 +0100180 char **attrs;
Paul Cercueil0b2ce712014-02-17 15:04:18 +0100181 unsigned int nb_attrs;
182
Paul Cercueilddaa26a2014-04-14 17:32:18 +0200183 char **debug_attrs;
184 unsigned int nb_debug_attrs;
185
Paul Cercueil0b2ce712014-02-17 15:04:18 +0100186 struct iio_channel **channels;
187 unsigned int nb_channels;
Paul Cercueilff778232014-03-24 14:23:08 +0100188
189 uint32_t *mask;
190 size_t words;
Paul Cercueil0b2ce712014-02-17 15:04:18 +0100191};
192
Paul Cercueila689cd92014-03-20 16:37:25 +0100193struct iio_buffer {
194 const struct iio_device *dev;
Paul Cercueila2d4bad2014-05-27 10:15:29 +0200195 void *buffer, *userdata;
Paul Cercueila689cd92014-03-20 16:37:25 +0100196 size_t length, data_length;
197
Paul Cercueil645ab972014-03-24 14:36:12 +0100198 uint32_t *mask;
Paul Cercueil9e5301d2014-11-19 15:34:28 +0100199 unsigned int dev_sample_size;
Paul Cercueila689cd92014-03-20 16:37:25 +0100200 unsigned int sample_size;
Paul Cercueil2a74bd72014-04-28 13:18:48 +0200201 bool is_output, dev_is_high_speed;
Paul Cercueila689cd92014-03-20 16:37:25 +0100202};
203
Lars-Peter Clausen08633732016-02-22 14:35:17 +0100204struct iio_context_info {
205 char *description;
206 char *uri;
207};
208
209struct iio_scan_result {
210 size_t size;
211 struct iio_context_info **info;
212};
213
214struct iio_context_info ** iio_scan_result_add(
215 struct iio_scan_result *scan_result, size_t num);
216
Paul Cercueil00236242014-02-18 15:09:06 +0100217void free_channel(struct iio_channel *chn);
218void free_device(struct iio_device *dev);
Paul Cercueil0b2ce712014-02-17 15:04:18 +0100219
Paul Cercueil42090d12014-02-24 12:32:23 +0100220char *iio_channel_get_xml(const struct iio_channel *chn, size_t *len);
221char *iio_device_get_xml(const struct iio_device *dev, size_t *len);
222
Paul Cercueilc1ed8482014-06-11 16:29:43 +0200223char *iio_context_create_xml(const struct iio_context *ctx);
Paul Cercueilfd387472015-08-05 10:34:19 +0200224int iio_context_init(struct iio_context *ctx);
Paul Cercueilae88fde2014-03-12 11:47:10 +0100225
Lars-Peter Clausen62bd5522015-03-27 16:06:52 +0100226bool iio_device_is_tx(const struct iio_device *dev);
Paul Cercueil6d3fb8d2014-05-27 10:04:00 +0200227int iio_device_open(const struct iio_device *dev,
228 size_t samples_count, bool cyclic);
229int iio_device_close(const struct iio_device *dev);
Romain Roffécead1da2015-06-30 13:35:51 +0200230int iio_device_set_blocking_mode(const struct iio_device *dev, bool blocking);
Paul Cercueil6d3fb8d2014-05-27 10:04:00 +0200231ssize_t iio_device_read_raw(const struct iio_device *dev,
232 void *dst, size_t len, uint32_t *mask, size_t words);
233ssize_t iio_device_write_raw(const struct iio_device *dev,
234 const void *src, size_t len);
Romain Roffé6a881702015-06-30 16:25:43 +0200235int iio_device_get_poll_fd(const struct iio_device *dev);
Paul Cercueil6d3fb8d2014-05-27 10:04:00 +0200236
Paul Cercueil542cbb42014-10-21 13:00:38 +0200237int read_double(const char *str, double *val);
Paul Cercueil225a3e12015-03-03 18:08:41 +0100238int write_double(char *buf, size_t len, double val);
Paul Cercueil542cbb42014-10-21 13:00:38 +0200239
Paul Cercueil63e52182014-12-11 12:52:48 +0100240struct iio_context * local_create_context(void);
241struct iio_context * network_create_context(const char *hostname);
242struct iio_context * xml_create_context_mem(const char *xml, size_t len);
243struct iio_context * xml_create_context(const char *xml_file);
Lars-Peter Clausen7a8e6b52016-02-22 13:25:12 +0100244struct iio_context * usb_create_context(unsigned int bus, unsigned int address,
245 unsigned int interface);
Lars-Peter Clausen60f1c9a2016-02-22 13:20:40 +0100246struct iio_context * usb_create_context_from_uri(const char *uri);
Paul Cercueilbcb04522016-03-22 17:03:29 +0100247struct iio_context * serial_create_context_from_uri(const char *uri);
Paul Cercueil63e52182014-12-11 12:52:48 +0100248
Lars-Peter Clausen3db58d62016-04-25 15:00:54 +0200249int local_context_scan(struct iio_scan_result *scan_result);
250
Lars-Peter Clausen794ba032016-04-25 15:07:00 +0200251struct iio_scan_backend_context * usb_context_scan_init(void);
252void usb_context_scan_free(struct iio_scan_backend_context *ctx);
253
254int usb_context_scan(struct iio_scan_backend_context *ctx,
255 struct iio_scan_result *scan_result);
256
Paul Cercueile98500b2014-04-10 13:31:04 +0200257/* This function is not part of the API, but is used by the IIO daemon */
Paul Cercueil59f2aa32014-04-04 16:28:51 +0200258__api ssize_t iio_device_get_sample_size_mask(const struct iio_device *dev,
Paul Cercueil92f15c22015-04-20 11:36:51 +0200259 const uint32_t *mask, size_t words);
Paul Cercueil46825942014-03-18 14:28:49 +0100260
Lars-Peter Clausenc6f85922016-04-20 15:03:49 +0200261void iio_channel_init_finalize(struct iio_channel *chn);
Lars-Peter Clausen093ae462016-06-21 11:43:54 +0200262unsigned int find_channel_modifier(const char *s, size_t *len_p);
Lars-Peter Clausenc6f85922016-04-20 15:03:49 +0200263
Paul Cercueilcaf0e712016-08-25 17:27:02 +0200264char *iio_strdup(const char *str);
265
Paul Cercueila09970b2016-11-24 17:30:07 +0100266int iio_context_add_attr(struct iio_context *ctx,
267 const char *key, const char *value);
268
Paul Cercueil65f90e42016-02-25 16:00:10 +0100269#undef __api
270
Paul Cercueil0b2ce712014-02-17 15:04:18 +0100271#endif /* __IIO_PRIVATE_H__ */