Skip to content

Commit 9184f62

Browse files
committed
Merge branch 'refactor/rng_ll_h2' into 'master'
rng: refactor to use hal/ll apis for esp32h2 Closes IDF-12462 See merge request espressif/esp-idf!36863
2 parents b70c995 + 8902d86 commit 9184f62

File tree

4 files changed

+126
-100
lines changed

4 files changed

+126
-100
lines changed
Lines changed: 38 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,94 +1,60 @@
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"
7-
#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"
147
#include "esp_log.h"
15-
16-
static const uint32_t SAR2_CHANNEL = 9;
17-
static const uint32_t PATTERN_BIT_WIDTH = 6;
18-
static const uint32_t SAR1_ATTEN = 1;
19-
static const uint32_t SAR2_ATTEN = 1;
8+
#include "bootloader_random.h"
9+
#include "hal/regi2c_ctrl_ll.h"
10+
#include "hal/adc_ll.h"
11+
#include "hal/adc_types.h"
2012

2113
void bootloader_random_enable(void)
2214
{
23-
REG_SET_BIT(PCR_SARADC_CONF_REG, PCR_SARADC_RST_EN);
24-
REG_CLR_BIT(PCR_SARADC_CONF_REG, PCR_SARADC_RST_EN);
25-
26-
REG_SET_BIT(PCR_SARADC_CONF_REG, PCR_SARADC_REG_CLK_EN);
27-
28-
REG_SET_BIT(PCR_SARADC_CLKM_CONF_REG, PCR_SARADC_CLKM_EN);
29-
30-
// select XTAL clock (40 MHz) source for ADC_CTRL_CLK
31-
REG_SET_FIELD(PCR_SARADC_CLKM_CONF_REG, PCR_SARADC_CLKM_SEL, 0);
32-
33-
REG_SET_FIELD(PCR_SARADC_CLKM_CONF_REG, PCR_SARADC_CLKM_DIV_NUM, 0);
15+
adc_ll_reset_register();
16+
adc_ll_enable_bus_clock(true);
17+
adc_ll_enable_func_clock(true);
18+
adc_ll_digi_clk_sel(ADC_DIGI_CLK_SRC_XTAL);
19+
adc_ll_digi_controller_clk_div(0, 0, 0);
3420

3521
// some ADC sensor registers are in power group PERIF_I2C and need to be enabled via PMU
36-
SET_PERI_REG_MASK(PMU_RF_PWC_REG, PMU_XPD_PERIF_I2C);
37-
22+
regi2c_ctrl_ll_i2c_periph_enable();
3823
// enable analog i2c master clock for RNG runtime
3924
ANALOG_CLOCK_ENABLE();
4025

41-
REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_DTEST, 0);
42-
REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_ENT_SAR, 1);
43-
REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_EN_TOUT_SAR1_BUS, 1);
44-
45-
REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_SAR2_INIT_CODE_MSB, 0X08);
46-
REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_SAR2_INIT_CODE_LSB, 0X66);
47-
REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_SAR1_INIT_CODE_MSB, 0X08);
48-
REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_SAR1_INIT_CODE_LSB, 0X66);
49-
50-
// create patterns and set them in pattern table
51-
uint32_t pattern_one = (SAR2_CHANNEL << 2) | SAR2_ATTEN;
52-
uint32_t pattern_two = SAR1_ATTEN; // we want channel 0 with max attenuation, channel doesn't really matter here
53-
uint32_t pattern_table = 0 | (pattern_two << 3 * PATTERN_BIT_WIDTH) | pattern_one << 2 * PATTERN_BIT_WIDTH;
54-
REG_WRITE(APB_SARADC_SAR_PATT_TAB1_REG, pattern_table);
55-
56-
// set pattern length to 2 (APB_SARADC_SAR_PATT_LEN counts from 0)
57-
REG_SET_FIELD(APB_SARADC_CTRL_REG, APB_SARADC_SARADC_SAR_PATT_LEN, 0);
58-
59-
// Same as in C3
60-
REG_SET_FIELD(APB_SARADC_CTRL_REG, APB_SARADC_SARADC_SAR_CLK_DIV, 15);
61-
62-
// set timer expiry (timer is ADC_CTRL_CLK)
63-
REG_SET_FIELD(APB_SARADC_CTRL2_REG, APB_SARADC_SARADC_TIMER_TARGET, 200);
64-
65-
// ENABLE_TIMER
66-
REG_SET_BIT(APB_SARADC_CTRL2_REG, APB_SARADC_SARADC_TIMER_EN);
26+
adc_ll_set_dtest_param(0);
27+
adc_ll_set_ent_param(1);
28+
adc_ll_enable_tout_bus(ADC_UNIT_1, true);
29+
adc_ll_set_calibration_param(ADC_UNIT_1, 0x866);
30+
adc_ll_set_calibration_param(ADC_UNIT_2, 0x866);
31+
32+
adc_digi_pattern_config_t pattern_config = {};
33+
pattern_config.atten = ADC_ATTEN_DB_2_5;
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_2_5;
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, 1);
40+
41+
adc_ll_digi_set_clk_div(15);
42+
adc_ll_digi_set_trigger_interval(200);
43+
adc_ll_digi_trigger_enable();
6744
}
6845

