Power Management: power up or down wifi power domain when wifi init or deinit

This commit is contained in:
Li Shuai
2021-09-14 17:15:58 +08:00
committed by baohongde
parent e9514be5f8
commit a66b5bbda2
4 changed files with 56 additions and 8 deletions

View File

@@ -58,6 +58,11 @@ static const char* TAG = "phy_init";
static _lock_t s_phy_access_lock;
static DRAM_ATTR struct {
int count; /* power on count of wifi and bt power domain */
_lock_t lock;
} s_wifi_bt_pd_controller = { .count = 0 };
/* Indicate PHY is calibrated or not */
static bool s_is_phy_calibrated = false;
@@ -286,6 +291,30 @@ void esp_phy_disable(void)
_lock_release(&s_phy_access_lock);
}
void IRAM_ATTR esp_wifi_bt_power_domain_on(void)
{
_lock_acquire(&s_wifi_bt_pd_controller.lock);
if (s_wifi_bt_pd_controller.count++ == 0) {
CLEAR_PERI_REG_MASK(RTC_CNTL_DIG_PWC_REG, RTC_CNTL_WIFI_FORCE_PD);
#if CONFIG_IDF_TARGET_ESP32C3
SET_PERI_REG_MASK(SYSCON_WIFI_RST_EN_REG, SYSTEM_BB_RST | SYSTEM_FE_RST);
CLEAR_PERI_REG_MASK(SYSCON_WIFI_RST_EN_REG, SYSTEM_BB_RST | SYSTEM_FE_RST);
#endif
CLEAR_PERI_REG_MASK(RTC_CNTL_DIG_ISO_REG, RTC_CNTL_WIFI_FORCE_ISO);
}
_lock_release(&s_wifi_bt_pd_controller.lock);
}
void esp_wifi_bt_power_domain_off(void)
{
_lock_acquire(&s_wifi_bt_pd_controller.lock);
if (--s_wifi_bt_pd_controller.count == 0) {
SET_PERI_REG_MASK(RTC_CNTL_DIG_ISO_REG, RTC_CNTL_WIFI_FORCE_ISO);
SET_PERI_REG_MASK(RTC_CNTL_DIG_PWC_REG, RTC_CNTL_WIFI_FORCE_PD);
}
_lock_release(&s_wifi_bt_pd_controller.lock);
}
void esp_phy_pd_mem_init(void)
{
_lock_acquire(&s_phy_access_lock);
@@ -340,12 +369,12 @@ void esp_mac_bb_pd_mem_deinit(void)
IRAM_ATTR void esp_mac_bb_power_up(void)
{
if (s_mac_bb_pd_mem != NULL && (!s_mac_bb_pu)) {
if (s_mac_bb_pd_mem == NULL) {
return;
}
esp_wifi_bt_power_domain_on();
if (!s_mac_bb_pu) {
esp_phy_common_clock_enable();
CLEAR_PERI_REG_MASK(RTC_CNTL_DIG_PWC_REG, RTC_CNTL_WIFI_FORCE_PD);
SET_PERI_REG_MASK(SYSCON_WIFI_RST_EN_REG, SYSTEM_BB_RST | SYSTEM_FE_RST);
CLEAR_PERI_REG_MASK(SYSCON_WIFI_RST_EN_REG, SYSTEM_BB_RST | SYSTEM_FE_RST);
CLEAR_PERI_REG_MASK(RTC_CNTL_DIG_ISO_REG, RTC_CNTL_WIFI_FORCE_ISO);
phy_freq_mem_backup(false, s_mac_bb_pd_mem);
esp_phy_common_clock_disable();
s_mac_bb_pu = true;
@@ -354,14 +383,16 @@ IRAM_ATTR void esp_mac_bb_power_up(void)
IRAM_ATTR void esp_mac_bb_power_down(void)
{
if (s_mac_bb_pd_mem != NULL && s_mac_bb_pu) {
if (s_mac_bb_pd_mem == NULL) {
return;
}
if (s_mac_bb_pu) {
esp_phy_common_clock_enable();
phy_freq_mem_backup(true, s_mac_bb_pd_mem);
SET_PERI_REG_MASK(RTC_CNTL_DIG_ISO_REG, RTC_CNTL_WIFI_FORCE_ISO);
SET_PERI_REG_MASK(RTC_CNTL_DIG_PWC_REG, RTC_CNTL_WIFI_FORCE_PD);
esp_phy_common_clock_disable();
s_mac_bb_pu = false;
}
esp_wifi_bt_power_domain_off();
}
#endif
@@ -942,3 +973,6 @@ esp_err_t esp_phy_update_country_info(const char *country)
#endif
return ESP_OK;
}
void esp_wifi_power_domain_on(void) __attribute__((alias("esp_wifi_bt_power_domain_on")));
void esp_wifi_power_domain_off(void) __attribute__((alias("esp_wifi_bt_power_domain_off")));