Skip to content

Commit 97b7b88

Browse files
committed
Merge branch 'refactor/rng_ll_c61' into 'master'
rng: refactor to use hal/ll apis for esp32c61 Closes IDF-12467 See merge request espressif/esp-idf!37019
2 parents 33e81e5 + c7ee2d7 commit 97b7b88

File tree

7 files changed

+221
-119
lines changed

7 files changed

+221
-119
lines changed
Lines changed: 36 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -1,107 +1,58 @@
11
/*
2-
* SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
66
#include "sdkconfig.h"
77
#include "bootloader_random.h"
8-
#include "soc/soc.h"
9-
#include "soc/pcr_reg.h"
10-
#include "soc/apb_saradc_reg.h"
11-
#include "soc/pmu_reg.h"
12-
#include "hal/regi2c_ctrl.h"
13-
#include "soc/regi2c_saradc.h"
14-
#include "esp_log.h"
15-
16-
static const uint32_t SAR2_CHANNEL = 9;
17-
static const uint32_t SAR1_CHANNEL = 7;
18-
static const uint32_t PATTERN_BIT_WIDTH = 6;
19-
static const uint32_t SAR1_ATTEN = 3;
20-
static const uint32_t SAR2_ATTEN = 3;
8+
#include "hal/regi2c_ctrl_ll.h"
9+
#include "hal/adc_ll.h"
10+
#include "hal/adc_types.h"
2111

2212
void bootloader_random_enable(void)
2313
{
24-
// pull SAR ADC out of reset
25-
REG_SET_BIT(PCR_SARADC_CONF_REG, PCR_SARADC_RST_EN);
26-
REG_CLR_BIT(PCR_SARADC_CONF_REG, PCR_SARADC_RST_EN);
27-
28-
// enable SAR ADC APB clock
29-
REG_SET_BIT(PCR_SARADC_CONF_REG, PCR_SARADC_REG_CLK_EN);
30-
31-
// pull APB register out of reset
32-
REG_SET_BIT(PCR_SARADC_CONF_REG, PCR_SARADC_REG_RST_EN);
33-
REG_CLR_BIT(PCR_SARADC_CONF_REG, PCR_SARADC_REG_RST_EN);
34-
35-
// enable ADC_CTRL_CLK (SAR ADC function clock)
36-
REG_SET_BIT(PCR_SARADC_CLKM_CONF_REG, PCR_SARADC_CLKM_EN);
37-
38-
// select XTAL clock (40 MHz) source for ADC_CTRL_CLK
39-
REG_SET_FIELD(PCR_SARADC_CLKM_CONF_REG, PCR_SARADC_CLKM_SEL, 0);
40-
41-
// set the clock divider for ADC_CTRL_CLK to default value (in case it has been changed)
42-
REG_SET_FIELD(PCR_SARADC_CLKM_CONF_REG, PCR_SARADC_CLKM_DIV_NUM, 0);
14+
adc_ll_reset_register();
15+
adc_ll_enable_bus_clock(true);
16+
adc_ll_enable_func_clock(true);
17+
adc_ll_digi_clk_sel(ADC_DIGI_CLK_SRC_XTAL);
18+
adc_ll_digi_controller_clk_div(0, 0, 0);
4319

4420
// some ADC sensor registers are in power group PERIF_I2C and need to be enabled via PMU
45-
SET_PERI_REG_MASK(PMU_RF_PWC_REG, PMU_PERIF_I2C_RSTB);
46-
SET_PERI_REG_MASK(PMU_RF_PWC_REG, PMU_XPD_PERIF_I2C);
47-
21+
regi2c_ctrl_ll_i2c_reset_set();
22+
regi2c_ctrl_ll_i2c_periph_enable();
4823
// enable analog i2c master clock for RNG runtime
4924
ANALOG_CLOCK_ENABLE();
5025

51-
// Config ADC circuit (Analog part) with I2C(HOST ID 0x69) and chose internal voltage as sampling source
52-
REGI2C_WRITE_MASK(I2C_SAR_ADC, ADC_SARADC_DTEST_RTC_ADDR , 0);
53-
REGI2C_WRITE_MASK(I2C_SAR_ADC, ADC_SARADC_ENT_RTC_ADDR , 1);
54-
REGI2C_WRITE_MASK(I2C_SAR_ADC, ADC_SARADC1_ENCAL_REF_ADDR, 1);
55-
REGI2C_WRITE_MASK(I2C_SAR_ADC, ADC_SARADC2_ENCAL_REF_ADDR, 1);
56-
57-
REGI2C_WRITE_MASK(I2C_SAR_ADC, ADC_SAR2_INITIAL_CODE_HIGH_ADDR, 0x08);
58-
REGI2C_WRITE_MASK(I2C_SAR_ADC, ADC_SAR2_INITIAL_CODE_LOW_ADDR, 0x66);
59-
REGI2C_WRITE_MASK(I2C_SAR_ADC, ADC_SAR1_INITIAL_CODE_HIGH_ADDR, 0x08);
60-
REGI2C_WRITE_MASK(I2C_SAR_ADC, ADC_SAR1_INITIAL_CODE_LOW_ADDR, 0x66);
61-
62-
// create patterns and set them in pattern table
63-
uint32_t pattern_one = (SAR2_CHANNEL << 2) | SAR2_ATTEN; // we want channel 9 with max attenuation
64-
uint32_t pattern_two = (SAR1_CHANNEL << 2) | SAR1_ATTEN; // we want channel 7 with max attenuation
65-
uint32_t pattern_table = 0 | (pattern_two << 3 * PATTERN_BIT_WIDTH) | pattern_one << 2 * PATTERN_BIT_WIDTH;
66-
REG_WRITE(SARADC_SAR_PATT_TAB1_REG, pattern_table);
67-
68-
// set pattern length to 2 (APB_SARADC_SAR_PATT_LEN counts from 0)
69-
REG_SET_FIELD(SARADC_CTRL_REG, SARADC_SAR_PATT_LEN, 1);
70-
71-
// Same as in C3
72-
REG_SET_FIELD(SARADC_CTRL_REG, SARADC_SAR_CLK_DIV, 15);
73-
74-
// set timer expiry (timer is ADC_CTRL_CLK)
75-
REG_SET_FIELD(SARADC_CTRL2_REG, SARADC_TIMER_TARGET, 200);
76-
77-
// enable timer
78-
REG_SET_BIT(SARADC_CTRL2_REG, SARADC_TIMER_EN);
26+
adc_ll_regi2c_adc_init();
27+
adc_ll_set_calibration_param(ADC_UNIT_1, 0x866);
28+
adc_ll_set_calibration_param(ADC_UNIT_2, 0x866);
29+
30+
adc_digi_pattern_config_t pattern_config = {};
31+
pattern_config.unit = ADC_UNIT_1;
32+
pattern_config.atten = ADC_ATTEN_DB_12;
33+
pattern_config.channel = ADC_CHANNEL_7;
34+
adc_ll_digi_set_pattern_table(ADC_UNIT_1, 0, pattern_config);
35+
pattern_config.unit = ADC_UNIT_2;
36+
pattern_config.atten = ADC_ATTEN_DB_12;
37+
pattern_config.channel = ADC_CHANNEL_1;
38+
adc_ll_digi_set_pattern_table(ADC_UNIT_2, 1, pattern_config);
39+
adc_ll_digi_set_pattern_table_len(ADC_UNIT_1, 2);
40+
41+
adc_ll_digi_set_clk_div(15);
42+
adc_ll_digi_set_trigger_interval(200);
43+
adc_ll_digi_trigger_enable();
7944
}
8045

8146
void bootloader_random_disable(void)
8247
{
83-
// disable timer
84-
REG_CLR_BIT(SARADC_CTRL2_REG, SARADC_TIMER_EN);
85-
86-
// Write reset value of this register
87-
REG_WRITE(SARADC_SAR_PATT_TAB1_REG, 0xFFFFFF);
88-
89-
// Revert ADC I2C configuration and initial voltage source setting
90-
REGI2C_WRITE_MASK(I2C_SAR_ADC, ADC_SAR2_INITIAL_CODE_HIGH_ADDR, 0x60);
91-
REGI2C_WRITE_MASK(I2C_SAR_ADC, ADC_SAR2_INITIAL_CODE_LOW_ADDR, 0x0);
92-
REGI2C_WRITE_MASK(I2C_SAR_ADC, ADC_SAR1_INITIAL_CODE_HIGH_ADDR, 0x60);
93-
REGI2C_WRITE_MASK(I2C_SAR_ADC, ADC_SAR1_INITIAL_CODE_LOW_ADDR, 0x0);
94-
REGI2C_WRITE_MASK(I2C_SAR_ADC, ADC_SARADC_DTEST_RTC_ADDR, 0);
95-
REGI2C_WRITE_MASK(I2C_SAR_ADC, ADC_SARADC_ENT_RTC_ADDR, 0);
96-
REGI2C_WRITE_MASK(I2C_SAR_ADC, ADC_SARADC1_ENCAL_REF_ADDR, 0);
97-
REGI2C_WRITE_MASK(I2C_SAR_ADC, ADC_SARADC2_ENCAL_REF_ADDR, 0);
48+
adc_ll_digi_trigger_disable();
49+
adc_ll_digi_reset_pattern_table();
50+
adc_ll_set_calibration_param(ADC_UNIT_1, 0x0);
51+
adc_ll_set_calibration_param(ADC_UNIT_2, 0x0);
52+
adc_ll_regi2c_adc_deinit();
9853

9954
// disable analog i2c master clock
10055
ANALOG_CLOCK_DISABLE();
101-
102-
// disable ADC_CTRL_CLK (SAR ADC function clock)
103-
REG_WRITE(PCR_SARADC_CLKM_CONF_REG, 0x00404000);
104-
105-
// Set PCR_SARADC_CONF_REG to initial state
106-
REG_WRITE(PCR_SARADC_CONF_REG, 0x5);
56+
adc_ll_digi_controller_clk_div(4, 0, 0);
57+
adc_ll_digi_clk_sel(ADC_DIGI_CLK_SRC_XTAL);
10758
}

components/bootloader_support/src/bootloader_random_esp32h2.c

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
* SPDX-License-Identifier: Apache-2.0
55
*/
66
#include "sdkconfig.h"
7-
#include "esp_log.h"
87
#include "bootloader_random.h"
98
#include "hal/regi2c_ctrl_ll.h"
109
#include "hal/adc_ll.h"
@@ -23,9 +22,7 @@ void bootloader_random_enable(void)
2322
// enable analog i2c master clock for RNG runtime
2423
ANALOG_CLOCK_ENABLE();
2524

