From fdfc95812c50cfc30794c6718512b1e6c37ab516 Mon Sep 17 00:00:00 2001 From: baohongde Date: Fri, 25 Dec 2020 14:10:27 +0800 Subject: [PATCH 1/2] components/bt: Shutdown Bluetooth before esp_restart. --- components/bt/controller/bt.c | 22 ++++++++++++++++++++++ components/esp_common/src/system_api.c | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/components/bt/controller/bt.c b/components/bt/controller/bt.c index c50629091f..d9386a1d36 100644 --- a/components/bt/controller/bt.c +++ b/components/bt/controller/bt.c @@ -1535,6 +1535,23 @@ esp_err_t esp_bt_controller_deinit(void) return ESP_OK; } +static void bt_shutdown(void) +{ + esp_err_t ret = ESP_OK; + ESP_LOGD(BTDM_LOG_TAG, "stop/deinit bt"); + + 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_err_t esp_bt_controller_enable(esp_bt_mode_t mode) { int ret; @@ -1598,6 +1615,10 @@ esp_err_t esp_bt_controller_enable(esp_bt_mode_t mode) } btdm_controller_status = ESP_BT_CONTROLLER_STATUS_ENABLED; + ret = esp_register_shutdown_handler(bt_shutdown); + if (ret != ESP_OK) { + ESP_LOGW(BTDM_LOG_TAG, "Register shutdown handler failed, ret = 0x%x", ret); + } return ESP_OK; } @@ -1628,6 +1649,7 @@ esp_err_t esp_bt_controller_disable(void) } esp_phy_rf_deinit(PHY_BT_MODULE); btdm_controller_status = ESP_BT_CONTROLLER_STATUS_INITED; + esp_unregister_shutdown_handler(bt_shutdown); #ifdef CONFIG_PM_ENABLE if (!s_btdm_allow_light_sleep) { diff --git a/components/esp_common/src/system_api.c b/components/esp_common/src/system_api.c index b43d413eb8..25814235c7 100644 --- a/components/esp_common/src/system_api.c +++ b/components/esp_common/src/system_api.c @@ -5,7 +5,7 @@ #include "freertos/task.h" -#define SHUTDOWN_HANDLERS_NO 2 +#define SHUTDOWN_HANDLERS_NO 3 static shutdown_handler_t shutdown_handlers[SHUTDOWN_HANDLERS_NO]; esp_err_t esp_register_shutdown_handler(shutdown_handler_t handler) From cc49472ea4c1ef6d0d5d8ec2ee983460ed93d444 Mon Sep 17 00:00:00 2001 From: baohongde Date: Mon, 1 Mar 2021 14:43:45 +0800 Subject: [PATCH 2/2] components/bt: Fix crash in Bluetooth when esp_restart --- components/bt/controller/bt.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/components/bt/controller/bt.c b/components/bt/controller/bt.c index d9386a1d36..617e2b7fdd 100644 --- a/components/bt/controller/bt.c +++ b/components/bt/controller/bt.c @@ -1328,7 +1328,7 @@ esp_err_t esp_bt_controller_init(esp_bt_controller_config_t *cfg) if (btdm_dram_available_region[0].mode == ESP_BT_MODE_IDLE) { return ESP_ERR_INVALID_STATE; } - + osi_funcs_p = (struct osi_funcs_t *)malloc_internal_wrapper(sizeof(struct osi_funcs_t)); if (osi_funcs_p == NULL) { return ESP_ERR_NO_MEM; @@ -1538,16 +1538,12 @@ esp_err_t esp_bt_controller_deinit(void) static void bt_shutdown(void) { esp_err_t ret = ESP_OK; - ESP_LOGD(BTDM_LOG_TAG, "stop/deinit bt"); + ESP_LOGD(BTDM_LOG_TAG, "stop Bluetooth"); 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; }