Example Program for EVAL-AD7606

Dependencies:   platform_drivers

Committer:
mahphalke
Date:
Mon Oct 05 13:45:15 2020 +0530
Revision:
1:819ac9aa5667
Child:
3:83b3133f544a
AD7606 IIO Application- Initial Revision

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