From 23e8e497dadb2be1c1bb10d276e8750165fd9a44 Mon Sep 17 00:00:00 2001 From: xiongweichao Date: Wed, 20 Oct 2021 19:32:21 +0800 Subject: [PATCH] make bluetooth and wifi use the same low power clock --- components/bt/controller/esp32c3/bt.c | 28 ++++++++++++++++++- components/bt/controller/esp32s3/bt.c | 1 - .../bt/include/esp32c3/include/esp_bt.h | 12 ++++++++ .../bt/include/esp32s3/include/esp_bt.h | 20 +++++++++++++ 4 files changed, 59 insertions(+), 2 deletions(-) diff --git a/components/bt/controller/esp32c3/bt.c b/components/bt/controller/esp32c3/bt.c index b322c3d33f..6d16201e5f 100644 --- a/components/bt/controller/esp32c3/bt.c +++ b/components/bt/controller/esp32c3/bt.c @@ -394,6 +394,8 @@ 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; @@ -924,6 +926,11 @@ 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; @@ -1109,6 +1116,10 @@ esp_err_t esp_bt_controller_init(esp_bt_controller_config_t *cfg) goto error; } + if (s_set_lpclk_source_cb) { + s_set_lpclk_source_cb(); + } + #ifdef CONFIG_PM_ENABLE if (s_lp_cntl.no_light_sleep) { if ((err = esp_pm_lock_create(ESP_PM_NO_LIGHT_SLEEP, 0, "btLS", &s_light_sleep_pm_lock)) != ESP_OK) { @@ -1194,7 +1205,15 @@ error: s_lp_cntl.main_xtal_pu = 0; } #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(); + } } + + btdm_lpcycle_us = 0; + s_set_lpclk_source_cb = NULL; } while (0); #if CONFIG_MAC_BB_PD @@ -1269,7 +1288,15 @@ esp_err_t esp_bt_controller_deinit(void) s_lp_cntl.main_xtal_pu = 0; } #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(); + } } + + btdm_lpcycle_us = 0; + s_set_lpclk_source_cb = NULL; } while (0); #if CONFIG_MAC_BB_PD @@ -1288,7 +1315,6 @@ esp_err_t esp_bt_controller_deinit(void) osi_funcs_p = NULL; btdm_controller_status = ESP_BT_CONTROLLER_STATUS_IDLE; - btdm_lpcycle_us = 0; return ESP_OK; } diff --git a/components/bt/controller/esp32s3/bt.c b/components/bt/controller/esp32s3/bt.c index ec25367924..2bb9f12406 100644 --- a/components/bt/controller/esp32s3/bt.c +++ b/components/bt/controller/esp32s3/bt.c @@ -1080,7 +1080,6 @@ esp_err_t esp_bt_controller_deinit(void) osi_funcs_p = NULL; btdm_controller_status = ESP_BT_CONTROLLER_STATUS_IDLE; - btdm_lpcycle_us = 0; return ESP_OK; } diff --git a/components/bt/include/esp32c3/include/esp_bt.h b/components/bt/include/esp32c3/include/esp_bt.h index 2ec3064d6e..9ec44d0996 100644 --- a/components/bt/include/esp32c3/include/esp_bt.h +++ b/components/bt/include/esp32c3/include/esp_bt.h @@ -92,6 +92,11 @@ 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 @@ -535,6 +540,13 @@ 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/bt/include/esp32s3/include/esp_bt.h b/components/bt/include/esp32s3/include/esp_bt.h index 2127a8a7f7..3d46dd1c29 100644 --- a/components/bt/include/esp32s3/include/esp_bt.h +++ b/components/bt/include/esp32s3/include/esp_bt.h @@ -448,6 +448,26 @@ void esp_bt_controller_wakeup_request(void); */ int esp_bt_h4tl_eif_io_event_notify(int event); +<<<<<<< HEAD +======= +/** + * @brief bt Wi-Fi power domain power on + */ +void esp_wifi_bt_power_domain_on(void); + +/** + * @brief bt Wi-Fi power domain power off + */ +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); + +>>>>>>> 8f0c559c03... make bluetooth and wifi use the same low power clock #ifdef __cplusplus } #endif