refactor(rng): refactor to use hal/ll apis for P4

This commit is contained in:
gaoxu
2025-05-13 09:09:06 +08:00
parent 719b1b2be0
commit b691eaba6d
7 changed files with 122 additions and 95 deletions

View File

@@ -10,6 +10,8 @@
#include "hal/adc_types.h" #include "hal/adc_types.h"
#include "esp_private/regi2c_ctrl.h" #include "esp_private/regi2c_ctrl.h"
#define I2C_SAR_ADC_INIT_CODE_VAL 2150
void bootloader_random_enable(void) void bootloader_random_enable(void)
{ {
adc_ll_reset_register(); adc_ll_reset_register();
@@ -29,8 +31,8 @@ void bootloader_random_enable(void)
ANALOG_CLOCK_ENABLE(); ANALOG_CLOCK_ENABLE();
adc_ll_regi2c_init(); adc_ll_regi2c_init();
adc_ll_set_calibration_param(ADC_UNIT_1, 0x866); adc_ll_set_calibration_param(ADC_UNIT_1, I2C_SAR_ADC_INIT_CODE_VAL);
adc_ll_set_calibration_param(ADC_UNIT_2, 0x866); adc_ll_set_calibration_param(ADC_UNIT_2, I2C_SAR_ADC_INIT_CODE_VAL);
adc_digi_pattern_config_t pattern_config = {}; adc_digi_pattern_config_t pattern_config = {};
pattern_config.unit = ADC_UNIT_1; pattern_config.unit = ADC_UNIT_1;

View File

@@ -10,6 +10,8 @@
#include "hal/adc_types.h" #include "hal/adc_types.h"
#include "esp_private/regi2c_ctrl.h" #include "esp_private/regi2c_ctrl.h"
#define I2C_SAR_ADC_INIT_CODE_VAL 2150
void bootloader_random_enable(void) void bootloader_random_enable(void)
{ {
adc_ll_reset_register(); adc_ll_reset_register();
@@ -29,8 +31,8 @@ void bootloader_random_enable(void)
ANALOG_CLOCK_ENABLE(); ANALOG_CLOCK_ENABLE();
adc_ll_regi2c_init(); adc_ll_regi2c_init();
adc_ll_set_calibration_param(ADC_UNIT_1, 0x866); adc_ll_set_calibration_param(ADC_UNIT_1, I2C_SAR_ADC_INIT_CODE_VAL);
adc_ll_set_calibration_param(ADC_UNIT_2, 0x866); adc_ll_set_calibration_param(ADC_UNIT_2, I2C_SAR_ADC_INIT_CODE_VAL);
adc_digi_pattern_config_t pattern_config = {}; adc_digi_pattern_config_t pattern_config = {};
pattern_config.unit = ADC_UNIT_2; pattern_config.unit = ADC_UNIT_2;

View File

@@ -10,6 +10,8 @@
#include "hal/adc_types.h" #include "hal/adc_types.h"
#include "esp_private/regi2c_ctrl.h" #include "esp_private/regi2c_ctrl.h"
#define I2C_SAR_ADC_INIT_CODE_VAL 2150
void bootloader_random_enable(void) void bootloader_random_enable(void)
{ {
adc_ll_reset_register(); adc_ll_reset_register();
@@ -29,8 +31,8 @@ void bootloader_random_enable(void)
ANALOG_CLOCK_ENABLE(); ANALOG_CLOCK_ENABLE();
adc_ll_regi2c_init(); adc_ll_regi2c_init();
adc_ll_set_calibration_param(ADC_UNIT_1, 0x866); adc_ll_set_calibration_param(ADC_UNIT_1, I2C_SAR_ADC_INIT_CODE_VAL);
adc_ll_set_calibration_param(ADC_UNIT_2, 0x866); adc_ll_set_calibration_param(ADC_UNIT_2, I2C_SAR_ADC_INIT_CODE_VAL);
adc_digi_pattern_config_t pattern_config = {}; adc_digi_pattern_config_t pattern_config = {};
pattern_config.unit = ADC_UNIT_1; pattern_config.unit = ADC_UNIT_1;

View File

@@ -10,6 +10,8 @@
#include "hal/adc_types.h" #include "hal/adc_types.h"
#include "esp_private/regi2c_ctrl.h" #include "esp_private/regi2c_ctrl.h"
#define I2C_SAR_ADC_INIT_CODE_VAL 2150
void bootloader_random_enable(void) void bootloader_random_enable(void)
{ {
adc_ll_reset_register(); adc_ll_reset_register();
@@ -29,8 +31,8 @@ void bootloader_random_enable(void)
ANALOG_CLOCK_ENABLE(); ANALOG_CLOCK_ENABLE();
adc_ll_regi2c_init(); adc_ll_regi2c_init();
adc_ll_set_calibration_param(ADC_UNIT_1, 0x866); adc_ll_set_calibration_param(ADC_UNIT_1, I2C_SAR_ADC_INIT_CODE_VAL);
adc_ll_set_calibration_param(ADC_UNIT_2, 0x866); adc_ll_set_calibration_param(ADC_UNIT_2, I2C_SAR_ADC_INIT_CODE_VAL);
adc_digi_pattern_config_t pattern_config = {}; adc_digi_pattern_config_t pattern_config = {};
pattern_config.atten = ADC_ATTEN_DB_2_5; pattern_config.atten = ADC_ATTEN_DB_2_5;

View File

@@ -3,106 +3,70 @@
* *
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
#include "sdkconfig.h"
#include "bootloader_random.h" #include "bootloader_random.h"
#include "soc/soc.h" #include "hal/regi2c_ctrl_ll.h"
#include "soc/adc_reg.h" #include "hal/adc_ll.h"
#include "soc/pmu_reg.h" #include "hal/adc_types.h"
#include "soc/regi2c_saradc.h"
#include "soc/hp_sys_clkrst_reg.h"
#include "soc/lp_adc_reg.h"
#include "esp_private/regi2c_ctrl.h"
#include "esp_rom_regi2c.h"
// TODO IDF-6497: once ADC API is supported, use the API instead of defining functions and constants here #include "esp_private/periph_ctrl.h"
#include "esp_private/adc_share_hw_ctrl.h"
#define I2C_SAR_ADC_INIT_CODE_VAL 2166 #define I2C_SAR_ADC_INIT_CODE_VAL 2166
typedef struct {
int atten;
int channel;
} pattern_item;
typedef struct {
pattern_item item[4];
} pattern_table;
static void adc1_fix_initcode_set(uint32_t initcode_value)
{
uint32_t msb = initcode_value >> 8;
uint32_t lsb = initcode_value & 0xff;
REGI2C_WRITE_MASK(I2C_SAR_ADC, ADC_SAR1_INITIAL_CODE_HIGH_ADDR, msb);
REGI2C_WRITE_MASK(I2C_SAR_ADC, ADC_SAR1_INITIAL_CODE_LOW_ADDR, lsb);
}
//total 4 tables
static void hpadc_sar1_pattern_table_cfg(unsigned int table_idx, pattern_table table)
{
uint32_t wdata = 0;
wdata = (table.item[0].channel << 20 | table.item[0].atten << 18 |
table.item[1].channel << 14|table.item[1].atten << 12 |
table.item[2].channel << 8 |table.item[2].atten << 6 |
table.item[3].channel << 2 |table.item[3].atten);
WRITE_PERI_REG(ADC_SAR1_PATT_TAB1_REG + table_idx * 4, wdata);
}
void bootloader_random_enable(void) void bootloader_random_enable(void)
{ {
pattern_table sar1_table[4] = {}; _adc_ll_reset_register();
uint32_t pattern_len = 0; _adc_ll_enable_bus_clock(true);
SET_PERI_REG_MASK(HP_SYS_CLKRST_SOC_CLK_CTRL2_REG, HP_SYS_CLKRST_REG_ADC_APB_CLK_EN); adc_ll_digi_clk_sel(ADC_DIGI_CLK_SRC_XTAL);
SET_PERI_REG_MASK(HP_SYS_CLKRST_PERI_CLK_CTRL23_REG, HP_SYS_CLKRST_REG_ADC_CLK_EN); adc_ll_digi_controller_clk_div(0, 0, 0);
SET_PERI_REG_MASK(RTCADC_MEAS1_MUX_REG, RTCADC_SAR1_DIG_FORCE); // some ADC sensor registers are in power group PERIF_I2C and need to be enabled via PMU
SET_PERI_REG_MASK(PMU_RF_PWC_REG,PMU_XPD_PERIF_I2C); #ifndef BOOTLOADER_BUILD
regi2c_saradc_enable();
uint32_t sar1_clk_div_num = GET_PERI_REG_BITS2((HP_SYS_CLKRST_PERI_CLK_CTRL24_REG), #else
(HP_SYS_CLKRST_REG_ADC_SAR1_CLK_DIV_NUM_M), regi2c_ctrl_ll_i2c_sar_periph_enable();
(HP_SYS_CLKRST_REG_ADC_SAR1_CLK_DIV_NUM_S)); #endif
SET_PERI_REG_MASK(ADC_CTRL_REG_REG, ADC_START_FORCE); //start force 1
// enable analog i2c master clock for RNG runtime // enable analog i2c master clock for RNG runtime
ANALOG_CLOCK_ENABLE(); ANALOG_CLOCK_ENABLE();
adc1_fix_initcode_set(I2C_SAR_ADC_INIT_CODE_VAL); adc_ll_regi2c_init();
adc_ll_set_calibration_param(ADC_UNIT_1, I2C_SAR_ADC_INIT_CODE_VAL);
// cfg pattern table adc_digi_pattern_config_t pattern_config = {};
sar1_table[0].item[0].channel = 10; //rand() % 6; pattern_config.unit = ADC_UNIT_1;
sar1_table[0].item[0].atten = 3; pattern_config.atten = ADC_ATTEN_DB_12;
sar1_table[0].item[1].channel = 10; pattern_config.channel = ADC_CHANNEL_10;
sar1_table[0].item[1].atten = 3; adc_ll_digi_set_pattern_table(ADC_UNIT_1, 0, pattern_config);
sar1_table[0].item[2].channel = 10; adc_ll_digi_set_pattern_table(ADC_UNIT_1, 1, pattern_config);
sar1_table[0].item[2].atten = 3; adc_ll_digi_set_pattern_table(ADC_UNIT_1, 2, pattern_config);
sar1_table[0].item[3].channel = 10; adc_ll_digi_set_pattern_table(ADC_UNIT_1, 3, pattern_config);
sar1_table[0].item[3].atten = 3; adc_ll_digi_set_pattern_table_len(ADC_UNIT_1, 1);
hpadc_sar1_pattern_table_cfg(0, sar1_table[0]); adc_ll_set_controller(ADC_UNIT_1, ADC_LL_CTRL_DIG);
SET_PERI_REG_BITS(ADC_CTRL_REG_REG, ADC_SAR1_PATT_LEN, pattern_len, ADC_SAR1_PATT_LEN_S); adc_ll_digi_set_power_manage(ADC_UNIT_1, ADC_LL_POWER_SW_ON);
SET_PERI_REG_BITS(ADC_CTRL_REG_REG, ADC_XPD_SAR1_FORCE, 3, ADC_XPD_SAR1_FORCE_S); adc_ll_digi_set_clk_div(15);
SET_PERI_REG_BITS(ADC_CTRL_REG_REG, ADC_XPD_SAR2_FORCE, 3, ADC_XPD_SAR2_FORCE_S); adc_ll_digi_set_trigger_interval(100);
adc_ll_digi_trigger_enable();
REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SAR_ADC_ENT_VDD_GRP1, 1);
REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SAR_ADC_DTEST_VDD_GRP1, 0);
CLEAR_PERI_REG_MASK(ADC_CTRL_REG_REG, ADC_START_FORCE);
SET_PERI_REG_MASK(ADC_CTRL2_REG, ADC_TIMER_EN);
SET_PERI_REG_BITS(ADC_CTRL2_REG, ADC_TIMER_TARGET, sar1_clk_div_num * 25, ADC_TIMER_TARGET_S);
while (GET_PERI_REG_MASK(ADC_INT_RAW_REG, ADC_SAR1_DONE_INT_RAW) == 0) { }
SET_PERI_REG_MASK(ADC_INT_CLR_REG, ADC_APB_SARADC1_DONE_INT_CLR);
} }
void bootloader_random_disable(void) void bootloader_random_disable(void)
{ {
adc_ll_digi_trigger_disable();
adc_ll_digi_reset_pattern_table();
adc_ll_set_calibration_param(ADC_UNIT_1, 0x0);
adc_ll_set_calibration_param(ADC_UNIT_2, 0x0);
adc_ll_regi2c_adc_deinit();
#ifndef BOOTLOADER_BUILD
regi2c_saradc_disable();
#endif
// disable analog i2c master clock // disable analog i2c master clock
ANALOG_CLOCK_DISABLE(); ANALOG_CLOCK_DISABLE();
adc_ll_digi_controller_clk_div(4, 0, 0);
REGI2C_WRITE_MASK(I2C_SAR_ADC, ADC_SAR1_INITIAL_CODE_LOW_ADDR, 0); adc_ll_digi_clk_sel(ADC_DIGI_CLK_SRC_XTAL);
REGI2C_WRITE_MASK(I2C_SAR_ADC, ADC_SAR1_INITIAL_CODE_HIGH_ADDR, 0);
REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SAR_ADC_ENT_VDD_GRP1, 0);
REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SAR_ADC_DTEST_VDD_GRP1, 0);
} }

View File

@@ -366,6 +366,18 @@ static inline void adc_ll_digi_set_pattern_table(adc_unit_t adc_n, uint32_t patt
} }
} }
/**
* Rest pattern table to default value
*/
static inline void adc_ll_digi_reset_pattern_table(void)
{
for(int i = 0; i < 4; i++) {
ADC.sar1_patt_tab[i].sar1_patt_tab = 0xffffff;
ADC.sar2_patt_tab[i].sar2_patt_tab = 0xffffff;
}
}
/** /**
* Reset the pattern table pointer, then take the measurement rule from table header in next measurement. * Reset the pattern table pointer, then take the measurement rule from table header in next measurement.
* *
@@ -514,24 +526,24 @@ static inline void _adc_ll_sar2_clock_force_en(bool enable)
* @brief Enable the ADC clock * @brief Enable the ADC clock
* @param enable true to enable, false to disable * @param enable true to enable, false to disable
*/ */
static inline void adc_ll_enable_bus_clock(bool enable) static inline void _adc_ll_enable_bus_clock(bool enable)
{ {
HP_SYS_CLKRST.soc_clk_ctrl2.reg_adc_apb_clk_en = enable; HP_SYS_CLKRST.soc_clk_ctrl2.reg_adc_apb_clk_en = enable;
HP_SYS_CLKRST.peri_clk_ctrl23.reg_adc_clk_en = enable; HP_SYS_CLKRST.peri_clk_ctrl23.reg_adc_clk_en = enable;
} }
// HP_SYS_CLKRST.soc_clk_ctrl2 are shared registers, so this function must be used in an atomic way // HP_SYS_CLKRST.soc_clk_ctrl2 are shared registers, so this function must be used in an atomic way
#define adc_ll_enable_bus_clock(...) (void)__DECLARE_RCC_ATOMIC_ENV; adc_ll_enable_bus_clock(__VA_ARGS__) #define adc_ll_enable_bus_clock(...) (void)__DECLARE_RCC_ATOMIC_ENV; _adc_ll_enable_bus_clock(__VA_ARGS__)
/** /**
* @brief Reset ADC module * @brief Reset ADC module
*/ */
static inline void adc_ll_reset_register(void) static inline void _adc_ll_reset_register(void)
{ {
HP_SYS_CLKRST.hp_rst_en2.reg_rst_en_adc = 1; HP_SYS_CLKRST.hp_rst_en2.reg_rst_en_adc = 1;
HP_SYS_CLKRST.hp_rst_en2.reg_rst_en_adc = 0; HP_SYS_CLKRST.hp_rst_en2.reg_rst_en_adc = 0;
} }
// HP_SYS_CLKRST.hp_rst_en2 is a shared register, so this function must be used in an atomic way // HP_SYS_CLKRST.hp_rst_en2 is a shared register, so this function must be used in an atomic way
#define adc_ll_reset_register(...) (void)__DECLARE_RCC_ATOMIC_ENV; adc_ll_reset_register(__VA_ARGS__) #define adc_ll_reset_register(...) (void)__DECLARE_RCC_ATOMIC_ENV; _adc_ll_reset_register(__VA_ARGS__)
@@ -747,6 +759,48 @@ static inline void adc_ll_set_calibration_param(adc_unit_t adc_n, uint32_t param
} }
} }
/**
* Set the SAR DTEST param
*
* @param param DTEST value
*/
__attribute__((always_inline))
static inline void adc_ll_set_dtest_param(uint32_t param)
{
REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SAR_ADC_DTEST_VDD_GRP1, param);
}
/**
* Set the SAR ENT param
*
* @param param ENT value
*/
__attribute__((always_inline))
static inline void adc_ll_set_ent_param(uint32_t param)
{
REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SAR_ADC_ENT_VDD_GRP1, param);
}
/**
* Init regi2c SARADC registers
*/
__attribute__((always_inline))
static inline void adc_ll_regi2c_init(void)
{
adc_ll_set_dtest_param(0);
adc_ll_set_ent_param(1);
}
/**
* Deinit regi2c SARADC registers
*/
__attribute__((always_inline))
static inline void adc_ll_regi2c_adc_deinit(void)
{
adc_ll_set_dtest_param(0);
adc_ll_set_ent_param(0);
}
/*--------------------------------------------------------------- /*---------------------------------------------------------------
Oneshot Read Oneshot Read
---------------------------------------------------------------*/ ---------------------------------------------------------------*/

View File

@@ -38,6 +38,7 @@ typedef enum {
ADC_CHANNEL_7, ///< ADC channel ADC_CHANNEL_7, ///< ADC channel
ADC_CHANNEL_8, ///< ADC channel ADC_CHANNEL_8, ///< ADC channel
ADC_CHANNEL_9, ///< ADC channel ADC_CHANNEL_9, ///< ADC channel
ADC_CHANNEL_10, ///< ADC channel
} adc_channel_t; } adc_channel_t;
/** /**