6946
void bootloader_random_disable(void)
7047
{
71-
// disable timer
72-
REG_CLR_BIT(APB_SARADC_CTRL2_REG, APB_SARADC_SARADC_TIMER_EN);
73-
74-
// Write reset value of this register
75-
REG_WRITE(APB_SARADC_SAR_PATT_TAB1_REG, 0xFFFFFF);
76-
77-
// Revert ADC I2C configuration and initial voltage source setting
78-
REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_SAR2_INIT_CODE_MSB, 0x60);
79-
REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_SAR2_INIT_CODE_LSB, 0x0);
80-
REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_SAR1_INIT_CODE_MSB, 0x60);
81-
REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_SAR1_INIT_CODE_LSB, 0x0);
82-
REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_DTEST, 0);
83-
REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_ENT_SAR, 0);
84-
REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_EN_TOUT_SAR1_BUS, 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_set_dtest_param(0);
53+
adc_ll_set_ent_param(0);
54+
adc_ll_enable_tout_bus(ADC_UNIT_1, false);
8555

8656
// disable analog i2c master clock
8757
ANALOG_CLOCK_DISABLE();
88-
89-
// disable ADC_CTRL_CLK (SAR ADC function clock)
90-
REG_WRITE(PCR_SARADC_CLKM_CONF_REG, 0x00404000);
91-
92-
// Set PCR_SARADC_CONF_REG to initial state
93-
REG_WRITE(PCR_SARADC_CONF_REG, 0x5);
58+
adc_ll_digi_controller_clk_div(4, 0, 0);
59+
adc_ll_digi_clk_sel(ADC_DIGI_CLK_SRC_XTAL);
9460
}

components/hal/esp32h2/include/hal/adc_ll.h

Lines changed: 55 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2023-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+
APB_SARADC.saradc_sar_patt_tab1.saradc_saradc_sar_patt_tab1 = 0xffffff;
233+
APB_SARADC.saradc_sar_patt_tab2.saradc_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
*
@@ -659,15 +668,57 @@ static inline void adc_ll_calibration_finish(adc_unit_t adc_n)
659668
* @note Different ADC units and different attenuation options use different calibration data (initial data).
660669
*
661670
* @param adc_n ADC index number.
671+
* @param param calibration param
662672
*/
663673
__attribute__((always_inline))
664674
static inline void adc_ll_set_calibration_param(adc_unit_t adc_n, uint32_t param)
665675
{
666-
HAL_ASSERT(adc_n == ADC_UNIT_1);
667676
uint8_t msb = param >> 8;
668677
uint8_t lsb = param & 0xFF;
669-
REGI2C_WRITE_MASK(I2C_SAR_ADC, ADC_SAR1_INITIAL_CODE_HIGH_ADDR, msb);
670-
REGI2C_WRITE_MASK(I2C_SAR_ADC, ADC_SAR1_INITIAL_CODE_LOW_ADDR, lsb);
678+
679+
if (adc_n == ADC_UNIT_1) {
680+
REGI2C_WRITE_MASK(I2C_SAR_ADC, ADC_SAR1_INITIAL_CODE_HIGH_ADDR, msb);
681+
REGI2C_WRITE_MASK(I2C_SAR_ADC, ADC_SAR1_INITIAL_CODE_LOW_ADDR, lsb);
682+
} else {
683+
//H2 doesn't support ADC2, here is for backward compatibility for RNG
684+
REGI2C_WRITE_MASK(I2C_SAR_ADC, ADC_SAR2_INITIAL_CODE_HIGH_ADDR, msb);
685+
REGI2C_WRITE_MASK(I2C_SAR_ADC, ADC_SAR2_INITIAL_CODE_LOW_ADDR, lsb);
686+
}
687+
}
688+
689+
/**
690+
* Set the SAR DTEST param
691+
*
692+
* @param param DTEST value
693+
*/
694+
__attribute__((always_inline))
695+
static inline void adc_ll_set_dtest_param(uint32_t param)
696+
{
697+
REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_DTEST, param);
698+
}
699+
700+
/**
701+
* Set the SAR ENT param
702+
*
703+
* @param param ENT value
704+
*/
705+
__attribute__((always_inline))
706+
static inline void adc_ll_set_ent_param(uint32_t param)
707+
{
708+
REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_ENT_SAR, param);
709+
}
710+
711+
/**
712+
* Enable the SAR TOUT bus
713+
*
714+
* @param adc_n ADC index number.
715+
* @param en true for enable
716+
*/
717+
__attribute__((always_inline))
718+
static inline void adc_ll_enable_tout_bus(adc_unit_t adc_n, bool en)
719+
{
720+
HAL_ASSERT(adc_n == ADC_UNIT_1);
721+
REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_EN_TOUT_SAR1_BUS, en);
671722
}
672723

673724
/*---------------------------------------------------------------

components/hal/esp32h2/include/hal/regi2c_ctrl_ll.h

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
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
*/
@@ -11,6 +11,7 @@
1111
#include "soc/soc.h"
1212
#include "soc/regi2c_defs.h"
1313
#include "soc/i2c_ana_mst_reg.h"
14+
#include "soc/pmu_reg.h"
1415
#include "modem/modem_lpcon_struct.h"
1516

