Skip to content

Commit f11ad0c

Browse files
committed
soc/rtc: fix spurious warnings about XTAL frequency on startup
1. Make sure that 8MD256 clock used to estimate XTAL frequency is enabled before trying to use rtc_clk_cal_ratio. This fixes "Bogus XTAL frequency: 0 MHz" warnings after software reset. 2. Don't call rtc_clk_xtal_freq_estimate if XTAL frequency is already known. This reduces startup time after deep sleep or software reset. 3. Compare known XTAL frequency and estimated one before printing a warning. This fixes "Possibly invalid CONFIG_ESP32_XTAL_FREQ setting (40MHz). Detected 40 MHz." warnings.
1 parent 9317cb3 commit f11ad0c

File tree

1 file changed

+15
-4
lines changed

1 file changed

+15
-4
lines changed

components/soc/esp32/rtc_clk.c

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -558,6 +558,13 @@ void rtc_clk_xtal_freq_update(rtc_xtal_freq_t xtal_freq)
558558

559559
static rtc_xtal_freq_t rtc_clk_xtal_freq_estimate()
560560
{
561+
/* Enable 8M/256 clock if needed */
562+
const bool clk_8m_enabled = rtc_clk_8m_enabled();
563+
const bool clk_8md256_enabled = rtc_clk_8md256_enabled();
564+
if (!clk_8md256_enabled) {
565+
rtc_clk_8m_enable(true, true);
566+
}
567+
561568
uint64_t cal_val = rtc_clk_cal_ratio(RTC_CAL_8MD256, XTAL_FREQ_EST_CYCLES);
562569
/* cal_val contains period of 8M/256 clock in XTAL clock cycles
563570
* (shifted by RTC_CLK_CAL_FRACT bits).
@@ -581,6 +588,8 @@ static rtc_xtal_freq_t rtc_clk_xtal_freq_estimate()
581588
SOC_LOGW(TAG, "Bogus XTAL frequency: %d MHz", freq_mhz);
582589
return RTC_XTAL_FREQ_AUTO;
583590
}
591+
/* Restore 8M and 8md256 clocks to original state */
592+
rtc_clk_8m_enable(clk_8m_enabled, clk_8md256_enabled);
584593
}
585594

586595
void rtc_clk_apb_freq_update(uint32_t apb_freq)
@@ -634,15 +643,14 @@ void rtc_clk_init(rtc_clk_config_t cfg)
634643
CLEAR_PERI_REG_MASK(ANA_CONFIG_REG, I2C_APLL_M | I2C_BBPLL_M);
635644

636645
/* Estimate XTAL frequency */
637-
rtc_xtal_freq_t est_xtal_freq = rtc_clk_xtal_freq_estimate();
638646
rtc_xtal_freq_t xtal_freq = cfg.xtal_freq;
639647
if (xtal_freq == RTC_XTAL_FREQ_AUTO) {
640648
if (clk_val_is_valid(READ_PERI_REG(RTC_XTAL_FREQ_REG))) {
641649
/* XTAL frequency has already been set, use existing value */
642650
xtal_freq = rtc_clk_xtal_freq_get();
643651
} else {
644652
/* Not set yet, estimate XTAL frequency based on RTC_FAST_CLK */
645-
xtal_freq = est_xtal_freq;
653+
xtal_freq = rtc_clk_xtal_freq_estimate();
646654
if (xtal_freq == RTC_XTAL_FREQ_AUTO) {
647655
SOC_LOGW(TAG, "Can't estimate XTAL frequency, assuming 26MHz");
648656
xtal_freq = RTC_XTAL_FREQ_26M;
@@ -653,8 +661,11 @@ void rtc_clk_init(rtc_clk_config_t cfg)
653661
* frequency is different. If autodetection failed, worst case we get a
654662
* bit of garbage output.
655663
*/
656-
SOC_LOGW(TAG, "Possibly invalid CONFIG_ESP32_XTAL_FREQ setting (%dMHz). Detected %d MHz.",
657-
xtal_freq, est_xtal_freq);
664+
rtc_xtal_freq_t est_xtal_freq = rtc_clk_xtal_freq_estimate();
665+
if (est_xtal_freq != xtal_freq) {
666+
SOC_LOGW(TAG, "Possibly invalid CONFIG_ESP32_XTAL_FREQ setting (%dMHz). Detected %d MHz.",
667+
xtal_freq, est_xtal_freq);
668+
}
658669
}
659670
uart_tx_wait_idle(0);
660671
rtc_clk_xtal_freq_update(xtal_freq);

0 commit comments

Comments
 (0)