diff --git a/components/bt/bt.c b/components/bt/bt.c index 53c9ec4ecd..a223b73686 100644 --- a/components/bt/bt.c +++ b/components/bt/bt.c @@ -47,6 +47,10 @@ #include "hli_api.h" #include "esp_core_dump.h" +#ifdef CONFIG_BLUEDROID_ENABLED +#include "esp_bt_main.h" +#endif + #if CONFIG_BT_ENABLED #define CONFIG_BT_HLIGH_LEVEL_INT /* Macro definition @@ -1207,6 +1211,35 @@ esp_err_t esp_bt_controller_deinit(void) return ESP_OK; } +static esp_err_t bt_restart(void) +{ + int ret = 0; + ESP_LOGI(BTDM_LOG_TAG, "stop/deinit bt"); + +#ifdef CONFIG_BLUEDROID_ENABLED + ret = esp_bluedroid_disable(); + if (ESP_OK != ret) { + ESP_LOGW(BTDM_LOG_TAG, "bluedroid disable ret=%d", ret); + } + + ret = esp_bluedroid_deinit(); + if (ESP_OK != ret) { + ESP_LOGW(BTDM_LOG_TAG, "bluedroid deinit ret=%d", ret); + } +#endif + + ret = esp_bt_controller_disable(); + if (ESP_OK != ret) { + ESP_LOGW(BTDM_LOG_TAG, "controller disable ret=%d", ret); + } + ret = esp_bt_controller_deinit(); + if (ESP_OK != ret) { + ESP_LOGW(BTDM_LOG_TAG, "controller deinit ret=%d", ret); + } + return ESP_OK; +} + + esp_err_t esp_bt_controller_enable(esp_bt_mode_t mode) { int ret; @@ -1266,6 +1299,7 @@ esp_err_t esp_bt_controller_enable(esp_bt_mode_t mode) } btdm_controller_status = ESP_BT_CONTROLLER_STATUS_ENABLED; + esp_register_shutdown_handler((shutdown_handler_t)bt_restart); return ESP_OK; } @@ -1304,6 +1338,7 @@ esp_err_t esp_bt_controller_disable(void) esp_pm_lock_release(s_pm_lock); #endif + return ESP_OK; } diff --git a/components/esp32/lib b/components/esp32/lib index 8a32f641e6..49bd17b2ba 160000 --- a/components/esp32/lib +++ b/components/esp32/lib @@ -1 +1 @@ -Subproject commit 8a32f641e6dfb57efa1b401d0295d45f0d2fbb17 +Subproject commit 49bd17b2bac66b5a883815fe0913eaed78ae9f3c diff --git a/components/esp32/system_api.c b/components/esp32/system_api.c index 0dc168378e..2809d98f25 100644 --- a/components/esp32/system_api.c +++ b/components/esp32/system_api.c @@ -44,7 +44,7 @@ static const char* TAG = "system_api"; static uint8_t base_mac_addr[6] = { 0 }; -#define SHUTDOWN_HANDLERS_NO 2 +#define SHUTDOWN_HANDLERS_NO 3 static shutdown_handler_t shutdown_handlers[SHUTDOWN_HANDLERS_NO]; void system_init() @@ -211,14 +211,25 @@ esp_err_t esp_read_mac(uint8_t* mac, esp_mac_type_t type) esp_err_t esp_register_shutdown_handler(shutdown_handler_t handler) { - int i; - for (i = 0; i < SHUTDOWN_HANDLERS_NO; i++) { - if (shutdown_handlers[i] == NULL) { - shutdown_handlers[i] = handler; - return ESP_OK; - } - } - return ESP_FAIL; + int empty_slot = SHUTDOWN_HANDLERS_NO; + int i; + + for (i = 0; i < SHUTDOWN_HANDLERS_NO; i++) { + if (shutdown_handlers[i] == handler) { + return ESP_OK; + } + + if ((empty_slot == SHUTDOWN_HANDLERS_NO) && (shutdown_handlers[i] == NULL)) { + empty_slot = i; + } + } + + if (empty_slot < SHUTDOWN_HANDLERS_NO) { + shutdown_handlers[empty_slot] = handler; + return ESP_OK; + } + + return ESP_FAIL; } void esp_restart_noos() __attribute__ ((noreturn)); @@ -303,6 +314,9 @@ void IRAM_ATTR esp_restart_noos() DPORT_RW_BTMAC_RST | DPORT_RW_BTLP_RST); DPORT_REG_WRITE(DPORT_CORE_RST_EN_REG, 0); + // Delay 1us to make sure wifi/bt mac/bb reset successfully + ets_delay_us(1); + // Reset timer/spi/uart DPORT_SET_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_TIMERS_RST | DPORT_SPI01_RST | DPORT_UART_RST | DPORT_UART1_RST | DPORT_UART2_RST);