IIO firmware for the AD717x and AD411x family of devices.

Dependencies:   sdp_k1_sdram

Committer:
Janani Sunil
Date:
Tue Nov 15 17:05:27 2022 +0530
Revision:
3:0dcba3253ec1
Parent:
0:5ad86d8d396a
Added support for AD4116

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Janani Sunil 0:5ad86d8d396a 1 /***************************************************************************//**
Janani Sunil 0:5ad86d8d396a 2 * @file ad717x_iio.c
Janani Sunil 0:5ad86d8d396a 3 * @brief Source file for the AD717x IIO Application
Janani Sunil 0:5ad86d8d396a 4 ********************************************************************************
Janani Sunil 0:5ad86d8d396a 5 * Copyright (c) 2021-22 Analog Devices, Inc.
Janani Sunil 0:5ad86d8d396a 6 * All rights reserved.
Janani Sunil 0:5ad86d8d396a 7 *
Janani Sunil 0:5ad86d8d396a 8 * This software is proprietary to Analog Devices, Inc. and its licensors.
Janani Sunil 0:5ad86d8d396a 9 * By using this software you agree to the terms of the associated
Janani Sunil 0:5ad86d8d396a 10 * Analog Devices Software License Agreement.
Janani Sunil 0:5ad86d8d396a 11 *******************************************************************************/
Janani Sunil 0:5ad86d8d396a 12
Janani Sunil 0:5ad86d8d396a 13 /******************************************************************************/
Janani Sunil 0:5ad86d8d396a 14 /***************************** Include Files **********************************/
Janani Sunil 0:5ad86d8d396a 15 /******************************************************************************/
Janani Sunil 0:5ad86d8d396a 16
Janani Sunil 0:5ad86d8d396a 17 #include <stdio.h>
Janani Sunil 0:5ad86d8d396a 18 #include "ad717x_user_config.h"
Janani Sunil 0:5ad86d8d396a 19 #include "app_config.h"
Janani Sunil 0:5ad86d8d396a 20 #include "ad717x_iio.h"
Janani Sunil 0:5ad86d8d396a 21 #include "ad717x.h"
Janani Sunil 0:5ad86d8d396a 22 #include "iio.h"
Janani Sunil 0:5ad86d8d396a 23 #include "no_os_util.h"
Janani Sunil 0:5ad86d8d396a 24 #include "ad717x_data_capture.h"
Janani Sunil 0:5ad86d8d396a 25 #include "no_os_error.h"
Janani Sunil 0:5ad86d8d396a 26
Janani Sunil 0:5ad86d8d396a 27 /******************************************************************************/
Janani Sunil 0:5ad86d8d396a 28 /********************* Macros and Constants Definition ************************/
Janani Sunil 0:5ad86d8d396a 29 /******************************************************************************/
Janani Sunil 0:5ad86d8d396a 30
Janani Sunil 0:5ad86d8d396a 31 /* Define ADC Resolution in Bits */
Janani Sunil 0:5ad86d8d396a 32 #if defined (DEV_AD7177_2)
Janani Sunil 0:5ad86d8d396a 33 #define AD717x_RESOLUTION 32
Janani Sunil 0:5ad86d8d396a 34 #else
Janani Sunil 0:5ad86d8d396a 35 #define AD717x_RESOLUTION 24
Janani Sunil 0:5ad86d8d396a 36 #endif
Janani Sunil 0:5ad86d8d396a 37
Janani Sunil 0:5ad86d8d396a 38 /* ADC max count (full scale value) for unipolar inputs */
Janani Sunil 0:5ad86d8d396a 39 #define ADC_MAX_COUNT_UNIPOLAR (uint32_t)((1 << AD717x_RESOLUTION) - 1)
Janani Sunil 0:5ad86d8d396a 40
Janani Sunil 0:5ad86d8d396a 41 /* ADC max count (full scale value) for bipolar inputs */
Janani Sunil 0:5ad86d8d396a 42 #define ADC_MAX_COUNT_BIPOLAR (uint32_t)(1 << (AD717x_RESOLUTION-1))
Janani Sunil 0:5ad86d8d396a 43
Janani Sunil 0:5ad86d8d396a 44 /* Bytes per sample (*Note: 4 bytes needed per sample for data range
Janani Sunil 0:5ad86d8d396a 45 * of 0 to 32-bit) */
Janani Sunil 0:5ad86d8d396a 46 #define BYTES_PER_SAMPLE sizeof(uint32_t)
Janani Sunil 0:5ad86d8d396a 47
Janani Sunil 0:5ad86d8d396a 48 /* Number of data storage bits (needed for IIO client) */
Janani Sunil 0:5ad86d8d396a 49 #define CHN_STORAGE_BITS (BYTES_PER_SAMPLE * 8)
Janani Sunil 0:5ad86d8d396a 50
Janani Sunil 0:5ad86d8d396a 51 /* Private IDs for IIO attributes */
Janani Sunil 0:5ad86d8d396a 52 #define AD717x_RAW_ATTR_ID 0
Janani Sunil 0:5ad86d8d396a 53 #define AD717x_SCALE_ATTR_ID 1
Janani Sunil 0:5ad86d8d396a 54 #define AD717x_OFFSET_ATTR_ID 2
Janani Sunil 0:5ad86d8d396a 55 #define AD717x_SAMPLING_FREQUENCY_ID 3
Janani Sunil 0:5ad86d8d396a 56
Janani Sunil 0:5ad86d8d396a 57 /* Data Buffer for burst mode data capture */
Janani Sunil 0:5ad86d8d396a 58 #define AD717x_DATA_BUFFER_SIZE (8192)
Janani Sunil 0:5ad86d8d396a 59
Janani Sunil 0:5ad86d8d396a 60 /* Scan type definition */
Janani Sunil 0:5ad86d8d396a 61 #define AD717x_SCAN {\
Janani Sunil 0:5ad86d8d396a 62 .sign = 'u',\
Janani Sunil 0:5ad86d8d396a 63 .realbits = AD717x_RESOLUTION,\
Janani Sunil 0:5ad86d8d396a 64 .storagebits = CHN_STORAGE_BITS,\
Janani Sunil 0:5ad86d8d396a 65 .shift = 0,\
Janani Sunil 0:5ad86d8d396a 66 .is_big_endian = false\
Janani Sunil 0:5ad86d8d396a 67 }
Janani Sunil 0:5ad86d8d396a 68
Janani Sunil 0:5ad86d8d396a 69 /* Channel attribute definition */
Janani Sunil 0:5ad86d8d396a 70 #define AD717x_CHANNEL(_name, _priv) {\
Janani Sunil 0:5ad86d8d396a 71 .name = _name,\
Janani Sunil 0:5ad86d8d396a 72 .priv = _priv,\
Janani Sunil 0:5ad86d8d396a 73 .show = get_adc_attribute,\
Janani Sunil 0:5ad86d8d396a 74 .store = set_adc_attribute\
Janani Sunil 0:5ad86d8d396a 75 }
Janani Sunil 0:5ad86d8d396a 76
Janani Sunil 0:5ad86d8d396a 77 /* AD717x Channel Definition */
Janani Sunil 0:5ad86d8d396a 78 #define IIO_AD717x_CHANNEL(_idx) {\
Janani Sunil 0:5ad86d8d396a 79 .name = "ch" # _idx,\
Janani Sunil 0:5ad86d8d396a 80 .ch_type = IIO_VOLTAGE,\
Janani Sunil 0:5ad86d8d396a 81 .channel = _idx,\
Janani Sunil 0:5ad86d8d396a 82 .scan_index = _idx,\
Janani Sunil 0:5ad86d8d396a 83 .indexed = true,\
Janani Sunil 0:5ad86d8d396a 84 .scan_type = &ad717x_scan_type[_idx],\
Janani Sunil 0:5ad86d8d396a 85 .ch_out = false,\
Janani Sunil 0:5ad86d8d396a 86 .attributes = ad717x_channel_attributes,\
Janani Sunil 0:5ad86d8d396a 87 }
Janani Sunil 0:5ad86d8d396a 88
Janani Sunil 0:5ad86d8d396a 89 /******************************************************************************/
Janani Sunil 0:5ad86d8d396a 90 /******************** Variables and User Defined Data Types *******************/
Janani Sunil 0:5ad86d8d396a 91 /******************************************************************************/
Janani Sunil 0:5ad86d8d396a 92
Janani Sunil 0:5ad86d8d396a 93 /* IIO interface descriptor */
Janani Sunil 0:5ad86d8d396a 94 static struct iio_desc *p_ad717x_iio_desc;
Janani Sunil 0:5ad86d8d396a 95
Janani Sunil 0:5ad86d8d396a 96 /* Pointer to the struct representing the AD717x IIO device */
Janani Sunil 0:5ad86d8d396a 97 ad717x_dev *p_ad717x_dev_inst = NULL;
Janani Sunil 0:5ad86d8d396a 98
Janani Sunil 0:5ad86d8d396a 99 /* Device Name */
Janani Sunil 0:5ad86d8d396a 100 static const char dev_name[] = ACTIVE_DEVICE_NAME;
Janani Sunil 0:5ad86d8d396a 101
Janani Sunil 0:5ad86d8d396a 102 /* Variable to hold the number of active channels*/
Janani Sunil 0:5ad86d8d396a 103 uint8_t num_active_channels = 0;
Janani Sunil 0:5ad86d8d396a 104
Janani Sunil 0:5ad86d8d396a 105 /* Channel scale values */
Janani Sunil 0:5ad86d8d396a 106 static float attr_scale_val[NUMBER_OF_CHANNELS];
Janani Sunil 0:5ad86d8d396a 107
Janani Sunil 0:5ad86d8d396a 108 /* Channel offset values */
Janani Sunil 0:5ad86d8d396a 109 static int attr_offset_val[NUMBER_OF_CHANNELS];
Janani Sunil 0:5ad86d8d396a 110
Janani Sunil 0:5ad86d8d396a 111 /* AD717x channel scan type */
Janani Sunil 0:5ad86d8d396a 112 static struct scan_type ad717x_scan_type[] = {
Janani Sunil 0:5ad86d8d396a 113 AD717x_SCAN,
Janani Sunil 0:5ad86d8d396a 114 AD717x_SCAN,
Janani Sunil 0:5ad86d8d396a 115 AD717x_SCAN,
Janani Sunil 0:5ad86d8d396a 116 AD717x_SCAN,
Janani Sunil 0:5ad86d8d396a 117 #if (NUMBER_OF_CHANNELS != 4)
Janani Sunil 0:5ad86d8d396a 118 AD717x_SCAN,
Janani Sunil 0:5ad86d8d396a 119 AD717x_SCAN,
Janani Sunil 0:5ad86d8d396a 120 AD717x_SCAN,
Janani Sunil 0:5ad86d8d396a 121 AD717x_SCAN,
Janani Sunil 0:5ad86d8d396a 122 #if (NUMBER_OF_CHANNELS != 4) && (NUMBER_OF_CHANNELS !=8 )
Janani Sunil 0:5ad86d8d396a 123 AD717x_SCAN,
Janani Sunil 0:5ad86d8d396a 124 AD717x_SCAN,
Janani Sunil 0:5ad86d8d396a 125 AD717x_SCAN,
Janani Sunil 0:5ad86d8d396a 126 AD717x_SCAN,
Janani Sunil 0:5ad86d8d396a 127 AD717x_SCAN,
Janani Sunil 0:5ad86d8d396a 128 AD717x_SCAN,
Janani Sunil 0:5ad86d8d396a 129 AD717x_SCAN,
Janani Sunil 0:5ad86d8d396a 130 AD717x_SCAN
Janani Sunil 0:5ad86d8d396a 131 #endif
Janani Sunil 0:5ad86d8d396a 132 #endif
Janani Sunil 0:5ad86d8d396a 133 };
Janani Sunil 0:5ad86d8d396a 134
Janani Sunil 0:5ad86d8d396a 135 /******************************************************************************/
Janani Sunil 0:5ad86d8d396a 136 /************************** Functions Declaration *****************************/
Janani Sunil 0:5ad86d8d396a 137 /******************************************************************************/
Janani Sunil 0:5ad86d8d396a 138
Janani Sunil 0:5ad86d8d396a 139 /******************************************************************************/
Janani Sunil 0:5ad86d8d396a 140 /************************** Functions Definition ******************************/
Janani Sunil 0:5ad86d8d396a 141 /******************************************************************************/
Janani Sunil 0:5ad86d8d396a 142
Janani Sunil 0:5ad86d8d396a 143 /*!
Janani Sunil 0:5ad86d8d396a 144 * @brief Getter/Setter for the attribute value
Janani Sunil 0:5ad86d8d396a 145 * @param device[in]- pointer to IIO device structure
Janani Sunil 0:5ad86d8d396a 146 * @param buf[in]- pointer to buffer holding attribute value
Janani Sunil 0:5ad86d8d396a 147 * @param len[in]- length of buffer string data
Janani Sunil 0:5ad86d8d396a 148 * @param channel[in]- pointer to IIO channel structure
Janani Sunil 0:5ad86d8d396a 149 * @param id[in]- Attribute ID
Janani Sunil 0:5ad86d8d396a 150 * @return Number of characters read/written in case of success, negative error code otherwise
Janani Sunil 0:5ad86d8d396a 151 */
Janani Sunil 0:5ad86d8d396a 152 static int32_t get_adc_attribute(void *device,
Janani Sunil 0:5ad86d8d396a 153 char *buf,
Janani Sunil 0:5ad86d8d396a 154 uint32_t len,
Janani Sunil 0:5ad86d8d396a 155 const struct iio_ch_info *channel,
Janani Sunil 0:5ad86d8d396a 156 intptr_t id)
Janani Sunil 0:5ad86d8d396a 157 {
Janani Sunil 0:5ad86d8d396a 158 int32_t adc_raw_data = 0;
Janani Sunil 0:5ad86d8d396a 159 int32_t adc_offset = 0;
Janani Sunil 0:5ad86d8d396a 160
Janani Sunil 0:5ad86d8d396a 161 switch (id) {
Janani Sunil 0:5ad86d8d396a 162 case AD717x_RAW_ATTR_ID:
Janani Sunil 0:5ad86d8d396a 163 if (ad717x_single_read(device, channel->ch_num, &adc_raw_data) < 0)
Janani Sunil 0:5ad86d8d396a 164 return -EINVAL;
Janani Sunil 0:5ad86d8d396a 165
Janani Sunil 0:5ad86d8d396a 166 return sprintf(buf, "%d", adc_raw_data);
Janani Sunil 0:5ad86d8d396a 167
Janani Sunil 0:5ad86d8d396a 168 case AD717x_SCALE_ATTR_ID:
Janani Sunil 0:5ad86d8d396a 169 return sprintf(buf, "%f", attr_scale_val[channel->ch_num]);
Janani Sunil 0:5ad86d8d396a 170
Janani Sunil 0:5ad86d8d396a 171 case AD717x_OFFSET_ATTR_ID:
Janani Sunil 0:5ad86d8d396a 172 return sprintf(buf, "%d", attr_offset_val[channel->ch_num]);
Janani Sunil 0:5ad86d8d396a 173
Janani Sunil 0:5ad86d8d396a 174 case AD717x_SAMPLING_FREQUENCY_ID:
Janani Sunil 0:5ad86d8d396a 175 return sprintf(buf, "%d", AD717x_SAMPLING_RATE/NUMBER_OF_CHANNELS);
Janani Sunil 0:5ad86d8d396a 176
Janani Sunil 0:5ad86d8d396a 177 default:
Janani Sunil 0:5ad86d8d396a 178 break;
Janani Sunil 0:5ad86d8d396a 179 }
Janani Sunil 0:5ad86d8d396a 180
Janani Sunil 0:5ad86d8d396a 181 return -EINVAL;
Janani Sunil 0:5ad86d8d396a 182 }
Janani Sunil 0:5ad86d8d396a 183
Janani Sunil 0:5ad86d8d396a 184
Janani Sunil 0:5ad86d8d396a 185 static int32_t set_adc_attribute(void *device,
Janani Sunil 0:5ad86d8d396a 186 char *buf,
Janani Sunil 0:5ad86d8d396a 187 uint32_t len,
Janani Sunil 0:5ad86d8d396a 188 const struct iio_ch_info *channel,
Janani Sunil 0:5ad86d8d396a 189 intptr_t id)
Janani Sunil 0:5ad86d8d396a 190 {
Janani Sunil 0:5ad86d8d396a 191 switch (id) {
Janani Sunil 0:5ad86d8d396a 192
Janani Sunil 0:5ad86d8d396a 193 /* ADC Raw, Scale, Offset factors are constant for the firmware configuration */
Janani Sunil 0:5ad86d8d396a 194 case AD717x_RAW_ATTR_ID:
Janani Sunil 0:5ad86d8d396a 195 case AD717x_SCALE_ATTR_ID:
Janani Sunil 0:5ad86d8d396a 196 case AD717x_OFFSET_ATTR_ID:
Janani Sunil 0:5ad86d8d396a 197 case AD717x_SAMPLING_FREQUENCY_ID:
Janani Sunil 0:5ad86d8d396a 198 default:
Janani Sunil 0:5ad86d8d396a 199 break;
Janani Sunil 0:5ad86d8d396a 200 }
Janani Sunil 0:5ad86d8d396a 201
Janani Sunil 0:5ad86d8d396a 202 return len;
Janani Sunil 0:5ad86d8d396a 203 }
Janani Sunil 0:5ad86d8d396a 204
Janani Sunil 0:5ad86d8d396a 205 /* AD717X Channel Attributes */
Janani Sunil 0:5ad86d8d396a 206 static struct iio_attribute ad717x_channel_attributes[] = {
Janani Sunil 0:5ad86d8d396a 207 AD717x_CHANNEL("raw", AD717x_RAW_ATTR_ID),
Janani Sunil 0:5ad86d8d396a 208 AD717x_CHANNEL("scale", AD717x_SCALE_ATTR_ID),
Janani Sunil 0:5ad86d8d396a 209 AD717x_CHANNEL("offset", AD717x_OFFSET_ATTR_ID),
Janani Sunil 0:5ad86d8d396a 210 END_ATTRIBUTES_ARRAY
Janani Sunil 0:5ad86d8d396a 211 };
Janani Sunil 0:5ad86d8d396a 212
Janani Sunil 0:5ad86d8d396a 213 /* AD717x Global Attributes */
Janani Sunil 0:5ad86d8d396a 214 static struct iio_attribute iio_ad717x_global_attributes[] = {
Janani Sunil 0:5ad86d8d396a 215 AD717x_CHANNEL("sampling_frequency", AD717x_SAMPLING_FREQUENCY_ID),
Janani Sunil 0:5ad86d8d396a 216 END_ATTRIBUTES_ARRAY
Janani Sunil 0:5ad86d8d396a 217 };
Janani Sunil 0:5ad86d8d396a 218
Janani Sunil 0:5ad86d8d396a 219 /* IIO Attributes */
Janani Sunil 0:5ad86d8d396a 220 static struct iio_channel iio_adc_channels[] = {
Janani Sunil 0:5ad86d8d396a 221 IIO_AD717x_CHANNEL(0),
Janani Sunil 0:5ad86d8d396a 222 IIO_AD717x_CHANNEL(1),
Janani Sunil 0:5ad86d8d396a 223 IIO_AD717x_CHANNEL(2),
Janani Sunil 0:5ad86d8d396a 224 IIO_AD717x_CHANNEL(3),
Janani Sunil 0:5ad86d8d396a 225 #if (NUMBER_OF_CHANNELS != 4)
Janani Sunil 0:5ad86d8d396a 226 IIO_AD717x_CHANNEL(4),
Janani Sunil 0:5ad86d8d396a 227 IIO_AD717x_CHANNEL(5),
Janani Sunil 0:5ad86d8d396a 228 IIO_AD717x_CHANNEL(6),
Janani Sunil 0:5ad86d8d396a 229 IIO_AD717x_CHANNEL(7),
Janani Sunil 0:5ad86d8d396a 230 #if (NUMBER_OF_CHANNELS != 4) && (NUMBER_OF_CHANNELS != 8)
Janani Sunil 0:5ad86d8d396a 231 IIO_AD717x_CHANNEL(8),
Janani Sunil 0:5ad86d8d396a 232 IIO_AD717x_CHANNEL(9),
Janani Sunil 0:5ad86d8d396a 233 IIO_AD717x_CHANNEL(10),
Janani Sunil 0:5ad86d8d396a 234 IIO_AD717x_CHANNEL(11),
Janani Sunil 0:5ad86d8d396a 235 IIO_AD717x_CHANNEL(12),
Janani Sunil 0:5ad86d8d396a 236 IIO_AD717x_CHANNEL(13),
Janani Sunil 0:5ad86d8d396a 237 IIO_AD717x_CHANNEL(14),
Janani Sunil 0:5ad86d8d396a 238 IIO_AD717x_CHANNEL(15)
Janani Sunil 0:5ad86d8d396a 239 #endif
Janani Sunil 0:5ad86d8d396a 240 #endif
Janani Sunil 0:5ad86d8d396a 241 };
Janani Sunil 0:5ad86d8d396a 242
Janani Sunil 0:5ad86d8d396a 243 /**
Janani Sunil 0:5ad86d8d396a 244 * @brief Read the debug register value
Janani Sunil 0:5ad86d8d396a 245 * @param desc[in,out] - Pointer to IIO device descriptor
Janani Sunil 0:5ad86d8d396a 246 * @param reg[in]- Address of the register to be read
Janani Sunil 0:5ad86d8d396a 247 * @param readval[out]- Pointer to the register data variable
Janani Sunil 0:5ad86d8d396a 248 * @return 0 in case of success, negative error code
Janani Sunil 0:5ad86d8d396a 249 */
Janani Sunil 0:5ad86d8d396a 250 static int32_t iio_ad717x_debug_reg_read(void *dev,
Janani Sunil 0:5ad86d8d396a 251 uint32_t reg,
Janani Sunil 0:5ad86d8d396a 252 uint32_t *readval)
Janani Sunil 0:5ad86d8d396a 253 {
Janani Sunil 0:5ad86d8d396a 254 int32_t debug_read_status; // Status check variable
Janani Sunil 0:5ad86d8d396a 255
Janani Sunil 0:5ad86d8d396a 256 /* Retrieve the pointer to the requested register */
Janani Sunil 0:5ad86d8d396a 257 ad717x_st_reg *read_register = AD717X_GetReg(p_ad717x_dev_inst, reg);
Janani Sunil 0:5ad86d8d396a 258 if (!read_register) {
Janani Sunil 0:5ad86d8d396a 259 return -EINVAL;
Janani Sunil 0:5ad86d8d396a 260 }
Janani Sunil 0:5ad86d8d396a 261
Janani Sunil 0:5ad86d8d396a 262 /* Read the register data, extract the value */
Janani Sunil 0:5ad86d8d396a 263 debug_read_status = AD717X_ReadRegister(p_ad717x_dev_inst, reg);
Janani Sunil 0:5ad86d8d396a 264 if (debug_read_status) {
Janani Sunil 0:5ad86d8d396a 265 return debug_read_status;
Janani Sunil 0:5ad86d8d396a 266 }
Janani Sunil 0:5ad86d8d396a 267 *readval = read_register->value;
Janani Sunil 0:5ad86d8d396a 268
Janani Sunil 0:5ad86d8d396a 269 return 0;
Janani Sunil 0:5ad86d8d396a 270 }
Janani Sunil 0:5ad86d8d396a 271
Janani Sunil 0:5ad86d8d396a 272
Janani Sunil 0:5ad86d8d396a 273 /**
Janani Sunil 0:5ad86d8d396a 274 * @brief Write value to the debug register
Janani Sunil 0:5ad86d8d396a 275 * @param desc[in,out] Pointer to IIO device descriptor
Janani Sunil 0:5ad86d8d396a 276 * @param reg[in] Address of the register where the data is to be written
Janani Sunil 0:5ad86d8d396a 277 * @param write_val[out] Pointer to the register data variable
Janani Sunil 0:5ad86d8d396a 278 * @return 0 in case of success, negative error code otherwise
Janani Sunil 0:5ad86d8d396a 279 */
Janani Sunil 0:5ad86d8d396a 280 static int32_t iio_ad717x_debug_reg_write(void *dev,
Janani Sunil 0:5ad86d8d396a 281 uint32_t reg,
Janani Sunil 0:5ad86d8d396a 282 uint32_t write_val)
Janani Sunil 0:5ad86d8d396a 283 {
Janani Sunil 0:5ad86d8d396a 284 int32_t debug_write_status; // Status check variable
Janani Sunil 0:5ad86d8d396a 285 ad717x_st_reg *device_data_reg; // Pointer to data register
Janani Sunil 0:5ad86d8d396a 286
Janani Sunil 0:5ad86d8d396a 287 /* Retrieve the pointer to the requested registrer */
Janani Sunil 0:5ad86d8d396a 288 device_data_reg = AD717X_GetReg(p_ad717x_dev_inst, reg);
Janani Sunil 0:5ad86d8d396a 289 device_data_reg->value = write_val;
Janani Sunil 0:5ad86d8d396a 290
Janani Sunil 0:5ad86d8d396a 291 /* Write value to the register */
Janani Sunil 0:5ad86d8d396a 292 debug_write_status = AD717X_WriteRegister(p_ad717x_dev_inst, reg);
Janani Sunil 0:5ad86d8d396a 293 if (debug_write_status) {
Janani Sunil 0:5ad86d8d396a 294 return debug_write_status;
Janani Sunil 0:5ad86d8d396a 295 }
Janani Sunil 0:5ad86d8d396a 296
Janani Sunil 0:5ad86d8d396a 297 return 0;
Janani Sunil 0:5ad86d8d396a 298 }
Janani Sunil 0:5ad86d8d396a 299
Janani Sunil 0:5ad86d8d396a 300
Janani Sunil 0:5ad86d8d396a 301 /**
Janani Sunil 0:5ad86d8d396a 302 * @brief Transfer the device data into memory (optional)
Janani Sunil 0:5ad86d8d396a 303 * @param dev_instance[in] - IIO device instance
Janani Sunil 0:5ad86d8d396a 304 * @param ch_mask[in] - Channels select mask
Janani Sunil 0:5ad86d8d396a 305 * @return 0 in case of success or negative value otherwise
Janani Sunil 0:5ad86d8d396a 306 */
Janani Sunil 0:5ad86d8d396a 307 static int32_t iio_ad717x_pre_enable(void *dev_instance, uint32_t chn_mask)
Janani Sunil 0:5ad86d8d396a 308 {
Janani Sunil 0:5ad86d8d396a 309 return prepare_data_transfer(chn_mask, NUMBER_OF_CHANNELS, BYTES_PER_SAMPLE);
Janani Sunil 0:5ad86d8d396a 310 }
Janani Sunil 0:5ad86d8d396a 311
Janani Sunil 0:5ad86d8d396a 312
Janani Sunil 0:5ad86d8d396a 313 /**
Janani Sunil 0:5ad86d8d396a 314 * @brief Read buffer data corresponding to AD4170 IIO device
Janani Sunil 0:5ad86d8d396a 315 * @param iio_dev_data[in] - Pointer to IIO device data structure
Janani Sunil 0:5ad86d8d396a 316 * @return 0 in case of success or negative value otherwise
Janani Sunil 0:5ad86d8d396a 317 */
Janani Sunil 0:5ad86d8d396a 318 static int32_t iio_ad717x_submit_buffer(struct iio_device_data *iio_dev_data)
Janani Sunil 0:5ad86d8d396a 319 {
Janani Sunil 0:5ad86d8d396a 320 int32_t ret;
Janani Sunil 0:5ad86d8d396a 321
Janani Sunil 0:5ad86d8d396a 322 /* Read the samples counts equal to buffer size/block */
Janani Sunil 0:5ad86d8d396a 323 ret = read_buffered_data(&iio_dev_data->buffer->buf->buff,
Janani Sunil 0:5ad86d8d396a 324 iio_dev_data->buffer->size);
Janani Sunil 0:5ad86d8d396a 325
Janani Sunil 0:5ad86d8d396a 326 /* Increment the write spin count as buffer reads all 'n' samples
Janani Sunil 0:5ad86d8d396a 327 * in one go which is also the size of buffer block for a given instance.
Janani Sunil 0:5ad86d8d396a 328 * The read spin count is incremented from IIO library during buffer
Janani Sunil 0:5ad86d8d396a 329 * write/offloading into transmit buffer */
Janani Sunil 0:5ad86d8d396a 330 if (iio_dev_data->buffer->buf->write.spin_count >= UINT32_MAX) {
Janani Sunil 0:5ad86d8d396a 331 iio_dev_data->buffer->buf->write.spin_count = 0;
Janani Sunil 0:5ad86d8d396a 332 }
Janani Sunil 0:5ad86d8d396a 333
Janani Sunil 0:5ad86d8d396a 334 iio_dev_data->buffer->buf->write.spin_count += 1;
Janani Sunil 0:5ad86d8d396a 335
Janani Sunil 0:5ad86d8d396a 336 return ret;
Janani Sunil 0:5ad86d8d396a 337 }
Janani Sunil 0:5ad86d8d396a 338
Janani Sunil 0:5ad86d8d396a 339
Janani Sunil 0:5ad86d8d396a 340 /**
Janani Sunil 0:5ad86d8d396a 341 * @brief Perform tasks before end of current data transfer
Janani Sunil 0:5ad86d8d396a 342 * @param dev[in] - IIO device instance
Janani Sunil 0:5ad86d8d396a 343 * @return 0 in case of success or negative value otherwise
Janani Sunil 0:5ad86d8d396a 344 */
Janani Sunil 0:5ad86d8d396a 345 static int32_t iio_ad717x_post_disable(void *dev)
Janani Sunil 0:5ad86d8d396a 346 {
Janani Sunil 0:5ad86d8d396a 347 return end_data_transfer();
Janani Sunil 0:5ad86d8d396a 348 }
Janani Sunil 0:5ad86d8d396a 349
Janani Sunil 0:5ad86d8d396a 350
Janani Sunil 0:5ad86d8d396a 351 /**
Janani Sunil 0:5ad86d8d396a 352 * @brief Init for reading/writing and parameterization of a AD717x IIO device
Janani Sunil 0:5ad86d8d396a 353 * @param desc[in,out] IIO device descriptor
Janani Sunil 0:5ad86d8d396a 354 * @return 0 in case of success, negative error code otherwise
Janani Sunil 0:5ad86d8d396a 355 */
Janani Sunil 0:5ad86d8d396a 356 int32_t iio_ad717x_init(struct iio_device **desc)
Janani Sunil 0:5ad86d8d396a 357 {
Janani Sunil 0:5ad86d8d396a 358 struct iio_device *iio_ad717x_inst; // IIO Device Descriptor for AD717x
Janani Sunil 0:5ad86d8d396a 359
Janani Sunil 0:5ad86d8d396a 360 iio_ad717x_inst = calloc(1, sizeof(struct iio_device));
Janani Sunil 0:5ad86d8d396a 361 if (!iio_ad717x_inst) {
Janani Sunil 0:5ad86d8d396a 362 return -EINVAL;
Janani Sunil 0:5ad86d8d396a 363 }
Janani Sunil 0:5ad86d8d396a 364
Janani Sunil 0:5ad86d8d396a 365 iio_ad717x_inst->num_ch = NO_OS_ARRAY_SIZE(iio_adc_channels);
Janani Sunil 0:5ad86d8d396a 366 iio_ad717x_inst->channels = iio_adc_channels;
Janani Sunil 0:5ad86d8d396a 367 iio_ad717x_inst->attributes = iio_ad717x_global_attributes;
Janani Sunil 0:5ad86d8d396a 368 iio_ad717x_inst->buffer_attributes = NULL;
Janani Sunil 0:5ad86d8d396a 369 iio_ad717x_inst->write_dev = NULL;
Janani Sunil 0:5ad86d8d396a 370 iio_ad717x_inst->pre_enable = iio_ad717x_pre_enable;
Janani Sunil 0:5ad86d8d396a 371 iio_ad717x_inst->post_disable = iio_ad717x_post_disable;
Janani Sunil 0:5ad86d8d396a 372 iio_ad717x_inst->submit = iio_ad717x_submit_buffer;
Janani Sunil 0:5ad86d8d396a 373 iio_ad717x_inst->debug_reg_read = iio_ad717x_debug_reg_read;
Janani Sunil 0:5ad86d8d396a 374 iio_ad717x_inst->debug_reg_write = iio_ad717x_debug_reg_write;
Janani Sunil 0:5ad86d8d396a 375
Janani Sunil 0:5ad86d8d396a 376 *desc = iio_ad717x_inst;
Janani Sunil 0:5ad86d8d396a 377
Janani Sunil 0:5ad86d8d396a 378 return 0;
Janani Sunil 0:5ad86d8d396a 379 }
Janani Sunil 0:5ad86d8d396a 380
Janani Sunil 0:5ad86d8d396a 381
Janani Sunil 0:5ad86d8d396a 382 /**
Janani Sunil 0:5ad86d8d396a 383 * @brief Function to update scale and offset values based on user selection
Janani Sunil 0:5ad86d8d396a 384 * @param device[in] AD717x device descriptor
Janani Sunil 0:5ad86d8d396a 385 * @return 0 in case of success, negative error code otherwise
Janani Sunil 0:5ad86d8d396a 386 */
Janani Sunil 0:5ad86d8d396a 387 static int32_t ad717x_update_attr_parameters(ad717x_dev *device)
Janani Sunil 0:5ad86d8d396a 388 {
Janani Sunil 0:5ad86d8d396a 389 float reference_value = 0; // Variable to hold the updated reference value
Janani Sunil 0:5ad86d8d396a 390 uint8_t i;
Janani Sunil 0:5ad86d8d396a 391
Janani Sunil 0:5ad86d8d396a 392 for (i = 0; i < NUMBER_OF_CHANNELS; i++) {
Janani Sunil 0:5ad86d8d396a 393 /* Update reference value */
Janani Sunil 0:5ad86d8d396a 394 switch (device->setups[device->chan_map[i].setup_sel].ref_source) {
Janani Sunil 0:5ad86d8d396a 395 case INTERNAL_REF:
Janani Sunil 0:5ad86d8d396a 396 reference_value = AD717X_INTERNAL_REFERENCE;
Janani Sunil 0:5ad86d8d396a 397 break;
Janani Sunil 0:5ad86d8d396a 398 case EXTERNAL_REF:
Janani Sunil 0:5ad86d8d396a 399 reference_value = AD717x_EXTERNAL_REFERENCE;
Janani Sunil 0:5ad86d8d396a 400 break;
Janani Sunil 0:5ad86d8d396a 401 case AVDD_AVSS:
Janani Sunil 0:5ad86d8d396a 402 reference_value = AD717X_AVDD_AVSS_REFERENCE;
Janani Sunil 0:5ad86d8d396a 403 break;
Janani Sunil 0:5ad86d8d396a 404 default:
Janani Sunil 0:5ad86d8d396a 405 return -EINVAL;
Janani Sunil 0:5ad86d8d396a 406 }
Janani Sunil 0:5ad86d8d396a 407
Janani Sunil 0:5ad86d8d396a 408 /* Update channel attribute parameters */
Janani Sunil 0:5ad86d8d396a 409 if (!(device->setups[device->chan_map[i].setup_sel].bi_unipolar)) {
Janani Sunil 0:5ad86d8d396a 410 /* Settings for Unipolar mode */
Janani Sunil 0:5ad86d8d396a 411 attr_scale_val[i] = ((reference_value / ADC_MAX_COUNT_UNIPOLAR) * 1000) /
Janani Sunil 0:5ad86d8d396a 412 SCALE_FACTOR_DR;
Janani Sunil 0:5ad86d8d396a 413 attr_offset_val[i] = 0;
Janani Sunil 0:5ad86d8d396a 414 ad717x_scan_type[i].sign = 'u';
Janani Sunil 0:5ad86d8d396a 415 ad717x_scan_type[i].realbits = AD717x_RESOLUTION;
Janani Sunil 0:5ad86d8d396a 416 } else {
Janani Sunil 0:5ad86d8d396a 417 /* Settings for Bipolar mode */
Janani Sunil 0:5ad86d8d396a 418 attr_scale_val[i] = ((reference_value / (ADC_MAX_COUNT_BIPOLAR)) * 1000) /
Janani Sunil 0:5ad86d8d396a 419 SCALE_FACTOR_DR;
Janani Sunil 0:5ad86d8d396a 420 attr_offset_val[i] = -(1 << (AD717x_RESOLUTION - 1));
Janani Sunil 0:5ad86d8d396a 421 ad717x_scan_type[i].sign = 's';
Janani Sunil 0:5ad86d8d396a 422 ad717x_scan_type[i].realbits = CHN_STORAGE_BITS;
Janani Sunil 0:5ad86d8d396a 423 }
Janani Sunil 0:5ad86d8d396a 424 }
Janani Sunil 0:5ad86d8d396a 425
Janani Sunil 0:5ad86d8d396a 426 return 0;
Janani Sunil 0:5ad86d8d396a 427 }
Janani Sunil 0:5ad86d8d396a 428
Janani Sunil 0:5ad86d8d396a 429
Janani Sunil 0:5ad86d8d396a 430 /**
Janani Sunil 0:5ad86d8d396a 431 * @brief Initialize the AD717x IIO Interface
Janani Sunil 0:5ad86d8d396a 432 * @return 0 in case of success, negative error code otherwise
Janani Sunil 0:5ad86d8d396a 433 */
Janani Sunil 0:5ad86d8d396a 434 int32_t ad717x_iio_initialize(void)
Janani Sunil 0:5ad86d8d396a 435 {
Janani Sunil 0:5ad86d8d396a 436 int32_t iio_init_status; // Status check variable
Janani Sunil 0:5ad86d8d396a 437 struct iio_init_param iio_init_params; // IIO Init Parameters
Janani Sunil 0:5ad86d8d396a 438 struct iio_device *ad717x_iio_desc; // aD717x IIO Descriptor
Janani Sunil 0:5ad86d8d396a 439
Janani Sunil 0:5ad86d8d396a 440 /* Init the system peripheral- UART */
Janani Sunil 0:5ad86d8d396a 441 iio_init_status = init_system();
Janani Sunil 0:5ad86d8d396a 442 if (iio_init_status) {
Janani Sunil 0:5ad86d8d396a 443 return iio_init_status;
Janani Sunil 0:5ad86d8d396a 444 }
Janani Sunil 0:5ad86d8d396a 445
Janani Sunil 0:5ad86d8d396a 446 /* IIO Initialization Parameters */
Janani Sunil 0:5ad86d8d396a 447 iio_init_params.phy_type = USE_UART;
Janani Sunil 0:5ad86d8d396a 448 iio_init_params.nb_devs = 1;
Janani Sunil 0:5ad86d8d396a 449
Janani Sunil 0:5ad86d8d396a 450 /* IIOD init parameters */
Janani Sunil 0:5ad86d8d396a 451 struct iio_device_init iio_device_init_params = {
Janani Sunil 0:5ad86d8d396a 452 .name = (char*)dev_name,
Janani Sunil 0:5ad86d8d396a 453 .raw_buf = adc_data_buffer,
Janani Sunil 0:5ad86d8d396a 454 .raw_buf_len = DATA_BUFFER_SIZE
Janani Sunil 0:5ad86d8d396a 455 };
Janani Sunil 0:5ad86d8d396a 456
Janani Sunil 0:5ad86d8d396a 457 /* Initialize AD717x device */
Janani Sunil 0:5ad86d8d396a 458 iio_init_status = AD717X_Init(&p_ad717x_dev_inst, ad717x_init_params);
Janani Sunil 0:5ad86d8d396a 459 if (iio_init_status) {
Janani Sunil 0:5ad86d8d396a 460 return iio_init_status;
Janani Sunil 0:5ad86d8d396a 461 }
Janani Sunil 0:5ad86d8d396a 462
Janani Sunil 0:5ad86d8d396a 463 /* Update the ADC scale respective to the device settings */
Janani Sunil 0:5ad86d8d396a 464 iio_init_status = ad717x_update_attr_parameters(p_ad717x_dev_inst);
Janani Sunil 0:5ad86d8d396a 465 if (iio_init_status) {
Janani Sunil 0:5ad86d8d396a 466 return iio_init_status;
Janani Sunil 0:5ad86d8d396a 467 }
Janani Sunil 0:5ad86d8d396a 468
Janani Sunil 0:5ad86d8d396a 469 /* Initialize the AD717x IIO Interface */
Janani Sunil 0:5ad86d8d396a 470 iio_init_status = iio_ad717x_init(&ad717x_iio_desc);
Janani Sunil 0:5ad86d8d396a 471 if (iio_init_status) {
Janani Sunil 0:5ad86d8d396a 472 return iio_init_status;
Janani Sunil 0:5ad86d8d396a 473 }
Janani Sunil 0:5ad86d8d396a 474
Janani Sunil 0:5ad86d8d396a 475 /* Initialize the IIO Interface */
Janani Sunil 0:5ad86d8d396a 476 iio_init_params.uart_desc = uart_desc;
Janani Sunil 0:5ad86d8d396a 477 iio_device_init_params.dev = p_ad717x_dev_inst;
Janani Sunil 0:5ad86d8d396a 478 iio_device_init_params.dev_descriptor = ad717x_iio_desc;
Janani Sunil 0:5ad86d8d396a 479 iio_init_params.devs = &iio_device_init_params;
Janani Sunil 0:5ad86d8d396a 480 iio_init_params.nb_trigs = 0;
Janani Sunil 0:5ad86d8d396a 481 iio_init_status = iio_init(&p_ad717x_iio_desc, &iio_init_params);
Janani Sunil 0:5ad86d8d396a 482 if (iio_init_status) {
Janani Sunil 0:5ad86d8d396a 483 return iio_init_status;
Janani Sunil 0:5ad86d8d396a 484 }
Janani Sunil 0:5ad86d8d396a 485
Janani Sunil 0:5ad86d8d396a 486 return 0;
Janani Sunil 0:5ad86d8d396a 487 }
Janani Sunil 0:5ad86d8d396a 488
Janani Sunil 0:5ad86d8d396a 489
Janani Sunil 0:5ad86d8d396a 490 /**
Janani Sunil 0:5ad86d8d396a 491 * @brief Run the AD717x IIO event handler
Janani Sunil 0:5ad86d8d396a 492 * @return None
Janani Sunil 0:5ad86d8d396a 493 */
Janani Sunil 0:5ad86d8d396a 494 void ad717x_iio_event_handler(void)
Janani Sunil 0:5ad86d8d396a 495 {
Janani Sunil 0:5ad86d8d396a 496 (void)iio_step(p_ad717x_iio_desc);
Janani Sunil 0:5ad86d8d396a 497 }