1617
#ifdef __cplusplus
@@ -112,6 +113,22 @@ static inline void regi2c_ctrl_ll_i2c_saradc_disable(void)
112113
SET_PERI_REG_MASK(I2C_MST_ANA_CONF2_REG, ANA_I2C_SAR_FORCE_PD);
113114
}
114115

116+
/**
117+
* @brief Enable regi2c controlled periph registers
118+
*/
119+
static inline void regi2c_ctrl_ll_i2c_periph_enable(void)
120+
{
121+
SET_PERI_REG_MASK(PMU_RF_PWC_REG, PMU_XPD_PERIF_I2C);
122+
}
123+
124+
/**
125+
* @brief Disable regi2c controlled periph registers
126+
*/
127+
static inline void regi2c_ctrl_ll_i2c_periph_disable(void)
128+
{
129+
CLEAR_PERI_REG_MASK(PMU_RF_PWC_REG, PMU_XPD_PERIF_I2C);
130+
}
131+
115132
#ifdef __cplusplus
116133
}
117134
#endif

components/soc/esp32h2/include/soc/regi2c_saradc.h

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
@@ -30,13 +30,21 @@
3030
#define ADC_SAR2_DREF_ADDR_MSB 0x6
3131
#define ADC_SAR2_DREF_ADDR_LSB 0x4
3232

33-
#define ADC_SAR1_INITIAL_CODE_HIGH_ADDR 0x1
34-
#define ADC_SAR1_INITIAL_CODE_HIGH_ADDR_MSB 0x3
35-
#define ADC_SAR1_INITIAL_CODE_HIGH_ADDR_LSB 0x0
33+
#define ADC_SAR1_INITIAL_CODE_HIGH_ADDR 0x1
34+
#define ADC_SAR1_INITIAL_CODE_HIGH_ADDR_MSB 0x3
35+
#define ADC_SAR1_INITIAL_CODE_HIGH_ADDR_LSB 0x0
3636

37-
#define ADC_SAR1_INITIAL_CODE_LOW_ADDR 0x0
38-
#define ADC_SAR1_INITIAL_CODE_LOW_ADDR_MSB 0x7
39-
#define ADC_SAR1_INITIAL_CODE_LOW_ADDR_LSB 0x0
37+
#define ADC_SAR1_INITIAL_CODE_LOW_ADDR 0x0
38+
#define ADC_SAR1_INITIAL_CODE_LOW_ADDR_MSB 0x7
39+
#define ADC_SAR1_INITIAL_CODE_LOW_ADDR_LSB 0x0
40+
41+
#define ADC_SAR2_INITIAL_CODE_HIGH_ADDR 0x4
42+
#define ADC_SAR2_INITIAL_CODE_HIGH_ADDR_MSB 0x3
43+
#define ADC_SAR2_INITIAL_CODE_HIGH_ADDR_LSB 0x0
44+
45+
#define ADC_SAR2_INITIAL_CODE_LOW_ADDR 0x3
46+
#define ADC_SAR2_INITIAL_CODE_LOW_ADDR_MSB 0x7
47+
#define ADC_SAR2_INITIAL_CODE_LOW_ADDR_LSB 0x0
4048

4149
#define I2C_SARADC_TSENS_DAC 0x6
4250
#define I2C_SARADC_TSENS_DAC_MSB 3
@@ -54,22 +62,6 @@
5462
#define I2C_SARADC_EN_TOUT_SAR1_BUS_MSB 5
5563
#define I2C_SARADC_EN_TOUT_SAR1_BUS_LSB 5
5664

57-
#define I2C_SARADC_SAR1_INIT_CODE_LSB 0
58-
#define I2C_SARADC_SAR1_INIT_CODE_LSB_MSB 7
59-
#define I2C_SARADC_SAR1_INIT_CODE_LSB_LSB 0
60-
61-
#define I2C_SARADC_SAR1_INIT_CODE_MSB 1
62-
#define I2C_SARADC_SAR1_INIT_CODE_MSB_MSB 3
63-
#define I2C_SARADC_SAR1_INIT_CODE_MSB_LSB 0
64-
65-
#define I2C_SARADC_SAR2_INIT_CODE_LSB 3
66-
#define I2C_SARADC_SAR2_INIT_CODE_LSB_MSB 7
67-
#define I2C_SARADC_SAR2_INIT_CODE_LSB_LSB 0
68-
69-
#define I2C_SARADC_SAR2_INIT_CODE_MSB 4
70-
#define I2C_SARADC_SAR2_INIT_CODE_MSB_MSB 3
71-
#define I2C_SARADC_SAR2_INIT_CODE_MSB_LSB 0
72-
7365
#define ADC_SAR1_ENCAL_GND_ADDR 0x8
7466
#define ADC_SAR1_ENCAL_GND_ADDR_MSB 0x1
7567
#define ADC_SAR1_ENCAL_GND_ADDR_LSB 0x1

0 commit comments

Comments
 (0)