diff --git a/components/bt/controller/esp32c3/bt.c b/components/bt/controller/esp32c3/bt.c index 6d16201e5f..5f08f7b8c2 100644 --- a/components/bt/controller/esp32c3/bt.c +++ b/components/bt/controller/esp32c3/bt.c @@ -394,8 +394,6 @@ static DRAM_ATTR uint8_t btdm_lpcycle_us_frac = 0; static DRAM_ATTR QueueHandle_t s_wakeup_req_sem = NULL; // wakeup timer static DRAM_ATTR esp_timer_handle_t s_btdm_slp_tmr; -// set low power clock source callback -static esp_set_lpclk_source_callback_t s_set_lpclk_source_cb = NULL; #ifdef CONFIG_PM_ENABLE static DRAM_ATTR esp_pm_lock_handle_t s_pm_lock; @@ -926,11 +924,6 @@ static void IRAM_ATTR btdm_mac_bb_power_up_cb(void) } #endif -void esp_wifi_set_lpclk_register_callback(esp_set_lpclk_source_callback_t callback) -{ - s_set_lpclk_source_cb = callback; -} - esp_err_t esp_bt_controller_init(esp_bt_controller_config_t *cfg) { esp_err_t err = ESP_FAIL; @@ -1115,10 +1108,9 @@ esp_err_t esp_bt_controller_init(esp_bt_controller_config_t *cfg) err = ESP_ERR_INVALID_ARG; goto error; } - - if (s_set_lpclk_source_cb) { - s_set_lpclk_source_cb(); - } +#if CONFIG_SW_COEXIST_ENABLE + coex_update_lpclk_interval(); +#endif #ifdef CONFIG_PM_ENABLE if (s_lp_cntl.no_light_sleep) { @@ -1207,13 +1199,12 @@ error: #endif btdm_lpclk_select_src(BTDM_LPCLK_SEL_RTC_SLOW); btdm_lpclk_set_div(0); - if (s_set_lpclk_source_cb) { - s_set_lpclk_source_cb(); - } +#if CONFIG_SW_COEXIST_ENABLE + coex_update_lpclk_interval(); +#endif } btdm_lpcycle_us = 0; - s_set_lpclk_source_cb = NULL; } while (0); #if CONFIG_MAC_BB_PD @@ -1290,13 +1281,12 @@ esp_err_t esp_bt_controller_deinit(void) #endif btdm_lpclk_select_src(BTDM_LPCLK_SEL_RTC_SLOW); btdm_lpclk_set_div(0); - if (s_set_lpclk_source_cb) { - s_set_lpclk_source_cb(); - } +#if CONFIG_SW_COEXIST_ENABLE + coex_update_lpclk_interval(); +#endif } btdm_lpcycle_us = 0; - s_set_lpclk_source_cb = NULL; } while (0); #if CONFIG_MAC_BB_PD diff --git a/components/bt/include/esp32c3/include/esp_bt.h b/components/bt/include/esp32c3/include/esp_bt.h index 9ec44d0996..2ec3064d6e 100644 --- a/components/bt/include/esp32c3/include/esp_bt.h +++ b/components/bt/include/esp32c3/include/esp_bt.h @@ -92,11 +92,6 @@ enum { */ typedef void (* esp_bt_hci_tl_callback_t) (void *arg, uint8_t status); -/** - * @brief callback function for Wi-Fi low power clock operations - */ -typedef void (* esp_set_lpclk_source_callback_t)(void); - #ifdef CONFIG_BT_ENABLED #define BT_CTRL_BLE_MAX_ACT_LIMIT 10 //Maximum BLE activity limitation @@ -540,13 +535,6 @@ void esp_wifi_bt_power_domain_on(void); */ void esp_wifi_bt_power_domain_off(void); -/** - * @brief Register application callback function to Wi-Fi low power clock module. - * - * @param callback : Wi-Fi set low power clock callback function - */ -void esp_wifi_set_lpclk_register_callback(esp_set_lpclk_source_callback_t callback); - #ifdef __cplusplus } #endif diff --git a/components/esp_wifi/esp32c3/esp_adapter.c b/components/esp_wifi/esp32c3/esp_adapter.c index 635599c7c0..58f8b59a6f 100644 --- a/components/esp_wifi/esp32c3/esp_adapter.c +++ b/components/esp_wifi/esp32c3/esp_adapter.c @@ -43,6 +43,7 @@ #include "soc/rtc_cntl_reg.h" #include "soc/rtc.h" #include "soc/syscon_reg.h" +#include "soc/system_reg.h" #include "phy_init_data.h" #include "driver/periph_ctrl.h" #include "nvs.h" @@ -53,6 +54,8 @@ #define TAG "esp_adapter" +#define MHZ (1000000) + #ifdef CONFIG_PM_ENABLE extern void wifi_apb80m_request(void); extern void wifi_apb80m_release(void); @@ -440,7 +443,12 @@ static uint32_t esp_clk_slowclk_cal_get_wrapper(void) /* The bit width of WiFi light sleep clock calibration is 12 while the one of * system is 19. It should shift 19 - 12 = 7. */ - return (esp_clk_slowclk_cal_get() >> (RTC_CLK_CAL_FRACT - SOC_WIFI_LIGHT_SLEEP_CLK_WIDTH)); + if (GET_PERI_REG_MASK(SYSTEM_BT_LPCK_DIV_FRAC_REG, SYSTEM_LPCLK_SEL_XTAL)) { + uint64_t time_per_us = 1000000ULL; + return (((time_per_us << RTC_CLK_CAL_FRACT) / (MHZ)) >> (RTC_CLK_CAL_FRACT - SOC_WIFI_LIGHT_SLEEP_CLK_WIDTH)); + } else { + return (esp_clk_slowclk_cal_get() >> (RTC_CLK_CAL_FRACT - SOC_WIFI_LIGHT_SLEEP_CLK_WIDTH)); + } } static void * IRAM_ATTR malloc_internal_wrapper(size_t size) diff --git a/components/esp_wifi/esp32s3/esp_adapter.c b/components/esp_wifi/esp32s3/esp_adapter.c index f55d8c7c91..84bffa44ec 100644 --- a/components/esp_wifi/esp32s3/esp_adapter.c +++ b/components/esp_wifi/esp32s3/esp_adapter.c @@ -42,6 +42,7 @@ #include "soc/rtc_cntl_reg.h" #include "soc/rtc.h" #include "soc/syscon_reg.h" +#include "soc/system_reg.h" #include "phy_init_data.h" #include "driver/periph_ctrl.h" #include "nvs.h" @@ -52,6 +53,8 @@ #define TAG "esp_adapter" +#define MHZ (1000000) + #ifdef CONFIG_PM_ENABLE extern void wifi_apb80m_request(void); extern void wifi_apb80m_release(void); @@ -485,7 +488,12 @@ static uint32_t esp_clk_slowclk_cal_get_wrapper(void) /* The bit width of WiFi light sleep clock calibration is 12 while the one of * system is 19. It should shift 19 - 12 = 7. */ - return (esp_clk_slowclk_cal_get() >> (RTC_CLK_CAL_FRACT - SOC_WIFI_LIGHT_SLEEP_CLK_WIDTH)); + if (GET_PERI_REG_MASK(SYSTEM_BT_LPCK_DIV_FRAC_REG, SYSTEM_LPCLK_SEL_XTAL)) { + uint64_t time_per_us = 1000000ULL; + return (((time_per_us << RTC_CLK_CAL_FRACT) / (MHZ)) >> (RTC_CLK_CAL_FRACT - SOC_WIFI_LIGHT_SLEEP_CLK_WIDTH)); + } else { + return (esp_clk_slowclk_cal_get() >> (RTC_CLK_CAL_FRACT - SOC_WIFI_LIGHT_SLEEP_CLK_WIDTH)); + } } static void * IRAM_ATTR malloc_internal_wrapper(size_t size) diff --git a/components/esp_wifi/include/esp_coexist_internal.h b/components/esp_wifi/include/esp_coexist_internal.h index 3501f0da6f..76ea054c04 100644 --- a/components/esp_wifi/include/esp_coexist_internal.h +++ b/components/esp_wifi/include/esp_coexist_internal.h @@ -30,6 +30,7 @@ typedef enum { } coex_prefer_t; typedef void (* coex_func_cb_t)(uint32_t event, int sched_cnt); +typedef esp_err_t (* coex_set_lpclk_source_callback_t)(void); /** * @brief Pre-Init software coexist @@ -122,6 +123,18 @@ int coex_wifi_release(uint32_t event); */ int coex_wifi_channel_set(uint8_t primary, uint8_t secondary); +/** + * @brief Register application callback function to Wi-Fi update low power clock module. + * + * @param callback : Wi-Fi update low power clock callback function + */ +void coex_wifi_register_update_lpclk_callback(coex_set_lpclk_source_callback_t callback); + +/** + * @brief Update low power clock interval + */ +void coex_update_lpclk_interval(void); + /** * @brief Get coexistence event duration. * diff --git a/components/esp_wifi/include/esp_private/wifi.h b/components/esp_wifi/include/esp_private/wifi.h index a2c763260e..3a15ffd7f2 100644 --- a/components/esp_wifi/include/esp_private/wifi.h +++ b/components/esp_wifi/include/esp_private/wifi.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -496,6 +496,15 @@ bool esp_wifi_internal_is_tsf_active(void); * */ void esp_wifi_internal_update_light_sleep_wake_ahead_time(uint32_t); + +/** + * @brief Update WiFi TSF tick interval + * + * @return + * - true: Active + * - false: Not active + */ +esp_err_t esp_wifi_update_tsf_tick_interval(void); #endif /** diff --git a/components/esp_wifi/lib b/components/esp_wifi/lib index cceecb2795..b4e5f2542a 160000 --- a/components/esp_wifi/lib +++ b/components/esp_wifi/lib @@ -1 +1 @@ -Subproject commit cceecb2795384d4b7589de79e37114d0290ae3e5 +Subproject commit b4e5f2542a574ac624fab18256a0bfe26d2d71cc diff --git a/components/esp_wifi/src/wifi_init.c b/components/esp_wifi/src/wifi_init.c index 910fdd0164..f8a16d5094 100644 --- a/components/esp_wifi/src/wifi_init.c +++ b/components/esp_wifi/src/wifi_init.c @@ -242,6 +242,9 @@ esp_err_t esp_wifi_init(const wifi_init_config_t *config) return ret; } esp_sleep_enable_wifi_wakeup(); +#if CONFIG_SW_COEXIST_ENABLE || CONFIG_EXTERNAL_COEX_ENABLE + coex_wifi_register_update_lpclk_callback(esp_wifi_update_tsf_tick_interval); +#endif #endif #endif