257 lines
5.3 KiB
C
257 lines
5.3 KiB
C
// Copyright 2020-2021 Beken
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
#pragma once
|
|
|
|
#include <soc/soc.h>
|
|
#include "adc_hw.h"
|
|
#include "system_hw.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#define ADC_LL_REG_BASE(_adc_unit_id) (SOC_SADC_REG_BASE)
|
|
#define ANALOG_CHANNEL 0x0B81
|
|
|
|
static inline void adc_ll_soft_reset(adc_hw_t *hw)
|
|
{
|
|
hw->global_ctrl.soft_reset = 1;
|
|
}
|
|
|
|
static inline uint32_t adc_ll_get_device_id(adc_hw_t *hw)
|
|
{
|
|
return hw->dev_id;
|
|
}
|
|
|
|
static inline uint32_t adc_ll_get_version_id(adc_hw_t *hw)
|
|
{
|
|
return hw->dev_version;
|
|
}
|
|
|
|
static inline uint32_t adc_ll_get_dev_status(adc_hw_t *hw)
|
|
{
|
|
return hw->dev_status;
|
|
}
|
|
static inline void adc_ll_init(adc_hw_t *hw)
|
|
{
|
|
adc_ll_soft_reset(hw);
|
|
hw->ctrl.v = 0;
|
|
//update gadc configure for saradc when clock on, remove it if use sdmadc
|
|
//keep it without recovery since there would be only one gadc finally
|
|
sys_ll_set_ana_reg2_sp_nt_ctrl(0x3);
|
|
sys_ll_set_ana_reg2_gadc_refbuf_ictrl(0x2);
|
|
}
|
|
|
|
static inline void adc_ll_deinit(adc_hw_t *hw)
|
|
{
|
|
hw->ctrl.v = 0;
|
|
hw->sat_ctrl.v = 0;
|
|
hw->steady_ctrl.v = 0;
|
|
}
|
|
|
|
static inline void adc_ll_set_sleep_mode(adc_hw_t *hw)
|
|
{
|
|
hw->ctrl.adc_mode = 0;
|
|
}
|
|
|
|
static inline void adc_ll_set_single_step_mode(adc_hw_t *hw)
|
|
{
|
|
hw->ctrl.adc_mode = 1;
|
|
}
|
|
|
|
static inline void adc_ll_set_software_control_mode(adc_hw_t *hw)
|
|
{
|
|
hw->ctrl.adc_mode = 2;
|
|
}
|
|
|
|
static inline void adc_ll_set_continuous_mode(adc_hw_t *hw)
|
|
{
|
|
hw->ctrl.adc_mode = 3;
|
|
}
|
|
|
|
static inline uint32_t adc_ll_get_adc_mode(adc_hw_t *hw)
|
|
{
|
|
return (hw->ctrl.adc_mode & 0x03);
|
|
}
|
|
|
|
static inline void adc_ll_enable(adc_hw_t *hw)
|
|
{
|
|
hw->ctrl.adc_en = 1;
|
|
}
|
|
|
|
static inline void adc_ll_disable(adc_hw_t *hw)
|
|
{
|
|
hw->ctrl.adc_en = 0;
|
|
}
|
|
|
|
static inline void adc_ll_sel_channel(adc_hw_t *hw, uint32_t id)
|
|
{
|
|
hw->ctrl.adc_channel = (id & 0xFF);
|
|
}
|
|
|
|
static inline void adc_ll_wait_4_cycle(adc_hw_t *hw)
|
|
{
|
|
hw->ctrl.adc_setting = 0;
|
|
}
|
|
|
|
static inline void adc_ll_wait_8_cycle(adc_hw_t *hw)
|
|
{
|
|
hw->ctrl.adc_setting = 1;
|
|
}
|
|
|
|
static inline void adc_ll_clear_int_status(adc_hw_t *hw)
|
|
{
|
|
hw->ctrl.adc_int_clear = 1;
|
|
}
|
|
|
|
static inline void adc_ll_enable_32m_clk(adc_hw_t *hw)
|
|
{
|
|
hw->ctrl.adc_32m_mode = 1;
|
|
}
|
|
|
|
static inline void adc_ll_disable_32m_clk(adc_hw_t *hw)
|
|
{
|
|
hw->ctrl.adc_32m_mode = 0;
|
|
}
|
|
|
|
static inline void adc_ll_set_pre_div(adc_hw_t *hw, uint32_t div)
|
|
{
|
|
hw->ctrl.adc_div = (div & 0x3F);
|
|
}
|
|
|
|
static inline void adc_ll_set_sample_rate(adc_hw_t *hw, uint32_t sample_rate)
|
|
{
|
|
hw->ctrl.adc_samp_rate = (sample_rate & 0x3F);
|
|
}
|
|
|
|
static inline void adc_ll_set_adc_filter(adc_hw_t *hw, uint32_t filter)
|
|
{
|
|
hw->ctrl.adc_filter = (filter & 0x7F);
|
|
}
|
|
|
|
static inline bool adc_ll_check_adc_busy(adc_hw_t *hw)
|
|
{
|
|
return !!(hw->ctrl.adc_busy) ;
|
|
}
|
|
|
|
static inline bool adc_ll_is_fifo_empty(adc_hw_t *hw)
|
|
{
|
|
return !!(hw->ctrl.fifo_empty) ;
|
|
}
|
|
|
|
static inline bool adc_ll_is_fifo_full(adc_hw_t *hw)
|
|
{
|
|
return !!(hw->ctrl.fifo_full) ;
|
|
}
|
|
|
|
static inline uint32_t adc_ll_get_adc_raw_data(adc_hw_t *hw)
|
|
{
|
|
return hw->adc_raw_data ;
|
|
}
|
|
|
|
static inline void adc_ll_set_fifo_threshold(adc_hw_t *hw, uint32_t value)
|
|
{
|
|
if(value >= 32)
|
|
value = 0x1F;
|
|
|
|
hw->steady_ctrl.fifo_level = (value & 0x1F);
|
|
}
|
|
|
|
static inline void adc_ll_set_steady_ctrl(adc_hw_t *hw, uint32_t value)
|
|
{
|
|
hw->steady_ctrl.steady_ctrl = (value & 0x7);
|
|
}
|
|
|
|
//bk7231n :this sat_enable value set const to same as other soc
|
|
static inline void adc_ll_set_sat_ctrl(adc_hw_t *hw, uint32_t value)
|
|
{
|
|
hw->sat_ctrl.sat_ctrl = (value & 0x03);
|
|
}
|
|
|
|
static inline uint32_t adc_ll_get_sat_ctrl(adc_hw_t *hw)
|
|
{
|
|
return (hw->sat_ctrl.sat_ctrl & 0x03);
|
|
}
|
|
|
|
static inline void adc_ll_enable_sat_process(adc_hw_t *hw)
|
|
{
|
|
hw->sat_ctrl.sat_enable = 1;
|
|
}
|
|
|
|
static inline void adc_ll_disable_sat_process(adc_hw_t *hw)
|
|
{
|
|
hw->sat_ctrl.sat_enable = 0;
|
|
}
|
|
|
|
static inline bool adc_ll_is_over_flow(adc_hw_t *hw)
|
|
{
|
|
return !!(hw->sat_ctrl.over_flow) ;
|
|
}
|
|
|
|
static inline uint16_t adc_ll_get_adc_data(adc_hw_t *hw)
|
|
{
|
|
return (hw->adc_data.adc_data_16 & 0xFFFF);
|
|
}
|
|
|
|
static inline bool adc_ll_check_adc_enable(adc_hw_t *hw)
|
|
{
|
|
return !!(hw->ctrl.adc_en);
|
|
}
|
|
|
|
static inline void adc_ll_enable_bypass_calib(adc_hw_t *hw)
|
|
{
|
|
hw->steady_ctrl.bypass_calibration = 1;
|
|
}
|
|
|
|
static inline void adc_ll_disable_bypass_calib(adc_hw_t *hw)
|
|
{
|
|
hw->steady_ctrl.bypass_calibration = 0;
|
|
}
|
|
|
|
static inline bool adc_ll_is_analog_channel(adc_hw_t *hw, int id)
|
|
{
|
|
//channel function
|
|
//ADC0 Vbat
|
|
//ADC1 GPIO25
|
|
//ADC2 GPIO24
|
|
//ADC3 GPIO23
|
|
//ADC4 GPIO28
|
|
//ADC5 GPIO22
|
|
//ADC6 GPIO21
|
|
//ADC7 vtemp
|
|
//ADC8 tssio
|
|
//ADC9 touch
|
|
//ADC10 GPIO8
|
|
//ADC11 vpeak_lo
|
|
//ADC12 GPIO0
|
|
//ADC13 GPIO1
|
|
//ADC14 GPIO12
|
|
//ADC15 GPIO13
|
|
//analog channel map: B00001011 10000001 = 0x0B81
|
|
return (ANALOG_CHANNEL & (1 << id));
|
|
}
|
|
|
|
static inline bool adc_ll_is_digital_channel(adc_hw_t *hw, int id)
|
|
{
|
|
//digital channel map: B11110100 01111110 = 0x0B81
|
|
return ((~ANALOG_CHANNEL) & (1 << id));
|
|
}
|
|
|
|
#define ADC_INIT_SATURATE_MODE ADC_SATURATE_MODE_1
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|