Skip to content

Commit f567341

Browse files
committed
fix(ext_32k): fix the external 32K issue on C3&S3
1 parent a82b856 commit f567341

File tree

4 files changed

+30
-22
lines changed

4 files changed

+30
-22
lines changed

components/esp_hw_support/port/esp32c3/rtc_clk.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "sdkconfig.h"
1313
#include "esp32c3/rom/rtc.h"
1414
#include "soc/rtc.h"
15+
#include "soc/io_mux_reg.h"
1516
#include "esp_private/rtc_clk.h"
1617
#include "esp_hw_log.h"
1718
#include "esp_rom_sys.h"
@@ -49,6 +50,8 @@ void rtc_clk_32k_enable(bool enable)
4950

5051
void rtc_clk_32k_enable_external(void)
5152
{
53+
PIN_INPUT_ENABLE(IO_MUX_GPIO0_REG);
54+
SET_PERI_REG_MASK(RTC_CNTL_PAD_HOLD_REG, RTC_CNTL_GPIO_PIN0_HOLD);
5255
clk_ll_xtal32k_enable(CLK_LL_XTAL32K_ENABLE_MODE_EXTERNAL);
5356
}
5457

components/esp_hw_support/port/esp32s3/rtc_clk.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "sdkconfig.h"
1313
#include "esp32s3/rom/rtc.h"
1414
#include "soc/rtc.h"
15+
#include "soc/io_mux_reg.h"
1516
#include "esp_private/rtc_clk.h"
1617
#include "soc/rtc_io_reg.h"
1718
#include "esp_rom_sys.h"
@@ -20,6 +21,7 @@
2021
#include "hal/regi2c_ctrl_ll.h"
2122
#include "esp_private/regi2c_ctrl.h"
2223
#include "soc/regi2c_dig_reg.h"
24+
#include "soc/sens_reg.h"
2325
#include "sdkconfig.h"
2426

2527
static const char *TAG = "rtc_clk";
@@ -62,8 +64,9 @@ void rtc_clk_32k_enable(bool enable)
6264

6365
void rtc_clk_32k_enable_external(void)
6466
{
65-
SET_PERI_REG_MASK(RTC_IO_XTAL_32P_PAD_REG, RTC_IO_X32P_MUX_SEL);
66-
SET_PERI_REG_MASK(RTC_IO_XTAL_32N_PAD_REG, RTC_IO_X32N_MUX_SEL);
67+
PIN_INPUT_ENABLE(IO_MUX_GPIO15_REG);
68+
SET_PERI_REG_MASK(SENS_SAR_PERI_CLK_GATE_CONF_REG, SENS_IOMUX_CLK_EN);
69+
SET_PERI_REG_MASK(RTC_CNTL_PAD_HOLD_REG, RTC_CNTL_X32P_HOLD);
6770
clk_ll_xtal32k_enable(CLK_LL_XTAL32K_ENABLE_MODE_EXTERNAL);
6871
}
6972

components/hal/esp32c3/include/hal/clk_tree_ll.h

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -86,17 +86,18 @@ static inline __attribute__((always_inline)) void clk_ll_bbpll_disable(void)
8686
*/
8787
static inline __attribute__((always_inline)) void clk_ll_xtal32k_enable(clk_ll_xtal32k_enable_mode_t mode)
8888
{
89-
// Configure xtal32k
90-
clk_ll_xtal32k_config_t cfg = CLK_LL_XTAL32K_CONFIG_DEFAULT();
91-
REG_SET_FIELD(RTC_CNTL_EXT_XTL_CONF_REG, RTC_CNTL_DAC_XTAL_32K, cfg.dac);
92-
REG_SET_FIELD(RTC_CNTL_EXT_XTL_CONF_REG, RTC_CNTL_DRES_XTAL_32K, cfg.dres);
93-
REG_SET_FIELD(RTC_CNTL_EXT_XTL_CONF_REG, RTC_CNTL_DGM_XTAL_32K, cfg.dgm);
94-
REG_SET_FIELD(RTC_CNTL_EXT_XTL_CONF_REG, RTC_CNTL_DBUF_XTAL_32K, cfg.dbuf);
95-
// Enable xtal32k xpd status
96-
SET_PERI_REG_MASK(RTC_CNTL_EXT_XTL_CONF_REG, RTC_CNTL_XPD_XTAL_32K);
9789
if (mode == CLK_LL_XTAL32K_ENABLE_MODE_EXTERNAL) {
98-
/* TODO ESP32-C3 IDF-2408:: external 32k source may need different settings */
99-
;
90+
SET_PERI_REG_MASK(RTC_CNTL_EXT_XTL_CONF_REG, RTC_CNTL_XTAL32K_GPIO_SEL);
91+
} else {
92+
// Configure xtal32k
93+
CLEAR_PERI_REG_MASK(RTC_CNTL_EXT_XTL_CONF_REG, RTC_CNTL_XTAL32K_GPIO_SEL);
94+
clk_ll_xtal32k_config_t cfg = CLK_LL_XTAL32K_CONFIG_DEFAULT();
95+
REG_SET_FIELD(RTC_CNTL_EXT_XTL_CONF_REG, RTC_CNTL_DAC_XTAL_32K, cfg.dac);
96+
REG_SET_FIELD(RTC_CNTL_EXT_XTL_CONF_REG, RTC_CNTL_DRES_XTAL_32K, cfg.dres);
97+
REG_SET_FIELD(RTC_CNTL_EXT_XTL_CONF_REG, RTC_CNTL_DGM_XTAL_32K, cfg.dgm);
98+
REG_SET_FIELD(RTC_CNTL_EXT_XTL_CONF_REG, RTC_CNTL_DBUF_XTAL_32K, cfg.dbuf);
99+
// Enable xtal32k xpd status
100+
SET_PERI_REG_MASK(RTC_CNTL_EXT_XTL_CONF_REG, RTC_CNTL_XPD_XTAL_32K);
100101
}
101102
}
102103

