| /** |
| * Synopsys DesignWare Sensor and Control IP Subsystem IO Software Driver and |
| * documentation (hereinafter, "Software") is an Unsupported proprietary work |
| * of Synopsys, Inc. unless otherwise expressly agreed to in writing between |
| * Synopsys and you. |
| * |
| * The Software IS NOT an item of Licensed Software or Licensed Product under |
| * any End User Software License Agreement or Agreement for Licensed Product |
| * with Synopsys or any supplement thereto. You are permitted to use and |
| * redistribute this Software in source and binary forms, with or without |
| * modification, provided that redistributions of source code must retain this |
| * notice. You may not view, use, disclose, copy or distribute this file or |
| * any information contained herein except pursuant to this license grant from |
| * Synopsys. If you do not agree with this notice, including the disclaimer |
| * below, then you are not authorized to use the Software. |
| * |
| * THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" BASIS |
| * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| * ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS BE LIABLE FOR ANY DIRECT, |
| * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
| * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
| * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
| * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
| * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH |
| * DAMAGE. |
| */ |
| |
| /** |
| * @file |
| * |
| * @brief Designware ADC header file |
| */ |
| |
| #ifndef DW_ADC_H_ |
| #define DW_ADC_H_ |
| |
| #include <zephyr/types.h> |
| #include <adc.h> |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| /** |
| * ADC driver name. |
| * |
| * Name for the singleton instance of the ADC driver. |
| * |
| */ |
| #define ADC_DRV_NAME "adc" |
| |
| /** |
| * Number of buffers. |
| * |
| * Number of reception buffers to be supported by the driver. |
| */ |
| #define BUFS_NUM 32 |
| |
| /* EAI ADC device registers */ |
| #define ADC_SET (0x00) |
| #define ADC_DIVSEQSTAT (0x01) |
| #define ADC_SEQ (0x02) |
| #define ADC_CTRL (0x03) |
| #define ADC_INTSTAT (0x04) |
| #define ADC_SAMPLE (0x05) |
| |
| /* Sensor Subsystem Interrupt Routing Mask */ |
| #define INT_SS_ADC_ERR_MASK (0x400) |
| #define INT_SS_ADC_IRQ_MASK (0x404) |
| |
| /* ADC Specific macros */ |
| #define ADC_POP_SAMPLE (0x80000000) |
| #define ADC_FLUSH_RX (0x40000000) |
| #define ADC_FTL_SET_MASK (0x00ffffff) |
| #define ADC_SEQ_SIZE_SET_MASK (0x3fc0ffff) |
| #define ADC_SEQ_MODE_SET_MASK (0x3fffdfff) |
| #define ADC_CONFIG_SET_MASK (0x3fffe000) |
| #define ADC_CLK_RATIO_MASK (0x1fffff) |
| #define ADC_CLR_UNDRFLOW (1 << 18) |
| #define ADC_CLR_OVERFLOW (1 << 17) |
| #define ADC_CLR_DATA_A (1 << 16) |
| #define ADC_SEQ_TABLE_RST (0x0040) |
| #define ADC_SEQ_PTR_RST (0x0020) |
| #define ADC_SEQ_START (0x0010) |
| #define ADC_SEQ_STOP_MASK (0x078ec) |
| #define ADC_INT_ENA_MASK (0x001e) |
| #define ADC_INT_DSB (0x0F00) |
| #define ADC_INT_ENABLE (0x0000) |
| #define ADC_CLK_ENABLE (0x0004) |
| #define ADC_ENABLE (0x0002) |
| #define ADC_DISABLE (0x0) |
| #define ADC_RESET (0x1) |
| #define ADC_INT_DATA_A (0x1) |
| #define ADC_INT_ERR (0x6) |
| #define ADC_NONE_CALIBRATION (0x80) |
| #define ADC_NONE_DUMMY (0x00) |
| #define ADC_DONE_DUMMY (0x01) |
| |
| #define ADC_STATE_CLOSED 0 |
| #define ADC_STATE_DISABLED 1 |
| #define ADC_STATE_IDLE 2 |
| #define ADC_STATE_SAMPLING 3 |
| #define ADC_STATE_ERROR 4 |
| |
| #define ADC_CMD_RESET_CALIBRATION 2 |
| #define ADC_CMD_START_CALIBRATION 3 |
| #define ADC_CMD_LOAD_CALIBRATION 4 |
| |
| /* ADC control commands */ |
| #define IO_ADC0_FS (32) |
| #define IO_ADC0_SE (32) |
| |
| #define IO_ADC_SET_CLK_DIVIDER (0x20) |
| #define IO_ADC_SET_CONFIG (0x21) |
| #define IO_ADC_SET_SEQ_TABLE (0x22) |
| #define IO_ADC_SET_SEQ_MODE (0x23) |
| #define IO_ADC_SET_SEQ_STOP (0x24) |
| #define IO_ADC_SET_RX_THRESHOLD (0x25) |
| |
| #define IO_ADC_INPUT_SINGLE_END 0 |
| #define IO_ADC_INPUT_DIFF 1 |
| #define IO_ADC_OUTPUT_PARAL 0 |
| #define IO_ADC_OUTPUT_SERIAL 1 |
| #define IO_ADC_CAPTURE_RISING_EDGE 0 |
| #define IO_ADC_CAPTURE_FALLING_EDGE 1 |
| |
| #define IO_ADC_SEQ_MODE_SINGLESHOT 0 |
| #define IO_ADC_SEQ_MODE_REPETITIVE 1 |
| |
| #define ENABLE_SSS_INTERRUPTS ~(0x01 << 8) |
| #define ENABLE_ADC (ADC_INT_ENABLE | ADC_CLK_ENABLE | ADC_SEQ_TABLE_RST) |
| #define START_ADC_SEQ (ADC_SEQ_START | ADC_ENABLE | ADC_CLK_ENABLE) |
| #define RESUME_ADC_CAPTURE (ADC_INT_DSB|ADC_CLK_ENABLE|ADC_SEQ_PTR_RST) |
| #define FLUSH_ADC_ERRORS (ADC_INT_DSB|ADC_CLK_ENABLE|ADC_CLR_OVERFLOW|ADC_CLR_UNDRFLOW) |
| |
| /** mV = 3.3V*/ |
| #define ADC_VREF 3300 |
| |
| /** |
| * |
| * @brief Converts ADC raw data into mV |
| * |
| * The ADC raw data readings are converted into mV: |
| * result = (data * ADC_VREF) / (2^resolution). |
| * |
| * @param _data_ Raw data to be converted. |
| * @param _resolution_ Resolution used during the data sampling. |
| * |
| * @return data read in mVolts. |
| */ |
| #define ss_adc_data_to_mv(_data_, _resolution_) \ |
| ((_data_ * ADC_VREF) / (1 << _resolution_)) |
| |
| typedef void (*adc_dw_config_t)(void); |
| /** @brief ADC configuration |
| * This structure defines the ADC configuration values |
| * that define the ADC hardware instance and configuration. |
| */ |
| struct adc_config { |
| /**Register base address for hardware registers.*/ |
| u32_t reg_base; |
| /**IIO address for the IRQ mask register.*/ |
| u32_t reg_irq_mask; |
| /**IIO address for the error mask register.*/ |
| u32_t reg_err_mask; |
| /**Output mode*/ |
| u8_t out_mode; |
| /**Capture mode*/ |
| u8_t capture_mode; |
| /**Sequence mode*/ |
| u8_t seq_mode; |
| /**Serial delay*/ |
| u8_t serial_dly; |
| /**Sample width*/ |
| u8_t sample_width; |
| u8_t padding[3]; |
| /**Clock ratio*/ |
| u32_t clock_ratio; |
| /**Config handler*/ |
| adc_dw_config_t config_func; |
| }; |
| |
| /**@brief ADC information and data. |
| * |
| * This structure defines the data that will be used |
| * during driver execution. |
| */ |
| struct adc_info { |
| struct k_sem device_sync_sem; |
| #ifdef CONFIG_ADC_DW_REPETITIVE |
| /**Current reception buffer index*/ |
| u8_t index[BUFS_NUM]; |
| #endif |
| /**Sequence entries' array*/ |
| struct adc_seq_entry *entries; |
| /**State of execution of the driver*/ |
| u8_t state; |
| /**Sequence size*/ |
| u8_t seq_size; |
| #ifdef CONFIG_ADC_DW_CALIBRATION |
| /**Calibration value*/ |
| u8_t calibration_value; |
| #endif |
| #ifdef CONFIG_ADC_DW_DUMMY_CONVERSION |
| u8_t dummy_conversion; |
| #endif |
| |
| }; |
| |
| |
| /** |
| * |
| * @brief ADC Initialization function. |
| * |
| * Inits device model for the ADC IP from Dataware. |
| * |
| * @param dev Pointer to the device structure descriptor that |
| * will be initialized. |
| * |
| * @return Integer: 0 for success, error otherwise. |
| */ |
| int adc_dw_init(struct device *dev); |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif /* DW_ADC_H_ */ |