mirror of
https://github.com/espressif/esp-idf.git
synced 2025-07-30 10:47:19 +02:00
Merge branch 'bugfix/fix_deinit_init_wifi_scan_fail_issue_v4.4' into 'release/v4.4'
Bugfix/fix deinit init wifi scan fail issue v4.4(Backport v4.4) See merge request espressif/esp-idf!27049
This commit is contained in:
@ -47,7 +47,7 @@ IRAM_ATTR void wifi_bt_common_module_enable(void)
|
|||||||
{
|
{
|
||||||
portENTER_CRITICAL_SAFE(&periph_spinlock);
|
portENTER_CRITICAL_SAFE(&periph_spinlock);
|
||||||
if (ref_counts[PERIPH_WIFI_BT_COMMON_MODULE] == 0) {
|
if (ref_counts[PERIPH_WIFI_BT_COMMON_MODULE] == 0) {
|
||||||
periph_ll_wifi_bt_module_enable_clk_clear_rst();
|
periph_ll_wifi_bt_module_enable_clk();
|
||||||
}
|
}
|
||||||
ref_counts[PERIPH_WIFI_BT_COMMON_MODULE]++;
|
ref_counts[PERIPH_WIFI_BT_COMMON_MODULE]++;
|
||||||
portEXIT_CRITICAL_SAFE(&periph_spinlock);
|
portEXIT_CRITICAL_SAFE(&periph_spinlock);
|
||||||
@ -58,7 +58,7 @@ IRAM_ATTR void wifi_bt_common_module_disable(void)
|
|||||||
portENTER_CRITICAL_SAFE(&periph_spinlock);
|
portENTER_CRITICAL_SAFE(&periph_spinlock);
|
||||||
ref_counts[PERIPH_WIFI_BT_COMMON_MODULE]--;
|
ref_counts[PERIPH_WIFI_BT_COMMON_MODULE]--;
|
||||||
if (ref_counts[PERIPH_WIFI_BT_COMMON_MODULE] == 0) {
|
if (ref_counts[PERIPH_WIFI_BT_COMMON_MODULE] == 0) {
|
||||||
periph_ll_wifi_bt_module_disable_clk_set_rst();
|
periph_ll_wifi_bt_module_disable_clk();
|
||||||
}
|
}
|
||||||
portEXIT_CRITICAL_SAFE(&periph_spinlock);
|
portEXIT_CRITICAL_SAFE(&periph_spinlock);
|
||||||
}
|
}
|
||||||
|
@ -284,11 +284,18 @@ void IRAM_ATTR esp_wifi_bt_power_domain_on(void)
|
|||||||
_lock_acquire(&s_wifi_bt_pd_controller.lock);
|
_lock_acquire(&s_wifi_bt_pd_controller.lock);
|
||||||
if (s_wifi_bt_pd_controller.count++ == 0) {
|
if (s_wifi_bt_pd_controller.count++ == 0) {
|
||||||
CLEAR_PERI_REG_MASK(RTC_CNTL_DIG_PWC_REG, RTC_CNTL_WIFI_FORCE_PD);
|
CLEAR_PERI_REG_MASK(RTC_CNTL_DIG_PWC_REG, RTC_CNTL_WIFI_FORCE_PD);
|
||||||
#if !CONFIG_IDF_TARGET_ESP32
|
esp_rom_delay_us(10);
|
||||||
|
wifi_bt_common_module_enable();
|
||||||
|
#if CONFIG_IDF_TARGET_ESP32
|
||||||
|
DPORT_SET_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, MODEM_RESET_FIELD_WHEN_PU);
|
||||||
|
DPORT_CLEAR_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, MODEM_RESET_FIELD_WHEN_PU);
|
||||||
|
#else
|
||||||
|
// modem reset when power on
|
||||||
SET_PERI_REG_MASK(SYSCON_WIFI_RST_EN_REG, MODEM_RESET_FIELD_WHEN_PU);
|
SET_PERI_REG_MASK(SYSCON_WIFI_RST_EN_REG, MODEM_RESET_FIELD_WHEN_PU);
|
||||||
CLEAR_PERI_REG_MASK(SYSCON_WIFI_RST_EN_REG, MODEM_RESET_FIELD_WHEN_PU);
|
CLEAR_PERI_REG_MASK(SYSCON_WIFI_RST_EN_REG, MODEM_RESET_FIELD_WHEN_PU);
|
||||||
#endif
|
#endif
|
||||||
CLEAR_PERI_REG_MASK(RTC_CNTL_DIG_ISO_REG, RTC_CNTL_WIFI_FORCE_ISO);
|
CLEAR_PERI_REG_MASK(RTC_CNTL_DIG_ISO_REG, RTC_CNTL_WIFI_FORCE_ISO);
|
||||||
|
wifi_bt_common_module_disable();
|
||||||
}
|
}
|
||||||
_lock_release(&s_wifi_bt_pd_controller.lock);
|
_lock_release(&s_wifi_bt_pd_controller.lock);
|
||||||
}
|
}
|
||||||
|
@ -237,16 +237,14 @@ static inline void periph_ll_disable_clk_set_rst(periph_module_t periph)
|
|||||||
DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false));
|
DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void)
|
static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk(void)
|
||||||
{
|
{
|
||||||
DPORT_SET_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_BT_COMMON_M);
|
DPORT_SET_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_BT_COMMON_M);
|
||||||
DPORT_CLEAR_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void)
|
static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk(void)
|
||||||
{
|
{
|
||||||
DPORT_CLEAR_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_BT_COMMON_M);
|
DPORT_CLEAR_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_BT_COMMON_M);
|
||||||
DPORT_SET_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void periph_ll_reset(periph_module_t periph)
|
static inline void periph_ll_reset(periph_module_t periph)
|
||||||
|
@ -216,16 +216,14 @@ static inline void periph_ll_disable_clk_set_rst(periph_module_t periph)
|
|||||||
DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false));
|
DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void)
|
static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk(void)
|
||||||
{
|
{
|
||||||
DPORT_SET_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M);
|
DPORT_SET_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M);
|
||||||
DPORT_CLEAR_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void)
|
static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk(void)
|
||||||
{
|
{
|
||||||
DPORT_CLEAR_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M);
|
DPORT_CLEAR_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M);
|
||||||
DPORT_SET_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void periph_ll_reset(periph_module_t periph)
|
static inline void periph_ll_reset(periph_module_t periph)
|
||||||
|
@ -241,16 +241,14 @@ static inline void periph_ll_disable_clk_set_rst(periph_module_t periph)
|
|||||||
DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false));
|
DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void)
|
static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk(void)
|
||||||
{
|
{
|
||||||
DPORT_SET_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_BT_COMMON_M);
|
DPORT_SET_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_BT_COMMON_M);
|
||||||
DPORT_CLEAR_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void)
|
static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk(void)
|
||||||
{
|
{
|
||||||
DPORT_CLEAR_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_BT_COMMON_M);
|
DPORT_CLEAR_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_BT_COMMON_M);
|
||||||
DPORT_SET_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void periph_ll_reset(periph_module_t periph)
|
static inline void periph_ll_reset(periph_module_t periph)
|
||||||
|
@ -262,16 +262,14 @@ static inline void periph_ll_disable_clk_set_rst(periph_module_t periph)
|
|||||||
DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false));
|
DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void)
|
static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk(void)
|
||||||
{
|
{
|
||||||
DPORT_SET_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M);
|
DPORT_SET_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M);
|
||||||
DPORT_CLEAR_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void)
|
static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk(void)
|
||||||
{
|
{
|
||||||
DPORT_CLEAR_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M);
|
DPORT_CLEAR_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M);
|
||||||
DPORT_SET_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void periph_ll_reset(periph_module_t periph)
|
static inline void periph_ll_reset(periph_module_t periph)
|
||||||
|
@ -1088,8 +1088,10 @@
|
|||||||
#define DPORT_RW_BTMAC_RST BIT(9)
|
#define DPORT_RW_BTMAC_RST BIT(9)
|
||||||
#define DPORT_RW_BTLP_RST BIT(10)
|
#define DPORT_RW_BTLP_RST BIT(10)
|
||||||
|
|
||||||
|
//ESP32 should not reset FE in esp_wifi_bt_power_domain_on().
|
||||||
|
//The FE of ESP32 is not in the WIFI PD power domain.
|
||||||
|
//When turning off WIFI PD, the FE will not power down, so phy_wakeup_init() did not rewrite the FE register.
|
||||||
#define MODEM_RESET_FIELD_WHEN_PU (DPORT_WIFIBB_RST | \
|
#define MODEM_RESET_FIELD_WHEN_PU (DPORT_WIFIBB_RST | \
|
||||||
DPORT_FE_RST | \
|
|
||||||
DPORT_WIFIMAC_RST | \
|
DPORT_WIFIMAC_RST | \
|
||||||
DPORT_BTBB_RST | \
|
DPORT_BTBB_RST | \
|
||||||
DPORT_BTMAC_RST | \
|
DPORT_BTMAC_RST | \
|
||||||
|
@ -443,7 +443,8 @@ extern "C" {
|
|||||||
#define DPORT_WIFI_CLK_BT_EN_V 0x61
|
#define DPORT_WIFI_CLK_BT_EN_V 0x61
|
||||||
#define DPORT_WIFI_CLK_BT_EN_S 11
|
#define DPORT_WIFI_CLK_BT_EN_S 11
|
||||||
/* Mask for clock bits used by both WIFI and Bluetooth, bit 0, 3, 6, 7, 8, 9 */
|
/* Mask for clock bits used by both WIFI and Bluetooth, bit 0, 3, 6, 7, 8, 9 */
|
||||||
#define DPORT_WIFI_CLK_WIFI_BT_COMMON_M 0x000003c9
|
#define SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M 0x000003c9
|
||||||
|
#define DPORT_WIFI_CLK_WIFI_BT_COMMON_M SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M
|
||||||
|
|
||||||
/* Digital team to check */
|
/* Digital team to check */
|
||||||
//bluetooth baseband bit11
|
//bluetooth baseband bit11
|
||||||
|
Reference in New Issue
Block a user