Example Program for EVAL-AD7606

Dependencies:   platform_drivers

Committer:
Kjansen45
Date:
Mon Oct 19 07:54:56 2020 +0000
Revision:
5:42b1eeef29d9
Parent:
3:83b3133f544a
Child:
6:32de160dce43
Repository update

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mahphalke 1:819ac9aa5667 1 /***************************************************************************//**
mahphalke 1:819ac9aa5667 2 * @file iio_ad7606.c
mahphalke 1:819ac9aa5667 3 * @brief Implementation of AD7606 IIO application interfaces
mahphalke 1:819ac9aa5667 4 * @details This module acts as an interface for AD7606 IIO application
mahphalke 1:819ac9aa5667 5 ********************************************************************************
mahphalke 1:819ac9aa5667 6 * Copyright (c) 2020 Analog Devices, Inc.
mahphalke 1:819ac9aa5667 7 *
mahphalke 1:819ac9aa5667 8 * This software is proprietary to Analog Devices, Inc. and its licensors.
mahphalke 1:819ac9aa5667 9 * By using this software you agree to the terms of the associated
mahphalke 1:819ac9aa5667 10 * Analog Devices Software License Agreement.
mahphalke 1:819ac9aa5667 11 *******************************************************************************/
mahphalke 1:819ac9aa5667 12
mahphalke 1:819ac9aa5667 13 /******************************************************************************/
mahphalke 1:819ac9aa5667 14 /***************************** Include Files **********************************/
mahphalke 1:819ac9aa5667 15 /******************************************************************************/
mahphalke 1:819ac9aa5667 16
mahphalke 1:819ac9aa5667 17 #include <inttypes.h>
mahphalke 1:819ac9aa5667 18 #include <string.h>
mahphalke 1:819ac9aa5667 19 #include <errno.h>
mahphalke 1:819ac9aa5667 20 #include <math.h>
mahphalke 1:819ac9aa5667 21
mahphalke 1:819ac9aa5667 22 #include "app_config.h"
mahphalke 1:819ac9aa5667 23
mahphalke 1:819ac9aa5667 24 #include "tinyiiod.h"
mahphalke 1:819ac9aa5667 25 #include "iio_ad7606.h"
mahphalke 1:819ac9aa5667 26 #include "iio_ad7606_attr.h"
mahphalke 1:819ac9aa5667 27 #include "iio_app.h"
mahphalke 1:819ac9aa5667 28 #include "iio_transport.h"
mahphalke 1:819ac9aa5667 29
mahphalke 1:819ac9aa5667 30 #include "platform_support.h"
mahphalke 1:819ac9aa5667 31 #include "spi_extra.h"
mahphalke 1:819ac9aa5667 32 #include "gpio_extra.h"
mahphalke 1:819ac9aa5667 33 #include "uart_extra.h"
mahphalke 1:819ac9aa5667 34 #include "irq_extra.h"
mahphalke 1:819ac9aa5667 35
mahphalke 1:819ac9aa5667 36 #include "ad7606.h"
mahphalke 1:819ac9aa5667 37 #include "ad7606_data_capture.h"
mahphalke 1:819ac9aa5667 38 #include "ad7606_support.h"
mahphalke 1:819ac9aa5667 39 #include "ad7606_user_config.h"
mahphalke 1:819ac9aa5667 40
mahphalke 1:819ac9aa5667 41 /******************************************************************************/
mahphalke 1:819ac9aa5667 42 /************************ Macros/Constants ************************************/
mahphalke 1:819ac9aa5667 43 /******************************************************************************/
mahphalke 1:819ac9aa5667 44
mahphalke 1:819ac9aa5667 45 /* ADC data to Voltage conversion scale factor for IIO client */
mahphalke 1:819ac9aa5667 46 #define DEFAULT_SCALE ((DEFAULT_CHN_RANGE / ADC_MAX_COUNT_BIPOLAR) * 1000)
mahphalke 1:819ac9aa5667 47
mahphalke 3:83b3133f544a 48 /* LSB Threshold to entry into open circuit detection as per datasheet */
mahphalke 3:83b3133f544a 49 #define MANUAL_OPEN_DETECT_ENTRY_TRHLD 350
mahphalke 3:83b3133f544a 50
mahphalke 3:83b3133f544a 51 /* Manual open circuit detect LSB threshold @50K Rpd as per datasheet */
mahphalke 3:83b3133f544a 52 #define MANUAL_OPEN_DETECT_THRESHOLD_RPD50K 20
mahphalke 3:83b3133f544a 53
mahphalke 3:83b3133f544a 54 /* Number of consecutive conversions (N) in manual open circuit detection */
mahphalke 3:83b3133f544a 55 #define MANUAL_OPEN_DETECT_CONV_CNTS 10
mahphalke 1:819ac9aa5667 56
mahphalke 3:83b3133f544a 57 /* LSB Threshold b/w consecutive N conversions */
mahphalke 3:83b3133f544a 58 #define MANUAL_OPEN_DETECT_CONV_TRSHLD 10
mahphalke 3:83b3133f544a 59
mahphalke 3:83b3133f544a 60 /* Number of common mode conversions in manual open circuit detect */
mahphalke 3:83b3133f544a 61 #define MANUAL_OPEN_DETECT_CM_CNV_CNT 3
mahphalke 3:83b3133f544a 62
mahphalke 3:83b3133f544a 63 /* Max number of queue counts for auto mode open circuit detection */
mahphalke 3:83b3133f544a 64 #define AUTO_OPEN_DETECT_QUEUE_MAX_CNT 128
mahphalke 3:83b3133f544a 65 #define AUTO_OPEN_DETECT_QUEUE_EXTRA_CONV_CNT 15
mahphalke 1:819ac9aa5667 66
mahphalke 1:819ac9aa5667 67 /* Maximum ADC calibration gain value */
mahphalke 1:819ac9aa5667 68 #define ADC_CALIBRATION_GAIN_MAX 64.0
mahphalke 1:819ac9aa5667 69
mahphalke 3:83b3133f544a 70 #if defined(DEV_AD7606C_18)
mahphalke 3:83b3133f544a 71 #define OFFSET_REG_RESOLUTION 4
mahphalke 3:83b3133f544a 72 #else
mahphalke 3:83b3133f544a 73 #define OFFSET_REG_RESOLUTION 1
mahphalke 3:83b3133f544a 74 #endif
mahphalke 3:83b3133f544a 75
mahphalke 3:83b3133f544a 76 /* Default sampling frequency for AD7606 (in SPS) to define IIO client timeout period.
mahphalke 3:83b3133f544a 77 * Note: The actual sampling frequncy is much higher (~30KSPS per channel), however the
mahphalke 3:83b3133f544a 78 * data transmission back to IIO client is limited by the serial (UART) link, which
mahphalke 3:83b3133f544a 79 * can provide max transmission rate of ~3-4KSPS. Hence sampling frequency is set to 1Khz
mahphalke 3:83b3133f544a 80 * for safer side */
mahphalke 3:83b3133f544a 81 #define AD7606_DEFLT_SAMPLING_FREQEUNCY (1000)
mahphalke 3:83b3133f544a 82
mahphalke 1:819ac9aa5667 83 /******************************************************************************/
mahphalke 1:819ac9aa5667 84 /*************************** Types Declarations *******************************/
mahphalke 1:819ac9aa5667 85 /******************************************************************************/
mahphalke 1:819ac9aa5667 86
mahphalke 1:819ac9aa5667 87 /**
mahphalke 1:819ac9aa5667 88 * IIO application instance descriptor.
mahphalke 1:819ac9aa5667 89 */
mahphalke 1:819ac9aa5667 90 static struct iio_app_desc *iio_app_desc;
mahphalke 1:819ac9aa5667 91
mahphalke 1:819ac9aa5667 92 /**
mahphalke 1:819ac9aa5667 93 * Device name.
mahphalke 1:819ac9aa5667 94 */
mahphalke 1:819ac9aa5667 95 static const char dev_name[] = ACTIVE_DEVICE_NAME;
mahphalke 1:819ac9aa5667 96
mahphalke 1:819ac9aa5667 97 /**
mahphalke 1:819ac9aa5667 98 * Pointer to the struct representing the AD7606 IIO device
mahphalke 1:819ac9aa5667 99 */
mahphalke 1:819ac9aa5667 100 static struct ad7606_dev *p_ad7606_dev = NULL;
mahphalke 1:819ac9aa5667 101
mahphalke 1:819ac9aa5667 102
mahphalke 1:819ac9aa5667 103 /* Device attributes with default values */
mahphalke 1:819ac9aa5667 104
mahphalke 1:819ac9aa5667 105 /* Power down mode values string representation (possible values specified in datasheet) */
mahphalke 1:819ac9aa5667 106 static char *operating_mode_str[] = {
mahphalke 1:819ac9aa5667 107 "0 (Normal Mode)",
mahphalke 1:819ac9aa5667 108 "1 (Standby Mode)",
mahphalke 1:819ac9aa5667 109 "2 (Auto Standby Mode)",
mahphalke 1:819ac9aa5667 110 "3 (Shutdown Mode)"
mahphalke 1:819ac9aa5667 111 };
mahphalke 1:819ac9aa5667 112
mahphalke 1:819ac9aa5667 113 /* Bandwidth values string */
mahphalke 1:819ac9aa5667 114 static char *bandwidth_str[] = {
mahphalke 1:819ac9aa5667 115 "0 (Low)",
mahphalke 1:819ac9aa5667 116 "1 (High)"
mahphalke 1:819ac9aa5667 117 };
mahphalke 1:819ac9aa5667 118
mahphalke 1:819ac9aa5667 119 /* Channel range values string representation (possible values specified in datasheet) */
mahphalke 1:819ac9aa5667 120 static char *chn_range_str[] = {
mahphalke 1:819ac9aa5667 121 #if defined(DEV_AD7606B)
mahphalke 1:819ac9aa5667 122 "0 (+/-2.5V SE)", "1 (+/-5.0V SE)", "2 (+/-10.0V SE)", "3 (+/-10.0V SE)",
mahphalke 1:819ac9aa5667 123 "4 (+/-10.0V SE)", "5 (+/-10.0V SE)", "6 (+/-10.0V SE)", "7 (+/-10.0V SE)",
mahphalke 1:819ac9aa5667 124 "8 (+/-10.0V SE)", "9 (+/-10.0V SE)", "10 (+/-10.0V SE)", "11 (+/-10.0V SE)",
mahphalke 1:819ac9aa5667 125 #elif defined(DEV_AD7606C_18) || defined(DEV_AD7606C_16)
mahphalke 1:819ac9aa5667 126 "0 (+/-2.5V SE)", "1 (+/-5.0V SE)", "2 (+/-6.25V SE)", "3 (+/-10.0V SE)",
mahphalke 3:83b3133f544a 127 "4 (+/-12.5V SE)", "5 (0 to 5V SE)", "6 (0 to 10V SE)", "7 (0 to 12.5V SE)",
mahphalke 3:83b3133f544a 128 "8 (+/-5.0V Diff)", "9 (+/-10.0V Diff)", "10 (+/-12.5V Diff)", "11 (+/-20.0V Diff)"
mahphalke 1:819ac9aa5667 129 #elif defined(DEV_AD7609)
mahphalke 1:819ac9aa5667 130 "0 (+/-10.0V SE)", "1 (+/-20.0V SE)"
mahphalke 1:819ac9aa5667 131 #else
mahphalke 1:819ac9aa5667 132 "0 (+/-5.0V SE)", "1 (+/-10.0V SE)"
mahphalke 1:819ac9aa5667 133 #endif
mahphalke 1:819ac9aa5667 134 };
mahphalke 1:819ac9aa5667 135
mahphalke 1:819ac9aa5667 136 /* Oversampling values string representation (possible values specified in datasheet) */
mahphalke 1:819ac9aa5667 137 static char *oversampling_val_str[] = {
mahphalke 1:819ac9aa5667 138 "0 (no oversampling)", "1 (oversampling by 2)", "2 (oversampling by 4)",
mahphalke 1:819ac9aa5667 139 "3 (oversampling by 8)", "4 (oversampling by 16)", "5 (oversampling by 32)",
mahphalke 1:819ac9aa5667 140 "6 (oversampling by 64)", "7 (oversampling by 128)", "8 (oversampling by 256)"
mahphalke 1:819ac9aa5667 141 };
mahphalke 1:819ac9aa5667 142
mahphalke 1:819ac9aa5667 143
mahphalke 1:819ac9aa5667 144 /* Channel range values string representation (possible values specified in datasheet) */
mahphalke 1:819ac9aa5667 145 static float chn_range_val[] = {
mahphalke 1:819ac9aa5667 146 #if defined(DEV_AD7606B)
mahphalke 1:819ac9aa5667 147 2.5, 5.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0
mahphalke 1:819ac9aa5667 148 #elif defined(DEV_AD7606C_18) || defined(DEV_AD7606C_16)
mahphalke 1:819ac9aa5667 149 2.5, 5.0, 6.25, 10.0, 12.5, 5.0, 10.0, 12.5, 5.0, 10.0, 12.5, 20.0
mahphalke 1:819ac9aa5667 150 #elif defined(DEV_AD7609)
mahphalke 1:819ac9aa5667 151 10.0, 20.0
mahphalke 1:819ac9aa5667 152 #else
mahphalke 1:819ac9aa5667 153 5.0, 10.0
mahphalke 1:819ac9aa5667 154 #endif
mahphalke 1:819ac9aa5667 155 };
mahphalke 1:819ac9aa5667 156
mahphalke 1:819ac9aa5667 157 /* Range value per channel */
mahphalke 1:819ac9aa5667 158 static float attr_chn_range[AD7606X_ADC_CHANNELS] = {
mahphalke 1:819ac9aa5667 159 DEFAULT_CHN_RANGE, DEFAULT_CHN_RANGE, DEFAULT_CHN_RANGE, DEFAULT_CHN_RANGE,
mahphalke 1:819ac9aa5667 160 DEFAULT_CHN_RANGE, DEFAULT_CHN_RANGE, DEFAULT_CHN_RANGE, DEFAULT_CHN_RANGE
mahphalke 1:819ac9aa5667 161 };
mahphalke 1:819ac9aa5667 162
mahphalke 1:819ac9aa5667 163 /* Scale value per channel */
mahphalke 1:819ac9aa5667 164 static float attr_scale_val[AD7606X_ADC_CHANNELS] = {
mahphalke 1:819ac9aa5667 165 DEFAULT_SCALE, DEFAULT_SCALE, DEFAULT_SCALE, DEFAULT_SCALE,
mahphalke 1:819ac9aa5667 166 DEFAULT_SCALE, DEFAULT_SCALE, DEFAULT_SCALE, DEFAULT_SCALE
mahphalke 1:819ac9aa5667 167 };
mahphalke 1:819ac9aa5667 168
mahphalke 1:819ac9aa5667 169 /* Scale value per channel */
mahphalke 1:819ac9aa5667 170 static polarity_e attr_polarity_val[AD7606X_ADC_CHANNELS] = {
mahphalke 1:819ac9aa5667 171 BIPOLAR, BIPOLAR, BIPOLAR, BIPOLAR,
mahphalke 1:819ac9aa5667 172 BIPOLAR, BIPOLAR, BIPOLAR, BIPOLAR
mahphalke 1:819ac9aa5667 173 };
mahphalke 1:819ac9aa5667 174
mahphalke 1:819ac9aa5667 175 /* Channel range */
mahphalke 1:819ac9aa5667 176 typedef enum {
mahphalke 1:819ac9aa5667 177 LOW,
mahphalke 1:819ac9aa5667 178 HIGH
mahphalke 1:819ac9aa5667 179 } range_e;
mahphalke 1:819ac9aa5667 180
mahphalke 1:819ac9aa5667 181 /* Open detect auto mode QUEUE register count */
mahphalke 1:819ac9aa5667 182 static uint8_t open_detect_queue_cnts[AD7606X_ADC_CHANNELS] = {
mahphalke 1:819ac9aa5667 183 0
mahphalke 1:819ac9aa5667 184 };
mahphalke 1:819ac9aa5667 185
mahphalke 1:819ac9aa5667 186 /* ADC gain calibration Rfilter value (in Kohms) */
mahphalke 1:819ac9aa5667 187 static uint8_t gain_calibration_reg_val[AD7606X_ADC_CHANNELS] = {
mahphalke 1:819ac9aa5667 188 0
mahphalke 1:819ac9aa5667 189 };
mahphalke 1:819ac9aa5667 190
mahphalke 1:819ac9aa5667 191 /* Device register value */
mahphalke 1:819ac9aa5667 192 static uint8_t device_reg_val;
mahphalke 1:819ac9aa5667 193
mahphalke 1:819ac9aa5667 194 /* GPIO LED descriptor and init structure */
mahphalke 1:819ac9aa5667 195 static struct gpio_desc *gpio_led;
mahphalke 1:819ac9aa5667 196
mahphalke 1:819ac9aa5667 197 /* Flag to trigger new background conversion and capture when READBUFF command is issued */
mahphalke 1:819ac9aa5667 198 static bool adc_background_data_capture_started = false;
mahphalke 1:819ac9aa5667 199
mahphalke 3:83b3133f544a 200 /* Gain calibration status */
mahphalke 3:83b3133f544a 201 static bool gain_calibration_done = false;
mahphalke 3:83b3133f544a 202
mahphalke 3:83b3133f544a 203 /* Open circuit mode detection flags */
mahphalke 3:83b3133f544a 204 static bool open_circuit_detection_done = false;
mahphalke 3:83b3133f544a 205 static bool open_circuit_detection_error = false;
mahphalke 3:83b3133f544a 206 static bool open_circuit_detect_read_done = false;
mahphalke 3:83b3133f544a 207
mahphalke 3:83b3133f544a 208 /* Sampling frequency of device */
mahphalke 3:83b3133f544a 209 static uint16_t sampling_frequency = AD7606_DEFLT_SAMPLING_FREQEUNCY;
mahphalke 3:83b3133f544a 210
mahphalke 1:819ac9aa5667 211 /******************************************************************************/
mahphalke 1:819ac9aa5667 212 /************************ Functions Prototypes ********************************/
mahphalke 1:819ac9aa5667 213 /******************************************************************************/
mahphalke 1:819ac9aa5667 214
mahphalke 1:819ac9aa5667 215 static float get_vltg_conv_scale_factor(float chn_range, polarity_e polarity);
mahphalke 1:819ac9aa5667 216 static void save_local_attributes(void);
mahphalke 1:819ac9aa5667 217
mahphalke 1:819ac9aa5667 218 /******************************************************************************/
mahphalke 1:819ac9aa5667 219 /************************ Functions Definitions *******************************/
mahphalke 1:819ac9aa5667 220 /******************************************************************************/
mahphalke 1:819ac9aa5667 221
mahphalke 1:819ac9aa5667 222 /*!
mahphalke 1:819ac9aa5667 223 * @brief Getter/Setter for the scale attribute value
mahphalke 1:819ac9aa5667 224 * @param device- pointer to IIO device structure
mahphalke 1:819ac9aa5667 225 * @param buf- pointer to buffer holding attribute value
mahphalke 1:819ac9aa5667 226 * @param len- length of buffer string data
mahphalke 1:819ac9aa5667 227 * @param channel- pointer to IIO channel structure
mahphalke 1:819ac9aa5667 228 * @return Number of characters read/written
mahphalke 1:819ac9aa5667 229 */
mahphalke 1:819ac9aa5667 230 ssize_t get_chn_scale(void *device,
mahphalke 1:819ac9aa5667 231 char *buf,
mahphalke 1:819ac9aa5667 232 size_t len,
mahphalke 1:819ac9aa5667 233 const struct iio_ch_info *channel)
mahphalke 1:819ac9aa5667 234 {
mahphalke 1:819ac9aa5667 235 return (ssize_t) sprintf(buf, "%f", attr_scale_val[channel->ch_num - 1]);
mahphalke 1:819ac9aa5667 236 }
mahphalke 1:819ac9aa5667 237
mahphalke 1:819ac9aa5667 238 ssize_t set_chn_scale(void *device,
mahphalke 1:819ac9aa5667 239 char *buf,
mahphalke 1:819ac9aa5667 240 size_t len,
mahphalke 1:819ac9aa5667 241 const struct iio_ch_info *channel)
mahphalke 1:819ac9aa5667 242 {
mahphalke 1:819ac9aa5667 243 float scale;
mahphalke 1:819ac9aa5667 244
mahphalke 1:819ac9aa5667 245 (void)sscanf(buf, "%f", &scale);
mahphalke 1:819ac9aa5667 246
mahphalke 1:819ac9aa5667 247 if (scale > 0.0) {
mahphalke 1:819ac9aa5667 248 attr_scale_val[channel->ch_num - 1] = scale;
mahphalke 1:819ac9aa5667 249 return len;
mahphalke 1:819ac9aa5667 250 }
mahphalke 1:819ac9aa5667 251
mahphalke 1:819ac9aa5667 252 return -EINVAL;
mahphalke 1:819ac9aa5667 253 }
mahphalke 1:819ac9aa5667 254
mahphalke 1:819ac9aa5667 255
mahphalke 1:819ac9aa5667 256 /*!
mahphalke 3:83b3133f544a 257 * @brief Getter/Setter for the sampling frequency attribute value
mahphalke 3:83b3133f544a 258 * @param device- pointer to IIO device structure
mahphalke 3:83b3133f544a 259 * @param buf- pointer to buffer holding attribute value
mahphalke 3:83b3133f544a 260 * @param len- length of buffer string data
mahphalke 3:83b3133f544a 261 * @param channel- pointer to IIO channel structure
mahphalke 3:83b3133f544a 262 * @return Number of characters read/written
mahphalke 3:83b3133f544a 263 * @Note This attribute is used to define the timeout period in IIO
mahphalke 3:83b3133f544a 264 * client during data capture.
mahphalke 3:83b3133f544a 265 * Timeout = (number of requested samples * (1/sampling frequency)) + 1sec
mahphalke 3:83b3133f544a 266 * e.g. if sampling frequency = 1KSPS and requested samples = 400
mahphalke 3:83b3133f544a 267 * Timeout = (400 * 0.001) + 1 = 1.4sec
mahphalke 3:83b3133f544a 268 */
mahphalke 3:83b3133f544a 269 ssize_t get_sampling_frequency(void *device,
mahphalke 3:83b3133f544a 270 char *buf,
mahphalke 3:83b3133f544a 271 size_t len,
mahphalke 3:83b3133f544a 272 const struct iio_ch_info *channel)
mahphalke 3:83b3133f544a 273 {
mahphalke 3:83b3133f544a 274 return (ssize_t) sprintf(buf, "%d", sampling_frequency);
mahphalke 3:83b3133f544a 275 }
mahphalke 3:83b3133f544a 276
mahphalke 3:83b3133f544a 277 ssize_t set_sampling_frequency(void *device,
mahphalke 3:83b3133f544a 278 char *buf,
mahphalke 3:83b3133f544a 279 size_t len,
mahphalke 3:83b3133f544a 280 const struct iio_ch_info *channel)
mahphalke 3:83b3133f544a 281 {
mahphalke 3:83b3133f544a 282 /* NA- Can't set sampling frequency value */
mahphalke 3:83b3133f544a 283 return len;
mahphalke 3:83b3133f544a 284 }
mahphalke 3:83b3133f544a 285
mahphalke 3:83b3133f544a 286
mahphalke 3:83b3133f544a 287 /*!
mahphalke 1:819ac9aa5667 288 * @brief Getter/Setter for the raw attribute value
mahphalke 1:819ac9aa5667 289 * @param device- pointer to IIO device structure
mahphalke 1:819ac9aa5667 290 * @param buf- pointer to buffer holding attribute value
mahphalke 1:819ac9aa5667 291 * @param len- length of buffer string data
mahphalke 1:819ac9aa5667 292 * @param channel- pointer to IIO channel structure
mahphalke 1:819ac9aa5667 293 * @return Number of characters read/written
mahphalke 1:819ac9aa5667 294 */
mahphalke 1:819ac9aa5667 295 ssize_t get_chn_raw(void *device,
mahphalke 1:819ac9aa5667 296 char *buf,
mahphalke 1:819ac9aa5667 297 size_t len,
mahphalke 1:819ac9aa5667 298 const struct iio_ch_info *channel)
mahphalke 1:819ac9aa5667 299 {
mahphalke 1:819ac9aa5667 300 int32_t adc_data_raw;
mahphalke 1:819ac9aa5667 301
mahphalke 1:819ac9aa5667 302 /* Capture the raw adc data */
mahphalke 1:819ac9aa5667 303 adc_data_raw = single_data_read(device, channel->ch_num - 1,
mahphalke 1:819ac9aa5667 304 attr_polarity_val[channel->ch_num - 1]);
mahphalke 1:819ac9aa5667 305
mahphalke 1:819ac9aa5667 306 return (ssize_t) sprintf(buf, "%d", adc_data_raw);
mahphalke 1:819ac9aa5667 307 }
mahphalke 1:819ac9aa5667 308
mahphalke 1:819ac9aa5667 309 ssize_t set_chn_raw(void *device,
mahphalke 1:819ac9aa5667 310 char *buf,
mahphalke 1:819ac9aa5667 311 size_t len,
mahphalke 1:819ac9aa5667 312 const struct iio_ch_info *channel)
mahphalke 1:819ac9aa5667 313 {
mahphalke 1:819ac9aa5667 314 /* NA- Can't set raw value */
mahphalke 1:819ac9aa5667 315 return len;
mahphalke 1:819ac9aa5667 316 }
mahphalke 1:819ac9aa5667 317
mahphalke 1:819ac9aa5667 318
mahphalke 1:819ac9aa5667 319 /*!
mahphalke 1:819ac9aa5667 320 * @brief Getter/Setter for the operating mode attribute value
mahphalke 1:819ac9aa5667 321 * @param device- pointer to IIO device structure
mahphalke 1:819ac9aa5667 322 * @param buf- pointer to buffer holding attribute value
mahphalke 1:819ac9aa5667 323 * @param len- length of buffer string data
mahphalke 1:819ac9aa5667 324 * @param channel- pointer to IIO channel structure
mahphalke 1:819ac9aa5667 325 * @return Number of characters read/written
mahphalke 1:819ac9aa5667 326 * @note Available only for AD7606B and AD7606C
mahphalke 1:819ac9aa5667 327 */
mahphalke 1:819ac9aa5667 328 ssize_t get_operating_mode(void *device,
mahphalke 1:819ac9aa5667 329 char *buf,
mahphalke 1:819ac9aa5667 330 size_t len,
mahphalke 1:819ac9aa5667 331 const struct iio_ch_info *channel)
mahphalke 1:819ac9aa5667 332 {
mahphalke 1:819ac9aa5667 333 uint8_t read_val;
mahphalke 1:819ac9aa5667 334 uint8_t operating_mode_value;
mahphalke 1:819ac9aa5667 335
mahphalke 1:819ac9aa5667 336 if (ad7606_spi_reg_read(device, AD7606_REG_CONFIG, &read_val) == SUCCESS) {
mahphalke 1:819ac9aa5667 337 operating_mode_value = (read_val & AD7606_CONFIG_OPERATION_MODE_MSK);
mahphalke 1:819ac9aa5667 338
mahphalke 1:819ac9aa5667 339 if (operating_mode_value < sizeof(operating_mode_str) / sizeof(
mahphalke 1:819ac9aa5667 340 operating_mode_str[0])) {
mahphalke 1:819ac9aa5667 341 return (ssize_t)sprintf(buf, "%s", operating_mode_str[operating_mode_value]);
mahphalke 1:819ac9aa5667 342 }
mahphalke 1:819ac9aa5667 343 }
mahphalke 1:819ac9aa5667 344
mahphalke 1:819ac9aa5667 345 return -EINVAL;
mahphalke 1:819ac9aa5667 346 }
mahphalke 1:819ac9aa5667 347
mahphalke 1:819ac9aa5667 348 ssize_t set_operating_mode(void *device,
mahphalke 1:819ac9aa5667 349 char *buf,
mahphalke 1:819ac9aa5667 350 size_t len,
mahphalke 1:819ac9aa5667 351 const struct iio_ch_info *channel)
mahphalke 1:819ac9aa5667 352 {
mahphalke 1:819ac9aa5667 353 uint8_t operating_mode_value;
mahphalke 1:819ac9aa5667 354
mahphalke 1:819ac9aa5667 355 (void)sscanf(buf, "%d", &operating_mode_value);
mahphalke 1:819ac9aa5667 356
mahphalke 1:819ac9aa5667 357 if (operating_mode_value < sizeof(operating_mode_str) / sizeof(
mahphalke 1:819ac9aa5667 358 operating_mode_str[0])) {
mahphalke 1:819ac9aa5667 359 if (ad7606_spi_write_mask(device,
mahphalke 1:819ac9aa5667 360 AD7606_REG_CONFIG,
mahphalke 1:819ac9aa5667 361 AD7606_CONFIG_OPERATION_MODE_MSK,
mahphalke 1:819ac9aa5667 362 operating_mode_value) == SUCCESS) {
mahphalke 1:819ac9aa5667 363 return len;
mahphalke 1:819ac9aa5667 364 }
mahphalke 1:819ac9aa5667 365 }
mahphalke 1:819ac9aa5667 366
mahphalke 1:819ac9aa5667 367 return -EINVAL;
mahphalke 1:819ac9aa5667 368 }
mahphalke 1:819ac9aa5667 369
mahphalke 1:819ac9aa5667 370
mahphalke 1:819ac9aa5667 371 /*!
mahphalke 1:819ac9aa5667 372 * @brief Getter/Setter for the power down mode attribute value
mahphalke 1:819ac9aa5667 373 * @param device- pointer to IIO device structure
mahphalke 1:819ac9aa5667 374 * @param buf- pointer to buffer holding attribute value
mahphalke 1:819ac9aa5667 375 * @param len- length of buffer string data
mahphalke 1:819ac9aa5667 376 * @param channel- pointer to IIO channel structure
mahphalke 1:819ac9aa5667 377 * @return Number of characters read/written
mahphalke 1:819ac9aa5667 378 * @note Available for all devices except AD7606B and AD7606C
mahphalke 1:819ac9aa5667 379 */
mahphalke 1:819ac9aa5667 380 ssize_t get_power_down_mode(void *device,
mahphalke 1:819ac9aa5667 381 char *buf,
mahphalke 1:819ac9aa5667 382 size_t len,
mahphalke 1:819ac9aa5667 383 const struct iio_ch_info *channel)
mahphalke 1:819ac9aa5667 384 {
mahphalke 1:819ac9aa5667 385 uint8_t gpio_stby_val;
mahphalke 1:819ac9aa5667 386 uint8_t gpio_range_val;
mahphalke 1:819ac9aa5667 387
mahphalke 1:819ac9aa5667 388 if (gpio_get_value(((struct ad7606_dev *)device)->gpio_stby_n,
mahphalke 1:819ac9aa5667 389 &gpio_stby_val) == SUCCESS) {
mahphalke 1:819ac9aa5667 390 if (gpio_get_value(((struct ad7606_dev *)device)->gpio_range,
mahphalke 1:819ac9aa5667 391 &gpio_range_val) == SUCCESS) {
mahphalke 1:819ac9aa5667 392
mahphalke 1:819ac9aa5667 393 if (gpio_stby_val) {
mahphalke 1:819ac9aa5667 394 return sprintf(buf, "%s", operating_mode_str[AD7606_NORMAL]);
mahphalke 1:819ac9aa5667 395 } else {
mahphalke 1:819ac9aa5667 396 if (gpio_range_val) {
mahphalke 1:819ac9aa5667 397 return sprintf(buf, "%s", operating_mode_str[AD7606_STANDBY]);
mahphalke 1:819ac9aa5667 398 } else {
mahphalke 1:819ac9aa5667 399 return sprintf(buf, "%s", operating_mode_str[AD7606_SHUTDOWN]);
mahphalke 1:819ac9aa5667 400 }
mahphalke 1:819ac9aa5667 401 }
mahphalke 1:819ac9aa5667 402 }
mahphalke 1:819ac9aa5667 403 }
mahphalke 1:819ac9aa5667 404
mahphalke 1:819ac9aa5667 405 return -EINVAL;
mahphalke 1:819ac9aa5667 406 }
mahphalke 1:819ac9aa5667 407
mahphalke 1:819ac9aa5667 408 ssize_t set_power_down_mode(void *device,
mahphalke 1:819ac9aa5667 409 char *buf,
mahphalke 1:819ac9aa5667 410 size_t len,
mahphalke 1:819ac9aa5667 411 const struct iio_ch_info *channel)
mahphalke 1:819ac9aa5667 412 {
mahphalke 1:819ac9aa5667 413 uint8_t power_down_mode_value;
mahphalke 1:819ac9aa5667 414 static enum ad7606_op_mode prev_power_down_mode = AD7606_NORMAL;
mahphalke 1:819ac9aa5667 415 struct ad7606_config dev_config;
mahphalke 1:819ac9aa5667 416
mahphalke 1:819ac9aa5667 417 sscanf(buf, "%d", &power_down_mode_value);
mahphalke 1:819ac9aa5667 418
mahphalke 1:819ac9aa5667 419 if (power_down_mode_value < (sizeof(operating_mode_str) / sizeof(
mahphalke 1:819ac9aa5667 420 operating_mode_str[0]))) {
mahphalke 1:819ac9aa5667 421
mahphalke 1:819ac9aa5667 422 dev_config.op_mode = power_down_mode_value;
mahphalke 1:819ac9aa5667 423
mahphalke 1:819ac9aa5667 424 switch (power_down_mode_value) {
mahphalke 1:819ac9aa5667 425 case AD7606_NORMAL:
mahphalke 1:819ac9aa5667 426 if (ad7606_set_config(device, dev_config) == SUCCESS) {
mahphalke 1:819ac9aa5667 427 /* Reset the device if previous power down mode was either standby
mahphalke 1:819ac9aa5667 428 * or shutdown */
mahphalke 1:819ac9aa5667 429 if (prev_power_down_mode != AD7606_NORMAL) {
mahphalke 1:819ac9aa5667 430
mahphalke 1:819ac9aa5667 431 /* Power-up wait time */
mahphalke 1:819ac9aa5667 432 mdelay(1);
mahphalke 1:819ac9aa5667 433
mahphalke 1:819ac9aa5667 434 /* Toggle reset pin */
mahphalke 1:819ac9aa5667 435 if (gpio_set_value(((struct ad7606_dev *)device)->gpio_reset,
mahphalke 1:819ac9aa5667 436 GPIO_HIGH) == SUCCESS) {
mahphalke 1:819ac9aa5667 437 mdelay(1);
mahphalke 1:819ac9aa5667 438
mahphalke 1:819ac9aa5667 439 if (gpio_set_value(((struct ad7606_dev *)device)->gpio_reset,
mahphalke 1:819ac9aa5667 440 GPIO_LOW) == SUCCESS) {
mahphalke 1:819ac9aa5667 441 prev_power_down_mode = AD7606_NORMAL;
mahphalke 1:819ac9aa5667 442 return len;
mahphalke 1:819ac9aa5667 443 }
mahphalke 1:819ac9aa5667 444 }
mahphalke 1:819ac9aa5667 445 }
mahphalke 1:819ac9aa5667 446 }
mahphalke 1:819ac9aa5667 447 break;
mahphalke 1:819ac9aa5667 448
mahphalke 1:819ac9aa5667 449 case AD7606_STANDBY:
mahphalke 1:819ac9aa5667 450 if (ad7606_set_config(device, dev_config) == SUCCESS) {
mahphalke 1:819ac9aa5667 451 prev_power_down_mode = AD7606_STANDBY;
mahphalke 1:819ac9aa5667 452 return len;
mahphalke 1:819ac9aa5667 453 }
mahphalke 1:819ac9aa5667 454 break;
mahphalke 1:819ac9aa5667 455
mahphalke 1:819ac9aa5667 456 case AD7606_SHUTDOWN:
mahphalke 1:819ac9aa5667 457 if (ad7606_set_config(device, dev_config) == SUCCESS) {
mahphalke 1:819ac9aa5667 458 prev_power_down_mode = AD7606_SHUTDOWN;
mahphalke 1:819ac9aa5667 459 return len;
mahphalke 1:819ac9aa5667 460 }
mahphalke 1:819ac9aa5667 461 break;
mahphalke 1:819ac9aa5667 462
mahphalke 1:819ac9aa5667 463 default:
mahphalke 1:819ac9aa5667 464 break;
mahphalke 1:819ac9aa5667 465 }
mahphalke 1:819ac9aa5667 466 }
mahphalke 1:819ac9aa5667 467
mahphalke 1:819ac9aa5667 468 return -EINVAL;
mahphalke 1:819ac9aa5667 469 }
mahphalke 1:819ac9aa5667 470
mahphalke 1:819ac9aa5667 471
mahphalke 1:819ac9aa5667 472 /*!
mahphalke 1:819ac9aa5667 473 * @brief Getter/Setter for the range attribute value
mahphalke 1:819ac9aa5667 474 * @param device- pointer to IIO device structure
mahphalke 1:819ac9aa5667 475 * @param buf- pointer to buffer holding attribute value
mahphalke 1:819ac9aa5667 476 * @param len- length of buffer string data
mahphalke 1:819ac9aa5667 477 * @param channel- pointer to IIO channel structure
mahphalke 1:819ac9aa5667 478 * @return Number of characters read/written
mahphalke 1:819ac9aa5667 479 * @note Available for all devices except AD7606B and AD7606C
mahphalke 1:819ac9aa5667 480 */
mahphalke 1:819ac9aa5667 481 ssize_t get_range(void *device,
mahphalke 1:819ac9aa5667 482 char *buf,
mahphalke 1:819ac9aa5667 483 size_t len,
mahphalke 1:819ac9aa5667 484 const struct iio_ch_info *channel)
mahphalke 1:819ac9aa5667 485 {
mahphalke 1:819ac9aa5667 486 uint8_t gpio_range_val;
mahphalke 1:819ac9aa5667 487 struct ad7606_dev *dev = device;
mahphalke 1:819ac9aa5667 488
mahphalke 1:819ac9aa5667 489 if (gpio_get_value(dev->gpio_range, &gpio_range_val) == SUCCESS) {
mahphalke 1:819ac9aa5667 490 if (gpio_range_val) {
mahphalke 1:819ac9aa5667 491 return sprintf(buf, "%s", chn_range_str[HIGH]);
mahphalke 1:819ac9aa5667 492 } else {
mahphalke 1:819ac9aa5667 493 return sprintf(buf, "%s", chn_range_str[LOW]);
mahphalke 1:819ac9aa5667 494 }
mahphalke 1:819ac9aa5667 495 }
mahphalke 1:819ac9aa5667 496
mahphalke 1:819ac9aa5667 497 return -EINVAL;
mahphalke 1:819ac9aa5667 498 }
mahphalke 1:819ac9aa5667 499
mahphalke 1:819ac9aa5667 500 ssize_t set_range(void *device,
mahphalke 1:819ac9aa5667 501 char *buf,
mahphalke 1:819ac9aa5667 502 size_t len,
mahphalke 1:819ac9aa5667 503 const struct iio_ch_info *channel)
mahphalke 1:819ac9aa5667 504 {
mahphalke 1:819ac9aa5667 505 uint8_t range_value;
mahphalke 1:819ac9aa5667 506 struct ad7606_dev *dev = device;
mahphalke 1:819ac9aa5667 507
mahphalke 1:819ac9aa5667 508 (void)sscanf(buf, "%d", &range_value);
mahphalke 1:819ac9aa5667 509
mahphalke 1:819ac9aa5667 510 if (range_value < (sizeof(chn_range_str) / sizeof(chn_range_str[0]))) {
mahphalke 1:819ac9aa5667 511 if (range_value == LOW) {
mahphalke 1:819ac9aa5667 512 if (gpio_set_value(dev->gpio_range, GPIO_LOW) == SUCCESS) {
mahphalke 1:819ac9aa5667 513 return len;
mahphalke 1:819ac9aa5667 514 }
mahphalke 1:819ac9aa5667 515 } else {
mahphalke 1:819ac9aa5667 516 if (gpio_set_value(dev->gpio_range, GPIO_HIGH) == SUCCESS) {
mahphalke 1:819ac9aa5667 517 return len;
mahphalke 1:819ac9aa5667 518 }
mahphalke 1:819ac9aa5667 519 }
mahphalke 1:819ac9aa5667 520 }
mahphalke 1:819ac9aa5667 521
mahphalke 1:819ac9aa5667 522 return -EINVAL;
mahphalke 1:819ac9aa5667 523 }
mahphalke 1:819ac9aa5667 524
mahphalke 1:819ac9aa5667 525
mahphalke 1:819ac9aa5667 526 /*!
mahphalke 1:819ac9aa5667 527 * @brief Getter/Setter for the oversampling attribute value
mahphalke 1:819ac9aa5667 528 * @param device- pointer to IIO device structure
mahphalke 1:819ac9aa5667 529 * @param buf- pointer to buffer holding attribute value
mahphalke 1:819ac9aa5667 530 * @param len- length of buffer string data
mahphalke 1:819ac9aa5667 531 * @param channel- pointer to IIO channel structure
mahphalke 1:819ac9aa5667 532 * @return Number of characters read/written
mahphalke 1:819ac9aa5667 533 * @note Available for all devices except AD7606B and AD7606C
mahphalke 1:819ac9aa5667 534 */
mahphalke 1:819ac9aa5667 535 ssize_t get_oversampling(void *device,
mahphalke 1:819ac9aa5667 536 char *buf,
mahphalke 1:819ac9aa5667 537 size_t len,
mahphalke 1:819ac9aa5667 538 const struct iio_ch_info *channel)
mahphalke 1:819ac9aa5667 539 {
mahphalke 1:819ac9aa5667 540 uint8_t oversampling_value;
mahphalke 1:819ac9aa5667 541 uint8_t read_val;
mahphalke 1:819ac9aa5667 542 uint8_t gpio_osr0_val;
mahphalke 1:819ac9aa5667 543 uint8_t gpio_osr1_val;
mahphalke 1:819ac9aa5667 544 uint8_t gpio_osr2_val;
mahphalke 1:819ac9aa5667 545 struct ad7606_dev *dev = device;
mahphalke 1:819ac9aa5667 546
mahphalke 1:819ac9aa5667 547 #if defined(DEV_AD7606B) || defined(DEV_AD7606C_18) || defined(DEV_AD7606C_16)
mahphalke 1:819ac9aa5667 548 if (ad7606_spi_reg_read(device,
mahphalke 1:819ac9aa5667 549 AD7606_REG_OVERSAMPLING,
mahphalke 1:819ac9aa5667 550 &read_val) == SUCCESS) {
mahphalke 1:819ac9aa5667 551 oversampling_value = (read_val & AD7606_OVERSAMPLING_MSK);
mahphalke 1:819ac9aa5667 552
mahphalke 1:819ac9aa5667 553 if (oversampling_value < sizeof(oversampling_val_str) / sizeof(
mahphalke 1:819ac9aa5667 554 oversampling_val_str[0])) {
mahphalke 1:819ac9aa5667 555 return (ssize_t)sprintf(buf, "%s", oversampling_val_str[oversampling_value]);
mahphalke 1:819ac9aa5667 556 }
mahphalke 1:819ac9aa5667 557 }
mahphalke 1:819ac9aa5667 558 #else
mahphalke 1:819ac9aa5667 559 if (gpio_get_value(dev->gpio_os0, &gpio_osr0_val) == SUCCESS) {
mahphalke 1:819ac9aa5667 560 if (gpio_get_value(dev->gpio_os1, &gpio_osr1_val) == SUCCESS) {
mahphalke 1:819ac9aa5667 561 if (gpio_get_value(dev->gpio_os2, &gpio_osr2_val) == SUCCESS) {
mahphalke 1:819ac9aa5667 562 oversampling_value = (gpio_osr2_val << 2) | (gpio_osr1_val << 1) |
mahphalke 1:819ac9aa5667 563 gpio_osr0_val;
mahphalke 1:819ac9aa5667 564
mahphalke 1:819ac9aa5667 565 if (oversampling_value < (sizeof(oversampling_val_str) / sizeof(
mahphalke 1:819ac9aa5667 566 oversampling_val_str[0]))) {
mahphalke 1:819ac9aa5667 567 return sprintf(buf, "%s", oversampling_val_str[oversampling_value]);
mahphalke 1:819ac9aa5667 568 }
mahphalke 1:819ac9aa5667 569 }
mahphalke 1:819ac9aa5667 570 }
mahphalke 1:819ac9aa5667 571 }
mahphalke 1:819ac9aa5667 572 #endif
mahphalke 1:819ac9aa5667 573
mahphalke 1:819ac9aa5667 574 return -EINVAL;
mahphalke 1:819ac9aa5667 575 }
mahphalke 1:819ac9aa5667 576
mahphalke 1:819ac9aa5667 577 ssize_t set_oversampling(void *device,
mahphalke 1:819ac9aa5667 578 char *buf,
mahphalke 1:819ac9aa5667 579 size_t len,
mahphalke 1:819ac9aa5667 580 const struct iio_ch_info *channel)
mahphalke 1:819ac9aa5667 581 {
mahphalke 1:819ac9aa5667 582 uint8_t oversampling_value;
mahphalke 1:819ac9aa5667 583 struct ad7606_oversampling oversampling_cfg;
mahphalke 1:819ac9aa5667 584
mahphalke 1:819ac9aa5667 585 (void)sscanf(buf, "%d", &oversampling_value);
mahphalke 1:819ac9aa5667 586
mahphalke 1:819ac9aa5667 587 if (oversampling_value < (sizeof(oversampling_val_str) / sizeof(
mahphalke 1:819ac9aa5667 588 oversampling_val_str[0]))) {
mahphalke 1:819ac9aa5667 589
mahphalke 1:819ac9aa5667 590 oversampling_cfg.os_pad = 0;
mahphalke 1:819ac9aa5667 591 oversampling_cfg.os_ratio = oversampling_value;
mahphalke 1:819ac9aa5667 592
mahphalke 1:819ac9aa5667 593 ad7606_set_oversampling(device, oversampling_cfg);
mahphalke 1:819ac9aa5667 594
mahphalke 1:819ac9aa5667 595 return len;
mahphalke 1:819ac9aa5667 596 }
mahphalke 1:819ac9aa5667 597
mahphalke 1:819ac9aa5667 598 return -EINVAL;
mahphalke 1:819ac9aa5667 599 }
mahphalke 1:819ac9aa5667 600
mahphalke 1:819ac9aa5667 601
mahphalke 1:819ac9aa5667 602 /*!
mahphalke 1:819ac9aa5667 603 * @brief Getter/Setter for the bandwidth attribute value
mahphalke 1:819ac9aa5667 604 * @param device- pointer to IIO device structure
mahphalke 1:819ac9aa5667 605 * @param buf- pointer to buffer holding attribute value
mahphalke 1:819ac9aa5667 606 * @param len- length of buffer string data
mahphalke 1:819ac9aa5667 607 * @param channel- pointer to IIO channel structure
mahphalke 1:819ac9aa5667 608 * @return Number of characters read/written
mahphalke 1:819ac9aa5667 609 * @note Available for only AD7606C
mahphalke 1:819ac9aa5667 610 */
mahphalke 1:819ac9aa5667 611 ssize_t get_bandwidth(void *device,
mahphalke 1:819ac9aa5667 612 char *buf,
mahphalke 1:819ac9aa5667 613 size_t len,
mahphalke 1:819ac9aa5667 614 const struct iio_ch_info *channel)
mahphalke 1:819ac9aa5667 615 {
mahphalke 1:819ac9aa5667 616 uint8_t bw_value;
mahphalke 1:819ac9aa5667 617 uint8_t read_val;
mahphalke 1:819ac9aa5667 618
mahphalke 1:819ac9aa5667 619 if (ad7606_spi_reg_read(device,
mahphalke 1:819ac9aa5667 620 AD7606_REG_BANDWIDTH,
mahphalke 1:819ac9aa5667 621 &read_val) == SUCCESS) {
mahphalke 1:819ac9aa5667 622 bw_value = (read_val >> (channel->ch_num - 1)) & 0x1;
mahphalke 1:819ac9aa5667 623
mahphalke 1:819ac9aa5667 624 if (bw_value < sizeof(bandwidth_str) / sizeof(
mahphalke 1:819ac9aa5667 625 bandwidth_str[0])) {
mahphalke 1:819ac9aa5667 626 return (ssize_t)sprintf(buf, "%s", bandwidth_str[bw_value]);
mahphalke 1:819ac9aa5667 627 }
mahphalke 1:819ac9aa5667 628 }
mahphalke 1:819ac9aa5667 629
mahphalke 1:819ac9aa5667 630 return -EINVAL;
mahphalke 1:819ac9aa5667 631 }
mahphalke 1:819ac9aa5667 632
mahphalke 1:819ac9aa5667 633 ssize_t set_bandwidth(void *device,
mahphalke 1:819ac9aa5667 634 char *buf,
mahphalke 1:819ac9aa5667 635 size_t len,
mahphalke 1:819ac9aa5667 636 const struct iio_ch_info *channel)
mahphalke 1:819ac9aa5667 637 {
mahphalke 1:819ac9aa5667 638 uint8_t bw_value;
mahphalke 1:819ac9aa5667 639 uint8_t read_val;
mahphalke 1:819ac9aa5667 640
mahphalke 1:819ac9aa5667 641 (void)sscanf(buf, "%d", &bw_value);
mahphalke 1:819ac9aa5667 642
mahphalke 1:819ac9aa5667 643 if (bw_value < sizeof(bandwidth_str) / sizeof(
mahphalke 1:819ac9aa5667 644 bandwidth_str[0])) {
mahphalke 1:819ac9aa5667 645 if (ad7606_spi_reg_read(device,
mahphalke 1:819ac9aa5667 646 AD7606_REG_BANDWIDTH,
mahphalke 1:819ac9aa5667 647 &read_val) == SUCCESS) {
mahphalke 1:819ac9aa5667 648 if (bw_value) {
mahphalke 1:819ac9aa5667 649 read_val |= (1 << (channel->ch_num - 1));
mahphalke 1:819ac9aa5667 650 } else {
mahphalke 1:819ac9aa5667 651 read_val &= (~(1 << (channel->ch_num - 1)));
mahphalke 1:819ac9aa5667 652 }
mahphalke 1:819ac9aa5667 653
mahphalke 1:819ac9aa5667 654 if (ad7606_spi_reg_write(device,
mahphalke 1:819ac9aa5667 655 AD7606_REG_BANDWIDTH,
mahphalke 1:819ac9aa5667 656 read_val) == SUCCESS) {
mahphalke 1:819ac9aa5667 657 return len;
mahphalke 1:819ac9aa5667 658 }
mahphalke 1:819ac9aa5667 659 }
mahphalke 1:819ac9aa5667 660 }
mahphalke 1:819ac9aa5667 661
mahphalke 1:819ac9aa5667 662 return -EINVAL;
mahphalke 1:819ac9aa5667 663 }
mahphalke 1:819ac9aa5667 664
mahphalke 1:819ac9aa5667 665
mahphalke 1:819ac9aa5667 666 /*!
mahphalke 1:819ac9aa5667 667 * @brief Getter/Setter for the channel range attribute value
mahphalke 1:819ac9aa5667 668 * @param device- pointer to IIO device structure
mahphalke 1:819ac9aa5667 669 * @param buf- pointer to buffer holding attribute value
mahphalke 1:819ac9aa5667 670 * @param len- length of buffer string data
mahphalke 1:819ac9aa5667 671 * @param channel- pointer to IIO channel structure
mahphalke 1:819ac9aa5667 672 * @return Number of characters read/written
mahphalke 1:819ac9aa5667 673 * @note Available only for AD7606B and AD7606C
mahphalke 1:819ac9aa5667 674 */
mahphalke 1:819ac9aa5667 675 ssize_t get_chn_range(void *device,
mahphalke 1:819ac9aa5667 676 char *buf,
mahphalke 1:819ac9aa5667 677 size_t len,
mahphalke 1:819ac9aa5667 678 const struct iio_ch_info *channel)
mahphalke 1:819ac9aa5667 679 {
mahphalke 1:819ac9aa5667 680 uint8_t read_val;
mahphalke 1:819ac9aa5667 681 uint8_t chn_range;
mahphalke 1:819ac9aa5667 682
mahphalke 1:819ac9aa5667 683 if (ad7606_spi_reg_read(device, AD7606_REG_RANGE_CH_ADDR(channel->ch_num-1),
mahphalke 1:819ac9aa5667 684 &read_val) == SUCCESS) {
mahphalke 1:819ac9aa5667 685 if (((channel->ch_num - 1) % 2) != 0) {
mahphalke 1:819ac9aa5667 686 read_val >>= CHANNEL_RANGE_MSK_OFFSET;
mahphalke 1:819ac9aa5667 687 chn_range = read_val;
mahphalke 1:819ac9aa5667 688 } else {
mahphalke 1:819ac9aa5667 689 chn_range = (read_val & AD7606_RANGE_CH_MSK(channel->ch_num - 1));
mahphalke 1:819ac9aa5667 690 }
mahphalke 1:819ac9aa5667 691
mahphalke 1:819ac9aa5667 692 if (chn_range < sizeof(chn_range_str) / sizeof(chn_range_str[0])) {
mahphalke 1:819ac9aa5667 693 attr_chn_range[channel->ch_num - 1] = chn_range_val[chn_range];
mahphalke 1:819ac9aa5667 694 attr_polarity_val[channel->ch_num - 1] = ad7606_get_input_polarity(chn_range);
mahphalke 1:819ac9aa5667 695
mahphalke 1:819ac9aa5667 696 return (ssize_t)sprintf(buf, "%s", chn_range_str[chn_range]);
mahphalke 1:819ac9aa5667 697 }
mahphalke 1:819ac9aa5667 698 }
mahphalke 1:819ac9aa5667 699
mahphalke 1:819ac9aa5667 700 return -EINVAL;
mahphalke 1:819ac9aa5667 701 }
mahphalke 1:819ac9aa5667 702
mahphalke 1:819ac9aa5667 703 ssize_t set_chn_range(void *device,
mahphalke 1:819ac9aa5667 704 char *buf,
mahphalke 1:819ac9aa5667 705 size_t len,
mahphalke 1:819ac9aa5667 706 const struct iio_ch_info *channel)
mahphalke 1:819ac9aa5667 707 {
mahphalke 1:819ac9aa5667 708 uint8_t chn_range;
mahphalke 1:819ac9aa5667 709
mahphalke 1:819ac9aa5667 710 (void)sscanf(buf, "%d", &chn_range);
mahphalke 1:819ac9aa5667 711
mahphalke 1:819ac9aa5667 712 if (chn_range < sizeof(chn_range_val) / sizeof(chn_range_val[0])) {
mahphalke 1:819ac9aa5667 713
mahphalke 1:819ac9aa5667 714 /* Get the polarity of channel */
mahphalke 1:819ac9aa5667 715 attr_polarity_val[channel->ch_num - 1] = ad7606_get_input_polarity(chn_range);
mahphalke 1:819ac9aa5667 716
mahphalke 1:819ac9aa5667 717 attr_chn_range[channel->ch_num - 1] = chn_range_val[chn_range];
mahphalke 1:819ac9aa5667 718 attr_scale_val[channel->ch_num - 1] = get_vltg_conv_scale_factor(
mahphalke 1:819ac9aa5667 719 chn_range_val[chn_range],
mahphalke 1:819ac9aa5667 720 attr_polarity_val[channel->ch_num - 1]);
mahphalke 1:819ac9aa5667 721
mahphalke 1:819ac9aa5667 722 if (((channel->ch_num - 1) % 2) != 0) {
mahphalke 1:819ac9aa5667 723 chn_range <<= CHANNEL_RANGE_MSK_OFFSET;
mahphalke 1:819ac9aa5667 724 }
mahphalke 1:819ac9aa5667 725
mahphalke 1:819ac9aa5667 726 if (ad7606_spi_write_mask(device,
mahphalke 1:819ac9aa5667 727 AD7606_REG_RANGE_CH_ADDR(channel->ch_num-1),
mahphalke 1:819ac9aa5667 728 AD7606_RANGE_CH_MSK(channel->ch_num-1),
mahphalke 1:819ac9aa5667 729 chn_range) == SUCCESS) {
mahphalke 1:819ac9aa5667 730 return len;
mahphalke 1:819ac9aa5667 731 }
mahphalke 1:819ac9aa5667 732 }
mahphalke 1:819ac9aa5667 733
mahphalke 1:819ac9aa5667 734 return -EINVAL;
mahphalke 1:819ac9aa5667 735 }
mahphalke 1:819ac9aa5667 736
mahphalke 1:819ac9aa5667 737
mahphalke 1:819ac9aa5667 738 /*!
mahphalke 1:819ac9aa5667 739 * @brief Getter/Setter for the channel offset attribute value
mahphalke 1:819ac9aa5667 740 * @param device- pointer to IIO device structure
mahphalke 1:819ac9aa5667 741 * @param buf- pointer to buffer holding attribute value
mahphalke 1:819ac9aa5667 742 * @param len- length of buffer string data
mahphalke 1:819ac9aa5667 743 * @param channel- pointer to IIO channel structure
mahphalke 1:819ac9aa5667 744 * @return Number of characters read/written
mahphalke 1:819ac9aa5667 745 * @note Available only for AD7606B and AD7606C
mahphalke 1:819ac9aa5667 746 */
mahphalke 1:819ac9aa5667 747 ssize_t get_chn_offset(void *device,
mahphalke 1:819ac9aa5667 748 char *buf,
mahphalke 1:819ac9aa5667 749 size_t len,
mahphalke 1:819ac9aa5667 750 const struct iio_ch_info *channel)
mahphalke 1:819ac9aa5667 751 {
mahphalke 1:819ac9aa5667 752 uint8_t chn_offset_value;
mahphalke 1:819ac9aa5667 753
mahphalke 1:819ac9aa5667 754 if (ad7606_spi_reg_read(device, AD7606_REG_OFFSET_CH(channel->ch_num-1),
mahphalke 1:819ac9aa5667 755 &chn_offset_value) == SUCCESS) {
mahphalke 1:819ac9aa5667 756 return (ssize_t)sprintf(buf, "%d", chn_offset_value);
mahphalke 1:819ac9aa5667 757 }
mahphalke 1:819ac9aa5667 758
mahphalke 1:819ac9aa5667 759 return -EINVAL;
mahphalke 1:819ac9aa5667 760 }
mahphalke 1:819ac9aa5667 761
mahphalke 1:819ac9aa5667 762 ssize_t set_chn_offset(void *device,
mahphalke 1:819ac9aa5667 763 char *buf,
mahphalke 1:819ac9aa5667 764 size_t len,
mahphalke 1:819ac9aa5667 765 const struct iio_ch_info *channel)
mahphalke 1:819ac9aa5667 766 {
mahphalke 1:819ac9aa5667 767 uint8_t chn_offset_value = 0;
mahphalke 1:819ac9aa5667 768
mahphalke 1:819ac9aa5667 769 (void)sscanf(buf, "%d", &chn_offset_value);
mahphalke 1:819ac9aa5667 770
mahphalke 1:819ac9aa5667 771 if (ad7606_set_ch_offset(device, channel->ch_num - 1,
mahphalke 1:819ac9aa5667 772 chn_offset_value) == SUCCESS) {
mahphalke 1:819ac9aa5667 773 return len;
mahphalke 1:819ac9aa5667 774 }
mahphalke 1:819ac9aa5667 775
mahphalke 1:819ac9aa5667 776 return -EINVAL;
mahphalke 1:819ac9aa5667 777 }
mahphalke 1:819ac9aa5667 778
mahphalke 1:819ac9aa5667 779
mahphalke 1:819ac9aa5667 780 /*!
mahphalke 1:819ac9aa5667 781 * @brief Getter/Setter for the channel pahse offset attribute value
mahphalke 1:819ac9aa5667 782 * @param device- pointer to IIO device structure
mahphalke 1:819ac9aa5667 783 * @param buf- pointer to buffer holding attribute value
mahphalke 1:819ac9aa5667 784 * @param len- length of buffer string data
mahphalke 1:819ac9aa5667 785 * @param channel- pointer to IIO channel structure
mahphalke 1:819ac9aa5667 786 * @return Number of characters read/written
mahphalke 1:819ac9aa5667 787 * @note Available only for AD7606B and AD7606C
mahphalke 1:819ac9aa5667 788 */
mahphalke 1:819ac9aa5667 789 ssize_t get_chn_phase_offset(void *device,
mahphalke 1:819ac9aa5667 790 char *buf,
mahphalke 1:819ac9aa5667 791 size_t len,
mahphalke 1:819ac9aa5667 792 const struct iio_ch_info *channel)
mahphalke 1:819ac9aa5667 793 {
mahphalke 1:819ac9aa5667 794 uint8_t chn_phase_offset_value;
mahphalke 1:819ac9aa5667 795
mahphalke 1:819ac9aa5667 796 if (ad7606_spi_reg_read(device,
mahphalke 1:819ac9aa5667 797 AD7606_REG_PHASE_CH(channel->ch_num - 1),
mahphalke 1:819ac9aa5667 798 &chn_phase_offset_value) == SUCCESS) {
mahphalke 1:819ac9aa5667 799 return (ssize_t)sprintf(buf, "%d", chn_phase_offset_value);
mahphalke 1:819ac9aa5667 800 }
mahphalke 1:819ac9aa5667 801
mahphalke 1:819ac9aa5667 802 return -EINVAL;
mahphalke 1:819ac9aa5667 803 }
mahphalke 1:819ac9aa5667 804
mahphalke 1:819ac9aa5667 805 ssize_t set_chn_phase_offset(void *device,
mahphalke 1:819ac9aa5667 806 char *buf,
mahphalke 1:819ac9aa5667 807 size_t len,
mahphalke 1:819ac9aa5667 808 const struct iio_ch_info *channel)
mahphalke 1:819ac9aa5667 809 {
mahphalke 1:819ac9aa5667 810 uint8_t chn_phase_offset_value = 0;
mahphalke 1:819ac9aa5667 811
mahphalke 1:819ac9aa5667 812 (void)sscanf(buf, "%d", &chn_phase_offset_value);
mahphalke 1:819ac9aa5667 813
mahphalke 1:819ac9aa5667 814 if (ad7606_set_ch_phase(device, channel->ch_num - 1,
mahphalke 1:819ac9aa5667 815 chn_phase_offset_value) == SUCCESS) {
mahphalke 1:819ac9aa5667 816 return len;
mahphalke 1:819ac9aa5667 817 }
mahphalke 1:819ac9aa5667 818
mahphalke 1:819ac9aa5667 819 return -EINVAL;
mahphalke 1:819ac9aa5667 820 }
mahphalke 1:819ac9aa5667 821
mahphalke 1:819ac9aa5667 822
mahphalke 1:819ac9aa5667 823 /*!
mahphalke 1:819ac9aa5667 824 * @brief Getter/Setter for the channel temperature attribute value
mahphalke 1:819ac9aa5667 825 * @param device- pointer to IIO device structure
mahphalke 1:819ac9aa5667 826 * @param buf- pointer to buffer holding attribute value
mahphalke 1:819ac9aa5667 827 * @param len- length of buffer string data
mahphalke 1:819ac9aa5667 828 * @param channel- pointer to IIO channel structure
mahphalke 1:819ac9aa5667 829 * @return Number of characters read/written
mahphalke 1:819ac9aa5667 830 * @note Available only for AD7606B and AD7606C
mahphalke 1:819ac9aa5667 831 */
mahphalke 1:819ac9aa5667 832 ssize_t get_chn_temperature(void *device,
mahphalke 1:819ac9aa5667 833 char *buf,
mahphalke 1:819ac9aa5667 834 size_t len,
mahphalke 1:819ac9aa5667 835 const struct iio_ch_info *channel)
mahphalke 1:819ac9aa5667 836 {
mahphalke 1:819ac9aa5667 837 int32_t adc_chn_data = 0;
mahphalke 1:819ac9aa5667 838 float temperature;
mahphalke 1:819ac9aa5667 839 float voltage;
mahphalke 1:819ac9aa5667 840
mahphalke 1:819ac9aa5667 841 /* Configure the channel multiplexer to select temperature read */
mahphalke 1:819ac9aa5667 842 if (ad7606_spi_write_mask(device,
mahphalke 1:819ac9aa5667 843 AD7606_REG_DIAGNOSTIC_MUX_CH(channel->ch_num - 1),
mahphalke 1:819ac9aa5667 844 AD7606_DIAGN_MUX_CH_MSK(channel->ch_num - 1),
mahphalke 1:819ac9aa5667 845 AD7606_DIAGN_MUX_CH_VAL((channel->ch_num - 1),
mahphalke 1:819ac9aa5667 846 TEMPERATURE_MUX)) == SUCCESS) {
mahphalke 1:819ac9aa5667 847
mahphalke 1:819ac9aa5667 848 /* Allow to settle Mux channel */
mahphalke 1:819ac9aa5667 849 udelay(100);
mahphalke 1:819ac9aa5667 850
mahphalke 1:819ac9aa5667 851 /* Sample the channel and read conversion result */
mahphalke 1:819ac9aa5667 852 adc_chn_data = single_data_read(device, channel->ch_num - 1,
mahphalke 1:819ac9aa5667 853 attr_polarity_val[channel->ch_num - 1]);
mahphalke 1:819ac9aa5667 854
mahphalke 1:819ac9aa5667 855 /* Convert ADC data into equivalent voltage */
mahphalke 1:819ac9aa5667 856 voltage = convert_adc_raw_to_voltage(adc_chn_data,
mahphalke 1:819ac9aa5667 857 attr_scale_val[channel->ch_num - 1]);
mahphalke 1:819ac9aa5667 858
mahphalke 1:819ac9aa5667 859 /* Obtain the temperature using equation specified in device datasheet */
mahphalke 1:819ac9aa5667 860 temperature = ((voltage - 0.69068) / 0.019328) + 25.0;
mahphalke 1:819ac9aa5667 861
mahphalke 1:819ac9aa5667 862 /* Change channel mux back to analog input */
mahphalke 1:819ac9aa5667 863 (void)ad7606_spi_write_mask(device,
mahphalke 1:819ac9aa5667 864 AD7606_REG_DIAGNOSTIC_MUX_CH(channel->ch_num - 1),
mahphalke 1:819ac9aa5667 865 AD7606_DIAGN_MUX_CH_MSK(channel->ch_num - 1),
mahphalke 1:819ac9aa5667 866 AD7606_DIAGN_MUX_CH_VAL((channel->ch_num - 1),
mahphalke 1:819ac9aa5667 867 ANALOG_INPUT_MUX));
mahphalke 1:819ac9aa5667 868
mahphalke 1:819ac9aa5667 869 return (ssize_t)sprintf(buf, "%f", temperature);
mahphalke 1:819ac9aa5667 870 }
mahphalke 1:819ac9aa5667 871
mahphalke 1:819ac9aa5667 872 return -EINVAL;
mahphalke 1:819ac9aa5667 873 }
mahphalke 1:819ac9aa5667 874
mahphalke 1:819ac9aa5667 875 ssize_t set_chn_temperature(void *device,
mahphalke 1:819ac9aa5667 876 char *buf,
mahphalke 1:819ac9aa5667 877 size_t len,
mahphalke 1:819ac9aa5667 878 const struct iio_ch_info *channel)
mahphalke 1:819ac9aa5667 879 {
mahphalke 1:819ac9aa5667 880 // NA- Can't set temperature
mahphalke 1:819ac9aa5667 881 return -EINVAL;
mahphalke 1:819ac9aa5667 882 }
mahphalke 1:819ac9aa5667 883
mahphalke 1:819ac9aa5667 884
mahphalke 1:819ac9aa5667 885 /*!
mahphalke 1:819ac9aa5667 886 * @brief Getter/Setter for the channel Vref attribute value
mahphalke 1:819ac9aa5667 887 * @param device- pointer to IIO device structure
mahphalke 1:819ac9aa5667 888 * @param buf- pointer to buffer holding attribute value
mahphalke 1:819ac9aa5667 889 * @param len- length of buffer string data
mahphalke 1:819ac9aa5667 890 * @param channel- pointer to IIO channel structure
mahphalke 1:819ac9aa5667 891 * @return Number of characters read/written
mahphalke 1:819ac9aa5667 892 * @note Available only for AD7606B and AD7606C
mahphalke 1:819ac9aa5667 893 */
mahphalke 1:819ac9aa5667 894 ssize_t get_chn_vref(void *device,
mahphalke 1:819ac9aa5667 895 char *buf,
mahphalke 1:819ac9aa5667 896 size_t len,
mahphalke 1:819ac9aa5667 897 const struct iio_ch_info *channel)
mahphalke 1:819ac9aa5667 898 {
mahphalke 1:819ac9aa5667 899 float vref_voltge;
mahphalke 1:819ac9aa5667 900 int32_t adc_chn_data;
mahphalke 1:819ac9aa5667 901
mahphalke 1:819ac9aa5667 902 /* Configure the channel multiplexer to select Vref read */
mahphalke 1:819ac9aa5667 903 if (ad7606_spi_write_mask(device,
mahphalke 1:819ac9aa5667 904 AD7606_REG_DIAGNOSTIC_MUX_CH(channel->ch_num - 1),
mahphalke 1:819ac9aa5667 905 AD7606_DIAGN_MUX_CH_MSK(channel->ch_num - 1),
mahphalke 1:819ac9aa5667 906 AD7606_DIAGN_MUX_CH_VAL((channel->ch_num - 1),
mahphalke 1:819ac9aa5667 907 VREF_MUX)) == SUCCESS) {
mahphalke 1:819ac9aa5667 908
mahphalke 1:819ac9aa5667 909 /* Allow to settle Mux channel */
mahphalke 1:819ac9aa5667 910 udelay(100);
mahphalke 1:819ac9aa5667 911
mahphalke 1:819ac9aa5667 912 /* Sample the channel and read conversion result */
mahphalke 1:819ac9aa5667 913 adc_chn_data = single_data_read(device, channel->ch_num - 1,
mahphalke 1:819ac9aa5667 914 attr_polarity_val[channel->ch_num - 1]);
mahphalke 1:819ac9aa5667 915
mahphalke 1:819ac9aa5667 916 /* Convert ADC data into equivalent voltage */
mahphalke 1:819ac9aa5667 917 vref_voltge = convert_adc_raw_to_voltage(adc_chn_data,
mahphalke 1:819ac9aa5667 918 attr_scale_val[channel->ch_num - 1]);
mahphalke 1:819ac9aa5667 919
mahphalke 1:819ac9aa5667 920 /* Divide by 4 since Vref Mux has 4x multiplier on it */
mahphalke 1:819ac9aa5667 921 vref_voltge /= VREF_MUX_MULTIPLIER;
mahphalke 1:819ac9aa5667 922
mahphalke 1:819ac9aa5667 923 /* Change channel mux back to analog input */
mahphalke 1:819ac9aa5667 924 (void)ad7606_spi_write_mask(device,
mahphalke 1:819ac9aa5667 925 AD7606_REG_DIAGNOSTIC_MUX_CH(channel->ch_num - 1),
mahphalke 1:819ac9aa5667 926 AD7606_DIAGN_MUX_CH_MSK(channel->ch_num - 1),
mahphalke 1:819ac9aa5667 927 AD7606_DIAGN_MUX_CH_VAL((channel->ch_num - 1),
mahphalke 1:819ac9aa5667 928 ANALOG_INPUT_MUX));
mahphalke 1:819ac9aa5667 929
mahphalke 1:819ac9aa5667 930 return (ssize_t)sprintf(buf, "%f", vref_voltge);
mahphalke 1:819ac9aa5667 931 }
mahphalke 1:819ac9aa5667 932
mahphalke 1:819ac9aa5667 933 return -EINVAL;
mahphalke 1:819ac9aa5667 934 }
mahphalke 1:819ac9aa5667 935
mahphalke 1:819ac9aa5667 936 ssize_t set_chn_vref(void *device,
mahphalke 1:819ac9aa5667 937 char *buf,
mahphalke 1:819ac9aa5667 938 size_t len,
mahphalke 1:819ac9aa5667 939 const struct iio_ch_info *channel)
mahphalke 1:819ac9aa5667 940 {
mahphalke 1:819ac9aa5667 941 // NA- Can't set Vref
mahphalke 1:819ac9aa5667 942 return - EINVAL;
mahphalke 1:819ac9aa5667 943 }
mahphalke 1:819ac9aa5667 944
mahphalke 1:819ac9aa5667 945
mahphalke 1:819ac9aa5667 946 /*!
mahphalke 1:819ac9aa5667 947 * @brief Getter/Setter for the channel Vdrive attribute value
mahphalke 1:819ac9aa5667 948 * @param device- pointer to IIO device structure
mahphalke 1:819ac9aa5667 949 * @param buf- pointer to buffer holding attribute value
mahphalke 1:819ac9aa5667 950 * @param len- length of buffer string data
mahphalke 1:819ac9aa5667 951 * @param channel- pointer to IIO channel structure
mahphalke 1:819ac9aa5667 952 * @return Number of characters read/written
mahphalke 1:819ac9aa5667 953 * @note Available only for AD7606B and AD7606C
mahphalke 1:819ac9aa5667 954 */
mahphalke 1:819ac9aa5667 955 ssize_t get_chn_vdrive(void *device,
mahphalke 1:819ac9aa5667 956 char *buf,
mahphalke 1:819ac9aa5667 957 size_t len,
mahphalke 1:819ac9aa5667 958 const struct iio_ch_info *channel)
mahphalke 1:819ac9aa5667 959 {
mahphalke 1:819ac9aa5667 960 float vdrive_voltge;
mahphalke 1:819ac9aa5667 961 int32_t adc_chn_data;
mahphalke 1:819ac9aa5667 962
mahphalke 1:819ac9aa5667 963 /* Configure the channel multiplexer to select Vdrive read */
mahphalke 1:819ac9aa5667 964 if (ad7606_spi_write_mask(device,
mahphalke 1:819ac9aa5667 965 AD7606_REG_DIAGNOSTIC_MUX_CH(channel->ch_num - 1),
mahphalke 1:819ac9aa5667 966 AD7606_DIAGN_MUX_CH_MSK(channel->ch_num - 1),
mahphalke 1:819ac9aa5667 967 AD7606_DIAGN_MUX_CH_VAL((channel->ch_num - 1),
mahphalke 1:819ac9aa5667 968 VDRIVE_MUX)) == SUCCESS) {
mahphalke 1:819ac9aa5667 969
mahphalke 1:819ac9aa5667 970 /* Allow to settle Mux channel */
mahphalke 1:819ac9aa5667 971 udelay(100);
mahphalke 1:819ac9aa5667 972
mahphalke 1:819ac9aa5667 973 /* Sample the channel and read conversion result */
mahphalke 1:819ac9aa5667 974 adc_chn_data = single_data_read(device, channel->ch_num - 1,
mahphalke 1:819ac9aa5667 975 attr_polarity_val[channel->ch_num - 1]);
mahphalke 1:819ac9aa5667 976
mahphalke 1:819ac9aa5667 977 /* Convert ADC data into equivalent voltage */
mahphalke 1:819ac9aa5667 978 vdrive_voltge = convert_adc_raw_to_voltage(adc_chn_data,
mahphalke 1:819ac9aa5667 979 attr_scale_val[channel->ch_num - 1]);
mahphalke 1:819ac9aa5667 980
mahphalke 1:819ac9aa5667 981 /* Change channel mux back to analog input */
mahphalke 1:819ac9aa5667 982 (void)ad7606_spi_write_mask(device,
mahphalke 1:819ac9aa5667 983 AD7606_REG_DIAGNOSTIC_MUX_CH(channel->ch_num - 1),
mahphalke 1:819ac9aa5667 984 AD7606_DIAGN_MUX_CH_MSK(channel->ch_num - 1),
mahphalke 1:819ac9aa5667 985 AD7606_DIAGN_MUX_CH_VAL((channel->ch_num - 1),
mahphalke 1:819ac9aa5667 986 ANALOG_INPUT_MUX));
mahphalke 1:819ac9aa5667 987
mahphalke 1:819ac9aa5667 988 return (ssize_t)sprintf(buf, "%f", vdrive_voltge);
mahphalke 1:819ac9aa5667 989 }
mahphalke 1:819ac9aa5667 990
mahphalke 1:819ac9aa5667 991 return -EINVAL;
mahphalke 1:819ac9aa5667 992 }
mahphalke 1:819ac9aa5667 993
mahphalke 1:819ac9aa5667 994 ssize_t set_chn_vdrive(void *device,
mahphalke 1:819ac9aa5667 995 char *buf,
mahphalke 1:819ac9aa5667 996 size_t len,
mahphalke 1:819ac9aa5667 997 const struct iio_ch_info *channel)
mahphalke 1:819ac9aa5667 998 {
mahphalke 1:819ac9aa5667 999 // NA- Can't set Vdrive
mahphalke 1:819ac9aa5667 1000 return - EINVAL;
mahphalke 1:819ac9aa5667 1001 }
mahphalke 1:819ac9aa5667 1002
mahphalke 1:819ac9aa5667 1003
mahphalke 1:819ac9aa5667 1004 /*!
mahphalke 1:819ac9aa5667 1005 * @brief Getter/Setter for the channel ALDO attribute value
mahphalke 1:819ac9aa5667 1006 * @param device- pointer to IIO device structure
mahphalke 1:819ac9aa5667 1007 * @param buf- pointer to buffer holding attribute value
mahphalke 1:819ac9aa5667 1008 * @param len- length of buffer string data
mahphalke 1:819ac9aa5667 1009 * @param channel- pointer to IIO channel structure
mahphalke 1:819ac9aa5667 1010 * @return Number of characters read/written
mahphalke 1:819ac9aa5667 1011 * @note Available only for AD7606B and AD7606C
mahphalke 1:819ac9aa5667 1012 */
mahphalke 1:819ac9aa5667 1013 ssize_t get_chn_aldo(void *device,
mahphalke 1:819ac9aa5667 1014 char *buf,
mahphalke 1:819ac9aa5667 1015 size_t len,
mahphalke 1:819ac9aa5667 1016 const struct iio_ch_info *channel)
mahphalke 1:819ac9aa5667 1017 {
mahphalke 1:819ac9aa5667 1018 float aldo_voltge;
mahphalke 1:819ac9aa5667 1019 int32_t adc_chn_data;
mahphalke 1:819ac9aa5667 1020
mahphalke 1:819ac9aa5667 1021 /* Configure the channel multiplexer to select ALDO read */
mahphalke 1:819ac9aa5667 1022 if (ad7606_spi_write_mask(device,
mahphalke 1:819ac9aa5667 1023 AD7606_REG_DIAGNOSTIC_MUX_CH(channel->ch_num - 1),
mahphalke 1:819ac9aa5667 1024 AD7606_DIAGN_MUX_CH_MSK(channel->ch_num - 1),
mahphalke 1:819ac9aa5667 1025 AD7606_DIAGN_MUX_CH_VAL((channel->ch_num - 1),
mahphalke 1:819ac9aa5667 1026 ALDO_MUX)) == SUCCESS) {
mahphalke 1:819ac9aa5667 1027
mahphalke 1:819ac9aa5667 1028 /* Allow to settle Mux channel */
mahphalke 1:819ac9aa5667 1029 udelay(100);
mahphalke 1:819ac9aa5667 1030
mahphalke 1:819ac9aa5667 1031 /* Sample the channel and read conversion result */
mahphalke 1:819ac9aa5667 1032 adc_chn_data = single_data_read(device, channel->ch_num - 1,
mahphalke 1:819ac9aa5667 1033 attr_polarity_val[channel->ch_num - 1]);
mahphalke 1:819ac9aa5667 1034
mahphalke 1:819ac9aa5667 1035 /* Convert ADC data into equivalent voltage */
mahphalke 1:819ac9aa5667 1036 aldo_voltge = convert_adc_raw_to_voltage(adc_chn_data,
mahphalke 1:819ac9aa5667 1037 attr_scale_val[channel->ch_num - 1]);
mahphalke 1:819ac9aa5667 1038
mahphalke 1:819ac9aa5667 1039 /* Divide by 4 since ALDO Mux has 4x multiplier on it */
mahphalke 1:819ac9aa5667 1040 aldo_voltge /= VREF_MUX_MULTIPLIER;
mahphalke 1:819ac9aa5667 1041
mahphalke 1:819ac9aa5667 1042 /* Change channel mux back to analog input */
mahphalke 1:819ac9aa5667 1043 (void)ad7606_spi_write_mask(device,
mahphalke 1:819ac9aa5667 1044 AD7606_REG_DIAGNOSTIC_MUX_CH(channel->ch_num - 1),
mahphalke 1:819ac9aa5667 1045 AD7606_DIAGN_MUX_CH_MSK(channel->ch_num - 1),
mahphalke 1:819ac9aa5667 1046 AD7606_DIAGN_MUX_CH_VAL((channel->ch_num - 1),
mahphalke 1:819ac9aa5667 1047 ANALOG_INPUT_MUX));
mahphalke 1:819ac9aa5667 1048
mahphalke 1:819ac9aa5667 1049 return (ssize_t)sprintf(buf, "%f", aldo_voltge);
mahphalke 1:819ac9aa5667 1050 }
mahphalke 1:819ac9aa5667 1051
mahphalke 1:819ac9aa5667 1052 return -EINVAL;
mahphalke 1:819ac9aa5667 1053 }
mahphalke 1:819ac9aa5667 1054
mahphalke 1:819ac9aa5667 1055 ssize_t set_chn_aldo(void *device,
mahphalke 1:819ac9aa5667 1056 char *buf,
mahphalke 1:819ac9aa5667 1057 size_t len,
mahphalke 1:819ac9aa5667 1058 const struct iio_ch_info *channel)
mahphalke 1:819ac9aa5667 1059 {
mahphalke 1:819ac9aa5667 1060 // NA- Can't set ALDO
mahphalke 1:819ac9aa5667 1061 return - EINVAL;
mahphalke 1:819ac9aa5667 1062 }
mahphalke 1:819ac9aa5667 1063
mahphalke 1:819ac9aa5667 1064
mahphalke 1:819ac9aa5667 1065 /*!
mahphalke 1:819ac9aa5667 1066 * @brief Getter/Setter for the channel DLDO attribute value
mahphalke 1:819ac9aa5667 1067 * @param device- pointer to IIO device structure
mahphalke 1:819ac9aa5667 1068 * @param buf- pointer to buffer holding attribute value
mahphalke 1:819ac9aa5667 1069 * @param len- length of buffer string data
mahphalke 1:819ac9aa5667 1070 * @param channel- pointer to IIO channel structure
mahphalke 1:819ac9aa5667 1071 * @return Number of characters read/written
mahphalke 1:819ac9aa5667 1072 * @note Available only for AD7606B and AD7606C
mahphalke 1:819ac9aa5667 1073 */
mahphalke 1:819ac9aa5667 1074 ssize_t get_chn_dldo(void *device,
mahphalke 1:819ac9aa5667 1075 char *buf,
mahphalke 1:819ac9aa5667 1076 size_t len,
mahphalke 1:819ac9aa5667 1077 const struct iio_ch_info *channel)
mahphalke 1:819ac9aa5667 1078 {
mahphalke 1:819ac9aa5667 1079 float dldo_voltge;
mahphalke 1:819ac9aa5667 1080 int32_t adc_chn_data;
mahphalke 1:819ac9aa5667 1081
mahphalke 1:819ac9aa5667 1082 /* Configure the channel multiplexer to select DLDO read */
mahphalke 1:819ac9aa5667 1083 if (ad7606_spi_write_mask(device,
mahphalke 1:819ac9aa5667 1084 AD7606_REG_DIAGNOSTIC_MUX_CH(channel->ch_num - 1),
mahphalke 1:819ac9aa5667 1085 AD7606_DIAGN_MUX_CH_MSK(channel->ch_num - 1),
mahphalke 1:819ac9aa5667 1086 AD7606_DIAGN_MUX_CH_VAL((channel->ch_num - 1),
mahphalke 1:819ac9aa5667 1087 DLDO_MUX)) == SUCCESS) {
mahphalke 1:819ac9aa5667 1088
mahphalke 1:819ac9aa5667 1089 /* Allow to settle Mux channel */
mahphalke 1:819ac9aa5667 1090 udelay(100);
mahphalke 1:819ac9aa5667 1091
mahphalke 1:819ac9aa5667 1092 /* Sample the channel and read conversion result */
mahphalke 1:819ac9aa5667 1093 adc_chn_data = single_data_read(device,
mahphalke 1:819ac9aa5667 1094 channel->ch_num - 1,
mahphalke 1:819ac9aa5667 1095 attr_polarity_val[channel->ch_num - 1]);
mahphalke 1:819ac9aa5667 1096
mahphalke 1:819ac9aa5667 1097 /* Convert ADC data into equivalent voltage */
mahphalke 1:819ac9aa5667 1098 dldo_voltge = convert_adc_raw_to_voltage(adc_chn_data,
mahphalke 1:819ac9aa5667 1099 attr_scale_val[channel->ch_num - 1]);
mahphalke 1:819ac9aa5667 1100
mahphalke 1:819ac9aa5667 1101 /* Divide by 4 since ALDO Mux has 4x multiplier on it */
mahphalke 1:819ac9aa5667 1102 dldo_voltge /= VREF_MUX_MULTIPLIER;
mahphalke 1:819ac9aa5667 1103
mahphalke 1:819ac9aa5667 1104 /* Change channel mux back to analog input */
mahphalke 1:819ac9aa5667 1105 (void)ad7606_spi_write_mask(device,
mahphalke 1:819ac9aa5667 1106 AD7606_REG_DIAGNOSTIC_MUX_CH(channel->ch_num - 1),
mahphalke 1:819ac9aa5667 1107 AD7606_DIAGN_MUX_CH_MSK(channel->ch_num - 1),
mahphalke 1:819ac9aa5667 1108 AD7606_DIAGN_MUX_CH_VAL((channel->ch_num - 1),
mahphalke 1:819ac9aa5667 1109 ANALOG_INPUT_MUX));
mahphalke 1:819ac9aa5667 1110
mahphalke 1:819ac9aa5667 1111 return (ssize_t)sprintf(buf, "%f", dldo_voltge);
mahphalke 1:819ac9aa5667 1112 }
mahphalke 1:819ac9aa5667 1113
mahphalke 1:819ac9aa5667 1114 return -EINVAL;
mahphalke 1:819ac9aa5667 1115 }
mahphalke 1:819ac9aa5667 1116
mahphalke 1:819ac9aa5667 1117 ssize_t set_chn_dldo(void *device,
mahphalke 1:819ac9aa5667 1118 char *buf,
mahphalke 1:819ac9aa5667 1119 size_t len,
mahphalke 1:819ac9aa5667 1120 const struct iio_ch_info *channel)
mahphalke 1:819ac9aa5667 1121 {
mahphalke 1:819ac9aa5667 1122 // NA- Can't set DLDO
mahphalke 1:819ac9aa5667 1123 return - EINVAL;
mahphalke 1:819ac9aa5667 1124 }
mahphalke 1:819ac9aa5667 1125
mahphalke 1:819ac9aa5667 1126
mahphalke 1:819ac9aa5667 1127 /*!
mahphalke 3:83b3133f544a 1128 * @brief Getter/Setter for the channel open circuit detect manual attribute value
mahphalke 1:819ac9aa5667 1129 * @param device- pointer to IIO device structure
mahphalke 1:819ac9aa5667 1130 * @param buf- pointer to buffer holding attribute value
mahphalke 1:819ac9aa5667 1131 * @param len- length of buffer string data
mahphalke 1:819ac9aa5667 1132 * @param channel- pointer to IIO channel structure
mahphalke 1:819ac9aa5667 1133 * @return Number of characters read/written
mahphalke 1:819ac9aa5667 1134 */
mahphalke 3:83b3133f544a 1135 ssize_t get_chn_open_circuit_detect_manual(void *device,
mahphalke 3:83b3133f544a 1136 char *buf,
mahphalke 3:83b3133f544a 1137 size_t len,
mahphalke 3:83b3133f544a 1138 const struct iio_ch_info *channel)
mahphalke 1:819ac9aa5667 1139 {
mahphalke 3:83b3133f544a 1140 int32_t prev_adc_code, curr_adc_code;
mahphalke 3:83b3133f544a 1141 bool open_detect_flag = false;
mahphalke 3:83b3133f544a 1142 bool open_detect_done = false;
mahphalke 3:83b3133f544a 1143 uint8_t cnt;
mahphalke 1:819ac9aa5667 1144
mahphalke 3:83b3133f544a 1145 /* Enter into manual open circuit detection mode */
mahphalke 3:83b3133f544a 1146 do {
mahphalke 3:83b3133f544a 1147 if (ad7606_spi_reg_write(device, AD7606_REG_OPEN_DETECT_QUEUE, 1) == SUCCESS) {
mahphalke 3:83b3133f544a 1148 /* Read the ADC on selected chnnel (first reading post open circuit detection start) */
mahphalke 3:83b3133f544a 1149 prev_adc_code = single_data_read(device,
mahphalke 3:83b3133f544a 1150 channel->ch_num - 1,
mahphalke 3:83b3133f544a 1151 attr_polarity_val[channel->ch_num - 1]);
mahphalke 1:819ac9aa5667 1152
mahphalke 3:83b3133f544a 1153 /* Perform N conversions and monitor the code delta */
mahphalke 3:83b3133f544a 1154 for (cnt = 0; cnt < MANUAL_OPEN_DETECT_CONV_CNTS; cnt++) {
mahphalke 3:83b3133f544a 1155 /* Check if code is within 350LSB (nearest ZS code) */
mahphalke 3:83b3133f544a 1156 if (prev_adc_code >= 0 && prev_adc_code < MANUAL_OPEN_DETECT_ENTRY_TRHLD) {
mahphalke 3:83b3133f544a 1157 /* Perform next conversion and read the result */
mahphalke 3:83b3133f544a 1158 curr_adc_code = single_data_read(device,
mahphalke 3:83b3133f544a 1159 channel->ch_num - 1,
mahphalke 3:83b3133f544a 1160 attr_polarity_val[channel->ch_num - 1]);
mahphalke 1:819ac9aa5667 1161
mahphalke 3:83b3133f544a 1162 /* Check if delta b/w current and previus reading is within 10 LSB code */
mahphalke 3:83b3133f544a 1163 if (abs(curr_adc_code - prev_adc_code) > MANUAL_OPEN_DETECT_CONV_TRSHLD) {
mahphalke 3:83b3133f544a 1164 open_detect_done = true;
mahphalke 3:83b3133f544a 1165 break;
mahphalke 3:83b3133f544a 1166 }
mahphalke 1:819ac9aa5667 1167
mahphalke 3:83b3133f544a 1168 /* Get the previous code */
mahphalke 3:83b3133f544a 1169 prev_adc_code = curr_adc_code;
mahphalke 3:83b3133f544a 1170 } else {
mahphalke 3:83b3133f544a 1171 open_detect_done = true;
mahphalke 3:83b3133f544a 1172 break;
mahphalke 1:819ac9aa5667 1173 }
mahphalke 1:819ac9aa5667 1174 }
mahphalke 1:819ac9aa5667 1175
mahphalke 3:83b3133f544a 1176 /* Break if open circuit detection aborted (in case above conditions not met) */
mahphalke 3:83b3133f544a 1177 if (open_detect_done)
mahphalke 3:83b3133f544a 1178 break;
mahphalke 3:83b3133f544a 1179
mahphalke 3:83b3133f544a 1180 /* Set common mode high (enabling open circuit detect on selected channel) */
mahphalke 3:83b3133f544a 1181 if (ad7606_spi_reg_write(device,
mahphalke 3:83b3133f544a 1182 AD7606_REG_OPEN_DETECT_ENABLE,
mahphalke 3:83b3133f544a 1183 (1 << ((channel->ch_num) - 1))) == SUCCESS) {
mahphalke 3:83b3133f544a 1184
mahphalke 3:83b3133f544a 1185 /* Perform next conversions (~2-3) and read the result (with common mode set high) */
mahphalke 3:83b3133f544a 1186 for (cnt = 0; cnt < MANUAL_OPEN_DETECT_CM_CNV_CNT; cnt++) {
mahphalke 3:83b3133f544a 1187 udelay(100);
mahphalke 3:83b3133f544a 1188 curr_adc_code = single_data_read(device,
mahphalke 3:83b3133f544a 1189 channel->ch_num - 1,
mahphalke 3:83b3133f544a 1190 attr_polarity_val[channel->ch_num - 1]);
mahphalke 3:83b3133f544a 1191 }
mahphalke 3:83b3133f544a 1192
mahphalke 3:83b3133f544a 1193 /* Check if delta b/w common mode high code and previous N conversion code is > threshold */
mahphalke 3:83b3133f544a 1194 if ((curr_adc_code - prev_adc_code) < MANUAL_OPEN_DETECT_THRESHOLD_RPD50K) {
mahphalke 3:83b3133f544a 1195 open_detect_done = true;
mahphalke 3:83b3133f544a 1196 break;
mahphalke 3:83b3133f544a 1197 }
mahphalke 3:83b3133f544a 1198 } else {
mahphalke 3:83b3133f544a 1199 return -EINVAL;
mahphalke 3:83b3133f544a 1200 }
mahphalke 3:83b3133f544a 1201
mahphalke 3:83b3133f544a 1202 /* Break if open circuit detection aborted (in case above conditions not met) */
mahphalke 3:83b3133f544a 1203 if (open_detect_done)
mahphalke 3:83b3133f544a 1204 break;
mahphalke 3:83b3133f544a 1205
mahphalke 3:83b3133f544a 1206 /* Set common mode low (disabling open circuit detect on channel) */
mahphalke 3:83b3133f544a 1207 if (ad7606_spi_reg_write(device,
mahphalke 3:83b3133f544a 1208 AD7606_REG_OPEN_DETECT_ENABLE,
mahphalke 3:83b3133f544a 1209 0) == SUCCESS) {
mahphalke 3:83b3133f544a 1210 /* Perform next conversion and read the result (with common mode set low) */
mahphalke 3:83b3133f544a 1211 curr_adc_code = single_data_read(device,
mahphalke 3:83b3133f544a 1212 channel->ch_num - 1,
mahphalke 3:83b3133f544a 1213 attr_polarity_val[channel->ch_num - 1]);
mahphalke 3:83b3133f544a 1214
mahphalke 3:83b3133f544a 1215 /* Check if delta b/w common mode low code and previous N conversion code is < threshold */
mahphalke 3:83b3133f544a 1216 if (abs(curr_adc_code - prev_adc_code) < MANUAL_OPEN_DETECT_THRESHOLD_RPD50K) {
mahphalke 3:83b3133f544a 1217 open_detect_flag = true;
mahphalke 3:83b3133f544a 1218 open_detect_done = true;
mahphalke 3:83b3133f544a 1219 }
mahphalke 3:83b3133f544a 1220 } else {
mahphalke 3:83b3133f544a 1221 return -EINVAL;
mahphalke 3:83b3133f544a 1222 }
mahphalke 3:83b3133f544a 1223 } else {
mahphalke 3:83b3133f544a 1224 return -EINVAL;
mahphalke 1:819ac9aa5667 1225 }
mahphalke 3:83b3133f544a 1226 } while (0);
mahphalke 1:819ac9aa5667 1227
mahphalke 1:819ac9aa5667 1228 /* Disable open detect mode */
mahphalke 1:819ac9aa5667 1229 (void)ad7606_spi_reg_write(device, AD7606_REG_OPEN_DETECT_QUEUE, 0);
mahphalke 1:819ac9aa5667 1230
mahphalke 3:83b3133f544a 1231 if (open_detect_done) {
mahphalke 1:819ac9aa5667 1232 if (open_detect_flag) {
mahphalke 3:83b3133f544a 1233 strcpy(buf, "Open Circuit Detected");
mahphalke 1:819ac9aa5667 1234 } else {
mahphalke 3:83b3133f544a 1235 strcpy(buf, "Open Circuit Not Detected");
mahphalke 1:819ac9aa5667 1236 }
mahphalke 1:819ac9aa5667 1237
mahphalke 1:819ac9aa5667 1238 return len;
mahphalke 1:819ac9aa5667 1239 }
mahphalke 1:819ac9aa5667 1240
mahphalke 1:819ac9aa5667 1241 return -EINVAL;
mahphalke 1:819ac9aa5667 1242 }
mahphalke 1:819ac9aa5667 1243
mahphalke 3:83b3133f544a 1244 ssize_t set_chn_open_circuit_detect_manual(void *device,
mahphalke 3:83b3133f544a 1245 char *buf,
mahphalke 3:83b3133f544a 1246 size_t len,
mahphalke 3:83b3133f544a 1247 const struct iio_ch_info *channel)
mahphalke 1:819ac9aa5667 1248 {
mahphalke 3:83b3133f544a 1249 // NA- Can't set open circuit detect
mahphalke 1:819ac9aa5667 1250 return - EINVAL;
mahphalke 1:819ac9aa5667 1251 }
mahphalke 1:819ac9aa5667 1252
mahphalke 1:819ac9aa5667 1253
mahphalke 1:819ac9aa5667 1254 /*!
mahphalke 3:83b3133f544a 1255 * @brief Getter/Setter for the channel open circuit detect auto attribute value
mahphalke 1:819ac9aa5667 1256 * @param device- pointer to IIO device structure
mahphalke 1:819ac9aa5667 1257 * @param buf- pointer to buffer holding attribute value
mahphalke 1:819ac9aa5667 1258 * @param len- length of buffer string data
mahphalke 1:819ac9aa5667 1259 * @param channel- pointer to IIO channel structure
mahphalke 1:819ac9aa5667 1260 * @return Number of characters read/written
mahphalke 1:819ac9aa5667 1261 */
mahphalke 3:83b3133f544a 1262 ssize_t get_chn_open_circuit_detect_auto(void *device,
mahphalke 3:83b3133f544a 1263 char *buf,
mahphalke 3:83b3133f544a 1264 size_t len,
mahphalke 3:83b3133f544a 1265 const struct iio_ch_info *channel)
mahphalke 1:819ac9aa5667 1266 {
mahphalke 3:83b3133f544a 1267 if (open_circuit_detect_read_done) {
mahphalke 3:83b3133f544a 1268 open_circuit_detect_read_done = false;
mahphalke 3:83b3133f544a 1269
mahphalke 3:83b3133f544a 1270 if (open_circuit_detection_error) {
mahphalke 3:83b3133f544a 1271 strcpy(buf, "Error!!");
mahphalke 3:83b3133f544a 1272 }
mahphalke 1:819ac9aa5667 1273
mahphalke 3:83b3133f544a 1274 if (open_circuit_detection_done) {
mahphalke 3:83b3133f544a 1275 strcpy(buf, "Open Circuit Detected");
mahphalke 3:83b3133f544a 1276 } else {
mahphalke 3:83b3133f544a 1277 strcpy(buf, "Open Circuit Not Detected");
mahphalke 3:83b3133f544a 1278 }
mahphalke 3:83b3133f544a 1279
mahphalke 1:819ac9aa5667 1280 return len;
mahphalke 1:819ac9aa5667 1281 }
mahphalke 1:819ac9aa5667 1282
mahphalke 3:83b3133f544a 1283 return (ssize_t)sprintf(buf, "OPEN_DETECT_QUEUE: %d",
mahphalke 3:83b3133f544a 1284 open_detect_queue_cnts[channel->ch_num - 1]);
mahphalke 3:83b3133f544a 1285 }
mahphalke 3:83b3133f544a 1286
mahphalke 3:83b3133f544a 1287 ssize_t set_chn_open_circuit_detect_auto(void *device,
mahphalke 3:83b3133f544a 1288 char *buf,
mahphalke 3:83b3133f544a 1289 size_t len,
mahphalke 3:83b3133f544a 1290 const struct iio_ch_info *channel)
mahphalke 3:83b3133f544a 1291 {
mahphalke 3:83b3133f544a 1292 uint8_t data;
mahphalke 3:83b3133f544a 1293 uint8_t open_detect_flag = false;
mahphalke 3:83b3133f544a 1294 int32_t rw_status = FAILURE;
mahphalke 3:83b3133f544a 1295 uint16_t conv_cnts;
mahphalke 3:83b3133f544a 1296
mahphalke 3:83b3133f544a 1297 (void)sscanf(buf, "%d", &data);
mahphalke 3:83b3133f544a 1298 open_circuit_detection_error = false;
mahphalke 3:83b3133f544a 1299
mahphalke 3:83b3133f544a 1300 if ((data > 1 && data <= AUTO_OPEN_DETECT_QUEUE_MAX_CNT) && (buf[0] >= '0'
mahphalke 3:83b3133f544a 1301 && buf[0] <= '9')) {
mahphalke 3:83b3133f544a 1302 open_detect_queue_cnts[channel->ch_num - 1] = data;
mahphalke 1:819ac9aa5667 1303
mahphalke 3:83b3133f544a 1304 /* Enter into open circuit auto open detect mode */
mahphalke 3:83b3133f544a 1305 if (ad7606_spi_reg_write(device,
mahphalke 3:83b3133f544a 1306 AD7606_REG_OPEN_DETECT_QUEUE,
mahphalke 3:83b3133f544a 1307 open_detect_queue_cnts[channel->ch_num - 1]) == SUCCESS) {
mahphalke 3:83b3133f544a 1308 /* Enable open circuit detection on selected channel */
mahphalke 3:83b3133f544a 1309 if (ad7606_spi_reg_write(device,
mahphalke 3:83b3133f544a 1310 AD7606_REG_OPEN_DETECT_ENABLE,
mahphalke 3:83b3133f544a 1311 (1 << ((channel->ch_num) - 1))) == SUCCESS) {
mahphalke 3:83b3133f544a 1312 /* Monitor the open detect flag for max N+15 (open detect queue count) conversions.
mahphalke 3:83b3133f544a 1313 * Note: In ideal scenario, the open detect flash should be monitored continuously while
mahphalke 3:83b3133f544a 1314 * background N conversions are in progress */
mahphalke 3:83b3133f544a 1315 for (conv_cnts = 0;
mahphalke 3:83b3133f544a 1316 conv_cnts < (open_detect_queue_cnts[channel->ch_num - 1] +
mahphalke 3:83b3133f544a 1317 AUTO_OPEN_DETECT_QUEUE_EXTRA_CONV_CNT);
mahphalke 3:83b3133f544a 1318 conv_cnts++) {
mahphalke 3:83b3133f544a 1319 if (ad7606_convst(device) == SUCCESS) {
mahphalke 3:83b3133f544a 1320 udelay(100);
mahphalke 1:819ac9aa5667 1321
mahphalke 3:83b3133f544a 1322 /* Monitor the open detect flag */
mahphalke 3:83b3133f544a 1323 if (ad7606_spi_reg_read(device,
mahphalke 3:83b3133f544a 1324 AD7606_REG_OPEN_DETECTED,
mahphalke 3:83b3133f544a 1325 &open_detect_flag) == SUCCESS) {
mahphalke 3:83b3133f544a 1326 open_detect_flag >>= (channel->ch_num - 1);
mahphalke 3:83b3133f544a 1327 open_detect_flag &= 0x1;
mahphalke 3:83b3133f544a 1328
mahphalke 3:83b3133f544a 1329 rw_status = SUCCESS;
mahphalke 3:83b3133f544a 1330 if (open_detect_flag) {
mahphalke 3:83b3133f544a 1331 break;
mahphalke 3:83b3133f544a 1332 }
mahphalke 3:83b3133f544a 1333 } else {
mahphalke 3:83b3133f544a 1334 rw_status = FAILURE;
mahphalke 1:819ac9aa5667 1335 break;
mahphalke 1:819ac9aa5667 1336 }
mahphalke 1:819ac9aa5667 1337 } else {
mahphalke 1:819ac9aa5667 1338 rw_status = FAILURE;
mahphalke 1:819ac9aa5667 1339 break;
mahphalke 1:819ac9aa5667 1340 }
mahphalke 1:819ac9aa5667 1341 }
mahphalke 1:819ac9aa5667 1342 }
mahphalke 1:819ac9aa5667 1343 }
mahphalke 3:83b3133f544a 1344
mahphalke 3:83b3133f544a 1345 /* Disable open detect mode and clear open detect flag */
mahphalke 3:83b3133f544a 1346 (void)ad7606_spi_reg_write(device, AD7606_REG_OPEN_DETECT_QUEUE, 0);
mahphalke 3:83b3133f544a 1347 (void)ad7606_spi_reg_write(device, AD7606_REG_OPEN_DETECTED, 0xFF);
mahphalke 3:83b3133f544a 1348
mahphalke 3:83b3133f544a 1349 open_detect_queue_cnts[channel->ch_num - 1] = 0;
mahphalke 3:83b3133f544a 1350
mahphalke 3:83b3133f544a 1351 if (rw_status == SUCCESS) {
mahphalke 3:83b3133f544a 1352 if (open_detect_flag) {
mahphalke 3:83b3133f544a 1353 open_circuit_detection_done = true;
mahphalke 3:83b3133f544a 1354 } else {
mahphalke 3:83b3133f544a 1355 open_circuit_detection_done = false;
mahphalke 3:83b3133f544a 1356 }
mahphalke 3:83b3133f544a 1357
mahphalke 3:83b3133f544a 1358 open_circuit_detect_read_done = true;
mahphalke 3:83b3133f544a 1359 return len;
mahphalke 3:83b3133f544a 1360 }
mahphalke 1:819ac9aa5667 1361 }
mahphalke 1:819ac9aa5667 1362
mahphalke 3:83b3133f544a 1363 open_circuit_detection_error = true;
mahphalke 1:819ac9aa5667 1364 return -EINVAL;
mahphalke 1:819ac9aa5667 1365 }
mahphalke 1:819ac9aa5667 1366
mahphalke 1:819ac9aa5667 1367
mahphalke 1:819ac9aa5667 1368 /*!
mahphalke 1:819ac9aa5667 1369 * @brief Getter/Setter for the adc offset calibration
mahphalke 1:819ac9aa5667 1370 * @param device- pointer to IIO device structure
mahphalke 1:819ac9aa5667 1371 * @param buf- pointer to buffer holding attribute value
mahphalke 1:819ac9aa5667 1372 * @param len- length of buffer string data
mahphalke 1:819ac9aa5667 1373 * @param channel- pointer to IIO channel structure
mahphalke 1:819ac9aa5667 1374 * @return Number of characters read/written
mahphalke 1:819ac9aa5667 1375 */
mahphalke 1:819ac9aa5667 1376 ssize_t get_chn_calibrate_adc_offset(void *device,
mahphalke 1:819ac9aa5667 1377 char *buf,
mahphalke 1:819ac9aa5667 1378 size_t len,
mahphalke 1:819ac9aa5667 1379 const struct iio_ch_info *channel)
mahphalke 1:819ac9aa5667 1380 {
mahphalke 1:819ac9aa5667 1381 float lsb_voltage;
mahphalke 1:819ac9aa5667 1382 float adc_voltage;
mahphalke 1:819ac9aa5667 1383 polarity_e polarity = attr_polarity_val[channel->ch_num - 1];
mahphalke 1:819ac9aa5667 1384 int32_t adc_data;
mahphalke 1:819ac9aa5667 1385 int8_t chn_offset;
mahphalke 1:819ac9aa5667 1386
mahphalke 1:819ac9aa5667 1387 /* Perform the system offset calibration */
mahphalke 1:819ac9aa5667 1388
mahphalke 1:819ac9aa5667 1389 if (polarity == UNIPOLAR) {
mahphalke 1:819ac9aa5667 1390 lsb_voltage = attr_chn_range[channel->ch_num - 1] / ADC_MAX_COUNT_UNIPOLAR;
mahphalke 1:819ac9aa5667 1391 } else {
mahphalke 1:819ac9aa5667 1392 lsb_voltage = attr_chn_range[channel->ch_num - 1] / ADC_MAX_COUNT_BIPOLAR;
mahphalke 1:819ac9aa5667 1393 }
mahphalke 1:819ac9aa5667 1394
mahphalke 1:819ac9aa5667 1395 /* Sample and read the ADC channel */
mahphalke 1:819ac9aa5667 1396 adc_data = single_data_read(device, channel->ch_num - 1,
mahphalke 1:819ac9aa5667 1397 polarity);
mahphalke 1:819ac9aa5667 1398
mahphalke 1:819ac9aa5667 1399 /* Get an equivalent ADC voltage */
mahphalke 1:819ac9aa5667 1400 adc_voltage = convert_adc_raw_to_voltage(adc_data,
mahphalke 1:819ac9aa5667 1401 attr_scale_val[channel->ch_num - 1]);
mahphalke 1:819ac9aa5667 1402
mahphalke 1:819ac9aa5667 1403 /* Calculate the channel offset and write it to offset register */
mahphalke 3:83b3133f544a 1404 chn_offset = -(adc_voltage / lsb_voltage / OFFSET_REG_RESOLUTION);
mahphalke 1:819ac9aa5667 1405
mahphalke 1:819ac9aa5667 1406 if (ad7606_set_ch_offset(device, channel->ch_num - 1,
mahphalke 1:819ac9aa5667 1407 chn_offset) == SUCCESS) {
mahphalke 1:819ac9aa5667 1408 return sprintf(buf, "%s", "ADC Calibration Done");
mahphalke 1:819ac9aa5667 1409 }
mahphalke 1:819ac9aa5667 1410
mahphalke 1:819ac9aa5667 1411 return -EINVAL;
mahphalke 1:819ac9aa5667 1412 }
mahphalke 1:819ac9aa5667 1413
mahphalke 1:819ac9aa5667 1414 ssize_t set_chn_calibrate_adc_offset(void *device,
mahphalke 1:819ac9aa5667 1415 char *buf,
mahphalke 1:819ac9aa5667 1416 size_t len,
mahphalke 1:819ac9aa5667 1417 const struct iio_ch_info *channel)
mahphalke 1:819ac9aa5667 1418 {
mahphalke 3:83b3133f544a 1419 // NA- Can't set open circuit detect
mahphalke 1:819ac9aa5667 1420 return - EINVAL;
mahphalke 1:819ac9aa5667 1421 }
mahphalke 1:819ac9aa5667 1422
mahphalke 1:819ac9aa5667 1423
mahphalke 1:819ac9aa5667 1424 /*!
mahphalke 1:819ac9aa5667 1425 * @brief Getter/Setter for the adc gain calibration
mahphalke 1:819ac9aa5667 1426 * @param device- pointer to IIO device structure
mahphalke 1:819ac9aa5667 1427 * @param buf- pointer to buffer holding attribute value
mahphalke 1:819ac9aa5667 1428 * @param len- length of buffer string data
mahphalke 1:819ac9aa5667 1429 * @param channel- pointer to IIO channel structure
mahphalke 1:819ac9aa5667 1430 * @return Number of characters read/written
mahphalke 1:819ac9aa5667 1431 */
mahphalke 1:819ac9aa5667 1432 ssize_t get_chn_calibrate_adc_gain(void *device,
mahphalke 1:819ac9aa5667 1433 char *buf,
mahphalke 1:819ac9aa5667 1434 size_t len,
mahphalke 1:819ac9aa5667 1435 const struct iio_ch_info *channel)
mahphalke 1:819ac9aa5667 1436 {
mahphalke 3:83b3133f544a 1437 uint8_t read_val;
mahphalke 1:819ac9aa5667 1438
mahphalke 3:83b3133f544a 1439 if (gain_calibration_done) {
mahphalke 3:83b3133f544a 1440 /* Get calibration status for previous gain value write event */
mahphalke 3:83b3133f544a 1441 gain_calibration_done = false;
mahphalke 3:83b3133f544a 1442 return sprintf(buf, "Calibration Done (Rfilter=%d K)",
mahphalke 3:83b3133f544a 1443 gain_calibration_reg_val[channel->ch_num - 1]);
mahphalke 3:83b3133f544a 1444 }
mahphalke 3:83b3133f544a 1445
mahphalke 3:83b3133f544a 1446 /* Return gain value when normal read event is triggered */
mahphalke 3:83b3133f544a 1447 if (ad7606_spi_reg_read(device,
mahphalke 3:83b3133f544a 1448 AD7606_REG_GAIN_CH(channel->ch_num - 1),
mahphalke 3:83b3133f544a 1449 &read_val) == SUCCESS) {
mahphalke 3:83b3133f544a 1450 gain_calibration_reg_val[channel->ch_num - 1] = (read_val & AD7606_GAIN_MSK);
mahphalke 3:83b3133f544a 1451 return sprintf(buf, "Rfilter= %d K",
mahphalke 3:83b3133f544a 1452 gain_calibration_reg_val[channel->ch_num - 1]);
mahphalke 1:819ac9aa5667 1453 }
mahphalke 1:819ac9aa5667 1454
mahphalke 1:819ac9aa5667 1455 return -EINVAL;
mahphalke 1:819ac9aa5667 1456 }
mahphalke 1:819ac9aa5667 1457
mahphalke 1:819ac9aa5667 1458 ssize_t set_chn_calibrate_adc_gain(void *device,
mahphalke 1:819ac9aa5667 1459 char *buf,
mahphalke 1:819ac9aa5667 1460 size_t len,
mahphalke 1:819ac9aa5667 1461 const struct iio_ch_info *channel)
mahphalke 1:819ac9aa5667 1462 {
mahphalke 1:819ac9aa5667 1463 float data;
mahphalke 1:819ac9aa5667 1464
mahphalke 3:83b3133f544a 1465 if (buf[0] >= '0' && buf[0] <= '9') {
mahphalke 3:83b3133f544a 1466 (void)sscanf(buf, "%f", &data);
mahphalke 3:83b3133f544a 1467
mahphalke 3:83b3133f544a 1468 if (data >= 0 && data < ADC_CALIBRATION_GAIN_MAX) {
mahphalke 3:83b3133f544a 1469 /* Get the nearest value of unsigned integer */
mahphalke 3:83b3133f544a 1470 gain_calibration_reg_val[channel->ch_num - 1] = (uint8_t)(round(data));
mahphalke 1:819ac9aa5667 1471
mahphalke 3:83b3133f544a 1472 /* Perform the gain calibration by writing gain value into gain register */
mahphalke 3:83b3133f544a 1473 if (ad7606_set_ch_gain(device,
mahphalke 3:83b3133f544a 1474 channel->ch_num - 1,
mahphalke 3:83b3133f544a 1475 gain_calibration_reg_val[channel->ch_num - 1]) == SUCCESS) {
mahphalke 3:83b3133f544a 1476 gain_calibration_done = true;
mahphalke 3:83b3133f544a 1477 return len;
mahphalke 3:83b3133f544a 1478 }
mahphalke 3:83b3133f544a 1479 }
mahphalke 1:819ac9aa5667 1480 }
mahphalke 1:819ac9aa5667 1481
mahphalke 1:819ac9aa5667 1482 return -EINVAL;
mahphalke 1:819ac9aa5667 1483 }
mahphalke 1:819ac9aa5667 1484
mahphalke 1:819ac9aa5667 1485
mahphalke 1:819ac9aa5667 1486 /*!
mahphalke 1:819ac9aa5667 1487 * @brief Getter/Setter for the direct register access attribute value
mahphalke 1:819ac9aa5667 1488 * @param device- pointer to IIO device structure
mahphalke 1:819ac9aa5667 1489 * @param buf- pointer to buffer holding attribute value
mahphalke 1:819ac9aa5667 1490 * @param len- length of buffer string data
mahphalke 1:819ac9aa5667 1491 * @param channel- pointer to IIO channel structure
mahphalke 1:819ac9aa5667 1492 * @return Number of characters read/written
mahphalke 1:819ac9aa5667 1493 */
mahphalke 1:819ac9aa5667 1494 ssize_t get_direct_reg_access(void *device,
mahphalke 1:819ac9aa5667 1495 char *buf,
mahphalke 1:819ac9aa5667 1496 size_t len,
mahphalke 1:819ac9aa5667 1497 const struct iio_ch_info *channel)
mahphalke 1:819ac9aa5667 1498 {
mahphalke 1:819ac9aa5667 1499 return (ssize_t)sprintf(buf, "%d", device_reg_val);
mahphalke 1:819ac9aa5667 1500 }
mahphalke 1:819ac9aa5667 1501
mahphalke 1:819ac9aa5667 1502 ssize_t set_direct_reg_access(void *device,
mahphalke 1:819ac9aa5667 1503 char *buf,
mahphalke 1:819ac9aa5667 1504 size_t len,
mahphalke 1:819ac9aa5667 1505 const struct iio_ch_info *channel)
mahphalke 1:819ac9aa5667 1506 {
mahphalke 1:819ac9aa5667 1507 uint8_t reg_address;
mahphalke 1:819ac9aa5667 1508 char *token;
mahphalke 1:819ac9aa5667 1509 uint8_t offset = strlen("0x");
mahphalke 1:819ac9aa5667 1510 char str[10] = "";
mahphalke 1:819ac9aa5667 1511 uint8_t i=0;
mahphalke 1:819ac9aa5667 1512 uint8_t reg_data;
mahphalke 1:819ac9aa5667 1513
mahphalke 1:819ac9aa5667 1514 if (buf[1] == 'x') {
mahphalke 1:819ac9aa5667 1515 /* Write a data to device */
mahphalke 1:819ac9aa5667 1516
mahphalke 1:819ac9aa5667 1517 /* Extract the register address from received string */
mahphalke 1:819ac9aa5667 1518 strcpy(str, buf);
mahphalke 1:819ac9aa5667 1519 token = strtok(str, " ");
mahphalke 1:819ac9aa5667 1520 (void)sscanf(token + offset, "%x", &reg_address);
mahphalke 1:819ac9aa5667 1521
mahphalke 1:819ac9aa5667 1522 /* Extract the register data from received string */
mahphalke 1:819ac9aa5667 1523 i = (strlen(str) + 1) + offset;
mahphalke 1:819ac9aa5667 1524 (void)sscanf(str + i, "%x", &reg_data);
mahphalke 1:819ac9aa5667 1525
mahphalke 1:819ac9aa5667 1526 if (reg_address <= NUM_OF_REGISTERS) {
mahphalke 1:819ac9aa5667 1527 if ((ad7606_spi_reg_write(device, reg_address, reg_data) == SUCCESS)) {
mahphalke 1:819ac9aa5667 1528 save_local_attributes();
mahphalke 1:819ac9aa5667 1529 return len;
mahphalke 1:819ac9aa5667 1530 }
mahphalke 1:819ac9aa5667 1531 }
mahphalke 1:819ac9aa5667 1532 } else {
mahphalke 1:819ac9aa5667 1533 /* Read the data from device */
mahphalke 1:819ac9aa5667 1534 (void)sscanf(buf, "%d", &reg_address);
mahphalke 1:819ac9aa5667 1535 if ((ad7606_spi_reg_read(device, reg_address, &device_reg_val) == SUCCESS)) {
mahphalke 1:819ac9aa5667 1536 return len;
mahphalke 1:819ac9aa5667 1537 }
mahphalke 1:819ac9aa5667 1538 }
mahphalke 1:819ac9aa5667 1539
mahphalke 1:819ac9aa5667 1540 return -EINVAL;
mahphalke 1:819ac9aa5667 1541 }
mahphalke 1:819ac9aa5667 1542
mahphalke 1:819ac9aa5667 1543
mahphalke 1:819ac9aa5667 1544 /**
mahphalke 1:819ac9aa5667 1545 * @brief Get xml corresponding to an AD7606 device.
mahphalke 1:819ac9aa5667 1546 * @param xml - Xml containing description of a device.
mahphalke 1:819ac9aa5667 1547 * @param iio_dev - Structure describing a device, channels and attributes.
mahphalke 1:819ac9aa5667 1548 * @return SUCCESS in case of success or negative value otherwise.
mahphalke 1:819ac9aa5667 1549 */
mahphalke 1:819ac9aa5667 1550 static ssize_t iio_ad7606_get_xml(char **xml, struct iio_device *iio_dev)
mahphalke 1:819ac9aa5667 1551 {
mahphalke 1:819ac9aa5667 1552 *xml = (char*)calloc(1, strlen(ad7606_phy_xml) + 1);
mahphalke 1:819ac9aa5667 1553 if (!(*xml)) {
mahphalke 1:819ac9aa5667 1554 return -ENOMEM;
mahphalke 1:819ac9aa5667 1555 }
mahphalke 1:819ac9aa5667 1556
mahphalke 1:819ac9aa5667 1557 memcpy(*xml, ad7606_phy_xml, strlen(ad7606_phy_xml));
mahphalke 1:819ac9aa5667 1558
mahphalke 1:819ac9aa5667 1559 return SUCCESS;
mahphalke 1:819ac9aa5667 1560 }
mahphalke 1:819ac9aa5667 1561
mahphalke 1:819ac9aa5667 1562
mahphalke 1:819ac9aa5667 1563 /**
mahphalke 1:819ac9aa5667 1564 * @brief Read buffer data corresponding to AD7606 IIO device
mahphalke 1:819ac9aa5667 1565 * @param dev_instance[in] - IIO device instance
mahphalke 1:819ac9aa5667 1566 * @param pbuf[out] - Pointer to output data buffer
mahphalke 1:819ac9aa5667 1567 * @return SUCCESS in case of success or negative value otherwise
mahphalke 1:819ac9aa5667 1568 */
mahphalke 1:819ac9aa5667 1569 static ssize_t iio_ad7606_read_data(void *dev_instance,
mahphalke 1:819ac9aa5667 1570 char *pbuf,
mahphalke 1:819ac9aa5667 1571 size_t offset,
mahphalke 1:819ac9aa5667 1572 size_t bytes_count,
mahphalke 1:819ac9aa5667 1573 uint32_t ch_mask)
mahphalke 1:819ac9aa5667 1574 {
mahphalke 1:819ac9aa5667 1575 if (adc_background_data_capture_started == false) {
mahphalke 1:819ac9aa5667 1576 start_background_data_capture(ch_mask, bytes_count);
mahphalke 1:819ac9aa5667 1577 adc_background_data_capture_started = true;
mahphalke 1:819ac9aa5667 1578 }
mahphalke 1:819ac9aa5667 1579
mahphalke 1:819ac9aa5667 1580 /* Read the buffered data */
mahphalke 1:819ac9aa5667 1581 return (ssize_t)buffered_data_read(pbuf, bytes_count, offset, ch_mask);
mahphalke 1:819ac9aa5667 1582 }
mahphalke 1:819ac9aa5667 1583
mahphalke 1:819ac9aa5667 1584
mahphalke 1:819ac9aa5667 1585 /**
mahphalke 1:819ac9aa5667 1586 * @brief Read requested samples count
mahphalke 1:819ac9aa5667 1587 * @param dev_instance[in] - IIO device instance
mahphalke 1:819ac9aa5667 1588 * @param pbuf[out] - Pointer to output data buffer
mahphalke 1:819ac9aa5667 1589 * @return SUCCESS in case of success or negative value otherwise
mahphalke 1:819ac9aa5667 1590 */
mahphalke 1:819ac9aa5667 1591 static ssize_t iio_ad7606_get_samples_count(void *dev_instance,
mahphalke 1:819ac9aa5667 1592 size_t bytes_count,
mahphalke 1:819ac9aa5667 1593 uint32_t ch_mask)
mahphalke 1:819ac9aa5667 1594 {
mahphalke 1:819ac9aa5667 1595 store_requested_samples_count(bytes_count);
mahphalke 1:819ac9aa5667 1596 return SUCCESS;
mahphalke 1:819ac9aa5667 1597 }
mahphalke 1:819ac9aa5667 1598
mahphalke 1:819ac9aa5667 1599
mahphalke 1:819ac9aa5667 1600 /**
mahphalke 1:819ac9aa5667 1601 * @brief Create structure describing a device, channels and attributes
mahphalke 1:819ac9aa5667 1602 * @param device_name[in] - Device name
mahphalke 1:819ac9aa5667 1603 * @return iio_device or NULL, in case of failure
mahphalke 1:819ac9aa5667 1604 */
mahphalke 1:819ac9aa5667 1605 static struct iio_device *iio_ad7606_create_device(const char *device_name)
mahphalke 1:819ac9aa5667 1606 {
mahphalke 1:819ac9aa5667 1607 struct iio_device *iio_ad7606_device;
mahphalke 1:819ac9aa5667 1608
mahphalke 1:819ac9aa5667 1609 iio_ad7606_device = calloc(1, sizeof(struct iio_device));
mahphalke 1:819ac9aa5667 1610 if (!iio_ad7606_device) {
mahphalke 1:819ac9aa5667 1611 return NULL;
mahphalke 1:819ac9aa5667 1612 }
mahphalke 1:819ac9aa5667 1613
mahphalke 1:819ac9aa5667 1614 iio_ad7606_device->name = device_name;
mahphalke 1:819ac9aa5667 1615 iio_ad7606_device->num_ch = sizeof(iio_ad7606_channels) / sizeof(
mahphalke 1:819ac9aa5667 1616 iio_ad7606_channels[0]);
mahphalke 1:819ac9aa5667 1617 iio_ad7606_device->channels = iio_ad7606_channels;
mahphalke 1:819ac9aa5667 1618 iio_ad7606_device->attributes = global_attributes;
mahphalke 1:819ac9aa5667 1619
mahphalke 1:819ac9aa5667 1620 return iio_ad7606_device;
mahphalke 1:819ac9aa5667 1621 }
mahphalke 1:819ac9aa5667 1622
mahphalke 1:819ac9aa5667 1623
mahphalke 1:819ac9aa5667 1624 /**
mahphalke 1:819ac9aa5667 1625 * @brief Delete IIO device.
mahphalke 1:819ac9aa5667 1626 * @param iio_device - Structure describing a device, channels and attributes
mahphalke 1:819ac9aa5667 1627 * @return SUCCESS in case of success or negative value otherwise
mahphalke 1:819ac9aa5667 1628 */
mahphalke 1:819ac9aa5667 1629 static ssize_t iio_ad7606_delete_device(struct iio_device *iio_device)
mahphalke 1:819ac9aa5667 1630 {
mahphalke 1:819ac9aa5667 1631 if (!iio_device) {
mahphalke 1:819ac9aa5667 1632 return FAILURE;
mahphalke 1:819ac9aa5667 1633 }
mahphalke 1:819ac9aa5667 1634
mahphalke 1:819ac9aa5667 1635 free(iio_device);
mahphalke 1:819ac9aa5667 1636
mahphalke 1:819ac9aa5667 1637 return SUCCESS;
mahphalke 1:819ac9aa5667 1638 }
mahphalke 1:819ac9aa5667 1639
mahphalke 1:819ac9aa5667 1640
mahphalke 1:819ac9aa5667 1641 /**
mahphalke 1:819ac9aa5667 1642 * @brief Init for reading/writing and parameterization of a
mahphalke 1:819ac9aa5667 1643 * ad7606 IIO device
mahphalke 1:819ac9aa5667 1644 * @param desc[in,out] - IIO device descriptor
mahphalke 1:819ac9aa5667 1645 * @param init[in] - Configuration structure
mahphalke 1:819ac9aa5667 1646 * @return SUCCESS in case of success, FAILURE otherwise
mahphalke 1:819ac9aa5667 1647 */
mahphalke 1:819ac9aa5667 1648 int32_t iio_ad7606_init(struct iio_ad7606_desc **desc,
mahphalke 1:819ac9aa5667 1649 struct iio_ad7606_init_param *init)
mahphalke 1:819ac9aa5667 1650 {
mahphalke 1:819ac9aa5667 1651 int32_t status;
mahphalke 1:819ac9aa5667 1652 struct iio_interface *iio_interface;
mahphalke 1:819ac9aa5667 1653
mahphalke 1:819ac9aa5667 1654 iio_interface = (struct iio_interface *)calloc(1, sizeof(struct iio_interface));
mahphalke 1:819ac9aa5667 1655 if (!iio_interface) {
mahphalke 1:819ac9aa5667 1656 return -ENOMEM;
mahphalke 1:819ac9aa5667 1657 }
mahphalke 1:819ac9aa5667 1658
mahphalke 1:819ac9aa5667 1659 *iio_interface = (struct iio_interface) {
mahphalke 1:819ac9aa5667 1660 .name = dev_name,
mahphalke 1:819ac9aa5667 1661 .dev_instance = init->ad7606_phy,
mahphalke 1:819ac9aa5667 1662 .iio = iio_ad7606_create_device(dev_name),
mahphalke 1:819ac9aa5667 1663 .get_xml = iio_ad7606_get_xml,
mahphalke 1:819ac9aa5667 1664 .transfer_dev_to_mem = iio_ad7606_get_samples_count,
mahphalke 1:819ac9aa5667 1665 .transfer_mem_to_dev = NULL,
mahphalke 1:819ac9aa5667 1666 .read_data = iio_ad7606_read_data,
mahphalke 1:819ac9aa5667 1667 .write_data = NULL,
mahphalke 1:819ac9aa5667 1668 };
mahphalke 1:819ac9aa5667 1669
mahphalke 1:819ac9aa5667 1670 status = iio_register(iio_interface);
mahphalke 1:819ac9aa5667 1671 if (status < 0) {
mahphalke 1:819ac9aa5667 1672 free(iio_interface);
mahphalke 1:819ac9aa5667 1673 return FAILURE;
mahphalke 1:819ac9aa5667 1674 }
mahphalke 1:819ac9aa5667 1675
mahphalke 1:819ac9aa5667 1676 *desc = calloc(1, sizeof(struct iio_ad7606_desc));
mahphalke 1:819ac9aa5667 1677 if (!(*desc)) {
mahphalke 1:819ac9aa5667 1678 iio_unregister(iio_interface);
mahphalke 1:819ac9aa5667 1679 free(iio_interface);
mahphalke 1:819ac9aa5667 1680 return FAILURE;
mahphalke 1:819ac9aa5667 1681 }
mahphalke 1:819ac9aa5667 1682
mahphalke 1:819ac9aa5667 1683 (*desc)->iio_interface = iio_interface;
mahphalke 1:819ac9aa5667 1684
mahphalke 1:819ac9aa5667 1685 return SUCCESS;
mahphalke 1:819ac9aa5667 1686 }
mahphalke 1:819ac9aa5667 1687
mahphalke 1:819ac9aa5667 1688
mahphalke 1:819ac9aa5667 1689 /**
mahphalke 1:819ac9aa5667 1690 * @brief Release resources allocated for IIO device
mahphalke 1:819ac9aa5667 1691 * @param desc[in] - IIO device descriptor
mahphalke 1:819ac9aa5667 1692 * @return SUCCESS in case of success, FAILURE otherwise
mahphalke 1:819ac9aa5667 1693 */
mahphalke 1:819ac9aa5667 1694 int32_t iio_ad7606_remove(struct iio_ad7606_desc *desc)
mahphalke 1:819ac9aa5667 1695 {
mahphalke 1:819ac9aa5667 1696 int32_t status;
mahphalke 1:819ac9aa5667 1697
mahphalke 1:819ac9aa5667 1698 if (!desc) {
mahphalke 1:819ac9aa5667 1699 return FAILURE;
mahphalke 1:819ac9aa5667 1700 }
mahphalke 1:819ac9aa5667 1701
mahphalke 1:819ac9aa5667 1702 status = iio_unregister(desc->iio_interface);
mahphalke 1:819ac9aa5667 1703 if (status < 0) {
mahphalke 1:819ac9aa5667 1704 return FAILURE;
mahphalke 1:819ac9aa5667 1705 }
mahphalke 1:819ac9aa5667 1706
mahphalke 1:819ac9aa5667 1707 status = iio_ad7606_delete_device(desc->iio_interface->iio);
mahphalke 1:819ac9aa5667 1708 if (status < 0) {
mahphalke 1:819ac9aa5667 1709 return FAILURE;
mahphalke 1:819ac9aa5667 1710 }
mahphalke 1:819ac9aa5667 1711
mahphalke 1:819ac9aa5667 1712 free(desc->iio_interface);
mahphalke 1:819ac9aa5667 1713 free(desc);
mahphalke 1:819ac9aa5667 1714
mahphalke 1:819ac9aa5667 1715 return SUCCESS;
mahphalke 1:819ac9aa5667 1716 }
mahphalke 1:819ac9aa5667 1717
mahphalke 1:819ac9aa5667 1718
mahphalke 1:819ac9aa5667 1719 /*!
mahphalke 1:819ac9aa5667 1720 * @brief Get scale factor for adc data to voltage conversion for IIO client
mahphalke 1:819ac9aa5667 1721 * @param chn_range[in] - Current channel voltage range
mahphalke 1:819ac9aa5667 1722 * @param chn_range_bits[in] - Channel range register bits
mahphalke 1:819ac9aa5667 1723 * @return scale
mahphalke 1:819ac9aa5667 1724 * @details This function samples and capture the new data when previous data
mahphalke 1:819ac9aa5667 1725 * is transmitted to IIO client
mahphalke 1:819ac9aa5667 1726 */
mahphalke 1:819ac9aa5667 1727 static float get_vltg_conv_scale_factor(float chn_range, polarity_e polarity)
mahphalke 1:819ac9aa5667 1728 {
mahphalke 1:819ac9aa5667 1729 float scale;
mahphalke 1:819ac9aa5667 1730
mahphalke 1:819ac9aa5667 1731 /* Get the scale factor for voltage conversion from range */
mahphalke 1:819ac9aa5667 1732 if (polarity == UNIPOLAR) {
mahphalke 1:819ac9aa5667 1733 scale = (chn_range / ADC_MAX_COUNT_UNIPOLAR) * 1000;
mahphalke 1:819ac9aa5667 1734 } else {
mahphalke 1:819ac9aa5667 1735 scale = (chn_range / ADC_MAX_COUNT_BIPOLAR) * 1000;
mahphalke 1:819ac9aa5667 1736 }
mahphalke 1:819ac9aa5667 1737
mahphalke 1:819ac9aa5667 1738 return scale;
mahphalke 1:819ac9aa5667 1739 }
mahphalke 1:819ac9aa5667 1740
mahphalke 1:819ac9aa5667 1741
mahphalke 1:819ac9aa5667 1742 /**
mahphalke 1:819ac9aa5667 1743 * @brief Save local variables
mahphalke 1:819ac9aa5667 1744 * @return none
mahphalke 1:819ac9aa5667 1745 * @details This function saves the local parameters with updated device values
mahphalke 1:819ac9aa5667 1746 */
mahphalke 1:819ac9aa5667 1747 static void save_local_attributes(void)
mahphalke 1:819ac9aa5667 1748 {
mahphalke 1:819ac9aa5667 1749 char buf[50];
mahphalke 1:819ac9aa5667 1750 struct iio_ch_info channel;
mahphalke 1:819ac9aa5667 1751
mahphalke 1:819ac9aa5667 1752 for (uint8_t chn = 1; chn <= AD7606X_ADC_CHANNELS; chn++) {
mahphalke 1:819ac9aa5667 1753 channel.ch_num = chn;
mahphalke 1:819ac9aa5667 1754
mahphalke 1:819ac9aa5667 1755 /* Get channel range */
mahphalke 1:819ac9aa5667 1756 (void)get_chn_range(p_ad7606_dev, buf, 0, &channel);
mahphalke 1:819ac9aa5667 1757
mahphalke 1:819ac9aa5667 1758 /* Get scale */
mahphalke 1:819ac9aa5667 1759 attr_scale_val[channel.ch_num - 1] = get_vltg_conv_scale_factor(
mahphalke 1:819ac9aa5667 1760 attr_chn_range[channel.ch_num - 1],
mahphalke 1:819ac9aa5667 1761 attr_polarity_val[channel.ch_num - 1]);
mahphalke 1:819ac9aa5667 1762 }
mahphalke 1:819ac9aa5667 1763 }
mahphalke 1:819ac9aa5667 1764
mahphalke 1:819ac9aa5667 1765
mahphalke 1:819ac9aa5667 1766 /**
mahphalke 1:819ac9aa5667 1767 * @brief Initialize the IRQ contoller
mahphalke 1:819ac9aa5667 1768 * @param uart_desc[in] - UART descriptor for UART Rx IRQ event init
mahphalke 1:819ac9aa5667 1769 * @return none
mahphalke 1:819ac9aa5667 1770 * @details This function initialize the interrupt controller
mahphalke 1:819ac9aa5667 1771 */
mahphalke 1:819ac9aa5667 1772 static int32_t iio_interrupt_handler_init(mbed_uart_desc *uart_desc)
mahphalke 1:819ac9aa5667 1773 {
mahphalke 1:819ac9aa5667 1774 /* Pin to generate external interrupt */
mahphalke 1:819ac9aa5667 1775 PinName ext_int_pin = BUSY_PIN;
mahphalke 1:819ac9aa5667 1776
mahphalke 1:819ac9aa5667 1777 /* External interrupt descriptor */
mahphalke 1:819ac9aa5667 1778 struct irq_ctrl_desc *external_int_desc;
mahphalke 1:819ac9aa5667 1779
mahphalke 1:819ac9aa5667 1780 /* Define external interrupt platform specific parameters structure */
mahphalke 1:819ac9aa5667 1781 mbed_irq_init_param mbed_ext_int_init_param = {
mahphalke 1:819ac9aa5667 1782 .int_mode = EXT_IRQ_FALL,
mahphalke 1:819ac9aa5667 1783 .int_obj_type = &ext_int_pin
mahphalke 1:819ac9aa5667 1784 };
mahphalke 1:819ac9aa5667 1785
mahphalke 1:819ac9aa5667 1786 /* External interrupt init parameters */
mahphalke 1:819ac9aa5667 1787 struct irq_init_param external_int_init_param = {
mahphalke 1:819ac9aa5667 1788 .irq_ctrl_id = EXTERNAL_INT_ID,
mahphalke 1:819ac9aa5667 1789 .extra = &mbed_ext_int_init_param
mahphalke 1:819ac9aa5667 1790 };
mahphalke 1:819ac9aa5667 1791
mahphalke 1:819ac9aa5667 1792 /* External interrupt callback descriptor */
mahphalke 1:819ac9aa5667 1793 struct callback_desc external_int_callback_desc = {
mahphalke 1:819ac9aa5667 1794 &do_conversion_callback,
mahphalke 1:819ac9aa5667 1795 NULL,
mahphalke 1:819ac9aa5667 1796 NULL
mahphalke 1:819ac9aa5667 1797 };
mahphalke 1:819ac9aa5667 1798
mahphalke 1:819ac9aa5667 1799 /* UART Rx interrupt descriptor */
mahphalke 1:819ac9aa5667 1800 struct irq_ctrl_desc *uart_rx_int_desc;
mahphalke 1:819ac9aa5667 1801
mahphalke 1:819ac9aa5667 1802 /* Define external interrupt platform specific parameters structure */
mahphalke 1:819ac9aa5667 1803 mbed_irq_init_param mbed_uart_rx_int_init_param = {
mahphalke 1:819ac9aa5667 1804 .int_mode = 0,
mahphalke 1:819ac9aa5667 1805 .int_obj_type = uart_desc->uart_port
mahphalke 1:819ac9aa5667 1806 };
mahphalke 1:819ac9aa5667 1807
mahphalke 1:819ac9aa5667 1808 /* UART Rx interrupt init parameters */
mahphalke 1:819ac9aa5667 1809 struct irq_init_param uart_rx_int_init_param = {
mahphalke 1:819ac9aa5667 1810 .irq_ctrl_id = UART_RX_INT_ID,
mahphalke 1:819ac9aa5667 1811 .extra = &mbed_uart_rx_int_init_param
mahphalke 1:819ac9aa5667 1812 };
mahphalke 1:819ac9aa5667 1813
mahphalke 1:819ac9aa5667 1814 /* UART Rx interrupt callback descriptor */
mahphalke 1:819ac9aa5667 1815 struct callback_desc uart_rx_int_callback_desc = {
mahphalke 1:819ac9aa5667 1816 &iio_uart_rx_callback,
mahphalke 1:819ac9aa5667 1817 NULL,
mahphalke 1:819ac9aa5667 1818 NULL
mahphalke 1:819ac9aa5667 1819 };
mahphalke 1:819ac9aa5667 1820
mahphalke 1:819ac9aa5667 1821 /* Init interrupt controller for external interrupt */
mahphalke 1:819ac9aa5667 1822 if (irq_ctrl_init(&external_int_desc, &external_int_init_param) == FAILURE) {
mahphalke 1:819ac9aa5667 1823 return FAILURE;
mahphalke 1:819ac9aa5667 1824 }
mahphalke 1:819ac9aa5667 1825
mahphalke 1:819ac9aa5667 1826 /* Init interrupt controller for UART Rx interrupt */
mahphalke 1:819ac9aa5667 1827 if (irq_ctrl_init(&uart_rx_int_desc, &uart_rx_int_init_param) == FAILURE) {
mahphalke 1:819ac9aa5667 1828 return FAILURE;
mahphalke 1:819ac9aa5667 1829 }
mahphalke 1:819ac9aa5667 1830
mahphalke 1:819ac9aa5667 1831 /* Register a callback function for external interrupt */
mahphalke 1:819ac9aa5667 1832 if (irq_register_callback(external_int_desc, EXTERNAL_INT_ID,
mahphalke 1:819ac9aa5667 1833 &external_int_callback_desc) == FAILURE) {
mahphalke 1:819ac9aa5667 1834 return FAILURE;
mahphalke 1:819ac9aa5667 1835 }
mahphalke 1:819ac9aa5667 1836
mahphalke 1:819ac9aa5667 1837 /* Register a callback function for UART Rx interrupt */
mahphalke 1:819ac9aa5667 1838 if (irq_register_callback(uart_rx_int_desc, UART_RX_INT_ID,
mahphalke 1:819ac9aa5667 1839 &uart_rx_int_callback_desc) == FAILURE) {
mahphalke 1:819ac9aa5667 1840 return FAILURE;
mahphalke 1:819ac9aa5667 1841 }
mahphalke 1:819ac9aa5667 1842
mahphalke 1:819ac9aa5667 1843 return SUCCESS;
mahphalke 1:819ac9aa5667 1844 }
mahphalke 1:819ac9aa5667 1845
mahphalke 1:819ac9aa5667 1846
mahphalke 1:819ac9aa5667 1847 /**
mahphalke 1:819ac9aa5667 1848 * @brief Initialize the IIO interface for AD7606 IIO device
mahphalke 1:819ac9aa5667 1849 * @return none
mahphalke 1:819ac9aa5667 1850 * @return SUCCESS in case of success, FAILURE otherwise
mahphalke 1:819ac9aa5667 1851 */
mahphalke 1:819ac9aa5667 1852 int32_t ad7606_iio_initialize(void)
mahphalke 1:819ac9aa5667 1853 {
mahphalke 1:819ac9aa5667 1854 int32_t init_status;
mahphalke 1:819ac9aa5667 1855
mahphalke 1:819ac9aa5667 1856 /**
mahphalke 1:819ac9aa5667 1857 * AD7606 IIO instance descriptor
mahphalke 1:819ac9aa5667 1858 */
mahphalke 1:819ac9aa5667 1859 struct iio_ad7606_desc *piio_ad7606_desc;
mahphalke 1:819ac9aa5667 1860
mahphalke 1:819ac9aa5667 1861 /**
mahphalke 1:819ac9aa5667 1862 * AD7606 IIO init parameters
mahphalke 1:819ac9aa5667 1863 */
mahphalke 1:819ac9aa5667 1864 struct iio_ad7606_init_param iio_ad7606_init_param;
mahphalke 1:819ac9aa5667 1865
mahphalke 1:819ac9aa5667 1866 /**
mahphalke 1:819ac9aa5667 1867 * IIO application init parameters
mahphalke 1:819ac9aa5667 1868 */
mahphalke 1:819ac9aa5667 1869 struct iio_app_init_param iio_app_init_par;
mahphalke 1:819ac9aa5667 1870
mahphalke 1:819ac9aa5667 1871 /**
mahphalke 1:819ac9aa5667 1872 * UART serial interface read/write callback
mahphalke 1:819ac9aa5667 1873 */
mahphalke 1:819ac9aa5667 1874 struct iio_server_ops uart_iio_server_ops;
mahphalke 1:819ac9aa5667 1875
mahphalke 1:819ac9aa5667 1876 /*
mahphalke 1:819ac9aa5667 1877 * UART Mbed init extra parameters structure
mahphalke 1:819ac9aa5667 1878 */
mahphalke 1:819ac9aa5667 1879 mbed_uart_init_param uart_extra_init_param;
mahphalke 1:819ac9aa5667 1880
mahphalke 1:819ac9aa5667 1881 /*
mahphalke 1:819ac9aa5667 1882 * UART init parameters structure
mahphalke 1:819ac9aa5667 1883 */
mahphalke 1:819ac9aa5667 1884 struct uart_init_param uart_init_param;
mahphalke 1:819ac9aa5667 1885
mahphalke 1:819ac9aa5667 1886 /**
mahphalke 1:819ac9aa5667 1887 * IIO application UART descriptor
mahphalke 1:819ac9aa5667 1888 */
mahphalke 1:819ac9aa5667 1889 struct uart_desc *uart_desc = NULL;
mahphalke 1:819ac9aa5667 1890
mahphalke 1:819ac9aa5667 1891 /*
mahphalke 1:819ac9aa5667 1892 * GPIO LED Init parameters structure
mahphalke 1:819ac9aa5667 1893 */
mahphalke 1:819ac9aa5667 1894 struct gpio_init_param gpio_init_led;
mahphalke 1:819ac9aa5667 1895
mahphalke 1:819ac9aa5667 1896 iio_ad7606_init_param = (struct iio_ad7606_init_param) {
mahphalke 1:819ac9aa5667 1897 .ad7606_phy = NULL,
mahphalke 1:819ac9aa5667 1898 };
mahphalke 1:819ac9aa5667 1899
mahphalke 1:819ac9aa5667 1900 uart_extra_init_param = (mbed_uart_init_param) {
mahphalke 1:819ac9aa5667 1901 .uart_tx_pin = UART_TX,
mahphalke 1:819ac9aa5667 1902 .uart_rx_pin = UART_RX
mahphalke 1:819ac9aa5667 1903 };
mahphalke 1:819ac9aa5667 1904
mahphalke 1:819ac9aa5667 1905 uart_init_param = (struct uart_init_param ) {
mahphalke 1:819ac9aa5667 1906 .device_id = NULL,
mahphalke 1:819ac9aa5667 1907 .baud_rate = IIO_UART_BAUD_RATE,
mahphalke 1:819ac9aa5667 1908 .extra = &uart_extra_init_param
mahphalke 1:819ac9aa5667 1909 };
mahphalke 1:819ac9aa5667 1910
mahphalke 1:819ac9aa5667 1911 uart_iio_server_ops = (struct iio_server_ops) {
mahphalke 1:819ac9aa5667 1912 .read = iio_uart_read,
mahphalke 1:819ac9aa5667 1913 .write = iio_uart_write,
mahphalke 1:819ac9aa5667 1914 };
mahphalke 1:819ac9aa5667 1915
mahphalke 1:819ac9aa5667 1916 gpio_init_led = (struct gpio_init_param) {
mahphalke 1:819ac9aa5667 1917 .number = LED_GREEN,
mahphalke 1:819ac9aa5667 1918 .extra = NULL
mahphalke 1:819ac9aa5667 1919 };
mahphalke 1:819ac9aa5667 1920
mahphalke 1:819ac9aa5667 1921 iio_app_init_par = (struct iio_app_init_param) {
mahphalke 1:819ac9aa5667 1922 .iio_server_ops = &uart_iio_server_ops,
mahphalke 1:819ac9aa5667 1923 };
mahphalke 1:819ac9aa5667 1924
mahphalke 1:819ac9aa5667 1925 /* Initialize AD7606 device and peripheral interface */
mahphalke 1:819ac9aa5667 1926 init_status = ad7606_init(&p_ad7606_dev, &ad7606_init_str);
mahphalke 1:819ac9aa5667 1927 if (init_status != SUCCESS) {
mahphalke 1:819ac9aa5667 1928 return init_status;
mahphalke 1:819ac9aa5667 1929 }
mahphalke 1:819ac9aa5667 1930
mahphalke 1:819ac9aa5667 1931 /* Initialize the LED GPIO descriptor */
mahphalke 1:819ac9aa5667 1932 init_status = gpio_get_optional(&gpio_led, &gpio_init_led);
mahphalke 1:819ac9aa5667 1933 if (init_status != SUCCESS) {
mahphalke 1:819ac9aa5667 1934 return init_status;
mahphalke 1:819ac9aa5667 1935 } else {
mahphalke 1:819ac9aa5667 1936 init_status = gpio_direction_output(gpio_led, GPIO_HIGH);
mahphalke 1:819ac9aa5667 1937 if (init_status != SUCCESS) {
mahphalke 1:819ac9aa5667 1938 return init_status;
mahphalke 1:819ac9aa5667 1939 }
mahphalke 1:819ac9aa5667 1940 }
mahphalke 1:819ac9aa5667 1941
mahphalke 1:819ac9aa5667 1942 /* Get the AD7606 IIO device instance */
mahphalke 1:819ac9aa5667 1943 iio_ad7606_init_param.ad7606_phy = p_ad7606_dev;
mahphalke 1:819ac9aa5667 1944
mahphalke 1:819ac9aa5667 1945 /* Initialize the UART interface for IIO application */
mahphalke 1:819ac9aa5667 1946 init_status = iio_uart_init(&uart_desc, &uart_init_param);
mahphalke 1:819ac9aa5667 1947 if (init_status != SUCCESS) {
mahphalke 1:819ac9aa5667 1948 return init_status;
mahphalke 1:819ac9aa5667 1949 }
mahphalke 1:819ac9aa5667 1950
mahphalke 1:819ac9aa5667 1951 /* Initialize the IIO application interface */
mahphalke 1:819ac9aa5667 1952 init_status = iio_app_init(&iio_app_desc, &iio_app_init_par);
mahphalke 1:819ac9aa5667 1953 if (init_status != SUCCESS) {
mahphalke 1:819ac9aa5667 1954 return init_status;
mahphalke 1:819ac9aa5667 1955 }
mahphalke 1:819ac9aa5667 1956
mahphalke 1:819ac9aa5667 1957 /* Register and initialize the AD7606 device into IIO interface */
mahphalke 1:819ac9aa5667 1958 init_status = iio_ad7606_init(&piio_ad7606_desc, &iio_ad7606_init_param);
mahphalke 1:819ac9aa5667 1959 if (init_status != SUCCESS) {
mahphalke 1:819ac9aa5667 1960 return init_status;
mahphalke 1:819ac9aa5667 1961 }
mahphalke 1:819ac9aa5667 1962
mahphalke 1:819ac9aa5667 1963 /* Init the data capture for AD7606 IIO app */
mahphalke 1:819ac9aa5667 1964 init_status = iio_data_capture_init(p_ad7606_dev);
mahphalke 1:819ac9aa5667 1965 if (init_status != SUCCESS) {
mahphalke 1:819ac9aa5667 1966 return init_status;
mahphalke 1:819ac9aa5667 1967 }
mahphalke 1:819ac9aa5667 1968
mahphalke 1:819ac9aa5667 1969 /* Init the interrupt event handler for AD7606 IIO app */
mahphalke 1:819ac9aa5667 1970 init_status = iio_interrupt_handler_init(uart_desc->extra);
mahphalke 1:819ac9aa5667 1971 if (init_status != SUCCESS) {
mahphalke 1:819ac9aa5667 1972 return init_status;
mahphalke 1:819ac9aa5667 1973 }
mahphalke 1:819ac9aa5667 1974
mahphalke 1:819ac9aa5667 1975 return init_status;
mahphalke 1:819ac9aa5667 1976 }
mahphalke 1:819ac9aa5667 1977
mahphalke 1:819ac9aa5667 1978
mahphalke 1:819ac9aa5667 1979 /**
mahphalke 1:819ac9aa5667 1980 * @brief Run the AD7606 IIO event handler
mahphalke 1:819ac9aa5667 1981 * @return none
mahphalke 1:819ac9aa5667 1982 * @details This function monitors the new IIO client event
mahphalke 1:819ac9aa5667 1983 */
mahphalke 1:819ac9aa5667 1984 void ad7606_iio_event_handler(void)
mahphalke 1:819ac9aa5667 1985 {
mahphalke 1:819ac9aa5667 1986 /* Handle new IIO command */
mahphalke 1:819ac9aa5667 1987 if (is_new_iio_command_detected()) {
mahphalke 1:819ac9aa5667 1988 /* Stop the background data capture if it is running before and any
mahphalke 1:819ac9aa5667 1989 * iio command except READBUF is received */
mahphalke 1:819ac9aa5667 1990 if (adc_background_data_capture_started) {
mahphalke 1:819ac9aa5667 1991 if (!check_iio_cmd("READBUF", 7)) {
mahphalke 1:819ac9aa5667 1992 stop_background_data_capture();
mahphalke 1:819ac9aa5667 1993 adc_background_data_capture_started = false;
mahphalke 1:819ac9aa5667 1994 }
mahphalke 1:819ac9aa5667 1995 }
mahphalke 1:819ac9aa5667 1996
mahphalke 1:819ac9aa5667 1997 /* Run the IIO interface when new command is detected */
mahphalke 1:819ac9aa5667 1998 (void)iio_app(iio_app_desc);
mahphalke 1:819ac9aa5667 1999 }
mahphalke 1:819ac9aa5667 2000 }