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_iio.c
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 3 * @brief Implementation of AD4130 IIO application interfaces
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 4 * @details This module acts as an interface for AD4130 IIO application
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 5 ********************************************************************************
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 6 * Copyright (c) 2020-2022 Analog Devices, Inc.
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 7 * All rights reserved.
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 8 *
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 9 * This software is proprietary to Analog Devices, Inc. and its licensors.
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 10 * By using this software you agree to the terms of the associated
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 11 * Analog Devices Software License Agreement.
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 /******************************************************************************/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 15 /***************************** Include Files **********************************/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 16 /******************************************************************************/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 17
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 18 #include <stdint.h>
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 19 #include <string.h>
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 20 #include <stdio.h>
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 21 #include <errno.h>
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 22
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 23 #include "app_config.h"
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 24 #include "ad4130_iio.h"
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 25 #include "ad4130_data_capture.h"
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 26 #include "ad4130_support.h"
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 27 #include "ad4130_user_config.h"
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 28 #include "ad4130_temperature_sensor.h"
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 29 #include "ad4130_regs.h"
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 30 #include "no_os_error.h"
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 31
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 32 /******** Forward declaration of getter/setter functions ********/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 33 static int iio_ad4130_attr_get(void *device, char *buf, uint32_t len,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 34 const struct iio_ch_info *channel, intptr_t priv);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 35
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 36 static int iio_ad4130_attr_set(void *device, char *buf, uint32_t len,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 37 const struct iio_ch_info *channel, intptr_t priv);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 38
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 39 static int iio_ad4130_attr_available_get(void *device, char *buf,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 40 uint32_t len,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 41 const struct iio_ch_info *channel, intptr_t priv);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 42
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 43 static int iio_ad4130_attr_available_set(void *device, char *buf,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 44 uint32_t len,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 45 const struct iio_ch_info *channel, intptr_t priv);
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 /************************ Macros/Constants ************************************/
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 #define AD4130_CHN_ATTR(_name, _priv) {\
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 52 .name = _name,\
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 53 .priv = _priv,\
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 54 .show = iio_ad4130_attr_get,\
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 55 .store = iio_ad4130_attr_set\
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 56 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 57
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 58 #define AD4130_CHN_AVAIL_ATTR(_name, _priv) {\
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 59 .name = _name,\
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 60 .priv = _priv,\
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 61 .show = iio_ad4130_attr_available_get,\
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 62 .store = iio_ad4130_attr_available_set\
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 63 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 64
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 65 #define AD4130_CH(_name, _idx, _type) {\
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 66 .name = _name, \
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 67 .ch_type = _type,\
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 68 .ch_out = 0,\
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 69 .indexed = true,\
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 70 .channel = _idx,\
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 71 .scan_index = _idx,\
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 72 .scan_type = &chn_scan,\
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 73 .attributes = ad4130_iio_ch_attributes\
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 74 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 75
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 76 /* Minimum sampling frequency supported/configured in the firmware.
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 77 * Note: This is not an actual device sampling frequency.
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 78 * It is just used for IIO oscilloscope timeout calculations. */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 79 #define AD4130_MIN_SAMPLING_FREQ (50 / ADC_USER_CHANNELS)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 80
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 81 /* Default offset value for AD4130 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 82 #define AD4130_DEFAULT_OFFSET 0x800000
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 83
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 84 /* Bytes per sample. This count should divide the total 256 bytes into 'n' equivalent
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 85 * ADC samples as IIO library requests only 256bytes of data at a time in a given
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 86 * data read query.
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 87 * For 1 to 8-bit ADC, bytes per sample = 1 (2^0)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 88 * For 9 to 16-bit ADC, bytes per sample = 2 (2^1)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 89 * For 17 to 32-bit ADC, bytes per sample = 4 (2^2)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 90 **/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 91 #define BYTES_PER_SAMPLE sizeof(uint32_t) // For ADC resolution of 24-bits
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 92
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 93 /* Number of data storage bits (needed for IIO client to plot ADC data) */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 94 #define CHN_STORAGE_BITS (BYTES_PER_SAMPLE * 8)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 95
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 96 /* Number of adc samples for loadcell calibration */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 97 #define LOADCELL_SAMPLES_COUNT 10
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 98
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 99 /* CJC channel is 1 (common sensor for all Thermocouples).
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 100 * Chn0 is used for TC connections */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 101 #define CJC_CHANNEL 1
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 102
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 103 /* Shunt resistance (in ohms) for AVDD/IOVDD current calculation */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 104 #define I_RSENSE 10
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 105
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 106 /* Multiplier for AVDD/IOVDD voltage calculation */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 107 #define V_SCALE 6
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 108
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 109 /******************************************************************************/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 110 /*************************** Types Declarations *******************************/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 111 /******************************************************************************/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 112
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 113 /* IIO interface descriptor */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 114 static struct iio_desc *p_ad4130_iio_desc;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 115
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 116 /**
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 117 * Device name.
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 118 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 119 static const char dev_name[] = ACTIVE_DEVICE_NAME;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 120
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 121 /**
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 122 * Pointer to the struct representing the AD4130 IIO device
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 123 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 124 struct ad413x_dev *ad4130_dev_inst = NULL;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 125
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 126 /* Device attributes with default values */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 127
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 128 /* Scale attribute value per channel */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 129 static float attr_scale_val[ADC_USER_CHANNELS];
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 130
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 131 /* IIOD channels scan structure */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 132 static struct scan_type chn_scan;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 133
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 134 /* AD4130 Attribute IDs */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 135 enum ad4130_attribute_id {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 136 RAW_ATTR_ID,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 137 SCALE_ATTR_ID,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 138 OFFSET_ATTR_ID,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 139 SAMPLING_FREQ_ATTR_ID,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 140 DEMO_CONFIG_ATTR_ID,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 141 INTERNAL_CALIB_ID,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 142 SYSTEM_CALIB_ID,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 143 LOADCELL_GAIN_CALIB_ID,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 144 LOADCELL_OFFSET_CALIB_ID,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 145 };
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 146
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 147 /* Calibration state */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 148 enum calibration_state {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 149 FULL_SCALE_CALIB_STATE,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 150 ZERO_SCALE_CALIB_STATE,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 151 CALIB_COMPLETE_STATE
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 152 };
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 153
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 154 /* Calibration status */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 155 enum calib_status {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 156 CALIB_NOT_DONE,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 157 CALIB_IN_PROGRESS,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 158 CALIB_DONE,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 159 CALIB_ERROR,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 160 CALIB_SKIPPED
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 161 };
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 162
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 163 /* ADC calibration configs */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 164 typedef struct {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 165 uint32_t gain_before_calib;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 166 uint32_t gain_after_calib;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 167 uint32_t offset_before_calib;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 168 uint32_t offset_after_calib;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 169 } adc_calibration_configs;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 170
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 171 /* ADC calibration variables */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 172 static enum calibration_state system_calibration_state = ZERO_SCALE_CALIB_STATE;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 173 static enum calibration_state internal_calibration_state =
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 174 FULL_SCALE_CALIB_STATE;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 175 static enum calib_status adc_calibration_status[ADC_USER_CHANNELS];
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 176 static adc_calibration_configs adc_calibration_config[ADC_USER_CHANNELS];
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 177
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 178 /* IIOD channels attributes list */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 179 static struct iio_attribute ad4130_iio_ch_attributes[] = {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 180 AD4130_CHN_ATTR("raw", RAW_ATTR_ID),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 181 AD4130_CHN_ATTR("scale", SCALE_ATTR_ID),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 182 AD4130_CHN_ATTR("offset", OFFSET_ATTR_ID),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 183 AD4130_CHN_ATTR("internal_calibration", INTERNAL_CALIB_ID),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 184 AD4130_CHN_ATTR("system_calibration", SYSTEM_CALIB_ID),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 185 #if (ACTIVE_DEMO_MODE_CONFIG == LOADCELL_CONFIG)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 186 AD4130_CHN_ATTR("loadcell_gain_calibration", LOADCELL_GAIN_CALIB_ID),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 187 AD4130_CHN_ATTR("loadcell_offset_calibration", LOADCELL_OFFSET_CALIB_ID),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 188 #endif
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 189 END_ATTRIBUTES_ARRAY
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 190 };
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 191
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 192 /* IIOD device (global) attributes list */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 193 static struct iio_attribute ad4130_iio_global_attributes[] = {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 194 AD4130_CHN_ATTR("sampling_frequency", SAMPLING_FREQ_ATTR_ID),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 195 AD4130_CHN_ATTR("demo_config", DEMO_CONFIG_ATTR_ID),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 196 END_ATTRIBUTES_ARRAY
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 197 };
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 198
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 199 /* IIOD context attributes list */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 200 static struct iio_context_attribute ad4130_iio_context_attributes[] = {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 201 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 202 .name = "hw_mezzanine",
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 203 .value = HW_MEZZANINE_NAME
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 .name = "hw_carrier",
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 207 .value = HW_CARRIER_NAME
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 208 },
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 209 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 210 .name = "hw_name",
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 211 .value = HW_NAME
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 212 },
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 213 END_ATTRIBUTES_ARRAY
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 214 };
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 215
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 216 static struct iio_channel ad4130_iio_channels[] = {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 217 #if (ACTIVE_DEMO_MODE_CONFIG == THERMISTOR_CONFIG)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 218 AD4130_CH("Sensor1", SENSOR_CHANNEL0, IIO_TEMP)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 219 #elif (ACTIVE_DEMO_MODE_CONFIG == RTD_3WIRE_CONFIG)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 220 AD4130_CH("Sensor1", SENSOR_CHANNEL0, IIO_TEMP)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 221 #elif (ACTIVE_DEMO_MODE_CONFIG == RTD_2WIRE_CONFIG || \
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 222 ACTIVE_DEMO_MODE_CONFIG == RTD_4WIRE_CONFIG)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 223 AD4130_CH("Sensor1", SENSOR_CHANNEL0, IIO_TEMP)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 224 #elif (ACTIVE_DEMO_MODE_CONFIG == THERMOCOUPLE_CONFIG)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 225 AD4130_CH("Sensor1", SENSOR_CHANNEL0, IIO_TEMP),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 226 AD4130_CH("CJC", CJC_CHANNEL, IIO_TEMP),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 227 #elif (ACTIVE_DEMO_MODE_CONFIG == LOADCELL_CONFIG)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 228 /* Note: Channel type is considered as voltage as IIO
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 229 * oscilloscope doesn't support loadcell unit fomat of gram */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 230 AD4130_CH("Sensor1", SENSOR_CHANNEL0, IIO_VOLTAGE),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 231 #elif (ACTIVE_DEMO_MODE_CONFIG == ECG_CONFIG)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 232 AD4130_CH("Sensor1", SENSOR_CHANNEL0, IIO_VOLTAGE),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 233 #elif (ACTIVE_DEMO_MODE_CONFIG == NOISE_TEST_CONFIG)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 234 AD4130_CH("Chn0", 0, IIO_VOLTAGE),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 235 #elif (ACTIVE_DEMO_MODE_CONFIG == POWER_TEST_CONFIG)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 236 AD4130_CH("V_AVDD", POWER_TEST_V_AVDD_CHN, IIO_VOLTAGE),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 237 AD4130_CH("V_IOVDD", POWER_TEST_V_IOVDD_CHN, IIO_VOLTAGE),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 238 AD4130_CH("I_AVDD", POWER_TEST_I_AVDD_CHN, IIO_CURRENT),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 239 AD4130_CH("I_IOVDD", POWER_TEST_I_IOVDD_CHN, IIO_CURRENT),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 240 AD4130_CH("V_AVSS-DGND", POWER_TEST_V_AVSS_DGND_CHN, IIO_VOLTAGE),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 241 AD4130_CH("V_REF", POWER_TEST_V_REF_CHN, IIO_VOLTAGE),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 242 #else
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 243 /* User default config */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 244 AD4130_CH("Chn0", 0, IIO_VOLTAGE),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 245 AD4130_CH("Chn1", 1, IIO_VOLTAGE),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 246 AD4130_CH("Chn2", 2, IIO_VOLTAGE),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 247 AD4130_CH("Chn3", 3, IIO_VOLTAGE),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 248 AD4130_CH("Chn4", 4, IIO_VOLTAGE),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 249 AD4130_CH("Chn5", 5, IIO_VOLTAGE),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 250 AD4130_CH("Chn6", 6, IIO_VOLTAGE),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 251 AD4130_CH("Chn7", 7, IIO_VOLTAGE),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 252 #if (ADC_USER_CHANNELS > 8)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 253 AD4130_CH("Chn8", 8, IIO_VOLTAGE),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 254 AD4130_CH("Chn9", 9, IIO_VOLTAGE),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 255 AD4130_CH("Chn10", 10, IIO_VOLTAGE),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 256 AD4130_CH("Chn11", 11, IIO_VOLTAGE),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 257 AD4130_CH("Chn12", 12, IIO_VOLTAGE),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 258 AD4130_CH("Chn13", 13, IIO_VOLTAGE),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 259 AD4130_CH("Chn14", 14, IIO_VOLTAGE),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 260 AD4130_CH("Chn15", 15, IIO_VOLTAGE)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 261 #endif
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 262 #endif
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 /* ADC raw averaged values from loadcell calibration */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 266 static uint32_t adc_raw_offset;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 267 static uint32_t adc_raw_gain;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 268
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 269 /******************************************************************************/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 270 /************************ Functions Prototypes ********************************/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 271 /******************************************************************************/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 272
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 273 static void update_vltg_conv_scale_factor(uint8_t chn);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 274 static void perform_sensor_measurement_and_update_scale(uint32_t adc_raw,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 275 uint16_t chn);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 276 static int get_calibration_status(char *buf,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 277 uint32_t len,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 278 uint8_t chn,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 279 intptr_t id);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 280 static int set_calibration_routine(char *buf,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 281 uint32_t len,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 282 uint8_t chn,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 283 intptr_t id);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 284 static int get_loadcell_calibration_status(char *buf,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 285 uint32_t len,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 286 uint8_t chn,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 287 intptr_t id);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 288 static int set_loadcell_calibration_status(char *buf,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 289 uint32_t len,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 290 uint8_t chn,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 291 intptr_t id);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 292
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 293 /******************************************************************************/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 294 /************************ Functions Definitions *******************************/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 295 /******************************************************************************/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 296
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 297 static char *get_demo_mode_config(void)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 298 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 299 #if (ACTIVE_DEMO_MODE_CONFIG == RTD_2WIRE_CONFIG)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 300 return "2-Wire RTD";
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 301 #elif (ACTIVE_DEMO_MODE_CONFIG == RTD_3WIRE_CONFIG)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 302 return "3-Wire RTD";
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 303 #elif (ACTIVE_DEMO_MODE_CONFIG == RTD_4WIRE_CONFIG)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 304 return "4-Wire RTD";
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 305 #elif (ACTIVE_DEMO_MODE_CONFIG == THERMISTOR_CONFIG)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 306 return "Thermistor";
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 307 #elif (ACTIVE_DEMO_MODE_CONFIG == THERMOCOUPLE_CONFIG)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 308 return "Thermocouple";
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 309 #elif (ACTIVE_DEMO_MODE_CONFIG == LOADCELL_CONFIG)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 310 return "Loadcell";
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 311 #elif (ACTIVE_DEMO_MODE_CONFIG == ECG_CONFIG)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 312 return "ECG";
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 313 #elif (ACTIVE_DEMO_MODE_CONFIG == NOISE_TEST_CONFIG)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 314 return "Noise Test";
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 315 #elif (ACTIVE_DEMO_MODE_CONFIG == POWER_TEST_CONFIG)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 316 return "Power Test";
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 317 #else
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 318 return "User Default";
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 319 #endif
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 320 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 321
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 322 /*!
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 323 * @brief Getter functions for AD4130 attributes
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 324 * @param device[in]- Pointer to IIO device instance
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 325 * @param buf[in]- IIO input data buffer
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 326 * @param len[in]- Number of input bytes
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 327 * @param channel[in] - Input channel
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 328 * @param priv[in] - Attribute private ID
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 329 * @return 0 in case of success, negative error code otherwise
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 330 * @Note This sampling_frequency attribute is used to define the
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 331 * timeout period in IIO client during data capture.
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 332 * Timeout (1 chn) = (requested samples * sampling frequency) + 1sec
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 333 * Timeout (n chns) = ((requested samples * n) / sampling frequency) + 1sec
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 334 * e.g. If sampling frequency = 31.5KSPS, requested samples = 4000, n=1min or 8max
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 335 * Timeout (1 chn) = (4000 / 315000) + 1 = ~1.13sec
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 336 * Timeout (8 chns) = ((4000 * 8) / 315000) + 1 = ~2.01sec
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 337 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 338 static int iio_ad4130_attr_get(void *device,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 339 char *buf,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 340 uint32_t len,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 341 const struct iio_ch_info *channel,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 342 intptr_t priv)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 343 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 344 uint32_t adc_data_raw;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 345 int32_t offset = 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 346 uint8_t bipolar;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 347 uint32_t val;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 348 int32_t ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 349 uint8_t preset = ad4130_dev_inst->ch[channel->ch_num].preset;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 350
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 351 val = no_os_str_to_uint32(buf);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 352
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 353 switch (priv) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 354 case RAW_ATTR_ID:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 355 /* Apply calibrated coefficients before new sampling */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 356 if (adc_calibration_status[channel->ch_num] == CALIB_DONE) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 357 ret = ad413x_reg_write(ad4130_dev_inst,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 358 AD413X_REG_OFFSET(preset),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 359 adc_calibration_config[channel->ch_num].offset_after_calib);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 360 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 361 break;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 362 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 363
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 364 ret = ad413x_reg_write(ad4130_dev_inst,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 365 AD413X_REG_GAIN(preset),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 366 adc_calibration_config[channel->ch_num].gain_after_calib);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 367 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 368 break;
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
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 372 /* Capture the raw adc data */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 373 ret = read_single_sample((uint8_t)channel->ch_num, &adc_data_raw);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 374 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 375 break;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 376 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 377
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 378 perform_sensor_measurement_and_update_scale(adc_data_raw, channel->ch_num);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 379 return sprintf(buf, "%d", adc_data_raw);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 380
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 381 case SCALE_ATTR_ID:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 382 return snprintf(buf, len, "%.10f", attr_scale_val[channel->ch_num]);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 383
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 384 case OFFSET_ATTR_ID:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 385 #if (ACTIVE_DEMO_MODE_CONFIG == USER_DEFAULT_CONFIG || \
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 386 ACTIVE_DEMO_MODE_CONFIG == LOADCELL_CONFIG || \
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 387 ACTIVE_DEMO_MODE_CONFIG == ECG_CONFIG || \
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 388 ACTIVE_DEMO_MODE_CONFIG == NOISE_TEST_CONFIG || \
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 389 ACTIVE_DEMO_MODE_CONFIG == POWER_TEST_CONFIG)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 390 /* Note: For temperature type channels, the offset
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 391 * is ignored, as signed conversion needed for IIO client
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 392 * is done through perform_sensor_measurement_and_update_scale() */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 393 bipolar = ad4130_dev_inst->bipolar;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 394 if (bipolar) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 395 /* For IIO clients, the raw to voltage conversion happens
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 396 * using formula: voltage = (adc_raw + offset) * scale
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 397 * Offset is determined based on the coding scheme of device.
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 398 * 'Offset binary coding' is used in bipolar mode while
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 399 * 'Streight binary coding' is used in unipolar mode.
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 400 * */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 401 offset = -ADC_MAX_COUNT_BIPOLAR;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 402 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 403 #endif
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 404 return sprintf(buf, "%d", offset);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 405
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 406 case SAMPLING_FREQ_ATTR_ID:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 407 /* Sampling frequency for IIO oscilloscope timeout purpose.
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 408 * Does not indicate an actual sampling rate of device.
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 409 * Refer the 'note' in function description above for timeout calculations */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 410 return sprintf(buf, "%d", AD4130_MIN_SAMPLING_FREQ);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 411
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 412 case DEMO_CONFIG_ATTR_ID:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 413 return sprintf(buf, "%s", get_demo_mode_config());
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 414
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 415 case INTERNAL_CALIB_ID:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 416 case SYSTEM_CALIB_ID:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 417 return get_calibration_status(buf, len, channel->ch_num, priv);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 418
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 419 case LOADCELL_GAIN_CALIB_ID:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 420 case LOADCELL_OFFSET_CALIB_ID:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 421 return get_loadcell_calibration_status(buf, len, channel->ch_num, priv);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 422
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 423 default:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 424 break;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 425 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 426
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 427 return len;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 428 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 429
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 430 /*!
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 431 * @brief Setter functions for AD4130 attributes
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 432 * @param device[in]- Pointer to IIO device instance
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 433 * @param buf[in]- IIO input data buffer
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 434 * @param len[in]- Number of input bytes
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 435 * @param channel[in] - Input channel
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 436 * @param priv[in] - Attribute private ID
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 437 * @return 0 in case of success, negative error code otherwise
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 438 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 439 static int iio_ad4130_attr_set(void *device,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 440 char *buf,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 441 uint32_t len,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 442 const struct iio_ch_info *channel,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 443 intptr_t priv)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 444 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 445 switch (priv) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 446 case RAW_ATTR_ID:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 447 case SCALE_ATTR_ID:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 448 case SAMPLING_FREQ_ATTR_ID:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 449 case DEMO_CONFIG_ATTR_ID:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 450 /* All are read-only attributes */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 451 break;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 452
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 453 case INTERNAL_CALIB_ID:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 454 case SYSTEM_CALIB_ID:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 455 return set_calibration_routine(buf, len, channel->ch_num, priv);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 456
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 457 case LOADCELL_GAIN_CALIB_ID:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 458 case LOADCELL_OFFSET_CALIB_ID:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 459 return set_loadcell_calibration_status(buf, len, channel->ch_num, priv);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 460
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 461 default:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 462 break;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 463 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 464
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 465 return len;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 466 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 467
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 468 /*!
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 469 * @brief Perform the ADC internal/system calibration
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 470 * @param chn[in] - ADC channel
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 471 * @param calib_mode[in] - ADC calibration mode
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 472 * @return 0 in case of success, negative error code otherwise
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 473 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 474 static int32_t perform_adc_calibration(uint8_t chn,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 475 enum ad413x_adc_mode calib_mode)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 476 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 477 int32_t ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 478 uint32_t data;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 479 uint8_t preset = ad4130_dev_inst->ch[chn].preset;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 480 uint8_t pga = ad4130_dev_inst->preset[preset].gain;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 481
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 482 /* Put ADC into standby mode */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 483 ret = ad413x_set_adc_mode(ad4130_dev_inst, AD413X_STANDBY_MODE);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 484 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 485 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 486 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 487
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 488 /* Read the gain/offset coefficient values before calibration */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 489 if ((calib_mode == AD413X_INT_GAIN_CAL)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 490 || (calib_mode == AD413X_SYS_GAIN_CAL)) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 491 if (calib_mode == AD413X_INT_GAIN_CAL) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 492 /* Write offset default value before internal gain calibration
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 493 * as internal offset calibration is performed after internal
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 494 * gain calibration */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 495 ret = ad413x_reg_write(ad4130_dev_inst,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 496 AD413X_REG_OFFSET(preset),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 497 AD4130_DEFAULT_OFFSET);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 498 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 499 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 500 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 501 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 502
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 503 ret = ad413x_reg_read(ad4130_dev_inst,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 504 AD413X_REG_GAIN(preset),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 505 &data);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 506 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 507 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 508 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 509 adc_calibration_config[chn].gain_before_calib = data;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 510 } else {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 511 ret = ad413x_reg_read(ad4130_dev_inst,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 512 AD413X_REG_OFFSET(preset),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 513 &data);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 514
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 515 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 516 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 517 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 518 adc_calibration_config[chn].offset_before_calib = data;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 519 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 520
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 521 /* Enable channel for calibration */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 522 ret = ad413x_ch_en(ad4130_dev_inst, chn, 1);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 523 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 524 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 525 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 526
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 527 if ((calib_mode == AD413X_INT_GAIN_CAL)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 528 || (calib_mode == AD413X_SYS_GAIN_CAL)) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 529 if ((calib_mode == AD413X_INT_GAIN_CAL) && (pga == AD413X_GAIN_1)) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 530 /* Internal gain calibration is not supported at gain of 1 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 531 adc_calibration_config[chn].gain_after_calib =
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 532 adc_calibration_config[chn].gain_before_calib;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 533 adc_calibration_status[chn] = CALIB_SKIPPED;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 534 return 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 535 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 536
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 537 /* Perform internal/system gain (full-scale) calibration */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 538 ret = ad413x_set_adc_mode(ad4130_dev_inst, calib_mode);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 539 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 540 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 541 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 542
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 543 /* Wait for conversion to finish */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 544 no_os_mdelay(200);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 545
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 546 /* Read the gain coefficient value (post calibrated) */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 547 ret = ad413x_reg_read(ad4130_dev_inst,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 548 AD413X_REG_GAIN(preset),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 549 &data);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 550 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 551 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 552 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 553 adc_calibration_config[chn].gain_after_calib = data;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 554
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 555 /* Compare the pre and post adc calibration gain coefficients to check calibration status */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 556 if (adc_calibration_config[chn].gain_after_calib ==
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 557 adc_calibration_config[chn].gain_before_calib) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 558 /* Error in gain calibration */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 559 return -EINVAL;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 560 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 561 } else {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 562 /* Perform internal/system offset (zero-scale) calibration */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 563 ret = ad413x_set_adc_mode(ad4130_dev_inst, calib_mode);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 564 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 565 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 566 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 567
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 568 /* Wait for conversion to finish */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 569 no_os_mdelay(200);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 570
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 571 /* Read the coefficient value (post calibrated) */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 572 ret = ad413x_reg_read(ad4130_dev_inst,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 573 AD413X_REG_OFFSET(preset),
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 574 &data);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 575 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 576 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 577 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 578 adc_calibration_config[chn].offset_after_calib = data;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 579
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 580 /* Compare the pre and post adc calibration offset coefficients to check calibration status */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 581 if (adc_calibration_config[chn].offset_after_calib ==
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 582 adc_calibration_config[chn].offset_before_calib) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 583 /* Error in offset calibration */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 584 return -EINVAL;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 585 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 586 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 587
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 588 /* Disable previously enabled channel */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 589 ret = ad413x_ch_en(ad4130_dev_inst, chn, 0);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 590 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 591 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 592 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 593
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 594 return 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 595 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 596
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 597 /*!
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 598 * @brief Getter for the ADC internal/system calibration
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 599 * @param buf[in]- pointer to buffer holding attribute value
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 600 * @param len[in]- length of buffer string data
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 601 * @param chn[in]- ADC channel
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 602 * @param id[in]- Attribute ID
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 603 * @return Number of characters read/written
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 604 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 605 static int get_calibration_status(char *buf,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 606 uint32_t len,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 607 uint8_t chn,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 608 intptr_t id)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 609 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 610 uint8_t buf_offset = 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 611
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 612 switch (id) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 613 case SYSTEM_CALIB_ID:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 614 case INTERNAL_CALIB_ID:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 615 if (id == SYSTEM_CALIB_ID && system_calibration_state == CALIB_COMPLETE_STATE) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 616 system_calibration_state = ZERO_SCALE_CALIB_STATE;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 617 } else if (id == INTERNAL_CALIB_ID
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 618 && internal_calibration_state == CALIB_COMPLETE_STATE) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 619 internal_calibration_state = FULL_SCALE_CALIB_STATE;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 620 } else {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 621 if (adc_calibration_status[chn] != CALIB_ERROR
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 622 && adc_calibration_status[chn] != CALIB_SKIPPED
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 623 && adc_calibration_status[chn] != CALIB_IN_PROGRESS) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 624 /* Return NA to indicate that system calibration is not supported
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 625 * using IIO oscilloscope. Pyadi-iio script needs to be executed
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 626 * to perform a system calibration due to manual intervention
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 627 **/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 628 return snprintf(buf, len, "%s", "NA");
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 629 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 630 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 631
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 632 sprintf(buf + buf_offset, "%08x",
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 633 adc_calibration_config[chn].gain_before_calib);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 634 buf_offset += 8;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 635 sprintf(buf + buf_offset, "%08x",
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 636 adc_calibration_config[chn].gain_after_calib);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 637 buf_offset += 8;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 638 sprintf(buf + buf_offset, "%08x",
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 639 adc_calibration_config[chn].offset_before_calib);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 640 buf_offset += 8;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 641 sprintf(buf + buf_offset, "%08x",
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 642 adc_calibration_config[chn].offset_after_calib);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 643 buf_offset += 8;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 644
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 645 if (adc_calibration_status[chn] == CALIB_ERROR) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 646 sprintf(buf + buf_offset, "%s", "calibration_failed");
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 647 buf_offset += (strlen("calibration_failed") + 1);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 648 adc_calibration_status[chn] = CALIB_NOT_DONE;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 649 } else if (adc_calibration_status[chn] == CALIB_SKIPPED) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 650 sprintf(buf + buf_offset, "%s", "calibration_skipped");
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 651 buf_offset += (strlen("calibration_skipped") + 1);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 652 adc_calibration_status[chn] = CALIB_NOT_DONE;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 653 } else {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 654 sprintf(buf + buf_offset, "%s", "calibration_done");
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 655 buf_offset += (strlen("calibration_done") + 1);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 656 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 657
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 658 return buf_offset;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 659
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 660 default:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 661 return -EINVAL;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 662 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 663
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 664 return len;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 665 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 666
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 667 /*!
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 668 * @brief Setter for the ADC internal/system calibration
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 669 * @param buf[in]- pointer to buffer holding attribute value
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 670 * @param len[in]- length of buffer string data
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 671 * @param chn[in]- ADC channel
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 672 * @param id[in]- Attribute ID
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 673 * @return Number of characters read/written
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 674 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 675 static int set_calibration_routine(char *buf,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 676 uint32_t len,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 677 uint8_t chn,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 678 intptr_t id)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 679 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 680 switch (id) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 681 case INTERNAL_CALIB_ID:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 682 if (!strncmp(buf, "start_calibration", strlen(buf))) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 683 switch (internal_calibration_state) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 684 case FULL_SCALE_CALIB_STATE:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 685 adc_calibration_status[chn] = CALIB_IN_PROGRESS;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 686 if (perform_adc_calibration(chn,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 687 AD413X_INT_GAIN_CAL)) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 688 adc_calibration_status[chn] = CALIB_ERROR;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 689 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 690 internal_calibration_state = ZERO_SCALE_CALIB_STATE;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 691 break;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 692
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 693 case ZERO_SCALE_CALIB_STATE:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 694 if (perform_adc_calibration(chn,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 695 AD413X_INT_OFFSET_CAL)) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 696 adc_calibration_status[chn] = CALIB_ERROR;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 697 internal_calibration_state = FULL_SCALE_CALIB_STATE;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 698 break;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 699 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 700 adc_calibration_status[chn] = CALIB_DONE;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 701 internal_calibration_state = CALIB_COMPLETE_STATE;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 702 break;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 703
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 704 case CALIB_COMPLETE_STATE:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 705 default:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 706 internal_calibration_state = FULL_SCALE_CALIB_STATE;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 707 break;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 708 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 709 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 710 break;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 711
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 712 case SYSTEM_CALIB_ID:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 713 if (!strncmp(buf, "start_calibration", strlen(buf))) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 714 switch (system_calibration_state) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 715 case ZERO_SCALE_CALIB_STATE:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 716 adc_calibration_status[chn] = CALIB_IN_PROGRESS;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 717 if (perform_adc_calibration(chn,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 718 AD413X_SYS_OFFSET_CAL)) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 719 adc_calibration_status[chn] = CALIB_ERROR;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 720 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 721 system_calibration_state = FULL_SCALE_CALIB_STATE;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 722 break;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 723
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 724 case FULL_SCALE_CALIB_STATE:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 725 if (perform_adc_calibration(chn,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 726 AD413X_SYS_GAIN_CAL)) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 727 adc_calibration_status[chn] = CALIB_ERROR;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 728 system_calibration_state = ZERO_SCALE_CALIB_STATE;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 729 break;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 730 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 731 adc_calibration_status[chn] = CALIB_DONE;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 732 system_calibration_state = CALIB_COMPLETE_STATE;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 733 break;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 734
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 735 case CALIB_COMPLETE_STATE:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 736 default:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 737 system_calibration_state = ZERO_SCALE_CALIB_STATE;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 738 break;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 739 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 740 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 741 break;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 742
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 743 default:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 744 return -EINVAL;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 745 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 746
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 747 return len;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 748 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 749
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 750 /*!
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 751 * @brief Getter for the Loadcell offset/gain calibration
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 752 * @param buf[in]- pointer to buffer holding attribute value
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 753 * @param len[in]- length of buffer string data
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 754 * @param chn[in]- ADC channel
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 755 * @param id[in]- Attribute ID
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 756 * @return Number of characters read/written
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 757 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 758 static int get_loadcell_calibration_status(char *buf,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 759 uint32_t len,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 760 uint8_t chn,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 761 intptr_t id)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 762 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 763 switch (id) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 764 case LOADCELL_OFFSET_CALIB_ID:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 765 return sprintf(buf, "%d", adc_raw_offset);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 766
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 767 case LOADCELL_GAIN_CALIB_ID:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 768 return sprintf(buf, "%d", adc_raw_gain);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 769
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 770 default:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 771 return -EINVAL;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 772 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 773
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 774 return len;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 775 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 776
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 777 /*!
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 778 * @brief Setter for the Loadcell offset/gain calibration
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 779 * @param buf[in]- pointer to buffer holding attribute value
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 780 * @param len[in]- length of buffer string data
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 781 * @param chn[in]- ADC channel
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 782 * @param id[in]- Attribute ID
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 783 * @return Number of characters read/written
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 784 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 785 static int set_loadcell_calibration_status(char *buf,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 786 uint32_t len,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 787 uint8_t chn,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 788 intptr_t id)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 789 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 790 uint32_t adc_raw;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 791 uint8_t sample_cnt;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 792 uint64_t adc_raw_avg = 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 793
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 794 if (!strncmp(buf, "start_calibration", strlen(buf))) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 795 switch (id) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 796 case LOADCELL_OFFSET_CALIB_ID:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 797 for (sample_cnt = 0; sample_cnt < LOADCELL_SAMPLES_COUNT; sample_cnt++) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 798 read_single_sample(chn, &adc_raw);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 799 adc_raw_avg += adc_raw;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 800 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 801
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 802 adc_raw_avg /= LOADCELL_SAMPLES_COUNT;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 803 adc_raw_offset = (uint32_t)adc_raw_avg;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 804 break;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 805
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 806 case LOADCELL_GAIN_CALIB_ID:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 807 for (sample_cnt = 0; sample_cnt < LOADCELL_SAMPLES_COUNT; sample_cnt++) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 808 read_single_sample(chn, &adc_raw);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 809 adc_raw_avg += adc_raw;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 810 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 811
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 812 adc_raw_avg /= LOADCELL_SAMPLES_COUNT;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 813 adc_raw_gain = (uint32_t)adc_raw_avg;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 814 break;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 815
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 816 default:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 817 return -EINVAL;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 818 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 819 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 820
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 821 return len;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 822 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 823
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 824 /*!
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 825 * @brief Read the debug register value
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 826 * @param dev[in]- Pointer to IIO device instance
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 827 * @param reg[in]- Register address to read from
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 828 * @param readval[in,out]- Pointer to variable to read data into
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 829 * @return 0 in case of success or negative value otherwise
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 830 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 831 int32_t debug_reg_read(void *dev, uint32_t reg, uint32_t *readval)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 832 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 833 int32_t ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 834
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 835 if (!dev || !readval || (reg > MAX_REGISTER_ADDRESS)) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 836 return -EINVAL;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 837 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 838
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 839 ret = ad413x_reg_read(dev, ad413x_regs[reg], readval);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 840 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 841 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 842 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 843
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 844 return 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 845 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 846
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 847 /*!
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 848 * @brief Write into the debug register
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 849 * @param dev[in]- Pointer to IIO device instance
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 850 * @param reg[in]- Register address to write into
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 851 * @param writeval[in]- Register value to write
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 852 * @return 0 in case of success or negative value otherwise
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 853 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 854 int32_t debug_reg_write(void *dev, uint32_t reg, uint32_t writeval)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 855 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 856 int32_t ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 857
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 858 if (!dev || (reg > MAX_REGISTER_ADDRESS)) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 859 return -EINVAL;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 860 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 861
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 862 ret = ad413x_reg_write(dev, ad413x_regs[reg], writeval);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 863 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 864 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 865 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 866
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 867 return 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 868 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 869
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 870 /**
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 871 * @brief Read buffer data corresponding to AD4130 ADC IIO device
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 872 * @param iio_dev_data[in] - IIO device data instance
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 873 * @return 0 in case of success or negative value otherwise
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 874 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 875 static int32_t iio_ad4130_submit_buffer(struct iio_device_data *iio_dev_data)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 876 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 877 uint32_t ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 878
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 879 /* Read the samples counts equal to buffer size/block */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 880 ret = read_buffered_data(&iio_dev_data->buffer->buf->buff,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 881 iio_dev_data->buffer->size);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 882
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 883 /* Increment the write spin count as buffer reads all 'n' samples
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 884 * in one go which is also the size of buffer block for a given instance.
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 885 * The read spin count is incremented from IIO library during buffer
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 886 * write/offloading into transmit buffer */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 887 if (iio_dev_data->buffer->buf->write.spin_count >= UINT32_MAX) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 888 iio_dev_data->buffer->buf->write.spin_count = 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 889 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 890
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 891 iio_dev_data->buffer->buf->write.spin_count += 1;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 892
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 893 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 894 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 895
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 896 /**
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 897 * @brief Prepare for data transfer
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 898 * @param dev[in] - IIO device instance
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 899 * @param ch_mask[in] - Channels select mask
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 900 * @return 0 in case of success or negative value otherwise
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 901 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 902 static int32_t iio_ad4130_prepare_transfer(void *dev,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 903 uint32_t ch_mask)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 904 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 905 return prepare_data_transfer(ch_mask, BYTES_PER_SAMPLE);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 906 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 907
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 908 /**
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 909 * @brief Terminate current data transfer
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 910 * @param dev[in] - IIO device instance
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 911 * @return 0 in case of success or negative value otherwise
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 912 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 913 static int32_t iio_ad4130_end_transfer(void *dev)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 914 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 915 return end_data_transfer();
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 916 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 917
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 918 /**
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 919 * @brief Perform the sensor measurement as per current demo config and update
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 920 * the adc_raw value to sensor conversion scale factor for IIO client
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 921 * @param adc_raw[in] - ADC raw value
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 922 * @param chn[in] - ADC channel
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 923 * @return none
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 924 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 925 static void perform_sensor_measurement_and_update_scale(uint32_t adc_raw,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 926 uint16_t chn)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 927 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 928 float temperature = 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 929 int32_t cjc_raw_data;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 930 float cjc_temp;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 931
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 932 #if (ACTIVE_DEMO_MODE_CONFIG == THERMISTOR_CONFIG)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 933 temperature = get_ntc_thermistor_temperature(ad4130_dev_inst, adc_raw, chn);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 934 attr_scale_val[chn] = (temperature / adc_raw) * 1000.0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 935 #elif ((ACTIVE_DEMO_MODE_CONFIG == RTD_2WIRE_CONFIG) || \
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 936 (ACTIVE_DEMO_MODE_CONFIG == RTD_3WIRE_CONFIG) || \
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 937 (ACTIVE_DEMO_MODE_CONFIG == RTD_4WIRE_CONFIG))
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 938 temperature = get_rtd_temperature(ad4130_dev_inst, adc_raw, chn);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 939 attr_scale_val[chn] = (temperature / adc_raw) * 1000.0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 940 #elif (ACTIVE_DEMO_MODE_CONFIG == THERMOCOUPLE_CONFIG)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 941 if (chn != CJC_CHANNEL) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 942 /* Sample the CJC channel (TC channel is already sampled through
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 943 * get_raw() function) */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 944 if (read_single_sample(CJC_CHANNEL, (uint32_t *)&cjc_raw_data)) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 945 return;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 946 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 947 } else {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 948 /* For calculating CJC temperature, TC raw data is not used */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 949 chn = SENSOR_CHANNEL0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 950 cjc_raw_data = adc_raw;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 951 adc_raw = 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 952 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 953
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 954 /* Calculate the TC and CJC temperature and update scale factor */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 955 temperature = get_tc_temperature(ad4130_dev_inst, adc_raw,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 956 cjc_raw_data, chn, CJC_CHANNEL, &cjc_temp);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 957 attr_scale_val[chn] = (temperature / adc_raw) * 1000.0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 958 attr_scale_val[CJC_CHANNEL] = (cjc_temp / cjc_raw_data) * 1000.0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 959 #endif
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 960 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 961
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 962 /*!
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 963 * @brief Update scale factor for adc data to voltage conversion
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 964 * for IIO client
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 965 * @param chn[in] - Input channel
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 966 * @return none
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 967 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 968 static void update_vltg_conv_scale_factor(uint8_t chn)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 969 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 970 enum ad413x_gain pga;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 971 uint8_t preset;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 972 uint8_t bipolar;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 973 float vref;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 974
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 975 preset = ad4130_dev_inst->ch[chn].preset;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 976 pga = ad4130_dev_inst->preset[preset].gain;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 977 bipolar = ad4130_dev_inst->bipolar;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 978
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 979 vref = ad4130_get_reference_voltage(ad4130_dev_inst, chn);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 980
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 981 /* Get the scale factor for voltage conversion */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 982 if (bipolar) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 983 attr_scale_val[chn] = (vref / (ADC_MAX_COUNT_BIPOLAR *
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 984 (1 << pga))) * 1000;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 985 } else {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 986 attr_scale_val[chn] = (vref / (ADC_MAX_COUNT_UNIPOLAR *
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 987 (1 << pga))) * 1000;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 988 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 989
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 990 #if (ACTIVE_DEMO_MODE_CONFIG == POWER_TEST_CONFIG)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 991 switch (chn) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 992 case POWER_TEST_I_AVDD_CHN:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 993 case POWER_TEST_I_IOVDD_CHN:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 994 attr_scale_val[chn] /= I_RSENSE;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 995 break;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 996
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 997 case POWER_TEST_V_AVDD_CHN:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 998 case POWER_TEST_V_IOVDD_CHN:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 999 attr_scale_val[chn] *= V_SCALE;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1000 break;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1001
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1002 default:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1003 break;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1004 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1005 #endif
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1006 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1007
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1008 /**
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1009 * @brief Init for reading/writing and parameterization of a
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1010 * ad4130 IIO device
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1011 * @param desc[in,out] - IIO device descriptor
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1012 * @return 0 in case of success, negative error code otherwise
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1013 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1014 int32_t ad4130_iio_init(struct iio_device **desc)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1015 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1016 struct iio_device *iio_ad4130_inst;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1017 uint8_t chn;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1018 uint8_t bipolar;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1019
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1020 iio_ad4130_inst = calloc(1, sizeof(struct iio_device));
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1021 if (!iio_ad4130_inst) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1022 return -ENOMEM;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1023 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1024
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1025 /* Update IIO device init parameters */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1026 for (chn = 0; chn < ADC_USER_CHANNELS; chn++) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1027 update_vltg_conv_scale_factor(chn);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1028 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1029
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1030 /* Get the polarity of device */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1031 bipolar = ad4130_dev_inst->bipolar;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1032
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1033 if (bipolar) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1034 /* Using offset-binary coding for bipolar mode */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1035 chn_scan.sign = 's';
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1036 chn_scan.realbits = CHN_STORAGE_BITS;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1037 } else {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1038 /* Using streight-binary coding for bipolar mode */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1039 chn_scan.sign = 'u';
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1040 chn_scan.realbits = ADC_RESOLUTION;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1041 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1042
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1043 chn_scan.storagebits = CHN_STORAGE_BITS;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1044 chn_scan.shift = 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1045 chn_scan.is_big_endian = false;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1046
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1047 iio_ad4130_inst->num_ch = NO_OS_ARRAY_SIZE(ad4130_iio_channels);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1048 iio_ad4130_inst->channels = ad4130_iio_channels;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1049 iio_ad4130_inst->attributes = ad4130_iio_global_attributes;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1050 iio_ad4130_inst->context_attributes = ad4130_iio_context_attributes;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1051
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1052 iio_ad4130_inst->submit = iio_ad4130_submit_buffer;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1053 iio_ad4130_inst->pre_enable = iio_ad4130_prepare_transfer;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1054 iio_ad4130_inst->post_disable = iio_ad4130_end_transfer;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1055
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1056 iio_ad4130_inst->debug_reg_read = debug_reg_read;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1057 iio_ad4130_inst->debug_reg_write = debug_reg_write;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1058
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1059 *desc = iio_ad4130_inst;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1060
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1061 return 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1062 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1063
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1064 /**
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1065 * @brief Release resources allocated for IIO device
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1066 * @param desc[in] - IIO device descriptor
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1067 * @return 0 in case of success, negative error code otherwise
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1068 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1069 int32_t ad4130_iio_remove(struct iio_desc *desc)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1070 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1071 int32_t status;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1072
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1073 if (!desc) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1074 return -ENOMEM;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1075 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1076
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1077 status = iio_remove(desc);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1078 if (status) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1079 return status;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1080 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1081
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1082 return 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1083 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1084
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1085 /**
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1086 * @brief Initialize the IIO interface for AD4130 IIO device
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1087 * @return 0 in case of success, negative error code otherwise
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1088 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1089 int32_t ad4130_iio_initialize(void)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1090 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1091 int32_t init_status;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1092
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1093 /* IIO device descriptor */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1094 struct iio_device *p_iio_ad4130_dev;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1095
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1096 /* IIO interface init parameters */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1097 struct iio_init_param iio_init_params = {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1098 .phy_type = USE_UART,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1099 .nb_devs = 1,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1100 };
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1101
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1102 /* IIOD init parameters */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1103 struct iio_device_init iio_device_init_params = {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1104 .name = (char *)dev_name,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1105 .raw_buf = adc_data_buffer,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1106 .raw_buf_len = DATA_BUFFER_SIZE
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1107 };
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1108
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1109 /* Init the system peripherals */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1110 init_status = init_system();
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1111 if (init_status) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1112 return init_status;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1113 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1114
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1115 /* Initialize AD4130 device and peripheral interface */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1116 init_status = ad413x_init(&ad4130_dev_inst, ad4130_init_params);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1117 if (init_status) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1118 return init_status;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1119 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1120
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1121 /* Initialize the AD4130 IIO application interface */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1122 init_status = ad4130_iio_init(&p_iio_ad4130_dev);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1123 if (init_status) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1124 return init_status;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1125 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1126
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1127 /* Initialize the IIO interface */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1128 iio_init_params.uart_desc = uart_desc;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1129 iio_device_init_params.dev = ad4130_dev_inst;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1130 iio_device_init_params.dev_descriptor = p_iio_ad4130_dev;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1131 iio_init_params.devs = &iio_device_init_params;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1132 init_status = iio_init(&p_ad4130_iio_desc, &iio_init_params);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1133 if (init_status) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1134 return init_status;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1135 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1136
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1137 /* Perform data capture initialization */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1138 init_status = ad4130_data_capture_init();
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1139 if (init_status) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1140 return init_status;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1141 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1142
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1143 return 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1144 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1145
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1146 /**
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1147 * @brief Run the AD4130 IIO event handler
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1148 * @return none
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1149 * @details This function monitors the new IIO client event
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1150 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1151 void ad4130_iio_event_handler(void)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1152 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1153 (void)iio_step(p_ad4130_iio_desc);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1154 }