AD4130 Mbed IIO Firmware
Dependencies: tempsensors sdp_k1_sdram
app/ad4130_data_capture.c@2:871d585d96ee, 2022-07-15 (annotated)
- Committer:
- MPhalke@MPHALKE-L02.ad.analog.com
- Date:
- Fri Jul 15 17:47:44 2022 +0530
- Revision:
- 2:871d585d96ee
AD4130 firmware - initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 1 | /***************************************************************************//** |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 2 | * @file ad4130_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 | } |