diff --git a/components/bt/bluedroid/api/esp_bt_main.c b/components/bt/bluedroid/api/esp_bt_main.c index c9fe4fc060..5f7265e99c 100644 --- a/components/bt/bluedroid/api/esp_bt_main.c +++ b/components/bt/bluedroid/api/esp_bt_main.c @@ -16,6 +16,7 @@ #include "esp_bt_main.h" #include "btc_task.h" #include "btc_main.h" +#include "bt.h" #include "future.h" static bool esp_already_enable = false; @@ -103,6 +104,11 @@ esp_err_t esp_bluedroid_init(void) btc_msg_t msg; future_t **future_p; + if (esp_bt_controller_get_status() != ESP_BT_CONTROLLER_STATUS_ENABLED) { + LOG_ERROR("%s conroller not init\n", __func__); + return ESP_ERR_INVALID_STATE; + } + if (esp_already_init) { LOG_ERROR("%s already init\n", __func__); return ESP_ERR_INVALID_STATE; diff --git a/components/bt/bt.c b/components/bt/bt.c index 440c960e64..6a81d11acc 100644 --- a/components/bt/bt.c +++ b/components/bt/bt.c @@ -35,6 +35,7 @@ /* not for user call, so don't put to include file */ extern void btdm_osi_funcs_register(void *osi_funcs); extern void btdm_controller_init(void); +extern void btdm_controller_schedule(void); extern void btdm_controller_deinit(void); extern int btdm_controller_enable(esp_bt_mode_t mode); extern int btdm_controller_disable(esp_bt_mode_t mode); @@ -77,6 +78,7 @@ struct osi_funcs_t { /* Static variable declare */ static bool btdm_bb_init_flag = false; +static esp_bt_controller_status_t btdm_controller_status = ESP_BT_CONTROLLER_STATUS_IDLE; static xTaskHandle btControllerTaskHandle; @@ -157,12 +159,18 @@ static void bt_controller_task(void *pvParam) btdm_osi_funcs_register(&osi_funcs); btdm_controller_init(); + btdm_controller_status = ESP_BT_CONTROLLER_STATUS_INITED; + + /* Loop */ + btdm_controller_schedule(); } -static bool bb_inited; void esp_bt_controller_init() { - bb_inited = false; + if (btdm_controller_status != ESP_BT_CONTROLLER_STATUS_IDLE) { + return; + } + xTaskCreatePinnedToCore(bt_controller_task, "btController", ESP_TASK_BT_CONTROLLER_STACK, NULL, ESP_TASK_BT_CONTROLLER_PRIO, &btControllerTaskHandle, 0); @@ -171,13 +179,17 @@ void esp_bt_controller_init() void esp_bt_controller_deinit(void) { vTaskDelete(btControllerTaskHandle); - bb_inited = false; + btdm_controller_status = ESP_BT_CONTROLLER_STATUS_IDLE; } esp_err_t esp_bt_controller_enable(esp_bt_mode_t mode) { int ret; + if (btdm_controller_status != ESP_BT_CONTROLLER_STATUS_INITED) { + return ESP_ERR_INVALID_STATE; + } + if (mode != ESP_BT_MODE_BTDM) { return ESP_ERR_INVALID_ARG; } @@ -194,6 +206,8 @@ esp_err_t esp_bt_controller_enable(esp_bt_mode_t mode) return ESP_ERR_INVALID_STATE; } + btdm_controller_status = ESP_BT_CONTROLLER_STATUS_ENABLED; + return ESP_OK; } @@ -201,6 +215,10 @@ esp_err_t esp_bt_controller_disable(esp_bt_mode_t mode) { int ret; + if (btdm_controller_status != ESP_BT_CONTROLLER_STATUS_ENABLED) { + return ESP_ERR_INVALID_STATE; + } + if (mode != ESP_BT_MODE_BTDM) { return ESP_ERR_INVALID_ARG; } @@ -212,7 +230,14 @@ esp_err_t esp_bt_controller_disable(esp_bt_mode_t mode) esp_phy_rf_deinit(); + btdm_controller_status = ESP_BT_CONTROLLER_STATUS_INITED; + return ESP_OK; } +esp_bt_controller_status_t esp_bt_controller_get_status(void) +{ + return btdm_controller_status; +} + #endif diff --git a/components/bt/include/bt.h b/components/bt/include/bt.h index 91617a28f4..2c652466bd 100644 --- a/components/bt/include/bt.h +++ b/components/bt/include/bt.h @@ -33,6 +33,16 @@ typedef enum { ESP_BT_MODE_BTDM = 0x03, /*!< Run dual mode */ } esp_bt_mode_t; +/** + * @brief Bluetooth controller enable/disable/initialised/de-initialised status + */ +typedef enum { + ESP_BT_CONTROLLER_STATUS_IDLE = 0, + ESP_BT_CONTROLLER_STATUS_INITED, + ESP_BT_CONTROLLER_STATUS_ENABLED, + ESP_BT_CONTROLLER_STATUS_NUM, +} esp_bt_controller_status_t; + /** * @brief Initialize BT controller to allocate task and other resource. * @@ -52,6 +62,7 @@ void esp_bt_controller_deinit(void); * @brief Enable BT controller * @param mode : the mode(BLE/BT/BTDM) to enable. * Now only support BTDM. + * @return ESP_OK - success, other - failed */ esp_err_t esp_bt_controller_enable(esp_bt_mode_t mode); @@ -59,10 +70,15 @@ esp_err_t esp_bt_controller_enable(esp_bt_mode_t mode); * @brief Disable BT controller * @param mode : the mode(BLE/BT/BTDM) to disable. * Now only support BTDM. + * @return ESP_OK - success, other - failed */ esp_err_t esp_bt_controller_disable(esp_bt_mode_t mode); - +/** + * @brief Get BT controller is initialised/de-initialised/enabled/disabled + * @return status value + */ +esp_bt_controller_status_t esp_bt_controller_get_status(void); /** @brief esp_vhci_host_callback * used for vhci call host function to notify what host need to do diff --git a/components/bt/lib b/components/bt/lib index 69616af765..dbac82b5c2 160000 --- a/components/bt/lib +++ b/components/bt/lib @@ -1 +1 @@ -Subproject commit 69616af7653f4de6e3b78f475dc10e73f0a20ece +Subproject commit dbac82b5c2694f2639161b0a2b3c0bd8c7d3efc5 diff --git a/docs/api/bluetooth/controller_vhci.rst b/docs/api/bluetooth/controller_vhci.rst index 108a9f678d..9fc5910c25 100644 --- a/docs/api/bluetooth/controller_vhci.rst +++ b/docs/api/bluetooth/controller_vhci.rst @@ -49,6 +49,7 @@ Functions .. doxygenfunction:: esp_bt_controller_deinit .. doxygenfunction:: esp_bt_controller_enable .. doxygenfunction:: esp_bt_controller_disable +.. doxygenfunction:: esp_bt_controller_get_status .. doxygenfunction:: esp_vhci_host_check_send_available .. doxygenfunction:: esp_vhci_host_send_packet .. doxygenfunction:: esp_vhci_host_register_callback