26-
adc_ll_set_dtest_param(0);
27-
adc_ll_set_ent_param(1);
28-
adc_ll_enable_tout_bus(ADC_UNIT_1, true);
25+
adc_ll_regi2c_adc_init();
2926
adc_ll_set_calibration_param(ADC_UNIT_1, 0x866);
3027
adc_ll_set_calibration_param(ADC_UNIT_2, 0x866);
3128

@@ -49,9 +46,7 @@ void bootloader_random_disable(void)
4946
adc_ll_digi_reset_pattern_table();
5047
adc_ll_set_calibration_param(ADC_UNIT_1, 0x0);
5148
adc_ll_set_calibration_param(ADC_UNIT_2, 0x0);
52-
adc_ll_set_dtest_param(0);
53-
adc_ll_set_ent_param(0);
54-
adc_ll_enable_tout_bus(ADC_UNIT_1, false);
49+
adc_ll_regi2c_adc_deinit();
5550

5651
// disable analog i2c master clock
5752
ANALOG_CLOCK_DISABLE();

components/esp_hw_support/port/esp32c61/pmu_init.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
@@ -12,6 +12,7 @@
1212
#include "soc/soc.h"
1313
#include "soc/pmu_struct.h"
1414
#include "hal/pmu_hal.h"
15+
#include "hal/regi2c_ctrl_ll.h"
1516
#include "pmu_param.h"
1617
#include "esp_private/esp_pmu.h"
1718
#include "soc/regi2c_dig_reg.h"
@@ -209,8 +210,8 @@ static void pmu_lp_system_init_default(pmu_context_t *ctx)
209210
void pmu_init(void)
210211
{
211212
/* Peripheral reg i2c power up */
212-
SET_PERI_REG_MASK(PMU_RF_PWC_REG, PMU_PERIF_I2C_RSTB);
213-
SET_PERI_REG_MASK(PMU_RF_PWC_REG, PMU_XPD_PERIF_I2C);
213+
regi2c_ctrl_ll_i2c_reset_set();
214+
regi2c_ctrl_ll_i2c_periph_enable();
214215

215216
pmu_hp_system_init_default(PMU_instance());
216217
pmu_lp_system_init_default(PMU_instance());

components/hal/esp32c61/include/hal/adc_ll.h

Lines changed: 101 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
@@ -224,6 +224,15 @@ static inline void adc_ll_digi_set_pattern_table(adc_unit_t adc_n, uint32_t patt
224224
}
225225
}
226226

