diff --git a/components/bt/controller/bt.c b/components/bt/controller/bt.c index 00172ecbc9..afe994fd3e 100644 --- a/components/bt/controller/bt.c +++ b/components/bt/controller/bt.c @@ -90,7 +90,7 @@ do{\ } while(0) #define OSI_FUNCS_TIME_BLOCKING 0xffffffff -#define OSI_VERSION 0x00010001 +#define OSI_VERSION 0x00010002 #define OSI_MAGIC_VALUE 0xFADEBEAD /* SPIRAM Configuration */ @@ -167,6 +167,8 @@ struct osi_funcs_t { void (* _btdm_sleep_exit_phase1)(void); /* called from ISR */ void (* _btdm_sleep_exit_phase2)(void); /* called from ISR */ void (* _btdm_sleep_exit_phase3)(void); /* called from task */ + bool (* _coex_bt_wakeup_request)(void); + void (* _coex_bt_wakeup_request_end)(void); int (* _coex_bt_request)(uint32_t event, uint32_t latency, uint32_t duration); int (* _coex_bt_release)(uint32_t event); int (* _coex_register_bt_cb)(coex_func_cb_t cb); @@ -282,6 +284,8 @@ static void btdm_sleep_enter_phase1_wrapper(uint32_t lpcycles); static void btdm_sleep_enter_phase2_wrapper(void); static void IRAM_ATTR btdm_sleep_exit_phase1_wrapper(void); static void btdm_sleep_exit_phase3_wrapper(void); +static bool coex_bt_wakeup_request(void); +static void coex_bt_wakeup_request_end(void); /* Local variable definition *************************************************************************** @@ -329,6 +333,8 @@ static const struct osi_funcs_t osi_funcs_ro = { ._btdm_sleep_exit_phase1 = btdm_sleep_exit_phase1_wrapper, ._btdm_sleep_exit_phase2 = NULL, ._btdm_sleep_exit_phase3 = btdm_sleep_exit_phase3_wrapper, + ._coex_bt_wakeup_request = coex_bt_wakeup_request, + ._coex_bt_wakeup_request_end = coex_bt_wakeup_request_end, ._coex_bt_request = coex_bt_request_wrapper, ._coex_bt_release = coex_bt_release_wrapper, ._coex_register_bt_cb = coex_register_bt_cb_wrapper, @@ -889,13 +895,24 @@ static void IRAM_ATTR btdm_slp_tmr_callback(void *arg) } #endif -bool esp_vhci_host_check_send_available(void) -{ - return API_vhci_host_check_send_available(); -} +#define BTDM_ASYNC_WAKEUP_REQ_HCI 0 +#define BTDM_ASYNC_WAKEUP_REQ_COEX 1 +#define BTDM_ASYNC_WAKEUP_REQMAX 2 -void esp_vhci_host_send_packet(uint8_t *data, uint16_t len) +static bool async_wakeup_request(int event) { + bool request_lock = false; + switch (event) { + case BTDM_ASYNC_WAKEUP_REQ_HCI: + request_lock = true; + break; + case BTDM_ASYNC_WAKEUP_REQ_COEX: + request_lock = false; + break; + default: + return false; + } + bool do_wakeup_request = false; if (!btdm_power_state_active()) { @@ -906,13 +923,57 @@ void esp_vhci_host_send_packet(uint8_t *data, uint16_t len) esp_timer_stop(s_btdm_slp_tmr); #endif do_wakeup_request = true; - btdm_wakeup_request(true); + btdm_wakeup_request(request_lock); } + return do_wakeup_request; +} + +static void async_wakeup_request_end(int event) +{ + bool request_lock = false; + switch (event) { + case BTDM_ASYNC_WAKEUP_REQ_HCI: + request_lock = true; + break; + case BTDM_ASYNC_WAKEUP_REQ_COEX: + request_lock = false; + break; + default: + return; + } + + if (request_lock) { + btdm_wakeup_request_end(); + } + + return; +} + +static bool coex_bt_wakeup_request(void) +{ + return async_wakeup_request(BTDM_ASYNC_WAKEUP_REQ_COEX); +} + +static void coex_bt_wakeup_request_end(void) +{ + async_wakeup_request_end(BTDM_ASYNC_WAKEUP_REQ_COEX); + return; +} + +bool esp_vhci_host_check_send_available(void) +{ + return API_vhci_host_check_send_available(); +} + +void esp_vhci_host_send_packet(uint8_t *data, uint16_t len) +{ + bool do_wakeup_request = async_wakeup_request(BTDM_ASYNC_WAKEUP_REQ_HCI); + API_vhci_host_send_packet(data, len); if (do_wakeup_request) { - btdm_wakeup_request_end(); + async_wakeup_request_end(BTDM_ASYNC_WAKEUP_REQ_HCI); } } diff --git a/components/bt/controller/lib b/components/bt/controller/lib index 6c685f1529..2575a67bc7 160000 --- a/components/bt/controller/lib +++ b/components/bt/controller/lib @@ -1 +1 @@ -Subproject commit 6c685f15293ac341bf2b11ff203ef06df3b79f29 +Subproject commit 2575a67bc744a617b2e10267174f5b642d890c37 diff --git a/components/esp_rom/esp32/ld/esp32.rom.ld b/components/esp_rom/esp32/ld/esp32.rom.ld index 4670d48b03..daccdad200 100644 --- a/components/esp_rom/esp32/ld/esp32.rom.ld +++ b/components/esp_rom/esp32/ld/esp32.rom.ld @@ -645,6 +645,7 @@ PROVIDE ( lmp_dhkey_chk_handler = 0x4002ab48 ); PROVIDE ( lmp_pause_enc_aes_req_handler = 0x400279a4 ); PROVIDE ( lmp_io_cap_res_handler = 0x4002c670 ); PROVIDE ( lmp_io_cap_req_handler = 0x4002c7a4 ); +PROVIDE ( lc_cmd_cmp_bd_addr_send = 0x4002cec4 ); PROVIDE ( ld_acl_tx_packet_type_select = 0x4002fb40 ); PROVIDE ( ld_acl_sched = 0x40033268 ); PROVIDE ( ld_acl_sniff_sched = 0x4003340c );