AD4130 Mbed IIO Firmware

Dependencies:   tempsensors sdp_k1_sdram

Committer:
MPhalke@MPHALKE-L02.ad.analog.com
Date:
Fri Jul 15 17:47:44 2022 +0530
Revision:
2:871d585d96ee
AD4130 firmware - initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1 /*************************************************************************//**
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 2 * @file ad4130_support.c
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 3 * @brief AD4130 device No-OS driver supports
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 4 ******************************************************************************
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 5 * Copyright (c) 2020, 2022 Analog Devices, Inc.
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 6 * All rights reserved.
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 7 *
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 8 * This software is proprietary to Analog Devices, Inc. and its licensors.
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 9 * By using this software you agree to the terms of the associated
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 10 * Analog Devices Software License Agreement.
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 11 *****************************************************************************/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 12
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 13 /******************************************************************************/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 14 /***************************** Include Files **********************************/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 15 /******************************************************************************/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 16
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 17 #include <stdint.h>
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 18
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 19 #include "app_config.h"
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 20 #include "ad4130_support.h"
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 21 #include "no_os_error.h"
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 22
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 23 /******************************************************************************/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 24 /********************** Macros and Constants Definition ***********************/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 25 /******************************************************************************/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 26
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 27 /* AD4130 FIFO size and readback command size in bytes */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 28 #define AD4130_FIFO_MAX_SIZE (256)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 29 #define AD4130_FIFO_READ_CMD_BYTES (2)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 30
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 31 #define BYTE_SIZE (8)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 32
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 33 /* Timeout to monitor CON monitor GPIO. The timeout count is dependent upon the
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 34 * MCU clock frequency. This timeout is tested for SDP-K1 Mbed controller platform */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 35 #define CONV_MON_GPIO_TIMEOUT (10000)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 36
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 37 /* Select between GPIO Or STATUS register to monitor the end
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 38 * of conversion in single conversion mode */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 39 //#define CONV_MON_USING_RDY_STATUS // Uncomment to use STATUS reg
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 40
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 41 /* FIFO busy time as per specifications (in usec)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 42 * Note : This time is stringent in FIFO readback.The minimum time period
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 43 * as per specifications is 20usec
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 44 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 45 #define FIFO_BUSY_TIME (20)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 46
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 47 /******************************************************************************/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 48 /********************** Variables and User Defined Data Types *****************/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 49 /******************************************************************************/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 50
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 51 /* AD4130 FIFO readback buffer.
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 52 * Size for 24-bit ADC = (256 * 3) + 2 = 770 bytes
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 53 * Size for 16-bit ADC = (256 * 2) + 2 = 514 bytes
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 54 * */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 55 static uint8_t fifo_buf[(AD4130_FIFO_MAX_SIZE * (ADC_RESOLUTION / BYTE_SIZE)) +
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 56 AD4130_FIFO_READ_CMD_BYTES];
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 57
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 58 /******************************************************************************/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 59 /************************ Functions Definitions *******************************/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 60 /******************************************************************************/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 61
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 62 /*!
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 63 * @brief Get reference voltage based on the reference source
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 64 * @param dev[in] - Device instance
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 65 * @param chn[in] - ADC channel
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 66 * @return Reference voltage
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 67 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 68 float ad4130_get_reference_voltage(struct ad413x_dev *dev, uint8_t chn)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 69 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 70 float ref_voltage;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 71 uint8_t preset = dev->ch[chn].preset;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 72 enum ad413x_ref_sel ref = dev->preset[preset].ref_sel;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 73 enum ad413x_int_ref int_ref = dev->int_ref;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 74
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 75 switch (ref) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 76 case AD413X_REFIN1:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 77 ref_voltage = AD4130_REFIN1_VOLTAGE;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 78 break;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 79
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 80 case AD413X_REFIN2:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 81 ref_voltage = AD4130_REFIN2_VOLTAGE;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 82 break;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 83
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 84 case AD413X_AVDD_AVSS:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 85 ref_voltage = AD4130_AVDD_VOLTAGE;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 86 break;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 87
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 88 case AD413X_REFOUT_AVSS:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 89 if (int_ref == AD413X_INTREF_1_25V) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 90 ref_voltage = AD4170_1_25V_INT_REF_VOLTAGE;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 91 } else {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 92 ref_voltage = AD4170_2_5V_INT_REF_VOLTAGE;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 93 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 94 break;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 95
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 96 default:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 97 ref_voltage = AD4170_2_5V_INT_REF_VOLTAGE;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 98 break;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 99 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 100
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 101 return ref_voltage;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 102 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 103
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 104 /*!
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 105 * @brief Perform the sign conversion for handling negative voltages in
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 106 * bipolar mode
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 107 * @param dev[in] - Device instance
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 108 * @param adc_raw_data[in] - ADC raw value
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 109 * @param chn[in] - ADC Channel
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 110 * @return ADC data after signed conversion
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 111 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 112 int32_t perform_sign_conversion(struct ad413x_dev *dev, uint32_t adc_raw_data,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 113 uint8_t chn)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 114 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 115 int32_t adc_data;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 116 bool bipolar = dev->bipolar;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 117
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 118 /* Bipolar ADC Range: (-FS) <-> 0 <-> (+FS) : 0 <-> 2^(ADC_RES-1)-1 <-> 2^(ADC_RES-1)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 119 Unipolar ADC Range: 0 <-> (+FS) : 0 <-> 2^ADC_RES
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 120 **/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 121 if (bipolar) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 122 /* Data output format is offset binary for bipolar mode */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 123 adc_data = adc_raw_data - ADC_MAX_COUNT_BIPOLAR;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 124 } else {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 125 /* Data output format is straight binary for unipolar mode */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 126 adc_data = adc_raw_data;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 127 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 128
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 129 return adc_data;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 130 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 131
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 132 /*!
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 133 * @brief Convert the ADC raw value into equivalent voltage
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 134 * @param dev[in] - Device instance
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 135 * @param adc_raw[in]- ADC raw data
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 136 * @param chn[in] - ADC channel
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 137 * @return ADC voltage value
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 138 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 139 float convert_adc_sample_into_voltage(void *dev, uint32_t adc_raw,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 140 uint8_t chn)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 141 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 142 enum ad413x_gain pga;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 143 float vref;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 144 int32_t adc_data;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 145 uint8_t preset = ((struct ad413x_dev *)dev)->ch[chn].preset;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 146 bool bipolar = ((struct ad413x_dev *)dev)->bipolar;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 147
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 148 pga = ((struct ad413x_dev *)dev)->preset[preset].gain;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 149 vref = ad4130_get_reference_voltage(dev, chn);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 150 adc_data = perform_sign_conversion(dev, adc_raw, chn);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 151
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 152 if (bipolar) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 153 return (adc_data * (vref / (ADC_MAX_COUNT_BIPOLAR * (1 << pga))));
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 154 } else {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 155 return (adc_data * (vref / (ADC_MAX_COUNT_UNIPOLAR * (1 << pga))));
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 156 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 157 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 158
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 159 /*!
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 160 * @brief Convert the ADC raw value into equivalent RTD resistance
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 161 * @param dev[in] - Device instance
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 162 * @param adc_raw[in] - ADC raw sample
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 163 * @param rtd_ref[in] - RTD reference resistance in ohms
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 164 * @param chn[in] - ADC channel
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 165 * @return RTD resistance value
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 166 * @note RTD is biased with constant excitation current. Below formula
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 167 * is based on ratiometric measurement, where fixed value of RTD RREF
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 168 * (reference resistor) and gain is taken into account
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 169 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 170 float convert_adc_raw_into_rtd_resistance(void *dev, uint32_t adc_raw,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 171 float rtd_ref, uint8_t chn)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 172 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 173 enum ad413x_gain pga;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 174 int32_t adc_data;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 175 uint8_t preset = ((struct ad413x_dev *)dev)->ch[chn].preset;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 176 bool bipolar = ((struct ad413x_dev *)dev)->bipolar;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 177
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 178 pga = ((struct ad413x_dev *)dev)->preset[preset].gain;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 179 adc_data = perform_sign_conversion(dev, adc_raw, chn);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 180
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 181 if (bipolar) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 182 return (((float)adc_data * rtd_ref) / (ADC_MAX_COUNT_BIPOLAR * (1 << pga)));
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 183 } else {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 184 return (((float)adc_data * rtd_ref) / (ADC_MAX_COUNT_UNIPOLAR * (1 << pga)));
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 185 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 186 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 187
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 188 /*!
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 189 * @brief Function to monitor end of conversion and read
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 190 * conversion result
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 191 * @param dev[in] - Device instance
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 192 * @param raw_data[in, out]- ADC raw data
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 193 * @return 0 in case of success, negative error code otherwise
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 194 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 195 int32_t ad413x_mon_conv_and_read_data(struct ad413x_dev *dev,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 196 uint32_t *raw_data)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 197 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 198 int32_t ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 199 uint8_t conv_mon = 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 200 uint32_t timeout = CONV_MON_GPIO_TIMEOUT;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 201
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 202 if (!dev || !raw_data) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 203 return -EINVAL;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 204 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 205
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 206 /* Wait for conversion */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 207 #if defined(CONV_MON_USING_RDY_STATUS)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 208 while (!conv_mon && timeout--) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 209 /* Read the value of the Status Register */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 210 ret = ad413x_reg_read(dev, AD413X_REG_STATUS, raw_data);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 211 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 212 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 213 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 214
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 215 /* Check the RDY bit in the Status Register */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 216 conv_mon = (*raw_data & AD413X_ADC_DATA_STATUS);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 217 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 218
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 219 if (!timeout) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 220 return -EIO;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 221 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 222
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 223 /* Read the conversion result */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 224 ret = ad413x_reg_read(dev, AD413X_REG_DATA, raw_data);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 225 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 226 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 227 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 228 #else
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 229 conv_mon = NO_OS_GPIO_HIGH;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 230 while (conv_mon == NO_OS_GPIO_HIGH && timeout--) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 231 ret = no_os_gpio_get_value(conv_mon_gpio_desc, &conv_mon);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 232 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 233 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 234 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 235 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 236
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 237 if (!timeout) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 238 return -EIO;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 239 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 240
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 241 /* Read the conversion result */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 242 ret = ad413x_reg_read(dev, AD413X_REG_DATA, raw_data);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 243 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 244 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 245 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 246
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 247 conv_mon = NO_OS_GPIO_LOW;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 248 timeout = CONV_MON_GPIO_TIMEOUT;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 249 while (conv_mon == NO_OS_GPIO_LOW && timeout--) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 250 ret = no_os_gpio_get_value(conv_mon_gpio_desc, &conv_mon);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 251 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 252 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 253 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 254 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 255
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 256 if (!timeout) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 257 return -EIO;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 258 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 259 #endif
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 260
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 261 return 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 262 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 263
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 264 /*!
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 265 * @brief Read the data from FIFO
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 266 * @param dev[in] - device instance
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 267 * @param data[in] - Buffer to store FIFO data
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 268 * @param adc_samples[in] - Number of ADC samples to read
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 269 * @return 0 in case of success, negative error code otherwise
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 270 * @note This function doesn't consider the FIFO status and header information
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 271 * during data readback. It is assumed data user is intending to read
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 272 * only the data from FIFO.
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 273 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 274 int32_t ad4130_read_fifo(struct ad413x_dev *dev, uint32_t *data,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 275 uint32_t adc_samples)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 276 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 277 int32_t ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 278 uint32_t loop_cntr;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 279 uint32_t buf_indx = 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 280 uint32_t bytes;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 281
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 282 if (!dev || !data) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 283 return -EINVAL;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 284 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 285
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 286 /* Watermark count of 0 implies full FIFO readback */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 287 if ((adc_samples == 0) || (adc_samples > AD4130_FIFO_MAX_SIZE)) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 288 adc_samples = AD4130_FIFO_MAX_SIZE;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 289 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 290
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 291 /* Delay b/w interrupt trigger and FIFO readback start */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 292 no_os_udelay(FIFO_BUSY_TIME);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 293
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 294 /* MOSI pin outputs 0x00 during FIFO data readback */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 295 memset(fifo_buf, 0, sizeof(fifo_buf));
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 296
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 297 /* Enter into FIFO read mode by issuing dummy read command. Command consists of first byte as
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 298 * address of FIFO data register and 2nd byte as number of samples to read from FIFO */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 299 fifo_buf[0] = AD413X_COMM_REG_RD | AD413X_ADDR(AD413X_REG_FIFO_DATA);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 300 fifo_buf[1] = adc_samples;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 301
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 302 /* Bytes to read = (samples * data size) + fifo data reg address + sample_cnt */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 303 bytes = (adc_samples * (ADC_RESOLUTION / BYTE_SIZE)) +
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 304 AD4130_FIFO_READ_CMD_BYTES;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 305
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 306 /* Read all bytes over SPI */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 307 ret = no_os_spi_write_and_read(dev->spi_dev, fifo_buf, bytes);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 308 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 309 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 310 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 311
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 312 /* Extract the data from buffer (data doesn't contain header/status info) */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 313 for (loop_cntr = AD4130_FIFO_READ_CMD_BYTES; loop_cntr < bytes;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 314 loop_cntr += (ADC_RESOLUTION / BYTE_SIZE)) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 315 #if (ADC_RESOLUTION == 24)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 316 data[buf_indx++] = ((int32_t)fifo_buf[loop_cntr] << 16) |
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 317 ((int32_t)fifo_buf[loop_cntr + 1] << 8) |
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 318 (int32_t)fifo_buf[loop_cntr + 2];
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 319 #else
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 320 /* For 16-bit resolution */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 321 data[buf_indx++] = ((int32_t)fifo_buf[loop_cntr] << 8) |
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 322 (int32_t)fifo_buf[loop_cntr + 1];
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 323 #endif
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 324 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 325
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 326 return 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 327 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 328
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 329 /*!
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 330 * @brief Set interrupt conversion source (GPIO)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 331 * @param dev[in] - Device instance
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 332 * @param conv_int_source[in]- Interrupt source
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 333 * @return 0 in case of success, negative error code otherwise
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 334 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 335 int32_t ad413x_set_int_source(struct ad413x_dev *dev,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 336 adc_conv_int_source_e conv_int_source)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 337 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 338 int32_t ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 339
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 340 if (!dev) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 341 return -EINVAL;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 342 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 343
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 344 ret = ad413x_reg_write_msk(dev,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 345 AD413X_REG_IO_CTRL,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 346 AD413X_INT_PIN_SEL(conv_int_source),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 347 AD4130_INT_SRC_SEL_MSK);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 348 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 349 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 350 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 351
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 352 return 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 353 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 354
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 355 /*!
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 356 * @brief Set filter FS value
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 357 * @param dev[in] - Device instance
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 358 * @param fs[in]- FS value
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 359 * @param preset[in] - Channel setup
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 360 * @return 0 in case of success, negative error code otherwise
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 361 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 362 int32_t ad413x_set_filter_fs(struct ad413x_dev *dev, uint32_t fs,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 363 uint8_t preset)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 364 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 365 int32_t ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 366
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 367 if (!dev) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 368 return -EINVAL;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 369 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 370
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 371 ret = ad413x_reg_write_msk(dev,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 372 AD413X_REG_FILTER(preset),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 373 AD413X_FS_N(fs),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 374 AD4130_FILTER_FS_MSK);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 375 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 376 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 377 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 378
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 379 return 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 380 }