mirror of
https://github.com/espressif/esp-idf.git
synced 2025-08-03 20:54:32 +02:00
component/bt: handle sleep wakeup event in the context of controller task instead of timer task
This commit is contained in:
@@ -89,6 +89,14 @@ do{\
|
|||||||
/* Types definition
|
/* Types definition
|
||||||
************************************************************************
|
************************************************************************
|
||||||
*/
|
*/
|
||||||
|
/* vendor dependent signals to be posted to controller task */
|
||||||
|
typedef enum {
|
||||||
|
BTDM_VND_OL_SIG_WAKEUP_TMR = 0,
|
||||||
|
BTDM_VND_OL_SIG_NUM,
|
||||||
|
} btdm_vnd_ol_sig_t;
|
||||||
|
|
||||||
|
/* prototype of function to handle vendor dependent signals */
|
||||||
|
typedef void (* btdm_vnd_ol_task_func_t)(void *param);
|
||||||
|
|
||||||
/* VHCI function interface */
|
/* VHCI function interface */
|
||||||
typedef struct vhci_host_callback {
|
typedef struct vhci_host_callback {
|
||||||
@@ -194,6 +202,13 @@ extern bool btdm_power_state_active(void);
|
|||||||
extern void btdm_wakeup_request(void);
|
extern void btdm_wakeup_request(void);
|
||||||
extern void btdm_wakeup_request_start(void);
|
extern void btdm_wakeup_request_start(void);
|
||||||
extern void btdm_wakeup_request_end(void);
|
extern void btdm_wakeup_request_end(void);
|
||||||
|
|
||||||
|
/* vendor dependent tasks to be posted and handled by controller task*/
|
||||||
|
extern int btdm_vnd_offload_task_register(btdm_vnd_ol_sig_t sig, btdm_vnd_ol_task_func_t func);
|
||||||
|
extern int btdm_vnd_offload_task_deregister(btdm_vnd_ol_sig_t sig);
|
||||||
|
extern int btdm_vnd_offload_post_from_isr(btdm_vnd_ol_sig_t sig, void *param, bool need_yield);
|
||||||
|
extern int btdm_vnd_offload_post(btdm_vnd_ol_sig_t sig, void *param);
|
||||||
|
|
||||||
/* Low Power Clock */
|
/* Low Power Clock */
|
||||||
extern bool btdm_lpclk_select_src(uint32_t sel);
|
extern bool btdm_lpclk_select_src(uint32_t sel);
|
||||||
extern bool btdm_lpclk_set_div(uint32_t div);
|
extern bool btdm_lpclk_set_div(uint32_t div);
|
||||||
@@ -924,7 +939,7 @@ static void btdm_sleep_exit_phase3_wrapper(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if (defined CONFIG_PM_ENABLE) || (defined CONFIG_PM_POWER_DOWN_WIFI_BT_MAC_BB)
|
#if (defined CONFIG_PM_ENABLE) || (defined CONFIG_PM_POWER_DOWN_WIFI_BT_MAC_BB)
|
||||||
static void IRAM_ATTR btdm_slp_tmr_callback(void *arg)
|
static void IRAM_ATTR btdm_sleep_exit_phase0(void *param)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_PM_ENABLE
|
#ifdef CONFIG_PM_ENABLE
|
||||||
if (semphr_take_wrapper(s_pm_lock_sem, 0) == pdTRUE) {
|
if (semphr_take_wrapper(s_pm_lock_sem, 0) == pdTRUE) {
|
||||||
@@ -938,7 +953,12 @@ static void IRAM_ATTR btdm_slp_tmr_callback(void *arg)
|
|||||||
sleep_backup_done = false;
|
sleep_backup_done = false;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static void IRAM_ATTR btdm_slp_tmr_callback(void *arg)
|
||||||
|
{
|
||||||
|
btdm_vnd_offload_post_from_isr(BTDM_VND_OL_SIG_WAKEUP_TMR, NULL, false);
|
||||||
|
esp_timer_isr_dispatch_need_yield();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -1139,11 +1159,13 @@ esp_err_t esp_bt_controller_init(esp_bt_controller_config_t *cfg)
|
|||||||
esp_timer_create_args_t create_args = {
|
esp_timer_create_args_t create_args = {
|
||||||
.callback = btdm_slp_tmr_callback,
|
.callback = btdm_slp_tmr_callback,
|
||||||
.arg = NULL,
|
.arg = NULL,
|
||||||
.name = "btSlp"
|
.dispatch_method = ESP_TIMER_ISR,
|
||||||
|
.name = "btSlp",
|
||||||
};
|
};
|
||||||
if ((err = esp_timer_create(&create_args, &s_btdm_slp_tmr)) != ESP_OK) {
|
if ((err = esp_timer_create(&create_args, &s_btdm_slp_tmr)) != ESP_OK) {
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
btdm_vnd_offload_task_register(BTDM_VND_OL_SIG_WAKEUP_TMR, btdm_sleep_exit_phase0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
do {// todo: rewrite this block of code for chip
|
do {// todo: rewrite this block of code for chip
|
||||||
@@ -1215,6 +1237,7 @@ error:
|
|||||||
esp_timer_delete(s_btdm_slp_tmr);
|
esp_timer_delete(s_btdm_slp_tmr);
|
||||||
s_btdm_slp_tmr = NULL;
|
s_btdm_slp_tmr = NULL;
|
||||||
}
|
}
|
||||||
|
btdm_vnd_offload_task_deregister(BTDM_VND_OL_SIG_WAKEUP_TMR);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (CONFIG_PM_POWER_DOWN_WIFI_BT_MAC_BB)
|
#if (CONFIG_PM_POWER_DOWN_WIFI_BT_MAC_BB)
|
||||||
@@ -1254,6 +1277,7 @@ esp_err_t esp_bt_controller_deinit(void)
|
|||||||
esp_timer_stop(s_btdm_slp_tmr);
|
esp_timer_stop(s_btdm_slp_tmr);
|
||||||
esp_timer_delete(s_btdm_slp_tmr);
|
esp_timer_delete(s_btdm_slp_tmr);
|
||||||
s_btdm_slp_tmr = NULL;
|
s_btdm_slp_tmr = NULL;
|
||||||
|
btdm_vnd_offload_task_deregister(BTDM_VND_OL_SIG_WAKEUP_TMR);
|
||||||
#endif
|
#endif
|
||||||
#if CONFIG_SPIRAM_USE_MALLOC
|
#if CONFIG_SPIRAM_USE_MALLOC
|
||||||
vSemaphoreDelete(btdm_queue_table_mux);
|
vSemaphoreDelete(btdm_queue_table_mux);
|
||||||
|
Reference in New Issue
Block a user