Paul Cercueil | bb4401d | 2014-02-28 16:10:49 +0100 | [diff] [blame] | 1 | /* |
| 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 Cercueil | 0b2ce71 | 2014-02-17 15:04:18 +0100 | [diff] [blame] | 19 | #ifndef __IIO_PRIVATE_H__ |
| 20 | #define __IIO_PRIVATE_H__ |
| 21 | |
Paul Cercueil | 0023624 | 2014-02-18 15:09:06 +0100 | [diff] [blame] | 22 | /* Include public interface */ |
Paul Cercueil | 0b2ce71 | 2014-02-17 15:04:18 +0100 | [diff] [blame] | 23 | #include "iio.h" |
| 24 | |
| 25 | #include <stdbool.h> |
| 26 | |
Paul Cercueil | 1fef1a5 | 2014-04-07 16:31:15 +0200 | [diff] [blame] | 27 | #ifdef _MSC_BUILD |
| 28 | #define snprintf sprintf_s |
| 29 | #define strerror_r(err, buf, len) strerror_s(buf, len, err) |
| 30 | #endif |
| 31 | |
Paul Cercueil | e131122 | 2014-03-12 15:46:16 +0100 | [diff] [blame] | 32 | #define BIT_MASK(bit) (1 << ((bit) % 32)) |
| 33 | #define BIT_WORD(bit) ((bit) / 32) |
| 34 | #define TEST_BIT(addr, bit) (!!(*(((uint32_t *) addr) + BIT_WORD(bit)) \ |
| 35 | & BIT_MASK(bit))) |
| 36 | #define SET_BIT(addr, bit) \ |
| 37 | *(((uint32_t *) addr) + BIT_WORD(bit)) |= BIT_MASK(bit) |
| 38 | #define CLEAR_BIT(addr, bit) \ |
| 39 | *(((uint32_t *) addr) + BIT_WORD(bit)) &= ~BIT_MASK(bit) |
| 40 | |
Paul Cercueil | 0b2ce71 | 2014-02-17 15:04:18 +0100 | [diff] [blame] | 41 | enum iio_modifier { |
| 42 | IIO_NO_MOD, |
| 43 | IIO_MOD_X, |
| 44 | IIO_MOD_Y, |
| 45 | IIO_MOD_Z, |
| 46 | IIO_MOD_LIGHT_BOTH, |
| 47 | IIO_MOD_LIGHT_IR, |
| 48 | IIO_MOD_ROOT_SUM_SQUARED_X_Y, |
| 49 | IIO_MOD_SUM_SQUARED_X_Y_Z, |
| 50 | IIO_MOD_LIGHT_CLEAR, |
| 51 | IIO_MOD_LIGHT_RED, |
| 52 | IIO_MOD_LIGHT_GREEN, |
| 53 | IIO_MOD_LIGHT_BLUE, |
| 54 | }; |
| 55 | |
| 56 | struct iio_backend_ops { |
Paul Cercueil | 45c575d | 2014-03-20 15:14:01 +0100 | [diff] [blame] | 57 | ssize_t (*read)(const struct iio_device *dev, void *dst, size_t len, |
| 58 | uint32_t *mask, size_t words); |
Paul Cercueil | ec1760d | 2014-02-21 11:31:20 +0100 | [diff] [blame] | 59 | ssize_t (*write)(const struct iio_device *dev, |
| 60 | const void *src, size_t len); |
Paul Cercueil | 93f1705 | 2014-04-02 13:56:27 +0200 | [diff] [blame] | 61 | int (*open)(const struct iio_device *dev, |
| 62 | size_t samples_count, uint32_t *mask, size_t words); |
Paul Cercueil | ec1760d | 2014-02-21 11:31:20 +0100 | [diff] [blame] | 63 | int (*close)(const struct iio_device *dev); |
Paul Cercueil | 0b2ce71 | 2014-02-17 15:04:18 +0100 | [diff] [blame] | 64 | |
Paul Cercueil | 93f7e1f | 2014-04-23 16:49:56 +0200 | [diff] [blame] | 65 | ssize_t (*get_buffer)(const struct iio_device *dev, |
| 66 | void **addr_ptr, uint32_t *mask, size_t words); |
| 67 | |
Paul Cercueil | 167d311 | 2014-02-18 12:23:53 +0100 | [diff] [blame] | 68 | ssize_t (*read_device_attr)(const struct iio_device *dev, |
Paul Cercueil | 50c762a | 2014-04-14 15:55:43 +0200 | [diff] [blame] | 69 | const char *attr, char *dst, size_t len, bool is_debug); |
Paul Cercueil | 167d311 | 2014-02-18 12:23:53 +0100 | [diff] [blame] | 70 | ssize_t (*write_device_attr)(const struct iio_device *dev, |
Paul Cercueil | 50c762a | 2014-04-14 15:55:43 +0200 | [diff] [blame] | 71 | const char *attr, const char *src, bool is_debug); |
Paul Cercueil | 167d311 | 2014-02-18 12:23:53 +0100 | [diff] [blame] | 72 | ssize_t (*read_channel_attr)(const struct iio_channel *chn, |
| 73 | const char *attr, char *dst, size_t len); |
| 74 | ssize_t (*write_channel_attr)(const struct iio_channel *chn, |
| 75 | const char *attr, const char *src); |
Paul Cercueil | 0b2ce71 | 2014-02-17 15:04:18 +0100 | [diff] [blame] | 76 | |
Paul Cercueil | 24ffa53 | 2014-03-10 12:39:58 +0100 | [diff] [blame] | 77 | int (*get_trigger)(const struct iio_device *dev, |
| 78 | const struct iio_device **trigger); |
| 79 | int (*set_trigger)(const struct iio_device *dev, |
| 80 | const struct iio_device *trigger); |
| 81 | |
Paul Cercueil | 0b2ce71 | 2014-02-17 15:04:18 +0100 | [diff] [blame] | 82 | void (*shutdown)(struct iio_context *ctx); |
| 83 | }; |
| 84 | |
Paul Cercueil | 82b3c1c | 2014-02-24 13:15:56 +0100 | [diff] [blame] | 85 | struct iio_context_pdata; |
Paul Cercueil | eaab658 | 2014-02-21 09:35:59 +0100 | [diff] [blame] | 86 | struct iio_device_pdata; |
| 87 | struct iio_channel_pdata; |
Paul Cercueil | 82b3c1c | 2014-02-24 13:15:56 +0100 | [diff] [blame] | 88 | |
Paul Cercueil | 0b2ce71 | 2014-02-17 15:04:18 +0100 | [diff] [blame] | 89 | struct iio_context { |
Paul Cercueil | 82b3c1c | 2014-02-24 13:15:56 +0100 | [diff] [blame] | 90 | struct iio_context_pdata *pdata; |
Paul Cercueil | 0b2ce71 | 2014-02-17 15:04:18 +0100 | [diff] [blame] | 91 | const struct iio_backend_ops *ops; |
Paul Cercueil | 0b2ce71 | 2014-02-17 15:04:18 +0100 | [diff] [blame] | 92 | const char *name; |
| 93 | |
| 94 | struct iio_device **devices; |
| 95 | unsigned int nb_devices; |
Paul Cercueil | 4c6729d | 2014-04-04 17:24:41 +0200 | [diff] [blame] | 96 | |
| 97 | char *xml; |
Paul Cercueil | 0b2ce71 | 2014-02-17 15:04:18 +0100 | [diff] [blame] | 98 | }; |
| 99 | |
Paul Cercueil | 0b2ce71 | 2014-02-17 15:04:18 +0100 | [diff] [blame] | 100 | struct iio_channel { |
Paul Cercueil | eaab658 | 2014-02-21 09:35:59 +0100 | [diff] [blame] | 101 | struct iio_device *dev; |
| 102 | struct iio_channel_pdata *pdata; |
Paul Cercueil | d96e61f | 2014-03-07 16:13:37 +0100 | [diff] [blame] | 103 | void *userdata; |
Paul Cercueil | eaab658 | 2014-02-21 09:35:59 +0100 | [diff] [blame] | 104 | |
Paul Cercueil | 35a0131 | 2014-02-20 10:56:57 +0100 | [diff] [blame] | 105 | bool is_output; |
Paul Cercueil | 85aaf48 | 2014-04-24 16:39:09 +0200 | [diff] [blame^] | 106 | bool is_scan_element; |
Paul Cercueil | 0b2ce71 | 2014-02-17 15:04:18 +0100 | [diff] [blame] | 107 | enum iio_modifier modifier; |
Paul Cercueil | cd6ce84 | 2014-03-14 13:21:06 +0100 | [diff] [blame] | 108 | struct iio_data_format format; |
Paul Cercueil | bb61827 | 2014-02-20 11:35:52 +0100 | [diff] [blame] | 109 | char *name, *id; |
Paul Cercueil | ae88fde | 2014-03-12 11:47:10 +0100 | [diff] [blame] | 110 | long index; |
Paul Cercueil | 0b2ce71 | 2014-02-17 15:04:18 +0100 | [diff] [blame] | 111 | |
Paul Cercueil | bb61827 | 2014-02-20 11:35:52 +0100 | [diff] [blame] | 112 | char **attrs; |
Paul Cercueil | 0b2ce71 | 2014-02-17 15:04:18 +0100 | [diff] [blame] | 113 | unsigned int nb_attrs; |
| 114 | }; |
| 115 | |
| 116 | struct iio_device { |
| 117 | const struct iio_context *ctx; |
Paul Cercueil | eaab658 | 2014-02-21 09:35:59 +0100 | [diff] [blame] | 118 | struct iio_device_pdata *pdata; |
Paul Cercueil | d96e61f | 2014-03-07 16:13:37 +0100 | [diff] [blame] | 119 | void *userdata; |
Paul Cercueil | eaab658 | 2014-02-21 09:35:59 +0100 | [diff] [blame] | 120 | |
Paul Cercueil | bb61827 | 2014-02-20 11:35:52 +0100 | [diff] [blame] | 121 | char *name, *id; |
Paul Cercueil | 0b2ce71 | 2014-02-17 15:04:18 +0100 | [diff] [blame] | 122 | |
Paul Cercueil | bb61827 | 2014-02-20 11:35:52 +0100 | [diff] [blame] | 123 | char **attrs; |
Paul Cercueil | 0b2ce71 | 2014-02-17 15:04:18 +0100 | [diff] [blame] | 124 | unsigned int nb_attrs; |
| 125 | |
Paul Cercueil | ddaa26a | 2014-04-14 17:32:18 +0200 | [diff] [blame] | 126 | char **debug_attrs; |
| 127 | unsigned int nb_debug_attrs; |
| 128 | |
Paul Cercueil | 0b2ce71 | 2014-02-17 15:04:18 +0100 | [diff] [blame] | 129 | struct iio_channel **channels; |
| 130 | unsigned int nb_channels; |
Paul Cercueil | ff77823 | 2014-03-24 14:23:08 +0100 | [diff] [blame] | 131 | |
| 132 | uint32_t *mask; |
| 133 | size_t words; |
Paul Cercueil | 0b2ce71 | 2014-02-17 15:04:18 +0100 | [diff] [blame] | 134 | }; |
| 135 | |
Paul Cercueil | a689cd9 | 2014-03-20 16:37:25 +0100 | [diff] [blame] | 136 | struct iio_buffer { |
| 137 | const struct iio_device *dev; |
| 138 | void *buffer; |
| 139 | size_t length, data_length; |
| 140 | |
Paul Cercueil | 645ab97 | 2014-03-24 14:36:12 +0100 | [diff] [blame] | 141 | uint32_t *mask; |
Paul Cercueil | a689cd9 | 2014-03-20 16:37:25 +0100 | [diff] [blame] | 142 | unsigned int sample_size; |
Paul Cercueil | 66ba171 | 2014-04-01 16:11:48 +0200 | [diff] [blame] | 143 | bool is_output; |
Paul Cercueil | a689cd9 | 2014-03-20 16:37:25 +0100 | [diff] [blame] | 144 | }; |
| 145 | |
Paul Cercueil | 0023624 | 2014-02-18 15:09:06 +0100 | [diff] [blame] | 146 | void free_channel(struct iio_channel *chn); |
| 147 | void free_device(struct iio_device *dev); |
Paul Cercueil | 0b2ce71 | 2014-02-17 15:04:18 +0100 | [diff] [blame] | 148 | |
Paul Cercueil | 42090d1 | 2014-02-24 12:32:23 +0100 | [diff] [blame] | 149 | char *iio_channel_get_xml(const struct iio_channel *chn, size_t *len); |
| 150 | char *iio_device_get_xml(const struct iio_device *dev, size_t *len); |
| 151 | |
Paul Cercueil | 4c6729d | 2014-04-04 17:24:41 +0200 | [diff] [blame] | 152 | int iio_context_init(struct iio_context *ctx); |
Paul Cercueil | ae88fde | 2014-03-12 11:47:10 +0100 | [diff] [blame] | 153 | |
Paul Cercueil | e98500b | 2014-04-10 13:31:04 +0200 | [diff] [blame] | 154 | ssize_t iio_device_process_samples(const struct iio_device *dev, |
Paul Cercueil | 4682594 | 2014-03-18 14:28:49 +0100 | [diff] [blame] | 155 | uint32_t *mask, size_t words, void *buf, size_t len, |
| 156 | ssize_t (*cb)(const struct iio_channel *, void *, void *), |
| 157 | void *data); |
Paul Cercueil | 645ab97 | 2014-03-24 14:36:12 +0100 | [diff] [blame] | 158 | |
Paul Cercueil | e98500b | 2014-04-10 13:31:04 +0200 | [diff] [blame] | 159 | /* This function is not part of the API, but is used by the IIO daemon */ |
Paul Cercueil | 59f2aa3 | 2014-04-04 16:28:51 +0200 | [diff] [blame] | 160 | __api ssize_t iio_device_get_sample_size_mask(const struct iio_device *dev, |
Paul Cercueil | 645ab97 | 2014-03-24 14:36:12 +0100 | [diff] [blame] | 161 | uint32_t *mask, size_t words); |
Paul Cercueil | 4682594 | 2014-03-18 14:28:49 +0100 | [diff] [blame] | 162 | |
Paul Cercueil | 0b2ce71 | 2014-02-17 15:04:18 +0100 | [diff] [blame] | 163 | #endif /* __IIO_PRIVATE_H__ */ |