227+
/**
228+
* Rest pattern table to default value
229+
*/
230+
static inline void adc_ll_digi_reset_pattern_table(void)
231+
{
232+
ADC.saradc_sar_patt_tab1.saradc_sar_patt_tab1 = 0xffffff;
233+
ADC.saradc_sar_patt_tab2.saradc_sar_patt_tab2 = 0xffffff;
234+
}
235+
227236
/**
228237
* Reset the pattern table pointer, then take the measurement rule from table header in next measurement.
229238
*
@@ -616,6 +625,97 @@ static inline void adc_ll_set_controller(adc_unit_t adc_n, adc_ll_controller_t c
616625
//Not used on ESP32C61
617626
}
618627

628+
/*---------------------------------------------------------------
629+
Calibration
630+
---------------------------------------------------------------*/
631+
/**
632+
* Set the calibration result to ADC.
633+
*
634+
* @note Different ADC units and different attenuation options use different calibration data (initial data).
635+
*
636+
* @param adc_n ADC index number.
637+
* @param param calibration param
638+
*/
639+
__attribute__((always_inline))
640+
static inline void adc_ll_set_calibration_param(adc_unit_t adc_n, uint32_t param)
641+
{
642+
uint8_t msb = param >> 8;
643+
uint8_t lsb = param & 0xFF;
644+
645+
if (adc_n == ADC_UNIT_1) {
646+
REGI2C_WRITE_MASK(I2C_SAR_ADC, ADC_SAR1_INITIAL_CODE_HIGH_ADDR, msb);
647+
REGI2C_WRITE_MASK(I2C_SAR_ADC, ADC_SAR1_INITIAL_CODE_LOW_ADDR, lsb);
648+
} else {
649+
//C61 doesn't support ADC2, here is for backward compatibility for RNG
650+
REGI2C_WRITE_MASK(I2C_SAR_ADC, ADC_SAR2_INITIAL_CODE_HIGH_ADDR, msb);
651+
REGI2C_WRITE_MASK(I2C_SAR_ADC, ADC_SAR2_INITIAL_CODE_LOW_ADDR, lsb);
652+
}
653+
}
654+
655+
/**
656+
* Set the SAR DTEST param
657+
*
658+
* @param param DTEST value
659+
*/
660+
__attribute__((always_inline))
661+
static inline void adc_ll_set_dtest_param(uint32_t param)
662+
{
663+
REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_DTEST , param);
664+
}
665+
666+
/**
667+
* Set the SAR ENT param
668+
*
669+
* @param param ENT value
670+
*/
671+
__attribute__((always_inline))
672+
static inline void adc_ll_set_ent_param(uint32_t param)
673+
{
674+
REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_ENT_SAR, param);
675+
}
676+
677+
/**
678+
* Enable the SAR TOUT bus
679+
*
680+
* @param adc_n ADC index number.
681+
* @param en true for enable
682+
*/
683+
__attribute__((always_inline))
684+
static inline void adc_ll_enable_encal_ref(adc_unit_t adc_n, bool en)
685+
{
686+
//C61 doesn't support ADC2, here is for backward compatibility for RNG
687+
if (adc_n == ADC_UNIT_1) {
688+
REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC1_ENCAL_REF, en);
689+
} else {
690+
REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC2_ENCAL_REF, en);
691+
}
692+
}
693+
694+
__attribute__((always_inline))
695+
/**
696+
* Init regi2c SARADC registers
697+
*/
698+
static inline void adc_ll_regi2c_adc_init(void)
699+
{
700+
adc_ll_set_dtest_param(0);
701+
adc_ll_set_ent_param(1);
702+
// Config ADC circuit (Analog part) with I2C(HOST ID 0x69) and chose internal voltage as sampling source
703+
adc_ll_enable_encal_ref(ADC_UNIT_1, true);
704+
adc_ll_enable_encal_ref(ADC_UNIT_2, true);
705+
}
706+
707+
/**
708+
* Deinit regi2c SARADC registers
709+
*/
710+
__attribute__((always_inline))
711+
static inline void adc_ll_regi2c_adc_deinit(void)
712+
{
713+
adc_ll_set_dtest_param(0);
714+
adc_ll_set_ent_param(0);
715+
adc_ll_enable_encal_ref(ADC_UNIT_1, false);
716+
adc_ll_enable_encal_ref(ADC_UNIT_2, false);
717+
}
718+
619719
/*---------------------------------------------------------------
620720
Oneshot Read
621721
---------------------------------------------------------------*/

