Merge branch 'feat/support_wakeup_causes_in_bt_wakeup' into 'release/v5.4'

Feat/support wakeup causes in bt wakeup

See merge request espressif/esp-idf!42064
This commit is contained in:
Island
2025-09-28 10:30:22 +08:00
4 changed files with 95 additions and 8 deletions

View File

@@ -130,6 +130,15 @@ enum {
}; };
#endif // CONFIG_BT_LE_CONTROLLER_LOG_ENABLED #endif // CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
typedef union {
struct {
uint32_t rtc_freq:20;
uint32_t rsv:11;
uint32_t bt_wakeup:1;
};
uint32_t val;
} bt_wakeup_params_t;
/* External functions or variables /* External functions or variables
************************************************************************ ************************************************************************
*/ */
@@ -220,6 +229,9 @@ static void esp_bt_ctrl_log_partition_get_and_erase_first_block(void);
#endif // CONFIG_BT_LE_CONTROLLER_LOG_STORAGE_ENABLE #endif // CONFIG_BT_LE_CONTROLLER_LOG_STORAGE_ENABLE
#endif /* !CONFIG_BT_LE_CONTROLLER_LOG_MODE_BLE_LOG_V2 */ #endif /* !CONFIG_BT_LE_CONTROLLER_LOG_MODE_BLE_LOG_V2 */
#endif // CONFIG_BT_LE_CONTROLLER_LOG_ENABLED #endif // CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
#if CONFIG_FREERTOS_USE_TICKLESS_IDLE
static bool esp_bt_check_wakeup_by_bt(void);
#endif // CONFIG_FREERTOS_USE_TICKLESS_IDLE
/* Local variable definition /* Local variable definition
*************************************************************************** ***************************************************************************
*/ */
@@ -712,6 +724,7 @@ void controller_sleep_cb(uint32_t enable_tick, void *arg)
void controller_wakeup_cb(void *arg) void controller_wakeup_cb(void *arg)
{ {
bt_wakeup_params_t *params;
if (s_ble_active) { if (s_ble_active) {
return; return;
} }
@@ -721,15 +734,25 @@ void controller_wakeup_cb(void *arg)
esp_pm_get_configuration(&pm_config); esp_pm_get_configuration(&pm_config);
assert(esp_rom_get_cpu_ticks_per_us() == pm_config.max_freq_mhz); assert(esp_rom_get_cpu_ticks_per_us() == pm_config.max_freq_mhz);
#endif //CONFIG_PM_ENABLE #endif //CONFIG_PM_ENABLE
params = (bt_wakeup_params_t *)arg;
esp_phy_enable(PHY_MODEM_BT); esp_phy_enable(PHY_MODEM_BT);
if (s_bt_lpclk_src == MODEM_CLOCK_LPCLK_SRC_RC_SLOW) { if (s_bt_lpclk_src == MODEM_CLOCK_LPCLK_SRC_RC_SLOW) {
uint32_t *clk_freq = (uint32_t *)arg; params->rtc_freq = esp_clk_tree_lp_slow_get_freq_hz(ESP_CLK_TREE_SRC_FREQ_PRECISION_CACHED) / 5;
*clk_freq = esp_clk_tree_lp_slow_get_freq_hz(ESP_CLK_TREE_SRC_FREQ_PRECISION_CACHED) / 5;
} }
#if CONFIG_FREERTOS_USE_TICKLESS_IDLE
params->bt_wakeup = esp_bt_check_wakeup_by_bt();
#endif // CONFIG_FREERTOS_USE_TICKLESS_IDLE
// need to check if need to call pm lock here // need to check if need to call pm lock here
s_ble_active = true; s_ble_active = true;
} }
#if CONFIG_FREERTOS_USE_TICKLESS_IDLE
static bool esp_bt_check_wakeup_by_bt(void)
{
return (esp_sleep_get_wakeup_causes() & ESP_SLEEP_WAKEUP_BT);
}
#endif // CONFIG_FREERTOS_USE_TICKLESS_IDLE
esp_err_t controller_sleep_init(modem_clock_lpclk_src_t slow_clk_src) esp_err_t controller_sleep_init(modem_clock_lpclk_src_t slow_clk_src)
{ {
esp_err_t rc = 0; esp_err_t rc = 0;

View File

@@ -109,6 +109,16 @@ enum {
BLE_LOG_INTERFACE_FLAG_END, BLE_LOG_INTERFACE_FLAG_END,
}; };
#endif // CONFIG_BT_LE_CONTROLLER_LOG_ENABLED #endif // CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
typedef union {
struct {
uint32_t rtc_freq:20;
uint32_t rsv:11;
uint32_t bt_wakeup:1;
};
uint32_t val;
} bt_wakeup_params_t;
/* External functions or variables /* External functions or variables
************************************************************************ ************************************************************************
*/ */
@@ -196,6 +206,9 @@ static void esp_bt_controller_log_interface(uint32_t len, const uint8_t *addr, u
static void esp_bt_ctrl_log_partition_get_and_erase_first_block(void); static void esp_bt_ctrl_log_partition_get_and_erase_first_block(void);
#endif // CONFIG_BT_LE_CONTROLLER_LOG_STORAGE_ENABLE #endif // CONFIG_BT_LE_CONTROLLER_LOG_STORAGE_ENABLE
#endif // CONFIG_BT_LE_CONTROLLER_LOG_ENABLED #endif // CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
#if CONFIG_FREERTOS_USE_TICKLESS_IDLE
static bool esp_bt_check_wakeup_by_bt(void);
#endif // CONFIG_FREERTOS_USE_TICKLESS_IDLE
/* Local variable definition /* Local variable definition
*************************************************************************** ***************************************************************************
*/ */
@@ -628,6 +641,7 @@ IRAM_ATTR void controller_sleep_cb(uint32_t enable_tick, void *arg)
IRAM_ATTR void controller_wakeup_cb(void *arg) IRAM_ATTR void controller_wakeup_cb(void *arg)
{ {
bt_wakeup_params_t *params;
if (s_ble_active) { if (s_ble_active) {
return; return;
} }
@@ -638,15 +652,23 @@ IRAM_ATTR void controller_wakeup_cb(void *arg)
assert(esp_rom_get_cpu_ticks_per_us() == pm_config.max_freq_mhz); assert(esp_rom_get_cpu_ticks_per_us() == pm_config.max_freq_mhz);
r_ble_rtc_wake_up_state_clr(); r_ble_rtc_wake_up_state_clr();
#endif //CONFIG_PM_ENABLE #endif //CONFIG_PM_ENABLE
params = (bt_wakeup_params_t *)arg;
esp_phy_enable(PHY_MODEM_BT); esp_phy_enable(PHY_MODEM_BT);
if (s_bt_lpclk_src == MODEM_CLOCK_LPCLK_SRC_RC_SLOW) { if (s_bt_lpclk_src == MODEM_CLOCK_LPCLK_SRC_RC_SLOW) {
uint32_t *clk_freq = (uint32_t *)arg; params->rtc_freq = esp_clk_tree_lp_slow_get_freq_hz(ESP_CLK_TREE_SRC_FREQ_PRECISION_CACHED) / 5;
*clk_freq = esp_clk_tree_lp_slow_get_freq_hz(ESP_CLK_TREE_SRC_FREQ_PRECISION_CACHED) / 5;
} }
#if CONFIG_FREERTOS_USE_TICKLESS_IDLE
params->bt_wakeup = esp_bt_check_wakeup_by_bt();
#endif // CONFIG_FREERTOS_USE_TICKLESS_IDLE
s_ble_active = true; s_ble_active = true;
} }
#if CONFIG_FREERTOS_USE_TICKLESS_IDLE #if CONFIG_FREERTOS_USE_TICKLESS_IDLE
static bool esp_bt_check_wakeup_by_bt(void)
{
return (esp_sleep_get_wakeup_causes() & ESP_SLEEP_WAKEUP_BT);
}
static esp_err_t sleep_modem_ble_mac_retention_init(void *arg) static esp_err_t sleep_modem_ble_mac_retention_init(void *arg)
{ {
uint8_t size; uint8_t size;

View File

@@ -125,6 +125,15 @@ enum {
}; };
#endif // CONFIG_BT_LE_CONTROLLER_LOG_ENABLED #endif // CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
typedef union {
struct {
uint32_t rtc_freq:20;
uint32_t rsv:11;
uint32_t bt_wakeup:1;
};
uint32_t val;
} bt_wakeup_params_t;
/* External functions or variables /* External functions or variables
************************************************************************ ************************************************************************
*/ */
@@ -221,6 +230,9 @@ static void esp_bt_ctrl_log_partition_get_and_erase_first_block(void);
#endif // CONFIG_BT_LE_CONTROLLER_LOG_STORAGE_ENABLE #endif // CONFIG_BT_LE_CONTROLLER_LOG_STORAGE_ENABLE
#endif /* !CONFIG_BT_LE_CONTROLLER_LOG_MODE_BLE_LOG_V2 */ #endif /* !CONFIG_BT_LE_CONTROLLER_LOG_MODE_BLE_LOG_V2 */
#endif // CONFIG_BT_LE_CONTROLLER_LOG_ENABLED #endif // CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
#if CONFIG_FREERTOS_USE_TICKLESS_IDLE
static bool esp_bt_check_wakeup_by_bt(void);
#endif // CONFIG_FREERTOS_USE_TICKLESS_IDLE
/* Local variable definition /* Local variable definition
*************************************************************************** ***************************************************************************
*/ */
@@ -759,6 +771,7 @@ IRAM_ATTR void controller_sleep_cb(uint32_t enable_tick, void *arg)
IRAM_ATTR void controller_wakeup_cb(void *arg) IRAM_ATTR void controller_wakeup_cb(void *arg)
{ {
bt_wakeup_params_t *params;
if (s_ble_active) { if (s_ble_active) {
return; return;
} }
@@ -769,15 +782,23 @@ IRAM_ATTR void controller_wakeup_cb(void *arg)
assert(esp_rom_get_cpu_ticks_per_us() == pm_config.max_freq_mhz); assert(esp_rom_get_cpu_ticks_per_us() == pm_config.max_freq_mhz);
r_ble_rtc_wake_up_state_clr(); r_ble_rtc_wake_up_state_clr();
#endif //CONFIG_PM_ENABLE #endif //CONFIG_PM_ENABLE
params = (bt_wakeup_params_t *)arg;
esp_phy_enable(PHY_MODEM_BT); esp_phy_enable(PHY_MODEM_BT);
if (s_bt_lpclk_src == MODEM_CLOCK_LPCLK_SRC_RC_SLOW) { if (s_bt_lpclk_src == MODEM_CLOCK_LPCLK_SRC_RC_SLOW) {
uint32_t *clk_freq = (uint32_t *)arg; params->rtc_freq = esp_clk_tree_lp_slow_get_freq_hz(ESP_CLK_TREE_SRC_FREQ_PRECISION_CACHED) / 5;
*clk_freq = esp_clk_tree_lp_slow_get_freq_hz(ESP_CLK_TREE_SRC_FREQ_PRECISION_CACHED) / 5;
} }
#if CONFIG_FREERTOS_USE_TICKLESS_IDLE
params->bt_wakeup = esp_bt_check_wakeup_by_bt();
#endif // CONFIG_FREERTOS_USE_TICKLESS_IDLE
s_ble_active = true; s_ble_active = true;
} }
#if CONFIG_FREERTOS_USE_TICKLESS_IDLE #if CONFIG_FREERTOS_USE_TICKLESS_IDLE
static bool esp_bt_check_wakeup_by_bt(void)
{
return (esp_sleep_get_wakeup_causes() & ESP_SLEEP_WAKEUP_BT);
}
static esp_err_t sleep_modem_ble_mac_retention_init(void *arg) static esp_err_t sleep_modem_ble_mac_retention_init(void *arg)
{ {
uint8_t size; uint8_t size;

View File

@@ -117,6 +117,15 @@ enum {
BLE_LOG_INTERFACE_FLAG_END, BLE_LOG_INTERFACE_FLAG_END,
}; };
#endif // CONFIG_BT_LE_CONTROLLER_LOG_ENABLED #endif // CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
typedef union {
struct {
uint32_t rtc_freq:20;
uint32_t rsv:11;
uint32_t bt_wakeup:1;
};
uint32_t val;
} bt_wakeup_params_t;
/* External functions or variables /* External functions or variables
************************************************************************ ************************************************************************
*/ */
@@ -214,6 +223,9 @@ static void esp_bt_ctrl_log_partition_get_and_erase_first_block(void);
#endif // CONFIG_BT_LE_CONTROLLER_LOG_STORAGE_ENABLE #endif // CONFIG_BT_LE_CONTROLLER_LOG_STORAGE_ENABLE
#endif /* !CONFIG_BT_LE_CONTROLLER_LOG_MODE_BLE_LOG_V2 */ #endif /* !CONFIG_BT_LE_CONTROLLER_LOG_MODE_BLE_LOG_V2 */
#endif // CONFIG_BT_LE_CONTROLLER_LOG_ENABLED #endif // CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
#if CONFIG_FREERTOS_USE_TICKLESS_IDLE
static bool esp_bt_check_wakeup_by_bt(void);
#endif // CONFIG_FREERTOS_USE_TICKLESS_IDLE
/* Local variable definition /* Local variable definition
*************************************************************************** ***************************************************************************
*/ */
@@ -727,6 +739,7 @@ IRAM_ATTR void controller_sleep_cb(uint32_t enable_tick, void *arg)
IRAM_ATTR void controller_wakeup_cb(void *arg) IRAM_ATTR void controller_wakeup_cb(void *arg)
{ {
bt_wakeup_params_t *params;
if (s_ble_active) { if (s_ble_active) {
return; return;
} }
@@ -737,15 +750,23 @@ IRAM_ATTR void controller_wakeup_cb(void *arg)
assert(esp_rom_get_cpu_ticks_per_us() == pm_config.max_freq_mhz); assert(esp_rom_get_cpu_ticks_per_us() == pm_config.max_freq_mhz);
r_ble_rtc_wake_up_state_clr(); r_ble_rtc_wake_up_state_clr();
#endif //CONFIG_PM_ENABLE #endif //CONFIG_PM_ENABLE
params = (bt_wakeup_params_t *)arg;
esp_phy_enable(PHY_MODEM_BT); esp_phy_enable(PHY_MODEM_BT);
if (s_bt_lpclk_src == MODEM_CLOCK_LPCLK_SRC_RC_SLOW) { if (s_bt_lpclk_src == MODEM_CLOCK_LPCLK_SRC_RC_SLOW) {
uint32_t *clk_freq = (uint32_t *)arg; params->rtc_freq = esp_clk_tree_lp_slow_get_freq_hz(ESP_CLK_TREE_SRC_FREQ_PRECISION_CACHED) / 5;
*clk_freq = esp_clk_tree_lp_slow_get_freq_hz(ESP_CLK_TREE_SRC_FREQ_PRECISION_CACHED) / 5;
} }
#if CONFIG_FREERTOS_USE_TICKLESS_IDLE
params->bt_wakeup = esp_bt_check_wakeup_by_bt();
#endif // CONFIG_FREERTOS_USE_TICKLESS_IDLE
s_ble_active = true; s_ble_active = true;
} }
#ifdef CONFIG_FREERTOS_USE_TICKLESS_IDLE #ifdef CONFIG_FREERTOS_USE_TICKLESS_IDLE
static bool esp_bt_check_wakeup_by_bt(void)
{
return (esp_sleep_get_wakeup_causes() & ESP_SLEEP_WAKEUP_BT);
}
static esp_err_t sleep_modem_ble_mac_retention_init(void *arg) static esp_err_t sleep_modem_ble_mac_retention_init(void *arg)
{ {
uint8_t size; uint8_t size;