AD7768-1 MBED IIO Application Example

Dependencies:   platform_drivers

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?

UserRevisionLine numberNew 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