|
|
@@ -508,10 +508,18 @@ static inline void clk_ll_rc_slow_set_divider(uint32_t divider)
|
|
|
* Value of RTC_XTAL_FREQ_REG is stored as two copies in lower and upper 16-bit
|
|
|
* halves. These are the routines to work with that representation.
|
|
|
*
|
|
|
- * @param xtal_freq_mhz XTAL frequency, in MHz
|
|
|
+ * @param xtal_freq_mhz XTAL frequency, in MHz. The frequency must necessarily be even,
|
|
|
+ * otherwise there will be a conflict with the low bit, which is used to disable logs
|
|
|
+ * in the ROM code.
|
|
|
*/
|
|
|
static inline void clk_ll_xtal_store_freq_mhz(uint32_t xtal_freq_mhz)
|
|
|
{
|
|
|
+ // Read the status of whether disabling logging from ROM code
|
|
|
+ uint32_t reg = READ_PERI_REG(RTC_XTAL_FREQ_REG) & RTC_DISABLE_ROM_LOG;
|
|
|
+ // If so, need to write back this setting
|
|
|
+ if (reg == RTC_DISABLE_ROM_LOG) {
|
|
|
+ xtal_freq_mhz |= 1;
|
|
|
+ }
|
|
|
WRITE_PERI_REG(RTC_XTAL_FREQ_REG, (xtal_freq_mhz & UINT16_MAX) | ((xtal_freq_mhz & UINT16_MAX) << 16));
|
|
|
}
|
|
|
|
|
|
@@ -529,7 +537,7 @@ static inline __attribute__((always_inline)) uint32_t clk_ll_xtal_load_freq_mhz(
|
|
|
uint32_t xtal_freq_reg = READ_PERI_REG(RTC_XTAL_FREQ_REG);
|
|
|
if ((xtal_freq_reg & 0xFFFF) == ((xtal_freq_reg >> 16) & 0xFFFF) &&
|
|
|
xtal_freq_reg != 0 && xtal_freq_reg != UINT32_MAX) {
|
|
|
- return xtal_freq_reg & UINT16_MAX;
|
|
|
+ return xtal_freq_reg & ~RTC_DISABLE_ROM_LOG & UINT16_MAX;
|
|
|
}
|
|
|
// If the format in reg is invalid
|
|
|
return 0;
|