components/hal/esp32s3/include/hal/clk_tree_ll.h

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -88,17 +88,18 @@ static inline __attribute__((always_inline)) void clk_ll_bbpll_disable(void)
8888
*/
8989
static inline __attribute__((always_inline)) void clk_ll_xtal32k_enable(clk_ll_xtal32k_enable_mode_t mode)
9090
{
91-
// Configure xtal32k
92-
clk_ll_xtal32k_config_t cfg = CLK_LL_XTAL32K_CONFIG_DEFAULT();
93-
REG_SET_FIELD(RTC_CNTL_EXT_XTL_CONF_REG, RTC_CNTL_DAC_XTAL_32K, cfg.dac);
94-
REG_SET_FIELD(RTC_CNTL_EXT_XTL_CONF_REG, RTC_CNTL_DRES_XTAL_32K, cfg.dres);
95-
REG_SET_FIELD(RTC_CNTL_EXT_XTL_CONF_REG, RTC_CNTL_DGM_XTAL_32K, cfg.dgm);
96-
REG_SET_FIELD(RTC_CNTL_EXT_XTL_CONF_REG, RTC_CNTL_DBUF_XTAL_32K, cfg.dbuf);
97-
// Enable xtal32k xpd status
98-
SET_PERI_REG_MASK(RTC_CNTL_EXT_XTL_CONF_REG, RTC_CNTL_XPD_XTAL_32K);
9991
if (mode == CLK_LL_XTAL32K_ENABLE_MODE_EXTERNAL) {
100-
/* TODO: external 32k oscillator may need different settings */
101-
;
92+
SET_PERI_REG_MASK(RTC_CNTL_EXT_XTL_CONF_REG, RTC_CNTL_XTAL32K_GPIO_SEL);
93+
} else {
94+
// Configure xtal32k
95+
CLEAR_PERI_REG_MASK(RTC_CNTL_EXT_XTL_CONF_REG, RTC_CNTL_XTAL32K_GPIO_SEL);
96+
clk_ll_xtal32k_config_t cfg = CLK_LL_XTAL32K_CONFIG_DEFAULT();
97+
REG_SET_FIELD(RTC_CNTL_EXT_XTL_CONF_REG, RTC_CNTL_DAC_XTAL_32K, cfg.dac);
98+
REG_SET_FIELD(RTC_CNTL_EXT_XTL_CONF_REG, RTC_CNTL_DRES_XTAL_32K, cfg.dres);
99+
REG_SET_FIELD(RTC_CNTL_EXT_XTL_CONF_REG, RTC_CNTL_DGM_XTAL_32K, cfg.dgm);
100+
REG_SET_FIELD(RTC_CNTL_EXT_XTL_CONF_REG, RTC_CNTL_DBUF_XTAL_32K, cfg.dbuf);
101+
// Enable xtal32k xpd status
102+
SET_PERI_REG_MASK(RTC_CNTL_EXT_XTL_CONF_REG, RTC_CNTL_XPD_XTAL_32K);
102103
}
103104
}
104105

0 commit comments

Comments
 (0)