Skip to content

Commit d2fc473

Browse files
author
Raffael Rostagno
committed
drivers: clock_control: esp32h2: Add support
Add clocl control support for ESP32-H2. Signed-off-by: Raffael Rostagno <[email protected]>
1 parent f2bf305 commit d2fc473

File tree

3 files changed

+159
-19
lines changed

3 files changed

+159
-19
lines changed

drivers/clock_control/clock_control_esp32.c

Lines changed: 67 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,18 @@
4949
#include <esp_private/esp_pmu.h>
5050
#include <esp_private/esp_modem_clock.h>
5151
#include <ocode_init.h>
52+
#elif defined(CONFIG_SOC_SERIES_ESP32H2)
53+
#define DT_CPU_COMPAT espressif_riscv
54+
#include <zephyr/dt-bindings/clock/esp32h2_clock.h>
55+
#include <soc/lpperi_reg.h>
56+
#include <soc/lp_clkrst_reg.h>
57+
#include <regi2c_ctrl.h>
58+
#include <esp32h2/rom/rtc.h>
59+
#include <soc/dport_access.h>
60+
#include <hal/clk_tree_ll.h>
61+
#include <hal/usb_serial_jtag_ll.h>
62+
#include <esp_private/esp_pmu.h>
63+
#include <esp_sleep.h>
5264
#endif
5365

5466
#include <zephyr/drivers/clock_control.h>
@@ -85,10 +97,13 @@ static bool reset_reason_is_cpu_reset(void)
8597
return false;
8698
}
8799

