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_data_capture.c
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 3 * @brief AD4130 data capture interface for IIO based applications
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 4 * @details This module handles the ADC data capturing for IIO client
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 5 ********************************************************************************
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 6 * Copyright (c) 2021-22 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 <string.h>
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 19
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 20 #include "app_config.h"
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 21 #include "ad413x.h"
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 22 #include "ad4130_support.h"
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 23 #include "ad4130_iio.h"
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 24 #include "ad4130_regs.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_user_config.h"
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 27 #include "no_os_gpio.h"
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 28 #include "no_os_error.h"
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 29
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 30 /******************************************************************************/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 31 /********************** Macros and Constants Definition ***********************/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 32 /******************************************************************************/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 33
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 34 /* Timeout count to avoid stuck into potential infinite loop while checking
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 35 * for new data into an acquisition buffer. The actual timeout factor is determined
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 36 * through 'sampling_frequency' attribute of IIO app, but this period here makes sure
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 37 * we are not stuck into a forever loop in case data capture is interrupted
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 38 * or failed in between.
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 39 * Note: This timeout factor is dependent upon the MCU clock frequency. Below timeout
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 40 * is tested for SDP-K1 platform @180Mhz default core clock */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 41 #define BUF_READ_TIMEOUT 0xffffffff
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 42
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 43 /* Fifo depth limit (watermark count) for data capture */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 44 #define FIFO_SIZE 256 // Range: 1-256
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 45
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 46 /******************************************************************************/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 47 /********************** Variables and User Defined Data Types *****************/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 48 /******************************************************************************/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 49
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 50 /* ADC data buffer */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 51 #if !defined(USE_SDRAM_CAPTURE_BUFFER)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 52 int8_t adc_data_buffer[DATA_BUFFER_SIZE] = { 0 };
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 53 #endif
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 54
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 55 /*
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 56 *@enum acq_buffer_state_e
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 57 *@details Enum holding the data acquisition buffer states
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 58 **/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 59 typedef enum {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 60 BUF_AVAILABLE,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 61 BUF_EMPTY,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 62 BUF_FULL
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 63 } acq_buffer_state_e;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 64
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 65 /*
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 66 *@struct acq_buf_t
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 67 *@details Structure holding the data acquisition buffer parameters
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 68 **/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 69 typedef struct {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 70 acq_buffer_state_e state; // Buffer state
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 71 uint32_t wr_indx; // Buffer write index (incremented per sample read)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 72 uint32_t rd_indx; // Buffer read index (incremented per sample read)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 73 int8_t *wr_pdata; // Data buffer write pointer
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 74 int8_t *rd_pdata; // Data buffer read pointer
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 75 bool reindex_buffer; // Reindex buffer to 0th channel
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 76 } acq_buf_t;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 77
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 78 /* ADC data acquisition buffers */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 79 static volatile acq_buf_t acq_buffer;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 80
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 81 /* Flag to indicate data capture status */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 82 static volatile bool start_cont_data_capture = false;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 83
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 84 /* Count to track number of actual samples requested by IIO client */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 85 static volatile uint32_t num_of_requested_samples = 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 86
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 87 /* ADC sample/raw data size in bytes */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 88 static volatile uint8_t sample_size_in_bytes;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 89
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 90 /* Max available buffer size (after considering the data alignment with IIO buffer) */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 91 static volatile uint32_t max_buffer_sz;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 92
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 93 /* List of channels to be captured */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 94 static volatile uint8_t active_channels[ADC_USER_CHANNELS];
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 95
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 96 /* Number of active channels */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 97 static volatile uint8_t num_of_active_channels;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 98
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 99 /* Current active channel index */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 100 static volatile uint8_t chn_indx;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 101
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 102 /* FIFO data capture flags */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 103 static volatile bool start_fifo_mode_data_capture = false;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 104 static volatile bool fifo_data_available = false;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 105 static uint32_t fifo_data[FIFO_SIZE];
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 106
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 107 /******************************************************************************/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 108 /************************ Functions Declarations ******************************/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 109 /******************************************************************************/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 110
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 111 /******************************************************************************/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 112 /************************ Functions Definitions *******************************/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 113 /******************************************************************************/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 114
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 115 /*!
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 116 * @brief Function to init the data capture for AD4130 device
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 117 * @return 0 in case of success, negative error code otherwise
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 118 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 119 int32_t ad4130_data_capture_init(void)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 120 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 121 int32_t ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 122 uint8_t preset;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 123 adc_conv_int_source_e conv_int_source;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 124
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 125 /* Stop any previous conversion */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 126 ret = ad413x_set_adc_mode(ad4130_dev_inst, AD413X_STANDBY_MODE);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 127 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 128 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 129 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 130
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 131 /* Select and enable the interupt pin source for data conversion monitor */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 132 #if defined(AD4130_WLCSP_PACKAGE_TYPE)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 133 conv_int_source = INT_PIN;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 134 #else
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 135 conv_int_source = CLK_PIN;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 136 #endif
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 137
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 138 ret = ad413x_set_int_source(ad4130_dev_inst, conv_int_source);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 139 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 140 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 141 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 142
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 143 /* Set the filter FS value (same for all setups/channels for
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 144 * consistant ODR/sample rate) */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 145 for (preset = 0; preset <= ADC_PRESETS; preset++) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 146 ret = ad413x_set_filter_fs(ad4130_dev_inst, AD4130_FS_CONFIG, preset);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 147 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 148 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 149 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 150 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 151
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 152 return 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 153 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 154
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 155 /*!
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 156 * @brief Store the list of all previously enabled channels and enable
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 157 * new channels set in the channel mask argument
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 158 * @param chn_mask[in] - Active channels list
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 159 * @return 0 in case of success, negative error code otherwise
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 160 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 161 static int32_t adc_store_active_chns(uint32_t chn_mask)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 162 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 163 uint8_t mask = 0x1;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 164 uint8_t index = 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 165 uint8_t chn;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 166 int32_t ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 167
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 168 /* Enable/Disable channels based on channel mask set in the IIO client */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 169 for (chn = 0; chn < ADC_USER_CHANNELS; chn++) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 170 if (chn_mask & mask) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 171 /* Store the active channel */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 172 active_channels[index++] = chn;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 173 num_of_active_channels++;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 174
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 175 /* Enable the selected channel */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 176 ret = ad413x_ch_en(ad4130_dev_inst, chn, 1);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 177 } else {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 178 /* Disable the selected channel */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 179 ret = ad413x_ch_en(ad4130_dev_inst, chn, 0);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 180 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 181
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 182 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 183 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 184 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 185
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 186 mask <<= 1;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 187 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 188
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 189 return 0;
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 /*!
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 193 * @brief Trigger a data capture in continuous/burst mode
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 194 * @return 0 in case of success, negative error code otherwise
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 195 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 196 static int32_t adc_start_data_capture(void)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 197 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 198 int32_t ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 199
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 200 /* Stop any previous conversion */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 201 ret = ad413x_set_adc_mode(ad4130_dev_inst, AD413X_STANDBY_MODE);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 202 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 203 return ret;
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 /* Trigger new conversion */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 207 ret = ad413x_set_adc_mode(ad4130_dev_inst, AD413X_CONTINOUS_CONV_MODE);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 208 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 209 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 210 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 211
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 212 return 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 213 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 214
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 215 /*!
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 216 * @brief Stop a data capture from continuous/burst/fifo mode
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 217 * @return 0 in case of success, negative error code otherwise
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 218 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 219 static int32_t adc_stop_data_capture(void)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 220 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 221 /* Stop any active conversion */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 222 return ad413x_set_adc_mode(ad4130_dev_inst, AD413X_STANDBY_MODE);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 223 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 224
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 225 /*!
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 226 * @brief Trigger a data capture in FIFO mode
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 227 * @return 0 in case of success, negative error code otherwise
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 228 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 229 static int32_t adc_start_fifo_data_capture(void)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 230 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 231 int32_t ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 232 uint32_t fifo_control_reg_val;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 233
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 234 /* Read FIFO control register */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 235 ret = ad413x_reg_read(ad4130_dev_inst, AD413X_REG_FIFO_CTRL,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 236 &fifo_control_reg_val);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 237 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 238 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 239 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 240
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 241 /* Store the watermark count in FIFO */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 242 fifo_control_reg_val = (fifo_control_reg_val & ~AD413X_WATERMARK_MSK) |
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 243 AD413X_WATERMARK(FIFO_SIZE);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 244
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 245 /* Select the FIFO mode to enable FIFO and enable watermark interrupt */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 246 fifo_control_reg_val = (fifo_control_reg_val & ~AD4130_FIFO_MODE_MSK) |
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 247 AD413X_FIFO_MODE(FIFO_OLDEST_SAVE_MODE) |
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 248 AD413X_WATERMARK_INT_EN;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 249
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 250 /* Disable the FIFO header and status (FIFO status and header is not appended to data) */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 251 fifo_control_reg_val &= ~(AD413X_ADD_FIFO_HEADER | AD413X_ADD_FIFO_STATUS);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 252
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 253 /* Write to ADC fifo_ctrl register */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 254 ret = ad413x_reg_write(ad4130_dev_inst, AD413X_REG_FIFO_CTRL,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 255 fifo_control_reg_val);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 256 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 257 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 258 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 259
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 260 start_fifo_mode_data_capture = true;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 261 ret = adc_start_data_capture();
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 262 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 263 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 264 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 265
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 266 return 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 267 }
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 * @brief Read a single sample of ADC
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 271 * @param adc_raw[in] - Pointer to ADC raw data variable
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 272 * @return 0 in case of success, negative error code otherwise
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 273 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 274 static int32_t adc_read_single_sample(uint32_t *adc_raw)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 275 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 276 if (!adc_raw) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 277 return -EINVAL;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 278 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 279
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 280 return ad413x_mon_conv_and_read_data(ad4130_dev_inst, adc_raw);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 281 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 282
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 283 /*!
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 284 * @brief Read a single sample of ADC
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 285 * @param data[in] - Pointer to FIFO data array
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 286 * @param samples[in] - Number of samples to read
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 287 * @return 0 in case of success, negative error code otherwise
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 288 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 289 static int32_t adc_read_fifo(uint32_t *data, uint32_t samples)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 290 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 291 if (!data) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 292 return -EINVAL;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 293 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 294
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 295 return ad4130_read_fifo(ad4130_dev_inst, data, samples);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 296 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 297
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 298 /*!
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 299 * @brief Read ADC raw data for recently sampled channel
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 300 * @param adc_data[in, out] - Pointer to adc data read variable
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 301 * @param input_chn[in] - Input channel (optional)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 302 * @return 0 in case of success, negative error code otherwise
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 303 * @note This function is intended to call from the conversion end trigger
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 304 * event. Therefore, this function should just read raw ADC data
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 305 * without further monitoring conversion end event.
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 306 * Continuous conversion mode is used to for this operation.
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 307 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 308 static int32_t adc_read_converted_sample(uint32_t *adc_data,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 309 uint8_t input_chn)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 310 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 311 if (!adc_data) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 312 return -EINVAL;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 313 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 314
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 315 /* Read the ADC data for previously sampled channel in sequencer */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 316 return ad413x_reg_read(ad4130_dev_inst, AD413X_REG_DATA, adc_data);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 317 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 318
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 319 /*!
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 320 * @brief Function to read the single ADC sample (raw data) for input channel
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 321 * @param input_chn[in] - Input channel to be sampled and read data for
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 322 * @param raw_data[in, out]- ADC raw data
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 323 * @return 0 in case of success, negative error code otherwise
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 324 * @note The single conversion mode is used to read a single sample
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 325 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 326 int32_t read_single_sample(uint8_t input_chn, uint32_t *adc_raw)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 327 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 328 uint32_t chn_mask = 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 329 uint8_t chn;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 330 int32_t ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 331
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 332 if (!adc_raw) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 333 return -EINVAL;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 334 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 335
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 336 /* Disable all active channels */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 337 for (chn = 0; chn < ADC_USER_CHANNELS; chn++) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 338 if (ad4130_dev_inst->ch[chn].enable) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 339 chn_mask |= (1 << chn);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 340
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 341 /* Disable the current channel */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 342 ret = ad413x_ch_en(ad4130_dev_inst, chn, 0);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 343 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 344 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 345 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 346 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 347 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 348
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 349 /* Enable user input channel */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 350 if (!ad4130_dev_inst->ch[input_chn].enable) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 351 ret = ad413x_ch_en(ad4130_dev_inst, input_chn, 1);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 352 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 353 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 354 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 355 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 356
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 357 /* Put device into single conversion mode */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 358 ret = ad413x_set_adc_mode(ad4130_dev_inst, AD413X_SINGLE_CONV_MODE);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 359 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 360 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 361 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 362
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 363 /* Monitor conversion and read the result */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 364 ret = ad413x_mon_conv_and_read_data(ad4130_dev_inst, adc_raw);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 365
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 366 /* Disable user input channel */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 367 ret = ad413x_ch_en(ad4130_dev_inst, input_chn, 0);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 368 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 369 return ret;
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 return 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 373 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 374
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 375 /********* Device Independent Data Capture Code Begin ************/
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 * @brief Reset the data capture specific variables
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 379 * @return none
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 380 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 381 static void reset_data_capture(void)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 382 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 383 /* Reset data capture flags */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 384 start_cont_data_capture = false;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 385 start_fifo_mode_data_capture = false;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 386 num_of_active_channels = 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 387 chn_indx = 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 388
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 389 /* Reset acquisition buffer states and clear old data */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 390 acq_buffer.state = BUF_EMPTY;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 391 acq_buffer.wr_indx = 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 392 acq_buffer.rd_indx = 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 393 acq_buffer.reindex_buffer = false;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 394 acq_buffer.wr_pdata = adc_data_buffer;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 395 acq_buffer.rd_pdata = adc_data_buffer;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 396 max_buffer_sz = DATA_BUFFER_SIZE;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 397 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 398
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 399 /*!
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 400 * @brief Function to prepare the data ADC capture for new READBUFF
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 401 * request from IIO client (for active channels)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 402 * @param ch_mask[in] - Channels to enable for data capturing
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 403 * @param sample_size[in] - Sample size in bytes
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 404 * @return 0 in case of success, negative error code otherwise
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 405 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 406 int32_t prepare_data_transfer(uint32_t ch_mask, uint8_t sample_size)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 407 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 408 int32_t ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 409
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 410 /* Reset data capture module specific flags and variables */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 411 reset_data_capture();
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 412
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 413 sample_size_in_bytes = sample_size;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 414
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 415 /* Store active channels */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 416 ret = adc_store_active_chns(ch_mask);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 417 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 418 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 419 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 420
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 421 #if (DATA_CAPTURE_MODE == CONTINUOUS_DATA_CAPTURE)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 422 /* Trigger continuous data capture */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 423 ret = adc_start_data_capture();
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 424 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 425 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 426 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 427
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 428 acq_buffer.state = BUF_AVAILABLE;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 429 start_cont_data_capture = true;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 430 #endif
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 431
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 432 return 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 433 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 434
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 435 /*!
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 436 * @brief Function to stop ADC data capture
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 int32_t end_data_transfer(void)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 440 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 441 int32_t ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 442 start_cont_data_capture = false;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 443
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 444 /* Stop data capture */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 445 ret = adc_stop_data_capture();
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 446 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 447 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 448 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 449
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 450 /* Reset data capture module specific flags and variables */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 451 reset_data_capture();
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 452
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 453 return 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 454 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 455
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 456 /*!
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 457 * @brief Perform buffer read operations to read requested samples
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 458 * @param nb_of_samples[in] - Requested number of samples to read
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 459 * @return 0 in case of success, negative error code otherwise
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 460 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 461 static int32_t buffer_read_operations(uint32_t nb_of_samples)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 462 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 463 uint32_t timeout = BUF_READ_TIMEOUT;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 464 int32_t offset;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 465
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 466 /* Wait until requested samples are available in the buffer to read */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 467 do {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 468 if (acq_buffer.wr_indx >= acq_buffer.rd_indx) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 469 offset = acq_buffer.wr_indx - acq_buffer.rd_indx;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 470 } else {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 471 offset = max_buffer_sz + (acq_buffer.wr_indx - acq_buffer.rd_indx);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 472 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 473
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 474 timeout--;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 475 } while ((offset < (int32_t)(nb_of_samples)) && (timeout > 0));
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 476
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 477 if (timeout == 0) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 478 /* This returns the empty buffer */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 479 return -EIO;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 480 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 481
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 482 if (acq_buffer.rd_indx >= max_buffer_sz) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 483 acq_buffer.rd_indx = 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 484 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 485
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 486 return 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 487 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 488
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 489 /*!
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 490 * @brief Perform buffer write operations such as buffer full or empty
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 491 * check, resetting buffer index and pointers, etc
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 492 * @return none
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 493 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 494 static void buffer_write_operations(void)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 495 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 496 acq_buffer.wr_indx++;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 497
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 498 /* Perform buffer full check and operations */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 499 if (acq_buffer.wr_indx >= max_buffer_sz) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 500 if ((acq_buffer.rd_indx >= num_of_requested_samples)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 501 && (acq_buffer.rd_indx != 0)) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 502 /* Reset buffer write index and write pointer when enough
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 503 * space available in the buffer to wrap to start */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 504 acq_buffer.wr_indx = 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 505 acq_buffer.wr_pdata = adc_data_buffer;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 506 if (acq_buffer.rd_indx >= max_buffer_sz) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 507 /* Wrap the read index and read pointer to start of buffer
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 508 * if buffer is completely read/emptied */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 509 acq_buffer.rd_indx = 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 510 acq_buffer.rd_pdata = adc_data_buffer;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 511 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 512
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 513 acq_buffer.state = BUF_AVAILABLE;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 514 } else {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 515 /* Wait until enough space available to wrap buffer write index
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 516 * at the start of buffer */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 517 acq_buffer.wr_indx = max_buffer_sz;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 518 acq_buffer.state = BUF_FULL;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 519 acq_buffer.reindex_buffer = true;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 520 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 521 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 522 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 523
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 524 /*!
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 525 * @brief This is an ISR (Interrupt Service Routine) to monitor end of conversion event.
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 526 * @param ctx[in] - Callback context (unused)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 527 * @return none
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 528 * @details This is an Interrupt callback function/ISR invoked in synchronous/asynchronous
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 529 * manner depending upon the application implementation. The conversion results
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 530 * are read into acquisition buffer and control continue to sample next channel.
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 531 * This continues until conversion is stopped (through IIO client command)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 532 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 533 void data_capture_callback(void *ctx)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 534 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 535 uint32_t adc_sample;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 536 volatile uint8_t *wr_addr;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 537
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 538 if (start_cont_data_capture == true) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 539 /* Read the sample for channel which has been sampled recently */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 540 if (!adc_read_converted_sample(&adc_sample,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 541 active_channels[chn_indx])) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 542 do {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 543 if (acq_buffer.state == BUF_AVAILABLE) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 544 if (acq_buffer.reindex_buffer) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 545 /* Buffer refilling must start with first active channel data
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 546 * for IIO client to synchronize the buffered data */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 547 if (chn_indx != 0) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 548 break;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 549 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 550 acq_buffer.reindex_buffer = false;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 551 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 552
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 553 /* Copy adc samples into acquisition buffer to transport over
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 554 * communication link */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 555 wr_addr = (volatile uint8_t *)(acq_buffer.wr_pdata + (acq_buffer.wr_indx *
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 556 sample_size_in_bytes));
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 557 memcpy((uint8_t *)wr_addr, &adc_sample, sample_size_in_bytes);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 558 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 559
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 560 /* Perform buffer write operations */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 561 buffer_write_operations();
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 562 } while (0);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 563
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 564 /* Track the count for recently sampled channel */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 565 chn_indx++;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 566 if (chn_indx >= num_of_active_channels) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 567 chn_indx = 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 568 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 569 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 570 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 571 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 572
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 573 /*!
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 574 * @brief This is an ISR (Interrupt Service Routine) to monitor FIFO data available event.
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 575 * This function is expected to be called asynchronously when data from internal device
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 576 * FIFO is available to read.
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 577 * @param ctx[in] - Callback context (unused)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 578 * @return none
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 579 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 580 void fifo_data_capture_callback(void *ctx)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 581 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 582 if (start_fifo_mode_data_capture) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 583 fifo_data_available = true;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 584 }
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 * @brief Capture requested number of ADC samples in burst mode
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 589 * @param pbuf[out] - Pointer to ADC data buffer
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 590 * @param nb_of_samples[in] - Number of samples to be read
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 591 * @return 0 in case of success, negative error code otherwise
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 592 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 593 static int32_t read_burst_data(int8_t *pbuf, uint32_t nb_of_samples)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 594 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 595 uint32_t sample_indx = 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 596 uint32_t adc_raw;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 597 int32_t ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 598
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 599 if (!pbuf) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 600 return -EINVAL;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 601 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 602
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 603 ret = adc_start_data_capture();
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 604 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 605 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 606 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 607
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 608 while (sample_indx < nb_of_samples) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 609 ret = adc_read_single_sample(&adc_raw);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 610 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 611 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 612 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 613
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 614 /* Copy adc samples into acquisition buffer to transport over
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 615 * communication link */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 616 memcpy((uint8_t *)pbuf, &adc_raw, sample_size_in_bytes);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 617 pbuf += sample_size_in_bytes;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 618
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 619 sample_indx++;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 620 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 621
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 622 /* Stop any active conversion */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 623 ret = adc_stop_data_capture();
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 624 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 625 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 626 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 627
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 628 return 0;
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 * @brief Capture requested number of ADC samples in FIFO mode
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 633 * @param pbuf[in] - Input buffer
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 634 * @param nb_of_samples[in] - Number of samples to read
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 635 * @return 0 in case of success, negative error code otherwise
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 636 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 637 static int32_t read_fifo_data(int8_t *pbuf,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 638 uint32_t nb_of_samples)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 639 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 640 uint32_t sample_cnt;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 641 uint32_t remaining_samples = nb_of_samples;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 642 uint32_t timeout = BUF_READ_TIMEOUT;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 643 int32_t ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 644
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 645 if (!pbuf) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 646 return -EINVAL;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 647 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 648
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 649 fifo_data_available = false;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 650
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 651 ret = adc_start_fifo_data_capture();
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 652 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 653 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 654 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 655
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 656 /* Read all requeted samples into acquisition buffer */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 657 do {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 658 /* Wait for new FIFO event */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 659 timeout = BUF_READ_TIMEOUT;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 660 do {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 661 timeout--;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 662 } while ((!fifo_data_available) && (timeout > 0));
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 663
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 664 if (timeout == 0) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 665 return -EIO;
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 fifo_data_available = false;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 669
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 670 if (remaining_samples > FIFO_SIZE) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 671 nb_of_samples = FIFO_SIZE;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 672 remaining_samples -= nb_of_samples;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 673 } else {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 674 nb_of_samples = remaining_samples;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 675 remaining_samples = 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 676 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 677
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 678 /* Read data from FIFO and store into local buffer */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 679 ret = adc_read_fifo(fifo_data, nb_of_samples);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 680 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 681 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 682 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 683
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 684 /* Read offloaded FIFO data and store into acquisition buffer */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 685 for (sample_cnt = 0; sample_cnt < nb_of_samples; sample_cnt++) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 686 memcpy(pbuf, &fifo_data[sample_cnt], sample_size_in_bytes);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 687 pbuf += sample_size_in_bytes;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 688 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 689 } while (remaining_samples > 0);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 690
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 691 /* Stop any active conversion */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 692 ret = adc_stop_data_capture();
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 693 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 694 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 695 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 696
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 697 return 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 698 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 699
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 700 /*!
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 701 * @brief Read requested number of ADC samples in continuous mode
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 702 * @param pbuf[in] - Pointer to data buffer
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 703 * @param nb_of_samples[in] - Number of samples to read
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 704 * @return 0 in case of success, negative error code otherwise
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 705 * @note The actual sample capturing happens through interrupt. This
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 706 * function tracks the buffer read pointer to read block of data
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 707 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 708 static int32_t read_continuous_conv_data(int8_t **pbuf, uint32_t nb_of_samples)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 709 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 710 volatile int8_t *rd_addr;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 711 int32_t ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 712
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 713 if (!pbuf) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 714 return -EINVAL;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 715 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 716
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 717 /* Determine the max available buffer size based on the requested
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 718 * samples count and actual avilable buffer size. Buffer should be
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 719 * capable of holding all requested 'n' samples from previous write
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 720 * index upto to the end of buffer, as data is read linearly
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 721 * from adc buffer in IIO library.
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 722 * E.g. If actual buffer size is 2048 samples and requested samples
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 723 * are 1600, max available buffer size is actually 1600. So in given
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 724 * iteration, only 1600 samples will be stored into buffer and after
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 725 * that buffer indexes will be wrapped to a start of buffer. If index
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 726 * is not wrapped, the next 1600 requested samples won't accomodate into
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 727 * remaining 448 samples space. As buffer is read in linear fashion, the
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 728 * read index can't be wrapped to start of buffer to read remaining samples.
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 729 * So max available space in this case is 2048 but only utilized space
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 730 * will be 1600 in single read buffer request from IIO client.
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 731 **/
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 732 max_buffer_sz = ((DATA_BUFFER_SIZE / sample_size_in_bytes) /
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 733 nb_of_samples) * nb_of_samples;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 734
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 735 ret = buffer_read_operations(nb_of_samples);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 736 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 737 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 738 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 739
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 740 /* Get the next read address */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 741 rd_addr = (volatile int8_t *)(acq_buffer.rd_pdata + (acq_buffer.rd_indx *
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 742 sample_size_in_bytes));
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 743 acq_buffer.rd_indx += nb_of_samples;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 744
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 745 /* Update the IIO buffer pointer to point to next read start location */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 746 *pbuf = rd_addr;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 747
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 748 return 0;
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 /*!
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 752 * @brief Function to read the ADC buffered raw data requested
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 753 * by IIO client
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 754 * @param pbuf[in] - Pointer to data buffer
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 755 * @param nb_of_bytes[in] - Number of bytes to read
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 756 * @return 0 in case of success, negative error code otherwise
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 757 */
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 758 int32_t read_buffered_data(int8_t **pbuf, uint32_t nb_of_bytes)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 759 {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 760 int32_t ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 761 num_of_requested_samples = nb_of_bytes / sample_size_in_bytes;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 762
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 763 #if (DATA_CAPTURE_MODE == BURST_DATA_CAPTURE)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 764 ret = read_burst_data(*pbuf, num_of_requested_samples);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 765 #elif (DATA_CAPTURE_MODE == FIFO_DATA_CAPTURE)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 766 ret = read_fifo_data(*pbuf, num_of_requested_samples);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 767 #else
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 768 ret = read_continuous_conv_data(pbuf, num_of_requested_samples);
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 769 #endif
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 770
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 771 if (ret) {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 772 return ret;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 773 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 774
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 775 return 0;
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 776 }