AD4130 Mbed IIO Firmware
Dependencies: tempsensors sdp_k1_sdram
app/ad4130_support.c@2:871d585d96ee, 2022-07-15 (annotated)
- 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?
User | Revision | Line number | New 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 | } |