diff --git a/components/bt/controller/esp32c6/bt.c b/components/bt/controller/esp32c6/bt.c index 347eb8f30c..2d6e88c554 100644 --- a/components/bt/controller/esp32c6/bt.c +++ b/components/bt/controller/esp32c6/bt.c @@ -566,8 +566,8 @@ esp_err_t controller_sleep_init(void) } #if SOC_PM_RETENTION_HAS_CLOCK_BUG && CONFIG_MAC_BB_PD - esp_pm_register_mac_bb_module_prepare_callback(mac_bb_power_down_prepare, - mac_bb_power_up_prepare); + sleep_modem_register_mac_bb_module_prepare_callback(sleep_modem_mac_bb_power_down_prepare, + sleep_modem_mac_bb_power_up_prepare); #endif // SOC_PM_RETENTION_HAS_CLOCK_BUG && CONFIG_MAC_BB_PD #endif /* CONFIG_FREERTOS_USE_TICKLESS_IDLE */ return rc; @@ -576,8 +576,8 @@ error: #if CONFIG_FREERTOS_USE_TICKLESS_IDLE #if SOC_PM_RETENTION_HAS_CLOCK_BUG && CONFIG_MAC_BB_PD - esp_pm_unregister_mac_bb_module_prepare_callback(mac_bb_power_down_prepare, - mac_bb_power_up_prepare); + sleep_modem_unregister_mac_bb_module_prepare_callback(sleep_modem_mac_bb_power_down_prepare, + sleep_modem_mac_bb_power_up_prepare); #endif // SOC_PM_RETENTION_HAS_CLOCK_BUG && CONFIG_MAC_BB_PD esp_sleep_disable_bt_wakeup(); esp_pm_unregister_inform_out_light_sleep_overhead_callback(sleep_modem_light_sleep_overhead_set); @@ -596,8 +596,8 @@ void controller_sleep_deinit(void) { #if CONFIG_FREERTOS_USE_TICKLESS_IDLE #if SOC_PM_RETENTION_HAS_CLOCK_BUG && CONFIG_MAC_BB_PD - esp_pm_unregister_mac_bb_module_prepare_callback(mac_bb_power_down_prepare, - mac_bb_power_up_prepare); + sleep_modem_unregister_mac_bb_module_prepare_callback(sleep_modem_mac_bb_power_down_prepare, + sleep_modem_mac_bb_power_up_prepare); #endif // SOC_PM_RETENTION_HAS_CLOCK_BUG && CONFIG_MAC_BB_PD r_ble_rtc_wake_up_state_clr(); esp_sleep_disable_bt_wakeup(); diff --git a/components/esp_hw_support/include/esp_private/sleep_modem.h b/components/esp_hw_support/include/esp_private/sleep_modem.h index 209c129161..7922c24fc8 100644 --- a/components/esp_hw_support/include/esp_private/sleep_modem.h +++ b/components/esp_hw_support/include/esp_private/sleep_modem.h @@ -48,7 +48,7 @@ void mac_bb_power_up_cb_execute(void); * @param pd_cb function to call when power down * @param pu_cb function to call when power up */ -void esp_pm_register_mac_bb_module_prepare_callback(mac_bb_power_down_cb_t pd_cb, +void sleep_modem_register_mac_bb_module_prepare_callback(mac_bb_power_down_cb_t pd_cb, mac_bb_power_up_cb_t pu_cb); /** @@ -57,7 +57,7 @@ void esp_pm_register_mac_bb_module_prepare_callback(mac_bb_power_down_cb_t pd_cb * @param pd_cb function to call when power down * @param pu_cb function to call when power up */ -void esp_pm_unregister_mac_bb_module_prepare_callback(mac_bb_power_down_cb_t pd_cb, +void sleep_modem_unregister_mac_bb_module_prepare_callback(mac_bb_power_down_cb_t pd_cb, mac_bb_power_up_cb_t pu_cb); /** @@ -66,7 +66,7 @@ void esp_pm_unregister_mac_bb_module_prepare_callback(mac_bb_power_down_cb_t pd_ * In light sleep mode, execute IEEE802154/Bluetooth module MAC and baseband * power down and backup prepare operations. */ -void mac_bb_power_down_prepare(void); +void sleep_modem_mac_bb_power_down_prepare(void); /** * @brief MAC and baseband power up operation @@ -74,7 +74,7 @@ void mac_bb_power_down_prepare(void); * In light sleep mode, execute IEEE802154/Bluetooth module MAC and baseband * power up and restore prepare operations. */ -void mac_bb_power_up_prepare(void); +void sleep_modem_mac_bb_power_up_prepare(void); #endif // SOC_PM_RETENTION_HAS_CLOCK_BUG && CONFIG_MAC_BB_PD #if SOC_PM_SUPPORT_PMU_MODEM_STATE diff --git a/components/esp_hw_support/port/esp32c6/rtc_clk.c b/components/esp_hw_support/port/esp32c6/rtc_clk.c index 91a5470efd..53644617ca 100644 --- a/components/esp_hw_support/port/esp32c6/rtc_clk.c +++ b/components/esp_hw_support/port/esp32c6/rtc_clk.c @@ -425,20 +425,3 @@ bool rtc_dig_8m_enabled(void) * TODO: update the library to use rtc_clk_xtal_freq_get */ rtc_xtal_freq_t rtc_get_xtal(void) __attribute__((alias("rtc_clk_xtal_freq_get"))); - -#if SOC_PM_RETENTION_HAS_CLOCK_BUG -void rtc_clk_cpu_freq_to_pll_mhz_and_do_retention(bool backup, int cpu_freq_mhz, void (*do_retention)(bool)) -{ - rtc_cpu_freq_config_t config, pll_config; - rtc_clk_cpu_freq_get_config(&config); - - rtc_clk_cpu_freq_mhz_to_config(cpu_freq_mhz, &pll_config); - rtc_clk_cpu_freq_set_config(&pll_config); - - if (do_retention) { - (*do_retention)(backup); - } - - rtc_clk_cpu_freq_set_config(&config); -} -#endif // SOC_PM_RETENTION_HAS_CLOCK_BUG diff --git a/components/esp_hw_support/sleep_modem.c b/components/esp_hw_support/sleep_modem.c index 68b6eca5a2..828f3a455b 100644 --- a/components/esp_hw_support/sleep_modem.c +++ b/components/esp_hw_support/sleep_modem.c @@ -399,8 +399,8 @@ static void esp_pm_light_sleep_default_params_config(int min_freq_mhz, int max_f #endif #if SOC_PM_RETENTION_HAS_CLOCK_BUG && CONFIG_MAC_BB_PD -void esp_pm_register_mac_bb_module_prepare_callback(mac_bb_power_down_cb_t pd_cb, - mac_bb_power_up_cb_t pu_cb) +void sleep_modem_register_mac_bb_module_prepare_callback(mac_bb_power_down_cb_t pd_cb, + mac_bb_power_up_cb_t pu_cb) { _lock_acquire(&s_modem_prepare_lock); if (s_modem_prepare_ref++ == 0) { @@ -410,8 +410,8 @@ void esp_pm_register_mac_bb_module_prepare_callback(mac_bb_power_down_cb_t pd_cb _lock_release(&s_modem_prepare_lock); } -void esp_pm_unregister_mac_bb_module_prepare_callback(mac_bb_power_down_cb_t pd_cb, - mac_bb_power_up_cb_t pu_cb) +void sleep_modem_unregister_mac_bb_module_prepare_callback(mac_bb_power_down_cb_t pd_cb, + mac_bb_power_up_cb_t pu_cb) { _lock_acquire(&s_modem_prepare_lock); assert(s_modem_prepare_ref); @@ -423,7 +423,36 @@ void esp_pm_unregister_mac_bb_module_prepare_callback(mac_bb_power_down_cb_t pd_ } -void IRAM_ATTR mac_bb_power_down_prepare(void) +/** + * @brief Switch root clock source to PLL do retention and switch back + * + * This function is used when Bluetooth/IEEE802154 module requires register backup/restore, this function + * is called ONLY when SOC_PM_RETENTION_HAS_CLOCK_BUG is set. + * @param backup true for backup, false for restore + * @param cpu_freq_mhz cpu frequency to do retention + * @param do_retention function for retention + */ +static void rtc_clk_cpu_freq_to_pll_mhz_and_do_retention(bool backup, int cpu_freq_mhz, void (*do_retention)(bool)) +{ +#if SOC_PM_SUPPORT_PMU_MODEM_STATE + if (pmu_sleep_pll_already_enabled()) { + return; + } +#endif + rtc_cpu_freq_config_t config, pll_config; + rtc_clk_cpu_freq_get_config(&config); + + rtc_clk_cpu_freq_mhz_to_config(cpu_freq_mhz, &pll_config); + rtc_clk_cpu_freq_set_config(&pll_config); + + if (do_retention) { + (*do_retention)(backup); + } + + rtc_clk_cpu_freq_set_config(&config); +} + +void IRAM_ATTR sleep_modem_mac_bb_power_down_prepare(void) { if (s_modem_sleep == false) { rtc_clk_cpu_freq_to_pll_mhz_and_do_retention(true, @@ -433,7 +462,7 @@ void IRAM_ATTR mac_bb_power_down_prepare(void) } } -void IRAM_ATTR mac_bb_power_up_prepare(void) +void IRAM_ATTR sleep_modem_mac_bb_power_up_prepare(void) { if (s_modem_sleep) { rtc_clk_cpu_freq_to_pll_mhz_and_do_retention(false, diff --git a/components/ieee802154/driver/esp_ieee802154_dev.c b/components/ieee802154/driver/esp_ieee802154_dev.c index a11aca6aef..4ba5dbd867 100644 --- a/components/ieee802154/driver/esp_ieee802154_dev.c +++ b/components/ieee802154/driver/esp_ieee802154_dev.c @@ -26,7 +26,7 @@ #include "esp_attr.h" #include "esp_phy_init.h" -#if CONFIG_FREERTOS_USE_TICKLESS_IDLE +#if SOC_PM_MODEM_RETENTION_BY_REGDMA && CONFIG_FREERTOS_USE_TICKLESS_IDLE #include "esp_pm.h" #include "esp_private/esp_clk.h" #include "esp_private/sleep_retention.h" @@ -37,7 +37,7 @@ static bool s_rf_closed = false; #else #define IEEE802154_LINK_OWNER ENTRY(0) | ENTRY(2) #endif // SOC_PM_RETENTION_HAS_CLOCK_BUG -#endif +#endif // SOC_PM_MODEM_RETENTION_BY_REGDMA && CONFIG_FREERTOS_USE_TICKLESS_IDLE #define CCA_DETECTION_TIME 8 @@ -614,12 +614,12 @@ void ieee802154_enable(void) void ieee802154_disable(void) { modem_clock_module_disable(ieee802154_periph.module); -#if CONFIG_FREERTOS_USE_TICKLESS_IDLE +#if SOC_PM_MODEM_RETENTION_BY_REGDMA && CONFIG_FREERTOS_USE_TICKLESS_IDLE #if SOC_PM_RETENTION_HAS_CLOCK_BUG && CONFIG_MAC_BB_PD - esp_pm_unregister_mac_bb_module_prepare_callback(mac_bb_power_down_prepare, - mac_bb_power_up_prepare); + sleep_modem_unregister_mac_bb_module_prepare_callback(sleep_modem_mac_bb_power_down_prepare, + sleep_modem_mac_bb_power_up_prepare); #endif // SOC_PM_RETENTION_HAS_CLOCK_BUG && CONFIG_MAC_BB_PD -#endif // CONFIG_FREERTOS_USE_TICKLESS_IDLE +#endif // SOC_PM_MODEM_RETENTION_BY_REGDMA && CONFIG_FREERTOS_USE_TICKLESS_IDLE ieee802154_set_state(IEEE802154_STATE_DISABLE); } @@ -797,32 +797,31 @@ static esp_err_t ieee802154_sleep_init(void) ESP_LOGI(IEEE802154_TAG, "ieee802154 mac sleep retention initialization"); #if SOC_PM_RETENTION_HAS_CLOCK_BUG && CONFIG_MAC_BB_PD - esp_pm_register_mac_bb_module_prepare_callback(mac_bb_power_down_prepare, - mac_bb_power_up_prepare); + sleep_modem_register_mac_bb_module_prepare_callback(sleep_modem_mac_bb_power_down_prepare, + sleep_modem_mac_bb_power_up_prepare); #endif // SOC_PM_RETENTION_HAS_CLOCK_BUG && CONFIG_MAC_BB_PD - -#endif +#endif // SOC_PM_MODEM_RETENTION_BY_REGDMA && CONFIG_FREERTOS_USE_TICKLESS_IDLE return err; } IRAM_ATTR static void ieee802154_rf_disable(void) { -#if CONFIG_FREERTOS_USE_TICKLESS_IDLE +#if SOC_PM_MODEM_RETENTION_BY_REGDMA && CONFIG_FREERTOS_USE_TICKLESS_IDLE if (s_rf_closed == false) { esp_phy_disable(PHY_MODEM_IEEE802154); s_rf_closed = true; } -#endif // CONFIG_FREERTOS_USE_TICKLESS_IDLE +#endif // SOC_PM_MODEM_RETENTION_BY_REGDMA && CONFIG_FREERTOS_USE_TICKLESS_IDLE } IRAM_ATTR static void ieee802154_rf_enable(void) { -#if CONFIG_FREERTOS_USE_TICKLESS_IDLE +#if SOC_PM_MODEM_RETENTION_BY_REGDMA && CONFIG_FREERTOS_USE_TICKLESS_IDLE if (s_rf_closed) { esp_phy_enable(PHY_MODEM_IEEE802154); s_rf_closed = false; } -#endif //CONFIG_FREERTOS_USE_TICKLESS_IDLE +#endif // SOC_PM_MODEM_RETENTION_BY_REGDMA && CONFIG_FREERTOS_USE_TICKLESS_IDLE } esp_err_t ieee802154_sleep(void) diff --git a/components/soc/esp32c6/include/soc/rtc.h b/components/soc/esp32c6/include/soc/rtc.h index b77ebff590..716424dcc0 100644 --- a/components/soc/esp32c6/include/soc/rtc.h +++ b/components/soc/esp32c6/include/soc/rtc.h @@ -481,19 +481,6 @@ bool rtc_dig_8m_enabled(void); uint32_t rtc_clk_freq_cal(uint32_t cal_val); -#if SOC_PM_RETENTION_HAS_CLOCK_BUG -/** - * @brief Switch root clock source to PLL do retention and switch back - * - * This function is used when Bluetooth/IEEE802154 module requires register backup/restore, this function - * is called ONLY when SOC_PM_RETENTION_HAS_CLOCK_BUG is set. - * @param backup true for backup, false for restore - * @param cpu_freq_mhz cpu frequency to do retention - * @param do_retention function for retention - */ -void rtc_clk_cpu_freq_to_pll_mhz_and_do_retention(bool backup, int cpu_freq_mhz, void (*do_retention)(bool)); -#endif // SOC_PM_RETENTION_HAS_CLOCK_BUG - // -------------------------- CLOCK TREE DEFS ALIAS ---------------------------- // **WARNING**: The following are only for backwards compatibility. // Please use the declarations in soc/clk_tree_defs.h instead. diff --git a/examples/openthread/.build-test-rules.yml b/examples/openthread/.build-test-rules.yml index 12ab9b55c3..0ad7d9b1a8 100644 --- a/examples/openthread/.build-test-rules.yml +++ b/examples/openthread/.build-test-rules.yml @@ -33,12 +33,12 @@ examples/openthread/ot_br: examples/openthread/ot_cli: enable: - - if: IDF_TARGET in ["esp32h2", "esp32c6"] + - if: SOC_IEEE802154_SUPPORTED == 1 <<: *openthread_dependencies examples/openthread/ot_rcp: enable: - - if: IDF_TARGET in ["esp32h2", "esp32c6"] + - if: SOC_IEEE802154_SUPPORTED == 1 disable_test: - if: IDF_TARGET == "esp32h2" temporary: true @@ -55,5 +55,5 @@ examples/openthread/ot_sleepy_device/deep_sleep: examples/openthread/ot_sleepy_device/light_sleep: enable: - - if: IDF_TARGET in ["esp32h2", "esp32c6"] + - if: SOC_IEEE802154_SUPPORTED == 1 <<: [*openthread_dependencies, *openthread_sleep_dependencies]