88-
#if defined(CONFIG_SOC_SERIES_ESP32C6)
100+
#if defined(CONFIG_SOC_SERIES_ESP32C6) || defined(CONFIG_SOC_SERIES_ESP32H2)
89101
static void esp32_clock_perip_init(void)
90102
{
91103
soc_rtc_slow_clk_src_t rtc_slow_clk_src = rtc_clk_slow_src_get();
104+
soc_reset_reason_t rst_reason = esp_rom_get_reset_reason(0);
105+
106+
#if defined(CONFIG_SOC_SERIES_ESP32C6)
92107
modem_clock_lpclk_src_t modem_lpclk_src =
93108
(modem_clock_lpclk_src_t)((rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_RC_SLOW)
94109
? MODEM_CLOCK_LPCLK_SRC_RC_SLOW
@@ -101,19 +116,36 @@ static void esp32_clock_perip_init(void)
101116
: MODEM_CLOCK_LPCLK_SRC_RC_SLOW);
102117

103118
modem_clock_select_lp_clock_source(PERIPH_WIFI_MODULE, modem_lpclk_src, 0);
104-
105-
soc_reset_reason_t rst_reason = esp_rom_get_reset_reason(0);
119+
#elif defined(CONFIG_SOC_SERIES_ESP32H2)
120+
esp_sleep_pd_domain_t pu_domain =
121+
(esp_sleep_pd_domain_t)((rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_XTAL32K)
122+
? ESP_PD_DOMAIN_XTAL32K
123+
: (rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_RC32K)
124+
? ESP_PD_DOMAIN_RC32K
125+
: ESP_PD_DOMAIN_MAX);
126+
esp_sleep_pd_config(pu_domain, ESP_PD_OPTION_ON);
127+
#endif
106128

107129
if ((rst_reason != RESET_REASON_CPU0_MWDT0) && (rst_reason != RESET_REASON_CPU0_MWDT1) &&
108130
(rst_reason != RESET_REASON_CPU0_SW) && (rst_reason != RESET_REASON_CPU0_RTC_WDT)) {
109131

132+
#if CONFIG_ESP_CONSOLE_UART_NUM != 0
133+
periph_ll_disable_clk_set_rst(PERIPH_UART0_MODULE);
134+
#endif
135+
#if CONFIG_ESP_CONSOLE_UART_NUM != 1
110136
periph_ll_disable_clk_set_rst(PERIPH_UART1_MODULE);
137+
#endif
111138
periph_ll_disable_clk_set_rst(PERIPH_I2C0_MODULE);
139+
#if defined(CONFIG_SOC_SERIES_ESP32H2)
140+
periph_ll_disable_clk_set_rst(PERIPH_I2C1_MODULE);
141+
#endif
112142
periph_ll_disable_clk_set_rst(PERIPH_RMT_MODULE);
113143
periph_ll_disable_clk_set_rst(PERIPH_LEDC_MODULE);
114144
periph_ll_disable_clk_set_rst(PERIPH_TIMG1_MODULE);
115145
periph_ll_disable_clk_set_rst(PERIPH_TWAI0_MODULE);
146+
#if defined(CONFIG_SOC_SERIES_ESP32C6)
116147
periph_ll_disable_clk_set_rst(PERIPH_TWAI1_MODULE);
148+
#endif
117149
periph_ll_disable_clk_set_rst(PERIPH_I2S1_MODULE);
118150
periph_ll_disable_clk_set_rst(PERIPH_PCNT_MODULE);
119151
periph_ll_disable_clk_set_rst(PERIPH_ETM_MODULE);
@@ -124,17 +156,24 @@ static void esp32_clock_perip_init(void)
124156
periph_ll_disable_clk_set_rst(PERIPH_TEMPSENSOR_MODULE);
125157
periph_ll_disable_clk_set_rst(PERIPH_UHCI0_MODULE);
126158
periph_ll_disable_clk_set_rst(PERIPH_SARADC_MODULE);
159+
#if defined(CONFIG_SOC_SERIES_ESP32C6)
127160
periph_ll_disable_clk_set_rst(PERIPH_SDIO_SLAVE_MODULE);
161+
#endif
128162
periph_ll_disable_clk_set_rst(PERIPH_RSA_MODULE);
129163
periph_ll_disable_clk_set_rst(PERIPH_AES_MODULE);
130164
periph_ll_disable_clk_set_rst(PERIPH_SHA_MODULE);
131165
periph_ll_disable_clk_set_rst(PERIPH_ECC_MODULE);
132166
periph_ll_disable_clk_set_rst(PERIPH_HMAC_MODULE);
133167
periph_ll_disable_clk_set_rst(PERIPH_DS_MODULE);
168+
#if defined(CONFIG_SOC_SERIES_ESP32H2)
169+
periph_ll_disable_clk_set_rst(PERIPH_ECDSA_MODULE);
170+
#endif
134171

135172
REG_CLR_BIT(PCR_CTRL_TICK_CONF_REG, PCR_TICK_ENABLE);
136173
REG_CLR_BIT(PCR_TRACE_CONF_REG, PCR_TRACE_CLK_EN);
174+
#if defined(CONFIG_SOC_SERIES_ESP32C6)
137175
REG_CLR_BIT(PCR_RETENTION_CONF_REG, PCR_RETENTION_CLK_EN);
176+
#endif
138177
REG_CLR_BIT(PCR_MEM_MONITOR_CONF_REG, PCR_MEM_MONITOR_CLK_EN);
139178
REG_CLR_BIT(PCR_PVT_MONITOR_CONF_REG, PCR_PVT_MONITOR_CLK_EN);
140179
REG_CLR_BIT(PCR_PVT_MONITOR_FUNC_CLK_CONF_REG, PCR_PVT_MONITOR_FUNC_CLK_EN);
@@ -150,8 +189,9 @@ static void esp32_clock_perip_init(void)
150189
(rst_reason == RESET_REASON_SYS_RTC_WDT) ||
151190
(rst_reason == RESET_REASON_SYS_SUPER_WDT)) {
152191

192+
#if defined(CONFIG_SOC_SERIES_ESP32C6)
153193
periph_ll_disable_clk_set_rst(PERIPH_LP_I2C0_MODULE);
154-
194+
#endif
155195
CLEAR_PERI_REG_MASK(LPPERI_CLK_EN_REG, LPPERI_RNG_CK_EN);
156196
CLEAR_PERI_REG_MASK(LPPERI_CLK_EN_REG, LPPERI_LP_UART_CK_EN);
157197
CLEAR_PERI_REG_MASK(LPPERI_CLK_EN_REG, LPPERI_OTP_DBG_CK_EN);
@@ -544,7 +584,7 @@ static int clock_control_esp32_get_rate(const struct device *dev, clock_control_
544584

545585
static int esp32_select_rtc_slow_clk(uint8_t slow_clk)
546586
{
547-
#if !defined(CONFIG_SOC_SERIES_ESP32C6)
587+
#if !defined(CONFIG_SOC_SERIES_ESP32C6) && !defined(CONFIG_SOC_SERIES_ESP32H2)
548588
soc_rtc_slow_clk_src_t rtc_slow_clk_src = slow_clk & RTC_CNTL_ANA_CLK_RTC_SEL_V;
549589
#else
550590
soc_rtc_slow_clk_src_t rtc_slow_clk_src = slow_clk;
@@ -600,7 +640,7 @@ static int esp32_select_rtc_slow_clk(uint8_t slow_clk)
600640
return -ENODEV;
601641
}
602642
}
603-
#if defined(CONFIG_SOC_SERIES_ESP32C6)
643+
#if defined(CONFIG_SOC_SERIES_ESP32C6) || defined(CONFIG_SOC_SERIES_ESP32H2)
604644
} else if (rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_RC32K) {
605645
rtc_clk_rc32k_enable(true);
606646
}
@@ -642,11 +682,21 @@ static int esp32_cpu_clock_configure(const struct esp32_cpu_clock_config *cpu_cf
642682
#if defined(CONFIG_SOC_SERIES_ESP32C6)
643683
rtc_clk_modem_clock_domain_active_state_icg_map_preinit();
644684

645-
REG_SET_FIELD(LP_CLKRST_FOSC_CNTL_REG, LP_CLKRST_FOSC_DFREQ, rtc_clk_cfg.clk_8m_dfreq);
646685
REGI2C_WRITE_MASK(I2C_DIG_REG, I2C_DIG_REG_SCK_DCAP, rtc_clk_cfg.slow_clk_dcap);
647-
REG_SET_FIELD(LP_CLKRST_RC32K_CNTL_REG, LP_CLKRST_RC32K_DFREQ, rtc_clk_cfg.rc32k_dfreq);
648686
REGI2C_WRITE_MASK(I2C_DIG_REG, I2C_DIG_REG_ENIF_RTC_DREG, 1);
649687
REGI2C_WRITE_MASK(I2C_DIG_REG, I2C_DIG_REG_ENIF_DIG_DREG, 1);
688+
#elif defined(CONFIG_SOC_SERIES_ESP32H2)
689+
REGI2C_WRITE_MASK(I2C_PMU, I2C_PMU_OC_SCK_DCAP, rtc_clk_cfg.slow_clk_dcap);
690+
REGI2C_WRITE_MASK(I2C_PMU, I2C_PMU_EN_I2C_RTC_DREG, 0);
691+
REGI2C_WRITE_MASK(I2C_PMU, I2C_PMU_EN_I2C_DIG_DREG, 0);
692+
#else
693+
REG_SET_FIELD(RTC_CNTL_REG, RTC_CNTL_SCK_DCAP, rtc_clk_cfg.slow_clk_dcap);
694+
REG_SET_FIELD(RTC_CNTL_CLK_CONF_REG, RTC_CNTL_CK8M_DFREQ, rtc_clk_cfg.clk_8m_dfreq);
695+
#endif
696+
697+
#if defined(CONFIG_SOC_SERIES_ESP32C6) || defined(CONFIG_SOC_SERIES_ESP32H2)
698+
REG_SET_FIELD(LP_CLKRST_FOSC_CNTL_REG, LP_CLKRST_FOSC_DFREQ, rtc_clk_cfg.clk_8m_dfreq);
699+
REG_SET_FIELD(LP_CLKRST_RC32K_CNTL_REG, LP_CLKRST_RC32K_DFREQ, rtc_clk_cfg.rc32k_dfreq);
650700

651701
uint32_t hp_cali_dbias = get_act_hp_dbias();
652702
uint32_t lp_cali_dbias = get_act_lp_dbias();
@@ -657,15 +707,11 @@ static int esp32_cpu_clock_configure(const struct esp32_cpu_clock_config *cpu_cf
657707
hp_cali_dbias, PMU_HP_MODEM_HP_REGULATOR_DBIAS_S);
658708
SET_PERI_REG_BITS(PMU_HP_SLEEP_LP_REGULATOR0_REG, PMU_HP_SLEEP_LP_REGULATOR_DBIAS,
659709
lp_cali_dbias, PMU_HP_SLEEP_LP_REGULATOR_DBIAS_S);
660-
661-
#else
662-
REG_SET_FIELD(RTC_CNTL_REG, RTC_CNTL_SCK_DCAP, rtc_clk_cfg.slow_clk_dcap);
663-
REG_SET_FIELD(RTC_CNTL_CLK_CONF_REG, RTC_CNTL_CK8M_DFREQ, rtc_clk_cfg.clk_8m_dfreq);
664710
#endif
665711

666712
#if defined(CONFIG_SOC_SERIES_ESP32)
667713
REG_SET_FIELD(RTC_CNTL_CLK_CONF_REG, RTC_CNTL_CK8M_DIV_SEL, rtc_clk_cfg.clk_8m_div - 1);
668-
#elif defined(CONFIG_SOC_SERIES_ESP32C6)
714+
#elif defined(CONFIG_SOC_SERIES_ESP32C6) || defined(CONFIG_SOC_SERIES_ESP32H2)
669715
clk_ll_rc_fast_tick_conf();
670716

671717
esp_rom_uart_tx_wait_idle(0);
@@ -678,7 +724,7 @@ static int esp32_cpu_clock_configure(const struct esp32_cpu_clock_config *cpu_cf
678724
rtc_clk_8m_divider_set(rtc_clk_cfg.clk_8m_clk_div);
679725
#endif
680726

681-
#if !defined(CONFIG_SOC_SERIES_ESP32C6)
727+
#if !defined(CONFIG_SOC_SERIES_ESP32C6) && !defined(CONFIG_SOC_SERIES_ESP32H2)
682728
/* Reset (disable) i2c internal bus for all regi2c registers */
683729
regi2c_ctrl_ll_i2c_reset();
684730
/* Enable the internal bus used to configure BBPLL */
@@ -699,7 +745,7 @@ static int esp32_cpu_clock_configure(const struct esp32_cpu_clock_config *cpu_cf
699745
* to make it run at 80MHz after the switch. PLL = 480MHz, so divider is 6.
700746
*/
701747
clk_ll_mspi_fast_set_hs_divider(6);
702-
#else
748+
#elif !defined(CONFIG_SOC_SERIES_ESP32H2)
703749
rtc_clk_apb_freq_update(rtc_clk_cfg.xtal_freq * MHZ(1));
704750
#endif
705751

@@ -719,7 +765,8 @@ static int esp32_cpu_clock_configure(const struct esp32_cpu_clock_config *cpu_cf
719765
old_config.freq_mhz);
720766

721767
#if defined(CONFIG_ESP_CONSOLE_UART)
722-
#if !defined(CONFIG_SOC_SERIES_ESP32C2) && !defined(CONFIG_SOC_SERIES_ESP32C6)
768+
#if !defined(CONFIG_SOC_SERIES_ESP32C2) && !defined(CONFIG_SOC_SERIES_ESP32C6) && \
769+
!defined(CONFIG_SOC_SERIES_ESP32H2)
723770
#if defined(CONFIG_MCUBOOT) && defined(ESP_ROM_UART_CLK_IS_XTAL)
724771
uint32_t uart_clock_src_hz = (uint32_t)rtc_clk_xtal_freq_get() * MHZ(1);
725772
#else
@@ -775,7 +822,9 @@ static int clock_control_esp32_init(const struct device *dev)
775822
if (rst_reas == RESET_REASON_CHIP_POWER_ON) {
776823
esp_ocode_calib_init();
777824
}
778-
#else /* CONFIG_SOC_SERIES_ESP32C6 */
825+
#elif defined(CONFIG_SOC_SERIES_ESP32H2)
826+
pmu_init();
827+
#else /* CONFIG_SOC_SERIES_ESP32C6 || CONFIG_SOC_SERIES_ESP32H2 */
779828
rtc_config_t rtc_cfg = RTC_CONFIG_DEFAULT();
780829

781830
#if !defined(CONFIG_SOC_SERIES_ESP32)
@@ -788,7 +837,7 @@ static int clock_control_esp32_init(const struct device *dev)
788837
}
789838
#endif /* !CONFIG_SOC_SERIES_ESP32 */
790839
rtc_init(rtc_cfg);
791-
#endif /* CONFIG_SOC_SERIES_ESP32C6 */
840+
#endif /* CONFIG_SOC_SERIES_ESP32C6 || CONFIG_SOC_SERIES_ESP32H2 */
792841

793842
ret = esp32_cpu_clock_configure(&cfg->cpu);
794843
if (ret) {

include/zephyr/drivers/clock_control/esp32_clock_control.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2024 Espressif Systems (Shanghai) Co., Ltd.
2+
* Copyright (c) 2024-2025 Espressif Systems (Shanghai) Co., Ltd.
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
@@ -19,6 +19,8 @@
1919
#include <zephyr/dt-bindings/clock/esp32c3_clock.h>
2020
#elif defined(CONFIG_SOC_SERIES_ESP32C6)
2121
#include <zephyr/dt-bindings/clock/esp32c6_clock.h>
22+
#elif defined(CONFIG_SOC_SERIES_ESP32H2)
23+
#include <zephyr/dt-bindings/clock/esp32h2_clock.h>
2224
#endif /* CONFIG_SOC_SERIES_ESP32xx */
2325

2426
#define ESP32_CLOCK_CONTROL_SUBSYS_CPU 50
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
/*
2+
* Copyright (c) 2025 Espressif Systems (Shanghai) Co., Ltd.
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#ifndef ZEPHYR_INCLUDE_DT_BINDINGS_CLOCK_ESP32H2_H_
8+
#define ZEPHYR_INCLUDE_DT_BINDINGS_CLOCK_ESP32H2_H_
9+
10+
/* Supported CPU clock Sources */
11+
#define ESP32_CPU_CLK_SRC_XTAL 0U
12+
#define ESP32_CPU_CLK_SRC_PLL 1U
13+
#define ESP32_CLK_SRC_RC_FAST 2U
14+
#define ESP32_CPU_CLK_SRC_FLASH_PLL 3U
15+
16+
/* Supported CPU frequencies */
17+
#define ESP32_CLK_CPU_PLL_48M 48000000
18+
#define ESP32_CLK_CPU_FLASH_PLL_64M 64000000
19+
#define ESP32_CLK_CPU_PLL_96M 96000000
20+
#define ESP32_CLK_CPU_RC_FAST_FREQ 8500000
21+
22+
/* Supported XTAL Frequencies */
23+
#define ESP32_CLK_XTAL_32M 32000000
24+
25+
/* Supported RTC fast clock sources */
26+
#define ESP32_RTC_FAST_CLK_SRC_RC_FAST 0
27+
#define ESP32_RTC_FAST_CLK_SRC_XTAL_D2 1
28+
29+
/* Supported RTC slow clock frequencies */
30+
#define ESP32_RTC_SLOW_CLK_SRC_RC_SLOW 0
31+
#define ESP32_RTC_SLOW_CLK_SRC_XTAL32K 1
32+
#define ESP32_RTC_SLOW_CLK_SRC_RC32K 2
33+
#define ESP32_RTC_SLOW_CLK_32K_EXT_OSC 9
34+
35+
/* RTC slow clock frequencies */
36+
#define ESP32_RTC_SLOW_CLK_SRC_RC_SLOW_FREQ 136000
37+
#define ESP32_RTC_SLOW_CLK_SRC_XTAL32K_FREQ 32768
38+
#define ESP32_RTC_SLOW_CLK_SRC_RC32K_FREQ 32768
39+
40+
/* Modules IDs
41+
* These IDs are actually offsets in CLK and RST Control registers.
42+
* These IDs shouldn't be changed unless there is a Hardware change
43+
* from Espressif.
44+
*
45+
* Basic Modules
46+
* Registers: DPORT_PERIP_CLK_EN_REG, DPORT_PERIP_RST_EN_REG
47+
*/
48+
#define ESP32_LEDC_MODULE 0
49+
#define ESP32_UART0_MODULE 1
50+
#define ESP32_UART1_MODULE 2
51+
#define ESP32_USB_DEVICE_MODULE 3
52+
#define ESP32_I2C0_MODULE 4
53+
#define ESP32_I2C1_MODULE 5
54+
#define ESP32_I2S1_MODULE 6
55+
#define ESP32_TIMG0_MODULE 7
56+
#define ESP32_TIMG1_MODULE 8
57+
#define ESP32_UHCI0_MODULE 9
58+
#define ESP32_RMT_MODULE 10
59+
#define ESP32_PCNT_MODULE 11
60+
#define ESP32_SPI_MODULE 12
61+
#define ESP32_SPI2_MODULE 13
62+
#define ESP32_TWAI0_MODULE 14
63+
#define ESP32_RNG_MODULE 15
64+
#define ESP32_RSA_MODULE 16
65+
#define ESP32_AES_MODULE 17
66+
#define ESP32_SHA_MODULE 18
67+
#define ESP32_ECC_MODULE 19
68+
#define ESP32_HMAC_MODULE 20
69+
#define ESP32_DS_MODULE 21
70+
#define ESP32_ECDSA_MODULE 22
71+
#define ESP32_GDMA_MODULE 23
72+
#define ESP32_MCPWM0_MODULE 24
73+
#define ESP32_ETM_MODULE 25
74+
#define ESP32_PARLIO_MODULE 26
75+
#define ESP32_SYSTIMER_MODULE 27
76+
#define ESP32_SARADC_MODULE 28
77+
#define ESP32_TEMPSENSOR_MODULE 29
78+
#define ESP32_REGDMA_MODULE 30
79+
/* Peripherals clock managed by the modem_clock driver must be listed last */
80+
#define ESP32_BT_MODULE 31
81+
#define ESP32_IEEE802154_MODULE 32
82+
#define ESP32_COEX_MODULE 33
83+
#define ESP32_PHY_MODULE 34
84+
#define ESP32_ANA_I2C_MASTER_MODULE 35
85+
#define ESP32_MODEM_ETM_MODULE 36
86+
#define ESP32_MODEM_ADC_COMMON_FE_MODULE 37
87+
#define ESP32_MODULE_MAX 38
88+
89+
#endif /* ZEPHYR_INCLUDE_DT_BINDINGS_CLOCK_ESP32H2_H_ */

0 commit comments

Comments
 (0)