components/hal/esp32c61/include/hal/regi2c_ctrl_ll.h

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
@@ -10,6 +10,7 @@
1010
#include <stdint.h>
1111
#include "soc/soc.h"
1212
#include "soc/regi2c_defs.h"
13+
#include "soc/pmu_reg.h"
1314
#include "modem/modem_lpcon_struct.h"
1415
#include "modem/modem_syscon_struct.h"
1516
#include "soc/i2c_ana_mst_reg.h"
@@ -111,6 +112,38 @@ static inline void regi2c_ctrl_ll_i2c_saradc_disable(void)
111112
// TODO: IDF-9322
112113
}
113114

115+
/**
116+
* @brief Enable regi2c controlled periph registers
117+
*/
118+
static inline void regi2c_ctrl_ll_i2c_periph_enable(void)
119+
{
120+
SET_PERI_REG_MASK(PMU_RF_PWC_REG, PMU_XPD_PERIF_I2C);
121+
}
122+
123+
/**
124+
* @brief Disable regi2c controlled periph registers
125+
*/
126+
static inline void regi2c_ctrl_ll_i2c_periph_disable(void)
127+
{
128+
CLEAR_PERI_REG_MASK(PMU_RF_PWC_REG, PMU_XPD_PERIF_I2C);
129+
}
130+
131+
/**
132+
* @brief Set regi2c reset
133+
*/
134+
static inline void regi2c_ctrl_ll_i2c_reset_set(void)
135+
{
136+
SET_PERI_REG_MASK(PMU_RF_PWC_REG, PMU_PERIF_I2C_RSTB);
137+
}
138+
139+
/**
140+
* @brief Clear regi2c reset
141+
*/
142+
static inline void regi2c_ctrl_ll_i2c_reset_clear(void)
143+
{
144+
CLEAR_PERI_REG_MASK(PMU_RF_PWC_REG, PMU_PERIF_I2C_RSTB);
145+
}
146+
114147
#ifdef __cplusplus
115148
}
116149
#endif

0 commit comments

Comments
 (0)