
AD7768-1 MBED IIO Application Example
Dependencies: platform_drivers
app/ad77681_iio.c@2:eb624ef78449, 2021-09-24 (annotated)
- Committer:
- epena
- Date:
- Fri Sep 24 19:07:29 2021 +0800
- Revision:
- 2:eb624ef78449
- Parent:
- 1:c0429edee15b
Deleting the redefinition of data_capture_ops
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
epena | 1:c0429edee15b | 1 | /***************************************************************************//** |
epena | 1:c0429edee15b | 2 | * @file ad77681_iio.c |
epena | 1:c0429edee15b | 3 | * @brief Implementation of AD7768-1 IIO application interfaces |
epena | 1:c0429edee15b | 4 | * @details This module acts as an interface for AD7768-1 IIO application |
epena | 1:c0429edee15b | 5 | ******************************************************************************** |
epena | 1:c0429edee15b | 6 | * Copyright (c) 2021 Analog Devices, Inc. |
epena | 1:c0429edee15b | 7 | * All rights reserved. |
epena | 1:c0429edee15b | 8 | * |
epena | 1:c0429edee15b | 9 | * This software is proprietary to Analog Devices, Inc. and its licensors. |
epena | 1:c0429edee15b | 10 | * By using this software you agree to the terms of the associated |
epena | 1:c0429edee15b | 11 | * Analog Devices Software License Agreement. |
epena | 1:c0429edee15b | 12 | *******************************************************************************/ |
epena | 1:c0429edee15b | 13 | |
epena | 1:c0429edee15b | 14 | /******************************************************************************/ |
epena | 1:c0429edee15b | 15 | /***************************** Include Files **********************************/ |
epena | 1:c0429edee15b | 16 | /******************************************************************************/ |
epena | 1:c0429edee15b | 17 | |
epena | 1:c0429edee15b | 18 | #include <stdint.h> |
epena | 1:c0429edee15b | 19 | #include <string.h> |
epena | 1:c0429edee15b | 20 | #include <stdio.h> |
epena | 1:c0429edee15b | 21 | #include <errno.h> |
epena | 1:c0429edee15b | 22 | |
epena | 1:c0429edee15b | 23 | #include "app_config.h" |
epena | 1:c0429edee15b | 24 | #include "tinyiiod.h" |
epena | 1:c0429edee15b | 25 | #include "ad77681_iio.h" |
epena | 1:c0429edee15b | 26 | #include "ad77681_user_config.h" |
epena | 1:c0429edee15b | 27 | #include "ad77681_regs.h" |
epena | 1:c0429edee15b | 28 | #include "ad77681_data_capture.h" |
epena | 1:c0429edee15b | 29 | #include "adc_data_capture.h" |
epena | 1:c0429edee15b | 30 | #include "error.h" |
epena | 1:c0429edee15b | 31 | |
epena | 1:c0429edee15b | 32 | /******************************************************************************/ |
epena | 1:c0429edee15b | 33 | /************************ Macros/Constants ************************************/ |
epena | 1:c0429edee15b | 34 | /******************************************************************************/ |
epena | 1:c0429edee15b | 35 | |
epena | 1:c0429edee15b | 36 | /* AD77681 Channel Number */ |
epena | 1:c0429edee15b | 37 | #define AD77681_NUM_CHANNELS 1 |
epena | 1:c0429edee15b | 38 | /* Bytes per sample (for ADC resolution of 24-bits) */ |
epena | 1:c0429edee15b | 39 | #define AD77681_BYTES_PER_SAMPLE sizeof(uint32_t) |
epena | 1:c0429edee15b | 40 | /* Number of data storage bits (needed for IIO client) */ |
epena | 1:c0429edee15b | 41 | #define AD77681_CHN_STORAGE_BITS (AD77681_BYTES_PER_SAMPLE * 8) |
epena | 1:c0429edee15b | 42 | /* AD77681 24 bits scale factor */ |
epena | 1:c0429edee15b | 43 | #define AD77681_SCALE_FACTOR (1 << ADC_RESOLUTION) |
epena | 1:c0429edee15b | 44 | /* AD77681 ADC data to Voltage conversion default scale factor for IIO client */ |
epena | 1:c0429edee15b | 45 | #define AD77681_DEFAULT_SCALE ((((float)(AD77681_VOLTAGE_REF / 1000.00) * 2) / AD77681_SCALE_FACTOR) * 1000) |
epena | 1:c0429edee15b | 46 | /* Register Max Address */ |
epena | 1:c0429edee15b | 47 | #define AD77681_REG_MAX_ADDR AD77681_REG_MCLK_COUNTER + 1 |
epena | 1:c0429edee15b | 48 | /* Conv Mode Value after setting a single conversion mode */ |
epena | 1:c0429edee15b | 49 | #define SINGLE_MODE_CONV_STANDBY 6 |
epena | 1:c0429edee15b | 50 | /* Conv Mode Value after setting a periodic conversion mode */ |
epena | 1:c0429edee15b | 51 | #define PERIODIC_MODE_CONV_STANDBY 7 |
epena | 1:c0429edee15b | 52 | |
epena | 1:c0429edee15b | 53 | /******************************************************************************/ |
epena | 1:c0429edee15b | 54 | /*************************** Types Declarations *******************************/ |
epena | 1:c0429edee15b | 55 | /******************************************************************************/ |
epena | 1:c0429edee15b | 56 | |
epena | 1:c0429edee15b | 57 | /* IIO interface descriptor */ |
epena | 1:c0429edee15b | 58 | static struct iio_desc *p_ad77681_iio_desc; |
epena | 1:c0429edee15b | 59 | |
epena | 1:c0429edee15b | 60 | /* Device name */ |
epena | 1:c0429edee15b | 61 | static const char dev_name[] = ACTIVE_DEVICE_NAME; |
epena | 1:c0429edee15b | 62 | |
epena | 1:c0429edee15b | 63 | /* Pointer to the struct representing the AD77681 IIO device */ |
epena | 1:c0429edee15b | 64 | struct ad77681_dev *p_ad77681_dev_inst = NULL; |
epena | 1:c0429edee15b | 65 | |
epena | 1:c0429edee15b | 66 | /* Pointer to the struct AD77681 status register */ |
epena | 1:c0429edee15b | 67 | struct ad77681_status_registers *p_ad77681_stat_reg = NULL; |
epena | 1:c0429edee15b | 68 | |
epena | 1:c0429edee15b | 69 | /* Flag to trigger new data capture */ |
epena | 1:c0429edee15b | 70 | static bool adc_data_capture_started = false; |
epena | 1:c0429edee15b | 71 | |
epena | 1:c0429edee15b | 72 | /* Scale value per channel */ |
epena | 1:c0429edee15b | 73 | static float attr_scale_val[AD77681_NUM_CHANNELS] = { |
epena | 1:c0429edee15b | 74 | AD77681_DEFAULT_SCALE |
epena | 1:c0429edee15b | 75 | }; |
epena | 1:c0429edee15b | 76 | |
epena | 1:c0429edee15b | 77 | /* Power mode values string representation */ |
epena | 1:c0429edee15b | 78 | static const char* power_mode_str[] = { |
epena | 1:c0429edee15b | 79 | "Eco-Mode", |
epena | 1:c0429edee15b | 80 | "Value-Not-Assigned", |
epena | 1:c0429edee15b | 81 | "Median-Mode", |
epena | 1:c0429edee15b | 82 | "Fast-Mode" |
epena | 1:c0429edee15b | 83 | }; |
epena | 1:c0429edee15b | 84 | |
epena | 1:c0429edee15b | 85 | /* Conversion mode values string representation */ |
epena | 1:c0429edee15b | 86 | static const char* conv_mode_str[] = { |
epena | 1:c0429edee15b | 87 | "Continuous-Mode", |
epena | 1:c0429edee15b | 88 | "Continious-One-Shot-Mode", |
epena | 1:c0429edee15b | 89 | "Single-Mode", |
epena | 1:c0429edee15b | 90 | "Periodic-Mode", |
epena | 1:c0429edee15b | 91 | "Standby-Mode" |
epena | 1:c0429edee15b | 92 | }; |
epena | 1:c0429edee15b | 93 | |
epena | 1:c0429edee15b | 94 | /* MCLK division values string representation */ |
epena | 1:c0429edee15b | 95 | static const char* mclk_division_str[] = { |
epena | 1:c0429edee15b | 96 | "AD77681_MCLK_DIV_16", |
epena | 1:c0429edee15b | 97 | "AD77681_MCLK_DIV_8", |
epena | 1:c0429edee15b | 98 | "AD77681_MCLK_DIV_4", |
epena | 1:c0429edee15b | 99 | "AD77681_MCLK_DIV_2" |
epena | 1:c0429edee15b | 100 | }; |
epena | 1:c0429edee15b | 101 | |
epena | 1:c0429edee15b | 102 | /******************************************************************************/ |
epena | 1:c0429edee15b | 103 | /************************ Functions Prototypes ********************************/ |
epena | 1:c0429edee15b | 104 | /******************************************************************************/ |
epena | 1:c0429edee15b | 105 | |
epena | 1:c0429edee15b | 106 | /******************************************************************************/ |
epena | 1:c0429edee15b | 107 | /************************ Functions Definitions *******************************/ |
epena | 1:c0429edee15b | 108 | /******************************************************************************/ |
epena | 1:c0429edee15b | 109 | |
epena | 1:c0429edee15b | 110 | /*! |
epena | 1:c0429edee15b | 111 | * @brief Getter/Setter for the sampling frequency attribute value |
epena | 1:c0429edee15b | 112 | * @param device- pointer to IIO device structure |
epena | 1:c0429edee15b | 113 | * @param buf- pointer to buffer holding attribute value |
epena | 1:c0429edee15b | 114 | * @param len- length of buffer string data |
epena | 1:c0429edee15b | 115 | * @param channel- pointer to IIO channel structure |
epena | 1:c0429edee15b | 116 | * @param id- Attribute ID (optional) |
epena | 1:c0429edee15b | 117 | * @return Number of characters read/written |
epena | 1:c0429edee15b | 118 | * @Note This attribute is used to define the timeout period in IIO |
epena | 1:c0429edee15b | 119 | * client during data capture. |
epena | 1:c0429edee15b | 120 | * Timeout = (number of requested samples * (1/sampling frequency)) + 1sec |
epena | 1:c0429edee15b | 121 | * e.g. if sampling frequency = 64KSPS and requested samples = 400 |
epena | 1:c0429edee15b | 122 | * Timeout = (400 * (1/64000)) + 1 = 1.00625sec = ~1sec |
epena | 1:c0429edee15b | 123 | */ |
epena | 1:c0429edee15b | 124 | static ssize_t get_sampling_frequency(void *device, |
epena | 1:c0429edee15b | 125 | char *buf, |
epena | 1:c0429edee15b | 126 | size_t len, |
epena | 1:c0429edee15b | 127 | const struct iio_ch_info *channel, |
epena | 1:c0429edee15b | 128 | intptr_t id) |
epena | 1:c0429edee15b | 129 | { |
epena | 1:c0429edee15b | 130 | return (ssize_t) sprintf(buf, "%d", (int32_t)AD77681_DEFAULT_SAMPLING_FREQ); |
epena | 1:c0429edee15b | 131 | } |
epena | 1:c0429edee15b | 132 | |
epena | 1:c0429edee15b | 133 | static ssize_t set_sampling_frequency(void *device, |
epena | 1:c0429edee15b | 134 | char *buf, |
epena | 1:c0429edee15b | 135 | size_t len, |
epena | 1:c0429edee15b | 136 | const struct iio_ch_info *channel, |
epena | 1:c0429edee15b | 137 | intptr_t id) |
epena | 1:c0429edee15b | 138 | { |
epena | 1:c0429edee15b | 139 | /* NA- Can't set sampling frequency value */ |
epena | 1:c0429edee15b | 140 | return len; |
epena | 1:c0429edee15b | 141 | } |
epena | 1:c0429edee15b | 142 | |
epena | 1:c0429edee15b | 143 | /*! |
epena | 1:c0429edee15b | 144 | * @brief Getter/Setter for the raw attribute value |
epena | 1:c0429edee15b | 145 | * @param device- pointer to IIO device structure |
epena | 1:c0429edee15b | 146 | * @param buf- pointer to buffer holding attribute value |
epena | 1:c0429edee15b | 147 | * @param len- length of buffer string data |
epena | 1:c0429edee15b | 148 | * @param channel- pointer to IIO channel structure |
epena | 1:c0429edee15b | 149 | * @return Number of characters read/written |
epena | 1:c0429edee15b | 150 | */ |
epena | 1:c0429edee15b | 151 | ssize_t get_raw(void *device, |
epena | 1:c0429edee15b | 152 | char *buf, |
epena | 1:c0429edee15b | 153 | size_t len, |
epena | 1:c0429edee15b | 154 | const struct iio_ch_info *channel, |
epena | 1:c0429edee15b | 155 | intptr_t id) |
epena | 1:c0429edee15b | 156 | { |
epena | 1:c0429edee15b | 157 | uint32_t adc_data_raw = 0; |
epena | 1:c0429edee15b | 158 | |
epena | 1:c0429edee15b | 159 | /* Capture the raw adc data */ |
epena | 1:c0429edee15b | 160 | if (read_single_sample((uint32_t)channel->ch_num, &adc_data_raw) != FAILURE) { |
epena | 1:c0429edee15b | 161 | return (ssize_t) sprintf(buf, "%d", (int32_t)adc_data_raw); |
epena | 1:c0429edee15b | 162 | } |
epena | 1:c0429edee15b | 163 | |
epena | 1:c0429edee15b | 164 | return - EINVAL; |
epena | 1:c0429edee15b | 165 | } |
epena | 1:c0429edee15b | 166 | |
epena | 1:c0429edee15b | 167 | ssize_t set_raw(void *device, |
epena | 1:c0429edee15b | 168 | char *buf, |
epena | 1:c0429edee15b | 169 | size_t len, |
epena | 1:c0429edee15b | 170 | const struct iio_ch_info *channel, |
epena | 1:c0429edee15b | 171 | intptr_t id) |
epena | 1:c0429edee15b | 172 | { |
epena | 1:c0429edee15b | 173 | /* NA- Can't set raw value */ |
epena | 1:c0429edee15b | 174 | return len; |
epena | 1:c0429edee15b | 175 | } |
epena | 1:c0429edee15b | 176 | |
epena | 1:c0429edee15b | 177 | /*! |
epena | 1:c0429edee15b | 178 | * @brief Getter/Setter for the scale attribute value |
epena | 1:c0429edee15b | 179 | * @param device- pointer to IIO device structure |
epena | 1:c0429edee15b | 180 | * @param buf- pointer to buffer holding attribute value |
epena | 1:c0429edee15b | 181 | * @param len- length of buffer string data |
epena | 1:c0429edee15b | 182 | * @param channel- pointer to IIO channel structure |
epena | 1:c0429edee15b | 183 | * @return Number of characters read/written |
epena | 1:c0429edee15b | 184 | */ |
epena | 1:c0429edee15b | 185 | ssize_t get_scale(void* device, |
epena | 1:c0429edee15b | 186 | char* buf, |
epena | 1:c0429edee15b | 187 | size_t len, |
epena | 1:c0429edee15b | 188 | const struct iio_ch_info* channel, |
epena | 1:c0429edee15b | 189 | intptr_t id) |
epena | 1:c0429edee15b | 190 | { |
epena | 1:c0429edee15b | 191 | return (ssize_t)sprintf(buf, "%f", attr_scale_val[channel->ch_num]); |
epena | 1:c0429edee15b | 192 | } |
epena | 1:c0429edee15b | 193 | |
epena | 1:c0429edee15b | 194 | ssize_t set_scale(void* device, |
epena | 1:c0429edee15b | 195 | char* buf, |
epena | 1:c0429edee15b | 196 | size_t len, |
epena | 1:c0429edee15b | 197 | const struct iio_ch_info* channel, |
epena | 1:c0429edee15b | 198 | intptr_t id) |
epena | 1:c0429edee15b | 199 | { |
epena | 1:c0429edee15b | 200 | float scale; |
epena | 1:c0429edee15b | 201 | |
epena | 1:c0429edee15b | 202 | (void)sscanf(buf, "%f", &scale); |
epena | 1:c0429edee15b | 203 | |
epena | 1:c0429edee15b | 204 | if (scale > 0.0) { |
epena | 1:c0429edee15b | 205 | attr_scale_val[channel->ch_num] = scale; |
epena | 1:c0429edee15b | 206 | return len; |
epena | 1:c0429edee15b | 207 | } |
epena | 1:c0429edee15b | 208 | |
epena | 1:c0429edee15b | 209 | return -EINVAL; |
epena | 1:c0429edee15b | 210 | } |
epena | 1:c0429edee15b | 211 | |
epena | 1:c0429edee15b | 212 | /*! |
epena | 1:c0429edee15b | 213 | * @brief Getter for the power mode available values |
epena | 1:c0429edee15b | 214 | * @param device- pointer to IIO device structure |
epena | 1:c0429edee15b | 215 | * @param buf- pointer to buffer holding attribute value |
epena | 1:c0429edee15b | 216 | * @param len- length of buffer string data |
epena | 1:c0429edee15b | 217 | * @param channel- pointer to IIO channel structure |
epena | 1:c0429edee15b | 218 | * @param id- Attribute ID (optional) |
epena | 1:c0429edee15b | 219 | * @return Number of characters read/written |
epena | 1:c0429edee15b | 220 | */ |
epena | 1:c0429edee15b | 221 | static ssize_t get_power_mode_available(void *device, |
epena | 1:c0429edee15b | 222 | char *buf, |
epena | 1:c0429edee15b | 223 | size_t len, |
epena | 1:c0429edee15b | 224 | const struct iio_ch_info *channel, |
epena | 1:c0429edee15b | 225 | intptr_t id) |
epena | 1:c0429edee15b | 226 | { |
epena | 1:c0429edee15b | 227 | return sprintf(buf, "%s", "Eco-Mode Value-Not-Assigned Median-Mode Fast-Mode"); |
epena | 1:c0429edee15b | 228 | } |
epena | 1:c0429edee15b | 229 | |
epena | 1:c0429edee15b | 230 | /*! |
epena | 1:c0429edee15b | 231 | * @brief Setter for the power mode available values |
epena | 1:c0429edee15b | 232 | * @param device- pointer to IIO device structure |
epena | 1:c0429edee15b | 233 | * @param buf- pointer to buffer holding attribute value |
epena | 1:c0429edee15b | 234 | * @param len- length of buffer string data |
epena | 1:c0429edee15b | 235 | * @param channel- pointer to IIO channel structure |
epena | 1:c0429edee15b | 236 | * @param id- Attribute ID (optional) |
epena | 1:c0429edee15b | 237 | * @return Number of characters read/written |
epena | 1:c0429edee15b | 238 | */ |
epena | 1:c0429edee15b | 239 | static ssize_t set_power_mode_available(void *device, |
epena | 1:c0429edee15b | 240 | char *buf, |
epena | 1:c0429edee15b | 241 | size_t len, |
epena | 1:c0429edee15b | 242 | const struct iio_ch_info *channel, |
epena | 1:c0429edee15b | 243 | intptr_t id) |
epena | 1:c0429edee15b | 244 | { |
epena | 1:c0429edee15b | 245 | /* NA- Can't set error value */ |
epena | 1:c0429edee15b | 246 | return len; |
epena | 1:c0429edee15b | 247 | } |
epena | 1:c0429edee15b | 248 | |
epena | 1:c0429edee15b | 249 | /*! |
epena | 1:c0429edee15b | 250 | * @brief Getter/Setter for the power mode attribute value |
epena | 1:c0429edee15b | 251 | * @param device- pointer to IIO device structure |
epena | 1:c0429edee15b | 252 | * @param buf- pointer to buffer holding attribute value |
epena | 1:c0429edee15b | 253 | * @param len- length of buffer string data |
epena | 1:c0429edee15b | 254 | * @param channel- pointer to IIO channel structure |
epena | 1:c0429edee15b | 255 | * @return Number of characters read/written |
epena | 1:c0429edee15b | 256 | */ |
epena | 1:c0429edee15b | 257 | ssize_t get_power_mode(void *device, |
epena | 1:c0429edee15b | 258 | char *buf, |
epena | 1:c0429edee15b | 259 | size_t len, |
epena | 1:c0429edee15b | 260 | const struct iio_ch_info *channel, |
epena | 1:c0429edee15b | 261 | intptr_t id) |
epena | 1:c0429edee15b | 262 | { |
epena | 1:c0429edee15b | 263 | uint8_t power_mode_value = 0; |
epena | 1:c0429edee15b | 264 | |
epena | 1:c0429edee15b | 265 | if (ad77681_spi_read_mask(device, |
epena | 1:c0429edee15b | 266 | AD77681_REG_POWER_CLOCK, |
epena | 1:c0429edee15b | 267 | AD77681_POWER_CLK_PWRMODE_MSK, |
epena | 1:c0429edee15b | 268 | &power_mode_value) == SUCCESS) { |
epena | 1:c0429edee15b | 269 | return (ssize_t)sprintf(buf, "%s", power_mode_str[power_mode_value]); |
epena | 1:c0429edee15b | 270 | } |
epena | 1:c0429edee15b | 271 | |
epena | 1:c0429edee15b | 272 | return -EINVAL; |
epena | 1:c0429edee15b | 273 | } |
epena | 1:c0429edee15b | 274 | |
epena | 1:c0429edee15b | 275 | ssize_t set_power_mode(void *device, |
epena | 1:c0429edee15b | 276 | char *buf, |
epena | 1:c0429edee15b | 277 | size_t len, |
epena | 1:c0429edee15b | 278 | const struct iio_ch_info *channel, |
epena | 1:c0429edee15b | 279 | intptr_t id) |
epena | 1:c0429edee15b | 280 | { |
epena | 1:c0429edee15b | 281 | uint8_t power_mode_value; |
epena | 1:c0429edee15b | 282 | |
epena | 1:c0429edee15b | 283 | for (power_mode_value = 0; |
epena | 1:c0429edee15b | 284 | power_mode_value < (uint8_t)ARRAY_SIZE(power_mode_str); power_mode_value++) { |
epena | 1:c0429edee15b | 285 | if (!strncmp(buf, power_mode_str[power_mode_value], |
epena | 1:c0429edee15b | 286 | strlen(power_mode_str[power_mode_value]))) { |
epena | 1:c0429edee15b | 287 | break; |
epena | 1:c0429edee15b | 288 | } |
epena | 1:c0429edee15b | 289 | } |
epena | 1:c0429edee15b | 290 | |
epena | 1:c0429edee15b | 291 | if (power_mode_value < (uint8_t)ARRAY_SIZE(power_mode_str)) { |
epena | 1:c0429edee15b | 292 | if (ad77681_set_power_mode(device, power_mode_value) == SUCCESS) { |
epena | 1:c0429edee15b | 293 | return len; |
epena | 1:c0429edee15b | 294 | } |
epena | 1:c0429edee15b | 295 | } |
epena | 1:c0429edee15b | 296 | |
epena | 1:c0429edee15b | 297 | return -EINVAL; |
epena | 1:c0429edee15b | 298 | } |
epena | 1:c0429edee15b | 299 | |
epena | 1:c0429edee15b | 300 | /*! |
epena | 1:c0429edee15b | 301 | * @brief Getter for the conv mode available values |
epena | 1:c0429edee15b | 302 | * @param device- pointer to IIO device structure |
epena | 1:c0429edee15b | 303 | * @param buf- pointer to buffer holding attribute value |
epena | 1:c0429edee15b | 304 | * @param len- length of buffer string data |
epena | 1:c0429edee15b | 305 | * @param channel- pointer to IIO channel structure |
epena | 1:c0429edee15b | 306 | * @param id- Attribute ID (optional) |
epena | 1:c0429edee15b | 307 | * @return Number of characters read/written |
epena | 1:c0429edee15b | 308 | */ |
epena | 1:c0429edee15b | 309 | static ssize_t get_conv_mode_available(void *device, |
epena | 1:c0429edee15b | 310 | char *buf, |
epena | 1:c0429edee15b | 311 | size_t len, |
epena | 1:c0429edee15b | 312 | const struct iio_ch_info *channel, |
epena | 1:c0429edee15b | 313 | intptr_t id) |
epena | 1:c0429edee15b | 314 | { |
epena | 1:c0429edee15b | 315 | return sprintf(buf, "%s", |
epena | 1:c0429edee15b | 316 | "Continuous-Mode Continious-One-Shot-Mode Single-Mode Periodic-Mode Standby-Mode"); |
epena | 1:c0429edee15b | 317 | } |
epena | 1:c0429edee15b | 318 | |
epena | 1:c0429edee15b | 319 | /*! |
epena | 1:c0429edee15b | 320 | * @brief Setter for the conv mode available values |
epena | 1:c0429edee15b | 321 | * @param device- pointer to IIO device structure |
epena | 1:c0429edee15b | 322 | * @param buf- pointer to buffer holding attribute value |
epena | 1:c0429edee15b | 323 | * @param len- length of buffer string data |
epena | 1:c0429edee15b | 324 | * @param channel- pointer to IIO channel structure |
epena | 1:c0429edee15b | 325 | * @param id- Attribute ID (optional) |
epena | 1:c0429edee15b | 326 | * @return Number of characters read/written |
epena | 1:c0429edee15b | 327 | */ |
epena | 1:c0429edee15b | 328 | static ssize_t set_conv_mode_available(void *device, |
epena | 1:c0429edee15b | 329 | char *buf, |
epena | 1:c0429edee15b | 330 | size_t len, |
epena | 1:c0429edee15b | 331 | const struct iio_ch_info *channel, |
epena | 1:c0429edee15b | 332 | intptr_t id) |
epena | 1:c0429edee15b | 333 | { |
epena | 1:c0429edee15b | 334 | /* NA- Can't set error value */ |
epena | 1:c0429edee15b | 335 | return len; |
epena | 1:c0429edee15b | 336 | } |
epena | 1:c0429edee15b | 337 | |
epena | 1:c0429edee15b | 338 | /*! |
epena | 1:c0429edee15b | 339 | * @brief Getter/Setter for the conversion mode attribute value |
epena | 1:c0429edee15b | 340 | * @param device- pointer to IIO device structure |
epena | 1:c0429edee15b | 341 | * @param buf- pointer to buffer holding attribute value |
epena | 1:c0429edee15b | 342 | * @param len- length of buffer string data |
epena | 1:c0429edee15b | 343 | * @param channel- pointer to IIO channel structure |
epena | 1:c0429edee15b | 344 | * @return Number of characters read/written |
epena | 1:c0429edee15b | 345 | */ |
epena | 1:c0429edee15b | 346 | ssize_t get_conv_mode(void* device, |
epena | 1:c0429edee15b | 347 | char* buf, |
epena | 1:c0429edee15b | 348 | size_t len, |
epena | 1:c0429edee15b | 349 | const struct iio_ch_info* channel, |
epena | 1:c0429edee15b | 350 | intptr_t id) |
epena | 1:c0429edee15b | 351 | { |
epena | 1:c0429edee15b | 352 | uint8_t conv_mode_value = 0; |
epena | 1:c0429edee15b | 353 | |
epena | 1:c0429edee15b | 354 | if (ad77681_spi_read_mask(device, |
epena | 1:c0429edee15b | 355 | AD77681_REG_CONVERSION, |
epena | 1:c0429edee15b | 356 | AD77681_CONVERSION_MODE_MSK, |
epena | 1:c0429edee15b | 357 | &conv_mode_value) == SUCCESS) { |
epena | 1:c0429edee15b | 358 | if (conv_mode_value <= (uint8_t)ARRAY_SIZE(conv_mode_str)) { |
epena | 1:c0429edee15b | 359 | return (ssize_t)sprintf(buf, "%s", conv_mode_str[conv_mode_value]); |
epena | 1:c0429edee15b | 360 | } else if (conv_mode_value == SINGLE_MODE_CONV_STANDBY) { |
epena | 1:c0429edee15b | 361 | return (ssize_t)sprintf(buf, "%s", conv_mode_str[2]); |
epena | 1:c0429edee15b | 362 | } else if (conv_mode_value == PERIODIC_MODE_CONV_STANDBY) { |
epena | 1:c0429edee15b | 363 | return (ssize_t)sprintf(buf, "%s", conv_mode_str[3]); |
epena | 1:c0429edee15b | 364 | } |
epena | 1:c0429edee15b | 365 | } |
epena | 1:c0429edee15b | 366 | |
epena | 1:c0429edee15b | 367 | return -EINVAL; |
epena | 1:c0429edee15b | 368 | } |
epena | 1:c0429edee15b | 369 | |
epena | 1:c0429edee15b | 370 | ssize_t set_conv_mode(void* device, |
epena | 1:c0429edee15b | 371 | char* buf, |
epena | 1:c0429edee15b | 372 | size_t len, |
epena | 1:c0429edee15b | 373 | const struct iio_ch_info* channel, |
epena | 1:c0429edee15b | 374 | intptr_t id) |
epena | 1:c0429edee15b | 375 | { |
epena | 1:c0429edee15b | 376 | uint8_t conv_mode_value; |
epena | 1:c0429edee15b | 377 | |
epena | 1:c0429edee15b | 378 | for (conv_mode_value = 0; conv_mode_value < (uint8_t)ARRAY_SIZE(conv_mode_str); |
epena | 1:c0429edee15b | 379 | conv_mode_value++) { |
epena | 1:c0429edee15b | 380 | if (!strncmp(buf, conv_mode_str[conv_mode_value], |
epena | 1:c0429edee15b | 381 | strlen(conv_mode_str[conv_mode_value]))) { |
epena | 1:c0429edee15b | 382 | break; |
epena | 1:c0429edee15b | 383 | } |
epena | 1:c0429edee15b | 384 | } |
epena | 1:c0429edee15b | 385 | |
epena | 1:c0429edee15b | 386 | if (conv_mode_value < (uint8_t)ARRAY_SIZE(conv_mode_str)) { |
epena | 1:c0429edee15b | 387 | if (ad77681_set_conv_mode(device, conv_mode_value, AD77681_AIN_SHORT, |
epena | 1:c0429edee15b | 388 | false) == SUCCESS) { |
epena | 1:c0429edee15b | 389 | return len; |
epena | 1:c0429edee15b | 390 | } |
epena | 1:c0429edee15b | 391 | } |
epena | 1:c0429edee15b | 392 | |
epena | 1:c0429edee15b | 393 | return -EINVAL; |
epena | 1:c0429edee15b | 394 | } |
epena | 1:c0429edee15b | 395 | |
epena | 1:c0429edee15b | 396 | /*! |
epena | 1:c0429edee15b | 397 | * @brief Getter for the mclk division available values |
epena | 1:c0429edee15b | 398 | * @param device- pointer to IIO device structure |
epena | 1:c0429edee15b | 399 | * @param buf- pointer to buffer holding attribute value |
epena | 1:c0429edee15b | 400 | * @param len- length of buffer string data |
epena | 1:c0429edee15b | 401 | * @param channel- pointer to IIO channel structure |
epena | 1:c0429edee15b | 402 | * @param id- Attribute ID (optional) |
epena | 1:c0429edee15b | 403 | * @return Number of characters read/written |
epena | 1:c0429edee15b | 404 | */ |
epena | 1:c0429edee15b | 405 | |
epena | 1:c0429edee15b | 406 | static ssize_t get_mclk_division_available(void *device, |
epena | 1:c0429edee15b | 407 | char *buf, |
epena | 1:c0429edee15b | 408 | size_t len, |
epena | 1:c0429edee15b | 409 | const struct iio_ch_info *channel, |
epena | 1:c0429edee15b | 410 | intptr_t id) |
epena | 1:c0429edee15b | 411 | { |
epena | 1:c0429edee15b | 412 | return sprintf(buf, "%s", |
epena | 1:c0429edee15b | 413 | "AD77681_MCLK_DIV_16 AD77681_MCLK_DIV_8 AD77681_MCLK_DIV_4 AD77681_MCLK_DIV_2"); |
epena | 1:c0429edee15b | 414 | } |
epena | 1:c0429edee15b | 415 | |
epena | 1:c0429edee15b | 416 | /*! |
epena | 1:c0429edee15b | 417 | * @brief Setter for the mclk division available values |
epena | 1:c0429edee15b | 418 | * @param device- pointer to IIO device structure |
epena | 1:c0429edee15b | 419 | * @param buf- pointer to buffer holding attribute value |
epena | 1:c0429edee15b | 420 | * @param len- length of buffer string data |
epena | 1:c0429edee15b | 421 | * @param channel- pointer to IIO channel structure |
epena | 1:c0429edee15b | 422 | * @param id- Attribute ID (optional) |
epena | 1:c0429edee15b | 423 | * @return Number of characters read/written |
epena | 1:c0429edee15b | 424 | */ |
epena | 1:c0429edee15b | 425 | static ssize_t set_mclk_division_available(void *device, |
epena | 1:c0429edee15b | 426 | char *buf, |
epena | 1:c0429edee15b | 427 | size_t len, |
epena | 1:c0429edee15b | 428 | const struct iio_ch_info *channel, |
epena | 1:c0429edee15b | 429 | intptr_t id) |
epena | 1:c0429edee15b | 430 | { |
epena | 1:c0429edee15b | 431 | /* NA- Can't set error value */ |
epena | 1:c0429edee15b | 432 | return len; |
epena | 1:c0429edee15b | 433 | } |
epena | 1:c0429edee15b | 434 | |
epena | 1:c0429edee15b | 435 | /*! |
epena | 1:c0429edee15b | 436 | * @brief Getter/Setter for the MCLK division attribute value |
epena | 1:c0429edee15b | 437 | * @param device- pointer to IIO device structure |
epena | 1:c0429edee15b | 438 | * @param buf- pointer to buffer holding attribute value |
epena | 1:c0429edee15b | 439 | * @param len- length of buffer string data |
epena | 1:c0429edee15b | 440 | * @param channel- pointer to IIO channel structure |
epena | 1:c0429edee15b | 441 | * @param channel- pointer to IIO channel structure |
epena | 1:c0429edee15b | 442 | * @return Number of characters read/written |
epena | 1:c0429edee15b | 443 | */ |
epena | 1:c0429edee15b | 444 | ssize_t get_mclk_division(void* device, |
epena | 1:c0429edee15b | 445 | char* buf, |
epena | 1:c0429edee15b | 446 | size_t len, |
epena | 1:c0429edee15b | 447 | const struct iio_ch_info* channel, |
epena | 1:c0429edee15b | 448 | intptr_t id) |
epena | 1:c0429edee15b | 449 | { |
epena | 1:c0429edee15b | 450 | uint8_t mclk_division_value = 0; |
epena | 1:c0429edee15b | 451 | |
epena | 1:c0429edee15b | 452 | if (ad77681_spi_read_mask(device, |
epena | 1:c0429edee15b | 453 | AD77681_REG_POWER_CLOCK, |
epena | 1:c0429edee15b | 454 | AD77681_POWER_CLK_MCLK_DIV_MSK, |
epena | 1:c0429edee15b | 455 | &mclk_division_value) == SUCCESS) { |
epena | 1:c0429edee15b | 456 | return (ssize_t)sprintf(buf, "%s", mclk_division_str[mclk_division_value >> 4]); |
epena | 1:c0429edee15b | 457 | } |
epena | 1:c0429edee15b | 458 | |
epena | 1:c0429edee15b | 459 | return -EINVAL; |
epena | 1:c0429edee15b | 460 | } |
epena | 1:c0429edee15b | 461 | |
epena | 1:c0429edee15b | 462 | ssize_t set_mclk_division(void* device, |
epena | 1:c0429edee15b | 463 | char* buf, |
epena | 1:c0429edee15b | 464 | size_t len, |
epena | 1:c0429edee15b | 465 | const struct iio_ch_info* channel, |
epena | 1:c0429edee15b | 466 | intptr_t id) |
epena | 1:c0429edee15b | 467 | { |
epena | 1:c0429edee15b | 468 | uint8_t mclk_division_value = 0; |
epena | 1:c0429edee15b | 469 | uint8_t mclk_division_str_len = 0; |
epena | 1:c0429edee15b | 470 | |
epena | 1:c0429edee15b | 471 | mclk_division_str_len = (uint8_t)ARRAY_SIZE(mclk_division_str); |
epena | 1:c0429edee15b | 472 | |
epena | 1:c0429edee15b | 473 | for (uint8_t mclk_division_cntr = 0; mclk_division_cntr < mclk_division_str_len; |
epena | 1:c0429edee15b | 474 | mclk_division_cntr++) { |
epena | 1:c0429edee15b | 475 | if (!strncmp(buf, mclk_division_str[mclk_division_cntr], |
epena | 1:c0429edee15b | 476 | strlen(mclk_division_str[mclk_division_cntr]))) { |
epena | 1:c0429edee15b | 477 | mclk_division_value = mclk_division_cntr; |
epena | 1:c0429edee15b | 478 | break; |
epena | 1:c0429edee15b | 479 | } |
epena | 1:c0429edee15b | 480 | } |
epena | 1:c0429edee15b | 481 | |
epena | 1:c0429edee15b | 482 | if (mclk_division_value < mclk_division_str_len) { |
epena | 1:c0429edee15b | 483 | if (ad77681_set_mclk_div(device, mclk_division_value) == SUCCESS) { |
epena | 1:c0429edee15b | 484 | return len; |
epena | 1:c0429edee15b | 485 | } |
epena | 1:c0429edee15b | 486 | } |
epena | 1:c0429edee15b | 487 | |
epena | 1:c0429edee15b | 488 | return -EINVAL; |
epena | 1:c0429edee15b | 489 | } |
epena | 1:c0429edee15b | 490 | |
epena | 1:c0429edee15b | 491 | /*! |
epena | 1:c0429edee15b | 492 | * @brief Get the actual register address value from the list |
epena | 1:c0429edee15b | 493 | * @param reg- Register address to read from |
epena | 1:c0429edee15b | 494 | * @param Reg_add - actual value of Register address |
epena | 1:c0429edee15b | 495 | * @return true in case of success, false value otherwise |
epena | 1:c0429edee15b | 496 | */ |
epena | 1:c0429edee15b | 497 | bool debug_get_reg_value(uint8_t reg, uint8_t* Reg_add) |
epena | 1:c0429edee15b | 498 | { |
epena | 1:c0429edee15b | 499 | bool ad77681_regs_debug_flg = false; |
epena | 1:c0429edee15b | 500 | uint8_t ad77681_regs_arr_cntr; |
epena | 1:c0429edee15b | 501 | |
epena | 1:c0429edee15b | 502 | for (ad77681_regs_arr_cntr = 0; |
epena | 1:c0429edee15b | 503 | ad77681_regs_arr_cntr < (uint8_t)AD77681_REG_MAX_ADDR; |
epena | 1:c0429edee15b | 504 | ad77681_regs_arr_cntr++) { |
epena | 1:c0429edee15b | 505 | if (reg == ad77681_regs[ad77681_regs_arr_cntr]) { |
epena | 1:c0429edee15b | 506 | ad77681_regs_debug_flg = true; |
epena | 1:c0429edee15b | 507 | *Reg_add = reg; |
epena | 1:c0429edee15b | 508 | break; |
epena | 1:c0429edee15b | 509 | } |
epena | 1:c0429edee15b | 510 | } |
epena | 1:c0429edee15b | 511 | |
epena | 1:c0429edee15b | 512 | return ad77681_regs_debug_flg; |
epena | 1:c0429edee15b | 513 | } |
epena | 1:c0429edee15b | 514 | |
epena | 1:c0429edee15b | 515 | /*! |
epena | 1:c0429edee15b | 516 | * @brief Read the debug register value |
epena | 1:c0429edee15b | 517 | * @param dev- Pointer to IIO device instance |
epena | 1:c0429edee15b | 518 | * @param reg- Register address to read from |
epena | 1:c0429edee15b | 519 | * @param readval- Pointer to variable to read data into |
epena | 1:c0429edee15b | 520 | * @return SUCCESS in case of success, negative value otherwise |
epena | 1:c0429edee15b | 521 | */ |
epena | 1:c0429edee15b | 522 | int32_t debug_reg_read(void *dev, uint32_t reg, uint32_t *readval) |
epena | 1:c0429edee15b | 523 | { |
epena | 1:c0429edee15b | 524 | |
epena | 1:c0429edee15b | 525 | bool ad77681_dev_debug_read_flg = false; |
epena | 1:c0429edee15b | 526 | uint8_t ad77681_dev_actual_reg_add = 0; |
epena | 1:c0429edee15b | 527 | |
epena | 1:c0429edee15b | 528 | ad77681_dev_debug_read_flg = debug_get_reg_value((uint8_t)reg, |
epena | 1:c0429edee15b | 529 | &ad77681_dev_actual_reg_add); |
epena | 1:c0429edee15b | 530 | |
epena | 1:c0429edee15b | 531 | /* Read the data from device */ |
epena | 1:c0429edee15b | 532 | if (ad77681_dev_debug_read_flg == true) { |
epena | 1:c0429edee15b | 533 | if ((ad77681_spi_reg_read(dev, (uint8_t)ad77681_dev_actual_reg_add, |
epena | 1:c0429edee15b | 534 | (uint8_t *)readval) == SUCCESS)) { |
epena | 1:c0429edee15b | 535 | // Shift 8 bits to get the uint8 value from uint32 |
epena | 1:c0429edee15b | 536 | *readval = *readval >> 8; |
epena | 1:c0429edee15b | 537 | return SUCCESS; |
epena | 1:c0429edee15b | 538 | } |
epena | 1:c0429edee15b | 539 | } |
epena | 1:c0429edee15b | 540 | |
epena | 1:c0429edee15b | 541 | return FAILURE; |
epena | 1:c0429edee15b | 542 | } |
epena | 1:c0429edee15b | 543 | |
epena | 1:c0429edee15b | 544 | /*! |
epena | 1:c0429edee15b | 545 | * @brief Write into the debug register |
epena | 1:c0429edee15b | 546 | * @param dev- Pointer to IIO device instance |
epena | 1:c0429edee15b | 547 | * @param reg- Register address to write into |
epena | 1:c0429edee15b | 548 | * @param writeval- Register value to write |
epena | 1:c0429edee15b | 549 | * @return SUCCESS in case of success, negative value otherwise |
epena | 1:c0429edee15b | 550 | */ |
epena | 1:c0429edee15b | 551 | int32_t debug_reg_write(void *dev, uint32_t reg, uint32_t writeval) |
epena | 1:c0429edee15b | 552 | { |
epena | 1:c0429edee15b | 553 | bool ad77681_dev_debug_write_flg = false; |
epena | 1:c0429edee15b | 554 | uint8_t ad77681_dev_actual_reg_add = 0; |
epena | 1:c0429edee15b | 555 | |
epena | 1:c0429edee15b | 556 | ad77681_dev_debug_write_flg = debug_get_reg_value((uint8_t)reg, |
epena | 1:c0429edee15b | 557 | &ad77681_dev_actual_reg_add); |
epena | 1:c0429edee15b | 558 | |
epena | 1:c0429edee15b | 559 | if (ad77681_dev_debug_write_flg == true) { |
epena | 1:c0429edee15b | 560 | if (ad77681_spi_reg_write(dev, ad77681_dev_actual_reg_add, |
epena | 1:c0429edee15b | 561 | (uint8_t) writeval) == SUCCESS) { |
epena | 1:c0429edee15b | 562 | return SUCCESS; |
epena | 1:c0429edee15b | 563 | } |
epena | 1:c0429edee15b | 564 | } |
epena | 1:c0429edee15b | 565 | |
epena | 1:c0429edee15b | 566 | return FAILURE; |
epena | 1:c0429edee15b | 567 | } |
epena | 1:c0429edee15b | 568 | |
epena | 1:c0429edee15b | 569 | |
epena | 1:c0429edee15b | 570 | /** |
epena | 1:c0429edee15b | 571 | * @brief Read buffer data corresponding to AD4170 IIO device |
epena | 1:c0429edee15b | 572 | * @param dev_instance[in] - IIO device instance |
epena | 1:c0429edee15b | 573 | * @param pbuf[out] - Pointer to output data buffer |
epena | 1:c0429edee15b | 574 | * @param offset[in] - Data buffer offset |
epena | 1:c0429edee15b | 575 | * @param bytes_count[in] - Number of bytes to read |
epena | 1:c0429edee15b | 576 | * @param ch_mask[in] - Channels select mask |
epena | 1:c0429edee15b | 577 | * @return SUCCESS in case of success or negative value otherwise |
epena | 1:c0429edee15b | 578 | */ |
epena | 1:c0429edee15b | 579 | static ssize_t iio_ad77681_read_data(void *dev_instance, |
epena | 1:c0429edee15b | 580 | char *pbuf, |
epena | 1:c0429edee15b | 581 | size_t offset, |
epena | 1:c0429edee15b | 582 | size_t bytes_count, |
epena | 1:c0429edee15b | 583 | uint32_t ch_mask) |
epena | 1:c0429edee15b | 584 | { |
epena | 1:c0429edee15b | 585 | if (adc_data_capture_started == false) { |
epena | 1:c0429edee15b | 586 | start_data_capture(ch_mask, AD77681_NUM_CHANNELS); |
epena | 1:c0429edee15b | 587 | adc_data_capture_started = true; |
epena | 1:c0429edee15b | 588 | } |
epena | 1:c0429edee15b | 589 | |
epena | 1:c0429edee15b | 590 | /* Read the data stored into acquisition buffers */ |
epena | 1:c0429edee15b | 591 | return (ssize_t)read_buffered_data(pbuf, |
epena | 1:c0429edee15b | 592 | bytes_count, |
epena | 1:c0429edee15b | 593 | offset, |
epena | 1:c0429edee15b | 594 | ch_mask, |
epena | 1:c0429edee15b | 595 | AD77681_BYTES_PER_SAMPLE); |
epena | 1:c0429edee15b | 596 | } |
epena | 1:c0429edee15b | 597 | |
epena | 1:c0429edee15b | 598 | /** |
epena | 1:c0429edee15b | 599 | * @brief Transfer the device data into memory (optional) |
epena | 1:c0429edee15b | 600 | * @param dev_instance[in] - IIO device instance |
epena | 1:c0429edee15b | 601 | * @param bytes_count[in] - Number of bytes to read |
epena | 1:c0429edee15b | 602 | * @param ch_mask[in] - Channels select mask |
epena | 1:c0429edee15b | 603 | * @return SUCCESS in case of success or negative value otherwise |
epena | 1:c0429edee15b | 604 | */ |
epena | 1:c0429edee15b | 605 | static ssize_t iio_ad77681_transfer_dev_data(void *dev_instance, |
epena | 1:c0429edee15b | 606 | size_t bytes_count, |
epena | 1:c0429edee15b | 607 | uint32_t ch_mask) |
epena | 1:c0429edee15b | 608 | { |
epena | 1:c0429edee15b | 609 | /* The function insures that data is first read into memory from the device. |
epena | 1:c0429edee15b | 610 | * This function doesn't do any sort of data transfer but it make sure data |
epena | 1:c0429edee15b | 611 | * read and it's transfer to memory from device is happening in application through |
epena | 1:c0429edee15b | 612 | * iio_ad4130_read_data() function */ |
epena | 1:c0429edee15b | 613 | |
epena | 1:c0429edee15b | 614 | /* Store the requested samples count value for data capture */ |
epena | 1:c0429edee15b | 615 | store_requested_samples_count(bytes_count, AD77681_BYTES_PER_SAMPLE); |
epena | 1:c0429edee15b | 616 | |
epena | 1:c0429edee15b | 617 | return SUCCESS; |
epena | 1:c0429edee15b | 618 | } |
epena | 1:c0429edee15b | 619 | |
epena | 1:c0429edee15b | 620 | /** |
epena | 1:c0429edee15b | 621 | * @brief Perform tasks before new data transfer |
epena | 1:c0429edee15b | 622 | * @param dev_instance[in] - IIO device instance |
epena | 1:c0429edee15b | 623 | * @param ch_mask[in] - Channels select mask |
epena | 1:c0429edee15b | 624 | * @return SUCCESS in case of success or negative value otherwise |
epena | 1:c0429edee15b | 625 | */ |
epena | 1:c0429edee15b | 626 | static int32_t iio_ad77681_start_transfer(void *dev_instance, uint32_t ch_mask) |
epena | 1:c0429edee15b | 627 | { |
epena | 1:c0429edee15b | 628 | return SUCCESS; |
epena | 1:c0429edee15b | 629 | } |
epena | 1:c0429edee15b | 630 | |
epena | 1:c0429edee15b | 631 | |
epena | 1:c0429edee15b | 632 | /** |
epena | 1:c0429edee15b | 633 | * @brief Perform tasks before end of current data transfer |
epena | 1:c0429edee15b | 634 | * @param dev_instance[in] - IIO device instance |
epena | 1:c0429edee15b | 635 | * @return SUCCESS in case of success or negative value otherwise |
epena | 1:c0429edee15b | 636 | */ |
epena | 1:c0429edee15b | 637 | static int32_t iio_ad77681_stop_transfer(void *dev) |
epena | 1:c0429edee15b | 638 | { |
epena | 1:c0429edee15b | 639 | adc_data_capture_started = false; |
epena | 1:c0429edee15b | 640 | stop_data_capture(); |
epena | 1:c0429edee15b | 641 | |
epena | 1:c0429edee15b | 642 | return SUCCESS; |
epena | 1:c0429edee15b | 643 | } |
epena | 1:c0429edee15b | 644 | |
epena | 1:c0429edee15b | 645 | /********************************************************* |
epena | 1:c0429edee15b | 646 | * IIO Attributes and Structures |
epena | 1:c0429edee15b | 647 | ********************************************************/ |
epena | 1:c0429edee15b | 648 | |
epena | 1:c0429edee15b | 649 | /* IIOD channels attributes list */ |
epena | 1:c0429edee15b | 650 | struct iio_attribute channel_input_attributes[] = { |
epena | 1:c0429edee15b | 651 | { |
epena | 1:c0429edee15b | 652 | .name = "raw", |
epena | 1:c0429edee15b | 653 | .show = get_raw, |
epena | 1:c0429edee15b | 654 | .store = set_raw, |
epena | 1:c0429edee15b | 655 | }, |
epena | 1:c0429edee15b | 656 | { |
epena | 1:c0429edee15b | 657 | .name = "scale", |
epena | 1:c0429edee15b | 658 | .show = get_scale, |
epena | 1:c0429edee15b | 659 | .store = set_scale, |
epena | 1:c0429edee15b | 660 | }, |
epena | 1:c0429edee15b | 661 | |
epena | 1:c0429edee15b | 662 | END_ATTRIBUTES_ARRAY |
epena | 1:c0429edee15b | 663 | }; |
epena | 1:c0429edee15b | 664 | |
epena | 1:c0429edee15b | 665 | /* IIOD device (global) attributes list */ |
epena | 1:c0429edee15b | 666 | static struct iio_attribute global_attributes[] = { |
epena | 1:c0429edee15b | 667 | { |
epena | 1:c0429edee15b | 668 | .name = "sampling_frequency", |
epena | 1:c0429edee15b | 669 | .show = get_sampling_frequency, |
epena | 1:c0429edee15b | 670 | .store = set_sampling_frequency, |
epena | 1:c0429edee15b | 671 | }, |
epena | 1:c0429edee15b | 672 | { |
epena | 1:c0429edee15b | 673 | .name = "conv_mode_available", |
epena | 1:c0429edee15b | 674 | .show = get_conv_mode_available, |
epena | 1:c0429edee15b | 675 | .store = set_conv_mode_available, |
epena | 1:c0429edee15b | 676 | }, |
epena | 1:c0429edee15b | 677 | { |
epena | 1:c0429edee15b | 678 | .name = "conv_mode", |
epena | 1:c0429edee15b | 679 | .show = get_conv_mode, |
epena | 1:c0429edee15b | 680 | .store = set_conv_mode, |
epena | 1:c0429edee15b | 681 | }, |
epena | 1:c0429edee15b | 682 | { |
epena | 1:c0429edee15b | 683 | .name = "power_mode_available", |
epena | 1:c0429edee15b | 684 | .show = get_power_mode_available, |
epena | 1:c0429edee15b | 685 | .store = set_power_mode_available, |
epena | 1:c0429edee15b | 686 | }, |
epena | 1:c0429edee15b | 687 | { |
epena | 1:c0429edee15b | 688 | .name = "power_mode", |
epena | 1:c0429edee15b | 689 | .show = get_power_mode, |
epena | 1:c0429edee15b | 690 | .store = set_power_mode, |
epena | 1:c0429edee15b | 691 | }, |
epena | 1:c0429edee15b | 692 | { |
epena | 1:c0429edee15b | 693 | .name = "mclk_division_available", |
epena | 1:c0429edee15b | 694 | .show = get_mclk_division_available, |
epena | 1:c0429edee15b | 695 | .store = set_mclk_division_available, |
epena | 1:c0429edee15b | 696 | }, |
epena | 1:c0429edee15b | 697 | { |
epena | 1:c0429edee15b | 698 | .name = "mclk_division", |
epena | 1:c0429edee15b | 699 | .show = get_mclk_division, |
epena | 1:c0429edee15b | 700 | .store = set_mclk_division, |
epena | 1:c0429edee15b | 701 | }, |
epena | 1:c0429edee15b | 702 | |
epena | 1:c0429edee15b | 703 | END_ATTRIBUTES_ARRAY |
epena | 1:c0429edee15b | 704 | |
epena | 1:c0429edee15b | 705 | }; |
epena | 1:c0429edee15b | 706 | |
epena | 1:c0429edee15b | 707 | /* IIOD debug attributes list */ |
epena | 1:c0429edee15b | 708 | static struct iio_attribute debug_attributes[] = { |
epena | 1:c0429edee15b | 709 | { |
epena | 1:c0429edee15b | 710 | .name = "direct_reg_access", |
epena | 1:c0429edee15b | 711 | .show = NULL, |
epena | 1:c0429edee15b | 712 | .store = NULL, |
epena | 1:c0429edee15b | 713 | }, |
epena | 1:c0429edee15b | 714 | |
epena | 1:c0429edee15b | 715 | END_ATTRIBUTES_ARRAY |
epena | 1:c0429edee15b | 716 | }; |
epena | 1:c0429edee15b | 717 | |
epena | 1:c0429edee15b | 718 | /* IIOD channels configurations */ |
epena | 1:c0429edee15b | 719 | struct scan_type chn_scan = { |
epena | 1:c0429edee15b | 720 | .sign = 's', |
epena | 1:c0429edee15b | 721 | .realbits = AD77681_CHN_STORAGE_BITS, |
epena | 1:c0429edee15b | 722 | .storagebits = AD77681_CHN_STORAGE_BITS, |
epena | 1:c0429edee15b | 723 | .shift = 0, |
epena | 1:c0429edee15b | 724 | .is_big_endian = false |
epena | 1:c0429edee15b | 725 | }; |
epena | 1:c0429edee15b | 726 | |
epena | 1:c0429edee15b | 727 | /* IIOD Channel list */ |
epena | 1:c0429edee15b | 728 | static struct iio_channel iio_ad77681_channels[] = { |
epena | 1:c0429edee15b | 729 | { |
epena | 1:c0429edee15b | 730 | .name = "voltage0", |
epena | 1:c0429edee15b | 731 | .ch_type = IIO_VOLTAGE, |
epena | 1:c0429edee15b | 732 | .channel = 0, |
epena | 1:c0429edee15b | 733 | .scan_index = 0, |
epena | 1:c0429edee15b | 734 | .scan_type = &chn_scan, |
epena | 1:c0429edee15b | 735 | .attributes = channel_input_attributes, |
epena | 1:c0429edee15b | 736 | .ch_out = false, |
epena | 1:c0429edee15b | 737 | .indexed = true, |
epena | 1:c0429edee15b | 738 | }, |
epena | 1:c0429edee15b | 739 | }; |
epena | 1:c0429edee15b | 740 | |
epena | 1:c0429edee15b | 741 | /** |
epena | 1:c0429edee15b | 742 | * @brief Init for reading/writing and parameterization of a |
epena | 1:c0429edee15b | 743 | * ad77681 IIO device |
epena | 1:c0429edee15b | 744 | * @param desc[in,out] - IIO device descriptor |
epena | 1:c0429edee15b | 745 | * @return SUCCESS in case of success, FAILURE otherwise |
epena | 1:c0429edee15b | 746 | */ |
epena | 1:c0429edee15b | 747 | static int32_t iio_ad77681_init(struct iio_device **desc) |
epena | 1:c0429edee15b | 748 | { |
epena | 1:c0429edee15b | 749 | struct iio_device *iio_ad77861_inst; |
epena | 1:c0429edee15b | 750 | |
epena | 1:c0429edee15b | 751 | iio_ad77861_inst = calloc(1, sizeof(struct iio_device)); |
epena | 1:c0429edee15b | 752 | if (!iio_ad77861_inst) { |
epena | 1:c0429edee15b | 753 | return FAILURE; |
epena | 1:c0429edee15b | 754 | } |
epena | 1:c0429edee15b | 755 | |
epena | 1:c0429edee15b | 756 | iio_ad77861_inst->num_ch = sizeof(iio_ad77681_channels) / sizeof( |
epena | 1:c0429edee15b | 757 | iio_ad77681_channels[0]); |
epena | 1:c0429edee15b | 758 | iio_ad77861_inst->channels = iio_ad77681_channels; |
epena | 1:c0429edee15b | 759 | iio_ad77861_inst->attributes = global_attributes; |
epena | 1:c0429edee15b | 760 | iio_ad77861_inst->debug_attributes = debug_attributes; |
epena | 1:c0429edee15b | 761 | iio_ad77861_inst->transfer_dev_to_mem = iio_ad77681_transfer_dev_data; |
epena | 1:c0429edee15b | 762 | iio_ad77861_inst->transfer_mem_to_dev = NULL; |
epena | 1:c0429edee15b | 763 | iio_ad77861_inst->read_data = iio_ad77681_read_data; |
epena | 1:c0429edee15b | 764 | iio_ad77861_inst->write_data = NULL; |
epena | 1:c0429edee15b | 765 | iio_ad77861_inst->prepare_transfer = iio_ad77681_start_transfer; |
epena | 1:c0429edee15b | 766 | iio_ad77861_inst->end_transfer = iio_ad77681_stop_transfer; |
epena | 1:c0429edee15b | 767 | iio_ad77861_inst->debug_reg_read = debug_reg_read; |
epena | 1:c0429edee15b | 768 | iio_ad77861_inst->debug_reg_write = debug_reg_write; |
epena | 1:c0429edee15b | 769 | |
epena | 1:c0429edee15b | 770 | *desc = iio_ad77861_inst; |
epena | 1:c0429edee15b | 771 | |
epena | 1:c0429edee15b | 772 | return SUCCESS; |
epena | 1:c0429edee15b | 773 | } |
epena | 1:c0429edee15b | 774 | |
epena | 1:c0429edee15b | 775 | |
epena | 1:c0429edee15b | 776 | /** |
epena | 1:c0429edee15b | 777 | * @brief Release resources allocated for AD77681 IIO device |
epena | 1:c0429edee15b | 778 | * @param desc[in] - IIO device descriptor |
epena | 1:c0429edee15b | 779 | * @return SUCCESS in case of success, FAILURE otherwise |
epena | 1:c0429edee15b | 780 | */ |
epena | 1:c0429edee15b | 781 | static int32_t iio_ad77681_remove(struct iio_desc *desc) |
epena | 1:c0429edee15b | 782 | { |
epena | 1:c0429edee15b | 783 | int32_t status; |
epena | 1:c0429edee15b | 784 | |
epena | 1:c0429edee15b | 785 | if (!desc) { |
epena | 1:c0429edee15b | 786 | return FAILURE; |
epena | 1:c0429edee15b | 787 | } |
epena | 1:c0429edee15b | 788 | |
epena | 1:c0429edee15b | 789 | status = iio_unregister(desc, (char *)dev_name); |
epena | 1:c0429edee15b | 790 | if (status != SUCCESS) { |
epena | 1:c0429edee15b | 791 | return FAILURE; |
epena | 1:c0429edee15b | 792 | } |
epena | 1:c0429edee15b | 793 | |
epena | 1:c0429edee15b | 794 | return SUCCESS; |
epena | 1:c0429edee15b | 795 | } |
epena | 1:c0429edee15b | 796 | |
epena | 1:c0429edee15b | 797 | /** |
epena | 1:c0429edee15b | 798 | * @brief Initialize the IIO interface for AD77681 IIO device |
epena | 1:c0429edee15b | 799 | * @return none |
epena | 1:c0429edee15b | 800 | * @return SUCCESS in case of success, FAILURE otherwise |
epena | 1:c0429edee15b | 801 | */ |
epena | 1:c0429edee15b | 802 | int32_t ad77681_iio_initialize(void) |
epena | 1:c0429edee15b | 803 | { |
epena | 1:c0429edee15b | 804 | int32_t init_status = FAILURE; |
epena | 1:c0429edee15b | 805 | |
epena | 1:c0429edee15b | 806 | /* IIO device descriptor */ |
epena | 1:c0429edee15b | 807 | struct iio_device *p_iio_ad77681_dev; |
epena | 1:c0429edee15b | 808 | |
epena | 1:c0429edee15b | 809 | /** |
epena | 1:c0429edee15b | 810 | * IIO interface init parameters |
epena | 1:c0429edee15b | 811 | */ |
epena | 1:c0429edee15b | 812 | struct iio_init_param iio_init_params = { |
epena | 1:c0429edee15b | 813 | .phy_type = USE_UART, |
epena | 1:c0429edee15b | 814 | { |
epena | 1:c0429edee15b | 815 | &uart_init_params |
epena | 1:c0429edee15b | 816 | } |
epena | 1:c0429edee15b | 817 | }; |
epena | 1:c0429edee15b | 818 | |
epena | 1:c0429edee15b | 819 | /* Initialize AD77681 device and peripheral interface */ |
epena | 1:c0429edee15b | 820 | init_status = ad77681_setup(&p_ad77681_dev_inst, sad77681_init, |
epena | 1:c0429edee15b | 821 | &p_ad77681_stat_reg); |
epena | 1:c0429edee15b | 822 | if (init_status != SUCCESS) { |
epena | 1:c0429edee15b | 823 | return init_status; |
epena | 1:c0429edee15b | 824 | } |
epena | 1:c0429edee15b | 825 | |
epena | 1:c0429edee15b | 826 | /* Initialize the IIO interface */ |
epena | 1:c0429edee15b | 827 | init_status = iio_init(&p_ad77681_iio_desc, &iio_init_params); |
epena | 1:c0429edee15b | 828 | if (init_status != SUCCESS) { |
epena | 1:c0429edee15b | 829 | return init_status; |
epena | 1:c0429edee15b | 830 | } |
epena | 1:c0429edee15b | 831 | |
epena | 1:c0429edee15b | 832 | /* Initialize the AD77681 IIO application interface */ |
epena | 1:c0429edee15b | 833 | init_status = iio_ad77681_init(&p_iio_ad77681_dev); |
epena | 1:c0429edee15b | 834 | if (init_status != SUCCESS) { |
epena | 1:c0429edee15b | 835 | return init_status; |
epena | 1:c0429edee15b | 836 | } |
epena | 1:c0429edee15b | 837 | |
epena | 1:c0429edee15b | 838 | /* Register AD77681 IIO interface */ |
epena | 1:c0429edee15b | 839 | init_status = iio_register(p_ad77681_iio_desc, |
epena | 1:c0429edee15b | 840 | p_iio_ad77681_dev, |
epena | 1:c0429edee15b | 841 | (char *)dev_name, |
epena | 1:c0429edee15b | 842 | p_ad77681_dev_inst, |
epena | 1:c0429edee15b | 843 | NULL, |
epena | 1:c0429edee15b | 844 | NULL); |
epena | 1:c0429edee15b | 845 | |
epena | 1:c0429edee15b | 846 | if (init_status != SUCCESS) { |
epena | 1:c0429edee15b | 847 | return init_status; |
epena | 1:c0429edee15b | 848 | } |
epena | 1:c0429edee15b | 849 | |
epena | 1:c0429edee15b | 850 | /* Init the system peripherals */ |
epena | 1:c0429edee15b | 851 | init_status = init_system(); |
epena | 1:c0429edee15b | 852 | if (init_status != SUCCESS) { |
epena | 1:c0429edee15b | 853 | return init_status; |
epena | 1:c0429edee15b | 854 | } |
epena | 1:c0429edee15b | 855 | |
epena | 1:c0429edee15b | 856 | return init_status; |
epena | 1:c0429edee15b | 857 | } |
epena | 1:c0429edee15b | 858 | |
epena | 1:c0429edee15b | 859 | /** |
epena | 1:c0429edee15b | 860 | * @brief Run the AD77681 IIO event handler |
epena | 1:c0429edee15b | 861 | * @return none |
epena | 1:c0429edee15b | 862 | * @details This function monitors the new IIO client event |
epena | 1:c0429edee15b | 863 | */ |
epena | 1:c0429edee15b | 864 | void ad77681_iio_event_handler(void) |
epena | 1:c0429edee15b | 865 | { |
epena | 1:c0429edee15b | 866 | while (1) { |
epena | 1:c0429edee15b | 867 | (void)iio_step(p_ad77681_iio_desc); |
epena | 1:c0429edee15b | 868 | } |
epena | 1:c0429edee15b | 869 | } |
epena | 1:c0429edee15b | 870 | |
epena | 1:c0429edee15b | 871 | |
epena | 1:c0429edee15b | 872 |