mirror of
https://github.com/espressif/esp-idf.git
synced 2026-10-02 11:10:54 +03:00
fix(esp_hw_support): fix cpu restart failed due to rtc_clk in flash
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD
|
* SPDX-FileCopyrightText: 2015-2026 Espressif Systems (Shanghai) CO LTD
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
@@ -31,6 +31,7 @@
|
|||||||
#include "esp_private/systimer.h"
|
#include "esp_private/systimer.h"
|
||||||
#include "hal/lact_ll.h"
|
#include "hal/lact_ll.h"
|
||||||
#endif
|
#endif
|
||||||
|
#include "esp_attr.h"
|
||||||
|
|
||||||
#define XTAL_32K_BOOTSTRAP_TIME_US 7
|
#define XTAL_32K_BOOTSTRAP_TIME_US 7
|
||||||
|
|
||||||
@@ -369,7 +370,7 @@ static void rtc_clk_bbpll_configure(soc_xtal_freq_t xtal_freq, int pll_freq)
|
|||||||
* Must satisfy: cpu_freq = XTAL_FREQ / div.
|
* Must satisfy: cpu_freq = XTAL_FREQ / div.
|
||||||
* Does not disable the PLL.
|
* Does not disable the PLL.
|
||||||
*/
|
*/
|
||||||
void rtc_clk_cpu_freq_to_xtal(int cpu_freq, int div)
|
FORCE_IRAM_ATTR void rtc_clk_cpu_freq_to_xtal(int cpu_freq, int div)
|
||||||
{
|
{
|
||||||
esp_rom_set_cpu_ticks_per_us(cpu_freq);
|
esp_rom_set_cpu_ticks_per_us(cpu_freq);
|
||||||
/* set divider from XTAL to APB clock */
|
/* set divider from XTAL to APB clock */
|
||||||
@@ -461,7 +462,7 @@ void rtc_clk_cpu_freq_set_xtal(void)
|
|||||||
rtc_clk_bbpll_disable();
|
rtc_clk_bbpll_disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
void rtc_clk_cpu_set_to_default_config(void)
|
FORCE_IRAM_ATTR void rtc_clk_cpu_set_to_default_config(void)
|
||||||
{
|
{
|
||||||
int freq_mhz = (int)rtc_clk_xtal_freq_get();
|
int freq_mhz = (int)rtc_clk_xtal_freq_get();
|
||||||
|
|
||||||
@@ -607,7 +608,7 @@ void rtc_clk_cpu_freq_set_config_fast(const rtc_cpu_freq_config_t* config)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
soc_xtal_freq_t rtc_clk_xtal_freq_get(void)
|
FORCE_IRAM_ATTR soc_xtal_freq_t rtc_clk_xtal_freq_get(void)
|
||||||
{
|
{
|
||||||
uint32_t xtal_freq_mhz = clk_ll_xtal_load_freq_mhz();
|
uint32_t xtal_freq_mhz = clk_ll_xtal_load_freq_mhz();
|
||||||
if (xtal_freq_mhz == 0) {
|
if (xtal_freq_mhz == 0) {
|
||||||
@@ -621,7 +622,7 @@ void rtc_clk_xtal_freq_update(soc_xtal_freq_t xtal_freq)
|
|||||||
clk_ll_xtal_store_freq_mhz((uint32_t)xtal_freq);
|
clk_ll_xtal_store_freq_mhz((uint32_t)xtal_freq);
|
||||||
}
|
}
|
||||||
|
|
||||||
void rtc_clk_apb_freq_update(uint32_t apb_freq)
|
FORCE_IRAM_ATTR void rtc_clk_apb_freq_update(uint32_t apb_freq)
|
||||||
{
|
{
|
||||||
clk_ll_apb_store_freq_hz(apb_freq);
|
clk_ll_apb_store_freq_hz(apb_freq);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* SPDX-FileCopyrightText: 2020-2025 Espressif Systems (Shanghai) CO LTD
|
* SPDX-FileCopyrightText: 2020-2026 Espressif Systems (Shanghai) CO LTD
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
@@ -21,6 +21,7 @@
|
|||||||
#include "esp_rom_sys.h"
|
#include "esp_rom_sys.h"
|
||||||
#include "hal/clk_tree_ll.h"
|
#include "hal/clk_tree_ll.h"
|
||||||
#include "hal/regi2c_ctrl_ll.h"
|
#include "hal/regi2c_ctrl_ll.h"
|
||||||
|
#include "esp_attr.h"
|
||||||
|
|
||||||
ESP_HW_LOG_ATTR_TAG(TAG, "rtc_clk");
|
ESP_HW_LOG_ATTR_TAG(TAG, "rtc_clk");
|
||||||
|
|
||||||
@@ -288,7 +289,7 @@ void rtc_clk_cpu_freq_set_xtal(void)
|
|||||||
rtc_clk_bbpll_disable();
|
rtc_clk_bbpll_disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
void rtc_clk_cpu_set_to_default_config(void)
|
FORCE_IRAM_ATTR void rtc_clk_cpu_set_to_default_config(void)
|
||||||
{
|
{
|
||||||
int freq_mhz = (int)rtc_clk_xtal_freq_get();
|
int freq_mhz = (int)rtc_clk_xtal_freq_get();
|
||||||
|
|
||||||
@@ -305,7 +306,7 @@ void rtc_clk_cpu_freq_set_xtal_for_sleep(void)
|
|||||||
* Must satisfy: cpu_freq = XTAL_FREQ / div.
|
* Must satisfy: cpu_freq = XTAL_FREQ / div.
|
||||||
* Does not disable the PLL.
|
* Does not disable the PLL.
|
||||||
*/
|
*/
|
||||||
void rtc_clk_cpu_freq_to_xtal(int cpu_freq, int div)
|
FORCE_IRAM_ATTR void rtc_clk_cpu_freq_to_xtal(int cpu_freq, int div)
|
||||||
{
|
{
|
||||||
esp_rom_set_cpu_ticks_per_us(cpu_freq);
|
esp_rom_set_cpu_ticks_per_us(cpu_freq);
|
||||||
/* Set divider from XTAL to APB clock. Need to set divider to 1 (reg. value 0) first. */
|
/* Set divider from XTAL to APB clock. Need to set divider to 1 (reg. value 0) first. */
|
||||||
@@ -324,7 +325,7 @@ static void rtc_clk_cpu_freq_to_rc_fast(void)
|
|||||||
rtc_clk_apb_freq_update(SOC_CLK_RC_FAST_FREQ_APPROX);
|
rtc_clk_apb_freq_update(SOC_CLK_RC_FAST_FREQ_APPROX);
|
||||||
}
|
}
|
||||||
|
|
||||||
soc_xtal_freq_t rtc_clk_xtal_freq_get(void)
|
FORCE_IRAM_ATTR soc_xtal_freq_t rtc_clk_xtal_freq_get(void)
|
||||||
{
|
{
|
||||||
uint32_t xtal_freq_mhz = clk_ll_xtal_load_freq_mhz();
|
uint32_t xtal_freq_mhz = clk_ll_xtal_load_freq_mhz();
|
||||||
if (xtal_freq_mhz == 0) {
|
if (xtal_freq_mhz == 0) {
|
||||||
@@ -339,7 +340,7 @@ void rtc_clk_xtal_freq_update(soc_xtal_freq_t xtal_freq)
|
|||||||
clk_ll_xtal_store_freq_mhz(xtal_freq);
|
clk_ll_xtal_store_freq_mhz(xtal_freq);
|
||||||
}
|
}
|
||||||
|
|
||||||
void rtc_clk_apb_freq_update(uint32_t apb_freq)
|
FORCE_IRAM_ATTR void rtc_clk_apb_freq_update(uint32_t apb_freq)
|
||||||
{
|
{
|
||||||
clk_ll_apb_store_freq_hz(apb_freq);
|
clk_ll_apb_store_freq_hz(apb_freq);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* SPDX-FileCopyrightText: 2020-2025 Espressif Systems (Shanghai) CO LTD
|
* SPDX-FileCopyrightText: 2020-2026 Espressif Systems (Shanghai) CO LTD
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
@@ -19,6 +19,7 @@
|
|||||||
#include "esp_rom_sys.h"
|
#include "esp_rom_sys.h"
|
||||||
#include "hal/clk_tree_ll.h"
|
#include "hal/clk_tree_ll.h"
|
||||||
#include "hal/regi2c_ctrl_ll.h"
|
#include "hal/regi2c_ctrl_ll.h"
|
||||||
|
#include "esp_attr.h"
|
||||||
|
|
||||||
ESP_HW_LOG_ATTR_TAG(TAG, "rtc_clk");
|
ESP_HW_LOG_ATTR_TAG(TAG, "rtc_clk");
|
||||||
|
|
||||||
@@ -318,7 +319,7 @@ void rtc_clk_cpu_freq_set_xtal(void)
|
|||||||
rtc_clk_bbpll_disable();
|
rtc_clk_bbpll_disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
void rtc_clk_cpu_set_to_default_config(void)
|
FORCE_IRAM_ATTR void rtc_clk_cpu_set_to_default_config(void)
|
||||||
{
|
{
|
||||||
int freq_mhz = (int)rtc_clk_xtal_freq_get();
|
int freq_mhz = (int)rtc_clk_xtal_freq_get();
|
||||||
|
|
||||||
@@ -335,7 +336,7 @@ void rtc_clk_cpu_freq_set_xtal_for_sleep(void)
|
|||||||
* Must satisfy: cpu_freq = XTAL_FREQ / div.
|
* Must satisfy: cpu_freq = XTAL_FREQ / div.
|
||||||
* Does not disable the PLL.
|
* Does not disable the PLL.
|
||||||
*/
|
*/
|
||||||
static void rtc_clk_cpu_freq_to_xtal(int cpu_freq, int div)
|
static FORCE_IRAM_ATTR void rtc_clk_cpu_freq_to_xtal(int cpu_freq, int div)
|
||||||
{
|
{
|
||||||
esp_rom_set_cpu_ticks_per_us(cpu_freq);
|
esp_rom_set_cpu_ticks_per_us(cpu_freq);
|
||||||
/* Set divider from XTAL to APB clock. Need to set divider to 1 (reg. value 0) first. */
|
/* Set divider from XTAL to APB clock. Need to set divider to 1 (reg. value 0) first. */
|
||||||
@@ -354,7 +355,7 @@ static void rtc_clk_cpu_freq_to_rc_fast(void)
|
|||||||
rtc_clk_apb_freq_update(SOC_CLK_RC_FAST_FREQ_APPROX);
|
rtc_clk_apb_freq_update(SOC_CLK_RC_FAST_FREQ_APPROX);
|
||||||
}
|
}
|
||||||
|
|
||||||
soc_xtal_freq_t rtc_clk_xtal_freq_get(void)
|
FORCE_IRAM_ATTR soc_xtal_freq_t rtc_clk_xtal_freq_get(void)
|
||||||
{
|
{
|
||||||
uint32_t xtal_freq_mhz = clk_ll_xtal_load_freq_mhz();
|
uint32_t xtal_freq_mhz = clk_ll_xtal_load_freq_mhz();
|
||||||
if (xtal_freq_mhz == 0) {
|
if (xtal_freq_mhz == 0) {
|
||||||
@@ -369,7 +370,7 @@ void rtc_clk_xtal_freq_update(soc_xtal_freq_t xtal_freq)
|
|||||||
clk_ll_xtal_store_freq_mhz(xtal_freq);
|
clk_ll_xtal_store_freq_mhz(xtal_freq);
|
||||||
}
|
}
|
||||||
|
|
||||||
void rtc_clk_apb_freq_update(uint32_t apb_freq)
|
FORCE_IRAM_ATTR void rtc_clk_apb_freq_update(uint32_t apb_freq)
|
||||||
{
|
{
|
||||||
clk_ll_apb_store_freq_hz(apb_freq);
|
clk_ll_apb_store_freq_hz(apb_freq);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD
|
* SPDX-FileCopyrightText: 2023-2026 Espressif Systems (Shanghai) CO LTD
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
@@ -24,6 +24,7 @@
|
|||||||
#include "hal/efuse_hal.h"
|
#include "hal/efuse_hal.h"
|
||||||
#include "soc/chip_revision.h"
|
#include "soc/chip_revision.h"
|
||||||
#include "esp_private/regi2c_ctrl.h"
|
#include "esp_private/regi2c_ctrl.h"
|
||||||
|
#include "esp_attr.h"
|
||||||
|
|
||||||
ESP_HW_LOG_ATTR_TAG(TAG, "rtc_clk");
|
ESP_HW_LOG_ATTR_TAG(TAG, "rtc_clk");
|
||||||
|
|
||||||
@@ -169,7 +170,7 @@ static void rtc_clk_bbpll_configure(soc_xtal_freq_t xtal_freq, int pll_freq)
|
|||||||
* Must satisfy: cpu_freq = XTAL_FREQ / div.
|
* Must satisfy: cpu_freq = XTAL_FREQ / div.
|
||||||
* Does not disable the PLL.
|
* Does not disable the PLL.
|
||||||
*/
|
*/
|
||||||
static void rtc_clk_cpu_freq_to_xtal(int cpu_freq, int div)
|
static FORCE_IRAM_ATTR void rtc_clk_cpu_freq_to_xtal(int cpu_freq, int div)
|
||||||
{
|
{
|
||||||
// let f_cpu = f_ahb
|
// let f_cpu = f_ahb
|
||||||
clk_ll_cpu_set_divider(div);
|
clk_ll_cpu_set_divider(div);
|
||||||
@@ -428,7 +429,7 @@ void rtc_clk_cpu_freq_set_xtal(void)
|
|||||||
rtc_clk_bbpll_disable();
|
rtc_clk_bbpll_disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
void rtc_clk_cpu_set_to_default_config(void)
|
FORCE_IRAM_ATTR void rtc_clk_cpu_set_to_default_config(void)
|
||||||
{
|
{
|
||||||
int freq_mhz = (int)rtc_clk_xtal_freq_get();
|
int freq_mhz = (int)rtc_clk_xtal_freq_get();
|
||||||
#ifndef BOOTLOADER_BUILD
|
#ifndef BOOTLOADER_BUILD
|
||||||
@@ -474,7 +475,7 @@ void rtc_clk_cpu_freq_to_pll_and_pll_lock_release(int cpu_freq_mhz)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
soc_xtal_freq_t rtc_clk_xtal_freq_get(void)
|
FORCE_IRAM_ATTR soc_xtal_freq_t rtc_clk_xtal_freq_get(void)
|
||||||
{
|
{
|
||||||
uint32_t xtal_freq_mhz = clk_ll_xtal_get_freq_mhz();
|
uint32_t xtal_freq_mhz = clk_ll_xtal_get_freq_mhz();
|
||||||
assert(xtal_freq_mhz == SOC_XTAL_FREQ_48M || xtal_freq_mhz == SOC_XTAL_FREQ_40M);
|
assert(xtal_freq_mhz == SOC_XTAL_FREQ_48M || xtal_freq_mhz == SOC_XTAL_FREQ_40M);
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
#include "soc/lp_aon_reg.h"
|
#include "soc/lp_aon_reg.h"
|
||||||
#include "esp_private/sleep_event.h"
|
#include "esp_private/sleep_event.h"
|
||||||
#include "esp_private/regi2c_ctrl.h"
|
#include "esp_private/regi2c_ctrl.h"
|
||||||
|
#include "esp_attr.h"
|
||||||
|
|
||||||
ESP_HW_LOG_ATTR_TAG(TAG, "rtc_clk");
|
ESP_HW_LOG_ATTR_TAG(TAG, "rtc_clk");
|
||||||
|
|
||||||
@@ -183,7 +184,7 @@ static void rtc_clk_bbpll_configure(soc_xtal_freq_t xtal_freq, int pll_freq)
|
|||||||
* Must satisfy: cpu_freq = XTAL_FREQ / div.
|
* Must satisfy: cpu_freq = XTAL_FREQ / div.
|
||||||
* Does not disable the PLL.
|
* Does not disable the PLL.
|
||||||
*/
|
*/
|
||||||
static void rtc_clk_cpu_freq_to_xtal(int cpu_freq, int div)
|
static FORCE_IRAM_ATTR void rtc_clk_cpu_freq_to_xtal(int cpu_freq, int div)
|
||||||
{
|
{
|
||||||
clk_ll_ahb_set_ls_divider(div);
|
clk_ll_ahb_set_ls_divider(div);
|
||||||
clk_ll_cpu_set_ls_divider(div);
|
clk_ll_cpu_set_ls_divider(div);
|
||||||
@@ -358,7 +359,7 @@ void rtc_clk_cpu_freq_set_xtal(void)
|
|||||||
rtc_clk_bbpll_disable();
|
rtc_clk_bbpll_disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
void rtc_clk_cpu_set_to_default_config(void)
|
FORCE_IRAM_ATTR void rtc_clk_cpu_set_to_default_config(void)
|
||||||
{
|
{
|
||||||
int freq_mhz = (int)rtc_clk_xtal_freq_get();
|
int freq_mhz = (int)rtc_clk_xtal_freq_get();
|
||||||
|
|
||||||
@@ -377,7 +378,7 @@ void rtc_clk_cpu_freq_to_pll_and_pll_lock_release(int cpu_freq_mhz)
|
|||||||
clk_ll_cpu_clk_src_lock_release();
|
clk_ll_cpu_clk_src_lock_release();
|
||||||
}
|
}
|
||||||
|
|
||||||
soc_xtal_freq_t rtc_clk_xtal_freq_get(void)
|
FORCE_IRAM_ATTR soc_xtal_freq_t rtc_clk_xtal_freq_get(void)
|
||||||
{
|
{
|
||||||
uint32_t xtal_freq_mhz = clk_ll_xtal_load_freq_mhz();
|
uint32_t xtal_freq_mhz = clk_ll_xtal_load_freq_mhz();
|
||||||
if (xtal_freq_mhz == 0) {
|
if (xtal_freq_mhz == 0) {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD
|
* SPDX-FileCopyrightText: 2024-2026 Espressif Systems (Shanghai) CO LTD
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
@@ -22,6 +22,7 @@
|
|||||||
#include "soc/lp_aon_reg.h"
|
#include "soc/lp_aon_reg.h"
|
||||||
#include "esp_private/sleep_event.h"
|
#include "esp_private/sleep_event.h"
|
||||||
#include "esp_private/regi2c_ctrl.h"
|
#include "esp_private/regi2c_ctrl.h"
|
||||||
|
#include "esp_attr.h"
|
||||||
|
|
||||||
ESP_HW_LOG_ATTR_TAG(TAG, "rtc_clk");
|
ESP_HW_LOG_ATTR_TAG(TAG, "rtc_clk");
|
||||||
|
|
||||||
@@ -167,7 +168,7 @@ static void rtc_clk_bbpll_configure(soc_xtal_freq_t xtal_freq, int pll_freq)
|
|||||||
* Must satisfy: cpu_freq = XTAL_FREQ / div.
|
* Must satisfy: cpu_freq = XTAL_FREQ / div.
|
||||||
* Does not disable the PLL.
|
* Does not disable the PLL.
|
||||||
*/
|
*/
|
||||||
static void rtc_clk_cpu_freq_to_xtal(int cpu_freq, int div)
|
static FORCE_IRAM_ATTR void rtc_clk_cpu_freq_to_xtal(int cpu_freq, int div)
|
||||||
{
|
{
|
||||||
// let f_cpu = f_ahb
|
// let f_cpu = f_ahb
|
||||||
clk_ll_cpu_set_divider(div);
|
clk_ll_cpu_set_divider(div);
|
||||||
@@ -328,7 +329,7 @@ void rtc_clk_cpu_freq_set_xtal(void)
|
|||||||
rtc_clk_bbpll_disable();
|
rtc_clk_bbpll_disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
void rtc_clk_cpu_set_to_default_config(void)
|
FORCE_IRAM_ATTR void rtc_clk_cpu_set_to_default_config(void)
|
||||||
{
|
{
|
||||||
int freq_mhz = (int)rtc_clk_xtal_freq_get();
|
int freq_mhz = (int)rtc_clk_xtal_freq_get();
|
||||||
|
|
||||||
@@ -347,7 +348,7 @@ void rtc_clk_cpu_freq_to_pll_and_pll_lock_release(int cpu_freq_mhz)
|
|||||||
clk_ll_cpu_clk_src_lock_release();
|
clk_ll_cpu_clk_src_lock_release();
|
||||||
}
|
}
|
||||||
|
|
||||||
soc_xtal_freq_t rtc_clk_xtal_freq_get(void)
|
FORCE_IRAM_ATTR soc_xtal_freq_t rtc_clk_xtal_freq_get(void)
|
||||||
{
|
{
|
||||||
uint32_t xtal_freq_mhz = clk_ll_xtal_get_freq_mhz();
|
uint32_t xtal_freq_mhz = clk_ll_xtal_get_freq_mhz();
|
||||||
assert(xtal_freq_mhz == SOC_XTAL_FREQ_40M);
|
assert(xtal_freq_mhz == SOC_XTAL_FREQ_40M);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
|
* SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
@@ -22,6 +22,7 @@
|
|||||||
#include "soc/lp_aon_reg.h"
|
#include "soc/lp_aon_reg.h"
|
||||||
#include "esp_private/sleep_event.h"
|
#include "esp_private/sleep_event.h"
|
||||||
#include "esp_private/regi2c_ctrl.h"
|
#include "esp_private/regi2c_ctrl.h"
|
||||||
|
#include "esp_attr.h"
|
||||||
|
|
||||||
ESP_HW_LOG_ATTR_TAG(TAG, "rtc_clk");
|
ESP_HW_LOG_ATTR_TAG(TAG, "rtc_clk");
|
||||||
|
|
||||||
@@ -194,7 +195,7 @@ static void rtc_clk_bbpll_configure(soc_xtal_freq_t xtal_freq, int pll_freq)
|
|||||||
* Must satisfy: cpu_freq = XTAL_FREQ / div.
|
* Must satisfy: cpu_freq = XTAL_FREQ / div.
|
||||||
* Does not disable the PLL.
|
* Does not disable the PLL.
|
||||||
*/
|
*/
|
||||||
static void rtc_clk_cpu_freq_to_xtal(int cpu_freq, int div)
|
static FORCE_IRAM_ATTR void rtc_clk_cpu_freq_to_xtal(int cpu_freq, int div)
|
||||||
{
|
{
|
||||||
// let f_cpu = f_ahb
|
// let f_cpu = f_ahb
|
||||||
clk_ll_cpu_set_divider(div);
|
clk_ll_cpu_set_divider(div);
|
||||||
@@ -399,7 +400,7 @@ void rtc_clk_cpu_freq_set_xtal(void)
|
|||||||
rtc_clk_bbpll_disable();
|
rtc_clk_bbpll_disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
void rtc_clk_cpu_set_to_default_config(void)
|
FORCE_IRAM_ATTR void rtc_clk_cpu_set_to_default_config(void)
|
||||||
{
|
{
|
||||||
int freq_mhz = (int)rtc_clk_xtal_freq_get();
|
int freq_mhz = (int)rtc_clk_xtal_freq_get();
|
||||||
|
|
||||||
@@ -412,7 +413,7 @@ void rtc_clk_cpu_freq_set_xtal_for_sleep(void)
|
|||||||
rtc_clk_cpu_set_to_default_config();
|
rtc_clk_cpu_set_to_default_config();
|
||||||
}
|
}
|
||||||
|
|
||||||
soc_xtal_freq_t rtc_clk_xtal_freq_get(void)
|
FORCE_IRAM_ATTR soc_xtal_freq_t rtc_clk_xtal_freq_get(void)
|
||||||
{
|
{
|
||||||
uint32_t xtal_freq_mhz = clk_ll_xtal_load_freq_mhz();
|
uint32_t xtal_freq_mhz = clk_ll_xtal_load_freq_mhz();
|
||||||
if (xtal_freq_mhz == 0) {
|
if (xtal_freq_mhz == 0) {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD
|
* SPDX-FileCopyrightText: 2024-2026 Espressif Systems (Shanghai) CO LTD
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
@@ -23,6 +23,7 @@
|
|||||||
#include "esp_private/sleep_event.h"
|
#include "esp_private/sleep_event.h"
|
||||||
#include "esp_private/regi2c_ctrl.h"
|
#include "esp_private/regi2c_ctrl.h"
|
||||||
#include "esp_private/esp_clk_tree_common.h"
|
#include "esp_private/esp_clk_tree_common.h"
|
||||||
|
#include "esp_attr.h"
|
||||||
|
|
||||||
ESP_HW_LOG_ATTR_TAG(TAG, "rtc_clk");
|
ESP_HW_LOG_ATTR_TAG(TAG, "rtc_clk");
|
||||||
|
|
||||||
@@ -168,7 +169,7 @@ static void rtc_clk_bbpll_configure(soc_xtal_freq_t xtal_freq, int pll_freq)
|
|||||||
* Must satisfy: cpu_freq = XTAL_FREQ / div.
|
* Must satisfy: cpu_freq = XTAL_FREQ / div.
|
||||||
* Does not disable the PLL.
|
* Does not disable the PLL.
|
||||||
*/
|
*/
|
||||||
static void rtc_clk_cpu_freq_to_xtal(int cpu_freq, int div)
|
static FORCE_IRAM_ATTR void rtc_clk_cpu_freq_to_xtal(int cpu_freq, int div)
|
||||||
{
|
{
|
||||||
// let f_cpu = f_ahb
|
// let f_cpu = f_ahb
|
||||||
clk_ll_cpu_set_divider(div);
|
clk_ll_cpu_set_divider(div);
|
||||||
@@ -383,7 +384,7 @@ void rtc_clk_cpu_freq_set_xtal(void)
|
|||||||
rtc_clk_bbpll_disable();
|
rtc_clk_bbpll_disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
void rtc_clk_cpu_set_to_default_config(void)
|
FORCE_IRAM_ATTR void rtc_clk_cpu_set_to_default_config(void)
|
||||||
{
|
{
|
||||||
int freq_mhz = (int)rtc_clk_xtal_freq_get();
|
int freq_mhz = (int)rtc_clk_xtal_freq_get();
|
||||||
|
|
||||||
@@ -396,7 +397,7 @@ void rtc_clk_cpu_freq_set_xtal_for_sleep(void)
|
|||||||
rtc_clk_cpu_set_to_default_config();
|
rtc_clk_cpu_set_to_default_config();
|
||||||
}
|
}
|
||||||
|
|
||||||
soc_xtal_freq_t rtc_clk_xtal_freq_get(void)
|
FORCE_IRAM_ATTR soc_xtal_freq_t rtc_clk_xtal_freq_get(void)
|
||||||
{
|
{
|
||||||
uint32_t xtal_freq_mhz = clk_ll_xtal_get_freq_mhz();
|
uint32_t xtal_freq_mhz = clk_ll_xtal_get_freq_mhz();
|
||||||
assert(xtal_freq_mhz == SOC_XTAL_FREQ_32M);
|
assert(xtal_freq_mhz == SOC_XTAL_FREQ_32M);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD
|
* SPDX-FileCopyrightText: 2025-2026 Espressif Systems (Shanghai) CO LTD
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
@@ -22,6 +22,7 @@
|
|||||||
#include "soc/lp_aon_reg.h"
|
#include "soc/lp_aon_reg.h"
|
||||||
#include "esp_private/sleep_event.h"
|
#include "esp_private/sleep_event.h"
|
||||||
#include "esp_private/esp_clk_tree_common.h"
|
#include "esp_private/esp_clk_tree_common.h"
|
||||||
|
#include "esp_attr.h"
|
||||||
|
|
||||||
ESP_HW_LOG_ATTR_TAG(TAG, "rtc_clk");
|
ESP_HW_LOG_ATTR_TAG(TAG, "rtc_clk");
|
||||||
|
|
||||||
@@ -382,7 +383,7 @@ void rtc_clk_cpu_freq_set_xtal(void)
|
|||||||
rtc_clk_bbpll_disable();
|
rtc_clk_bbpll_disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
void rtc_clk_cpu_set_to_default_config(void)
|
FORCE_IRAM_ATTR void rtc_clk_cpu_set_to_default_config(void)
|
||||||
{
|
{
|
||||||
int freq_mhz = (int)rtc_clk_xtal_freq_get();
|
int freq_mhz = (int)rtc_clk_xtal_freq_get();
|
||||||
|
|
||||||
@@ -405,7 +406,7 @@ void rtc_clk_cpu_freq_to_pll_and_pll_lock_release(int cpu_freq_mhz)
|
|||||||
clk_ll_cpu_clk_src_lock_release();
|
clk_ll_cpu_clk_src_lock_release();
|
||||||
}
|
}
|
||||||
|
|
||||||
soc_xtal_freq_t rtc_clk_xtal_freq_get(void)
|
FORCE_IRAM_ATTR soc_xtal_freq_t rtc_clk_xtal_freq_get(void)
|
||||||
{
|
{
|
||||||
uint32_t xtal_freq_mhz = clk_ll_xtal_get_freq_mhz();
|
uint32_t xtal_freq_mhz = clk_ll_xtal_get_freq_mhz();
|
||||||
assert(xtal_freq_mhz == SOC_XTAL_FREQ_32M);
|
assert(xtal_freq_mhz == SOC_XTAL_FREQ_32M);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
|
* SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
@@ -23,6 +23,7 @@
|
|||||||
#include "soc/io_mux_reg.h"
|
#include "soc/io_mux_reg.h"
|
||||||
#include "esp_private/sleep_event.h"
|
#include "esp_private/sleep_event.h"
|
||||||
#include "esp_private/regi2c_ctrl.h"
|
#include "esp_private/regi2c_ctrl.h"
|
||||||
|
#include "esp_attr.h"
|
||||||
|
|
||||||
ESP_HW_LOG_ATTR_TAG(TAG, "rtc_clk");
|
ESP_HW_LOG_ATTR_TAG(TAG, "rtc_clk");
|
||||||
|
|
||||||
@@ -179,7 +180,7 @@ static void rtc_clk_cpll_configure(soc_xtal_freq_t xtal_freq, int cpll_freq)
|
|||||||
* If to_default is set, then will configure CPU - MEM - SYS - APB frequencies back to power-on reset configuration (40 - 20 - 20 - 10)
|
* If to_default is set, then will configure CPU - MEM - SYS - APB frequencies back to power-on reset configuration (40 - 20 - 20 - 10)
|
||||||
* If to_default is not set, then will configure to 40 - 40 - 40 - 40
|
* If to_default is not set, then will configure to 40 - 40 - 40 - 40
|
||||||
*/
|
*/
|
||||||
static void rtc_clk_cpu_freq_to_xtal(int cpu_freq, int div, bool to_default)
|
static FORCE_IRAM_ATTR void rtc_clk_cpu_freq_to_xtal(int cpu_freq, int div, bool to_default)
|
||||||
{
|
{
|
||||||
// let f_cpu = f_mem = f_sys = f_apb
|
// let f_cpu = f_mem = f_sys = f_apb
|
||||||
uint32_t mem_divider = 1;
|
uint32_t mem_divider = 1;
|
||||||
@@ -494,7 +495,7 @@ void rtc_clk_cpu_freq_set_xtal(void)
|
|||||||
rtc_clk_cpll_disable();
|
rtc_clk_cpll_disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
void rtc_clk_cpu_set_to_default_config(void)
|
FORCE_IRAM_ATTR void rtc_clk_cpu_set_to_default_config(void)
|
||||||
{
|
{
|
||||||
int freq_mhz = (int)rtc_clk_xtal_freq_get();
|
int freq_mhz = (int)rtc_clk_xtal_freq_get();
|
||||||
|
|
||||||
@@ -509,7 +510,7 @@ void rtc_clk_cpu_freq_set_xtal_for_sleep(void)
|
|||||||
s_cur_cpll_freq = 0; // no disable PLL, but set freq to 0 to trigger a PLL calibration after wake-up from sleep
|
s_cur_cpll_freq = 0; // no disable PLL, but set freq to 0 to trigger a PLL calibration after wake-up from sleep
|
||||||
}
|
}
|
||||||
|
|
||||||
soc_xtal_freq_t rtc_clk_xtal_freq_get(void)
|
FORCE_IRAM_ATTR soc_xtal_freq_t rtc_clk_xtal_freq_get(void)
|
||||||
{
|
{
|
||||||
uint32_t xtal_freq_mhz = clk_ll_xtal_load_freq_mhz();
|
uint32_t xtal_freq_mhz = clk_ll_xtal_load_freq_mhz();
|
||||||
if (xtal_freq_mhz == 0) {
|
if (xtal_freq_mhz == 0) {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD
|
* SPDX-FileCopyrightText: 2015-2026 Espressif Systems (Shanghai) CO LTD
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
@@ -25,6 +25,7 @@
|
|||||||
#include "esp_private/systimer.h"
|
#include "esp_private/systimer.h"
|
||||||
#include "hal/systimer_ll.h"
|
#include "hal/systimer_ll.h"
|
||||||
#endif
|
#endif
|
||||||
|
#include "esp_attr.h"
|
||||||
|
|
||||||
ESP_HW_LOG_ATTR_TAG(TAG, "rtc_clk");
|
ESP_HW_LOG_ATTR_TAG(TAG, "rtc_clk");
|
||||||
|
|
||||||
@@ -445,7 +446,7 @@ void rtc_clk_cpu_freq_set_xtal(void)
|
|||||||
/* BBPLL is kept enabled */
|
/* BBPLL is kept enabled */
|
||||||
}
|
}
|
||||||
|
|
||||||
void rtc_clk_cpu_set_to_default_config(void)
|
FORCE_IRAM_ATTR void rtc_clk_cpu_set_to_default_config(void)
|
||||||
{
|
{
|
||||||
rtc_clk_cpu_freq_to_xtal(CLK_LL_XTAL_FREQ_MHZ, 1);
|
rtc_clk_cpu_freq_to_xtal(CLK_LL_XTAL_FREQ_MHZ, 1);
|
||||||
}
|
}
|
||||||
@@ -460,7 +461,7 @@ void rtc_clk_cpu_freq_set_xtal_for_sleep(void)
|
|||||||
* Must satisfy: cpu_freq = XTAL_FREQ / div.
|
* Must satisfy: cpu_freq = XTAL_FREQ / div.
|
||||||
* Does not disable the PLL.
|
* Does not disable the PLL.
|
||||||
*/
|
*/
|
||||||
static void rtc_clk_cpu_freq_to_xtal(int cpu_freq, int div)
|
static FORCE_IRAM_ATTR void rtc_clk_cpu_freq_to_xtal(int cpu_freq, int div)
|
||||||
{
|
{
|
||||||
rtc_cpu_freq_config_t cur_config;
|
rtc_cpu_freq_config_t cur_config;
|
||||||
rtc_clk_cpu_freq_get_config(&cur_config);
|
rtc_clk_cpu_freq_get_config(&cur_config);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD
|
* SPDX-FileCopyrightText: 2015-2026 Espressif Systems (Shanghai) CO LTD
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
@@ -25,6 +25,7 @@
|
|||||||
#include "soc/regi2c_dig_reg.h"
|
#include "soc/regi2c_dig_reg.h"
|
||||||
#include "soc/sens_reg.h"
|
#include "soc/sens_reg.h"
|
||||||
#include "sdkconfig.h"
|
#include "sdkconfig.h"
|
||||||
|
#include "esp_attr.h"
|
||||||
|
|
||||||
ESP_HW_LOG_ATTR_TAG(TAG, "rtc_clk");
|
ESP_HW_LOG_ATTR_TAG(TAG, "rtc_clk");
|
||||||
|
|
||||||
@@ -316,7 +317,7 @@ void rtc_clk_cpu_freq_set_config(const rtc_cpu_freq_config_t *config)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void rtc_clk_cpu_freq_get_config(rtc_cpu_freq_config_t *out_config)
|
FORCE_IRAM_ATTR void rtc_clk_cpu_freq_get_config(rtc_cpu_freq_config_t *out_config)
|
||||||
{
|
{
|
||||||
soc_cpu_clk_src_t source = clk_ll_cpu_get_src();
|
soc_cpu_clk_src_t source = clk_ll_cpu_get_src();
|
||||||
uint32_t source_freq_mhz;
|
uint32_t source_freq_mhz;
|
||||||
@@ -339,8 +340,8 @@ void rtc_clk_cpu_freq_get_config(rtc_cpu_freq_config_t *out_config)
|
|||||||
} else if (freq_mhz == CLK_LL_PLL_240M_FREQ_MHZ && source_freq_mhz == CLK_LL_PLL_480M_FREQ_MHZ) {
|
} else if (freq_mhz == CLK_LL_PLL_240M_FREQ_MHZ && source_freq_mhz == CLK_LL_PLL_480M_FREQ_MHZ) {
|
||||||
div = 2;
|
div = 2;
|
||||||
} else {
|
} else {
|
||||||
ESP_HW_LOGE(TAG, "unsupported frequency configuration");
|
// Unsupported frequency configuration
|
||||||
return;
|
abort();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -350,8 +351,8 @@ void rtc_clk_cpu_freq_get_config(rtc_cpu_freq_config_t *out_config)
|
|||||||
freq_mhz = source_freq_mhz;
|
freq_mhz = source_freq_mhz;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
ESP_HW_LOGE(TAG, "unsupported frequency configuration");
|
// Unsupported frequency configuration
|
||||||
return;
|
abort();
|
||||||
}
|
}
|
||||||
*out_config = (rtc_cpu_freq_config_t) {
|
*out_config = (rtc_cpu_freq_config_t) {
|
||||||
.source = source,
|
.source = source,
|
||||||
@@ -380,7 +381,7 @@ void rtc_clk_cpu_freq_set_xtal(void)
|
|||||||
rtc_clk_bbpll_disable();
|
rtc_clk_bbpll_disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
void rtc_clk_cpu_set_to_default_config(void)
|
FORCE_IRAM_ATTR void rtc_clk_cpu_set_to_default_config(void)
|
||||||
{
|
{
|
||||||
int freq_mhz = (int)rtc_clk_xtal_freq_get();
|
int freq_mhz = (int)rtc_clk_xtal_freq_get();
|
||||||
|
|
||||||
@@ -399,7 +400,7 @@ void rtc_clk_cpu_freq_set_xtal_for_sleep(void)
|
|||||||
*
|
*
|
||||||
* Public function for testing only.
|
* Public function for testing only.
|
||||||
*/
|
*/
|
||||||
void rtc_clk_cpu_freq_to_xtal(int cpu_freq, int div)
|
FORCE_IRAM_ATTR void rtc_clk_cpu_freq_to_xtal(int cpu_freq, int div)
|
||||||
{
|
{
|
||||||
rtc_cpu_freq_config_t cur_config;
|
rtc_cpu_freq_config_t cur_config;
|
||||||
rtc_clk_cpu_freq_get_config(&cur_config);
|
rtc_clk_cpu_freq_get_config(&cur_config);
|
||||||
@@ -433,7 +434,7 @@ static void rtc_clk_cpu_freq_to_rc_fast(void)
|
|||||||
REG_SET_FIELD(RTC_CNTL_DATE_REG, RTC_CNTL_SLAVE_PD, DEFAULT_LDO_SLAVE);
|
REG_SET_FIELD(RTC_CNTL_DATE_REG, RTC_CNTL_SLAVE_PD, DEFAULT_LDO_SLAVE);
|
||||||
}
|
}
|
||||||
|
|
||||||
soc_xtal_freq_t rtc_clk_xtal_freq_get(void)
|
FORCE_IRAM_ATTR soc_xtal_freq_t rtc_clk_xtal_freq_get(void)
|
||||||
{
|
{
|
||||||
uint32_t xtal_freq_mhz = clk_ll_xtal_load_freq_mhz();
|
uint32_t xtal_freq_mhz = clk_ll_xtal_load_freq_mhz();
|
||||||
if (xtal_freq_mhz == 0) {
|
if (xtal_freq_mhz == 0) {
|
||||||
@@ -448,7 +449,7 @@ void rtc_clk_xtal_freq_update(soc_xtal_freq_t xtal_freq)
|
|||||||
clk_ll_xtal_store_freq_mhz(xtal_freq);
|
clk_ll_xtal_store_freq_mhz(xtal_freq);
|
||||||
}
|
}
|
||||||
|
|
||||||
void rtc_clk_apb_freq_update(uint32_t apb_freq)
|
FORCE_IRAM_ATTR void rtc_clk_apb_freq_update(uint32_t apb_freq)
|
||||||
{
|
{
|
||||||
s_apb_freq = apb_freq;
|
s_apb_freq = apb_freq;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user