diff --git a/components/bt/common/btc/core/btc_task.c b/components/bt/common/btc/core/btc_task.c index 5367d5ef85..4564beea1c 100644 --- a/components/bt/common/btc/core/btc_task.c +++ b/components/bt/common/btc/core/btc_task.c @@ -185,6 +185,15 @@ static bt_status_t btc_task_post(btc_msg_t *msg, uint32_t timeout) return BT_STATUS_SUCCESS; } +/** + * transfer an message to another module in the different task. + * @param msg message + * @param arg paramter + * @param arg_len length of paramter + * @param copy_func deep copy function + * @return BT_STATUS_SUCCESS: success + * others: fail + */ bt_status_t btc_transfer_context(btc_msg_t *msg, void *arg, int arg_len, btc_arg_deep_copy_t copy_func) { btc_msg_t lmsg; @@ -214,6 +223,34 @@ bt_status_t btc_transfer_context(btc_msg_t *msg, void *arg, int arg_len, btc_arg } +/** + * transfer an message to another module in tha same task. + * @param msg message + * @param arg paramter + * @return BT_STATUS_SUCCESS: success + * others: fail + */ +bt_status_t btc_inter_profile_call(btc_msg_t *msg, void *arg) +{ + if (msg == NULL) { + return BT_STATUS_PARM_INVALID; + } + + msg->arg = arg; + switch (msg->sig) { + case BTC_SIG_API_CALL: + profile_tab[msg->pid].btc_call(msg); + break; + case BTC_SIG_API_CB: + profile_tab[msg->pid].btc_cb(msg); + break; + default: + break; + } + return BT_STATUS_SUCCESS; +} + + #if BTC_DYNAMIC_MEMORY static void btc_deinit_mem(void) { diff --git a/components/bt/common/btc/include/btc/btc_task.h b/components/bt/common/btc/include/btc/btc_task.h index e9ee22acec..a746caef6e 100644 --- a/components/bt/common/btc/include/btc/btc_task.h +++ b/components/bt/common/btc/include/btc/btc_task.h @@ -96,8 +96,26 @@ typedef struct { typedef void (* btc_arg_deep_copy_t)(btc_msg_t *msg, void *dst, void *src); +/** + * transfer an message to another module in the different task. + * @param msg message + * @param arg paramter + * @param arg_len length of paramter + * @param copy_func deep copy function + * @return BT_STATUS_SUCCESS: success + * others: fail + */ bt_status_t btc_transfer_context(btc_msg_t *msg, void *arg, int arg_len, btc_arg_deep_copy_t copy_func); +/** + * transfer an message to another module in tha same task. + * @param msg message + * @param arg paramter + * @return BT_STATUS_SUCCESS: success + * others: fail + */ +bt_status_t btc_inter_profile_call(btc_msg_t *msg, void *arg); + bt_status_t btc_init(void); void btc_deinit(void); bool btc_check_queue_is_congest(void); diff --git a/components/bt/host/bluedroid/api/include/api/esp_gap_bt_api.h b/components/bt/host/bluedroid/api/include/api/esp_gap_bt_api.h index 4ecc64a3f7..66fffb7d78 100644 --- a/components/bt/host/bluedroid/api/include/api/esp_gap_bt_api.h +++ b/components/bt/host/bluedroid/api/include/api/esp_gap_bt_api.h @@ -221,6 +221,7 @@ typedef enum { ESP_BT_GAP_SET_AFH_CHANNELS_EVT, /*!< set AFH channels event */ ESP_BT_GAP_READ_REMOTE_NAME_EVT, /*!< read Remote Name event */ ESP_BT_GAP_MODE_CHG_EVT, + ESP_BT_GAP_REMOVE_BOND_DEV_COMPLETE_EVT, /*!< remove bond device complete event */ ESP_BT_GAP_EVT_MAX, } esp_bt_gap_cb_event_t; @@ -355,6 +356,14 @@ typedef union { esp_bt_pm_mode_t mode; /*!< PM mode*/ } mode_chg; /*!< mode change event parameter struct */ + /** + * @brief ESP_BT_GAP_REMOVE_BOND_DEV_COMPLETE_EVT + */ + struct bt_remove_bond_dev_cmpl_evt_param { + esp_bd_addr_t bda; /*!< remote bluetooth device address*/ + esp_bt_status_t status; /*!< Indicate the remove bond device operation success status */ + }remove_bond_dev_cmpl; /*!< Event parameter of ESP_BT_GAP_REMOVE_BOND_DEV_COMPLETE_EVT */ + } esp_bt_gap_cb_param_t; /** diff --git a/components/bt/host/bluedroid/bta/dm/bta_dm_act.c b/components/bt/host/bluedroid/bta/dm/bta_dm_act.c index a86d9c003d..010c0b5821 100644 --- a/components/bt/host/bluedroid/bta/dm/bta_dm_act.c +++ b/components/bt/host/bluedroid/bta/dm/bta_dm_act.c @@ -997,11 +997,14 @@ void bta_dm_remove_device(tBTA_DM_MSG *p_data) /* Take the link down first, and mark the device for removal when disconnected */ for (int i = 0; i < bta_dm_cb.device_list.count; i++) { if (!bdcmp(bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_dev->bd_addr) - && bta_dm_cb.device_list.peer_device[i].transport == transport) { +#if BLE_INCLUDED == TRUE + && bta_dm_cb.device_list.peer_device[i].transport == transport +#endif + ) { + bta_dm_cb.device_list.peer_device[i].conn_state = BTA_DM_UNPAIRING; - btm_remove_acl( p_dev->bd_addr, bta_dm_cb.device_list.peer_device[i].transport); - APPL_TRACE_DEBUG("%s:transport = %d", __func__, - bta_dm_cb.device_list.peer_device[i].transport); + btm_remove_acl( p_dev->bd_addr, transport); + APPL_TRACE_DEBUG("%s:transport = %d", __func__, transport); break; } } diff --git a/components/bt/host/bluedroid/bta/include/bta/bta_api.h b/components/bt/host/bluedroid/bta/include/bta/bta_api.h index c5daf6cc8b..abebedffa4 100644 --- a/components/bt/host/bluedroid/bta/include/bta/bta_api.h +++ b/components/bt/host/bluedroid/bta/include/bta/bta_api.h @@ -955,7 +955,7 @@ typedef union { tBTA_DM_PIN_REQ pin_req; /* PIN request. */ tBTA_DM_AUTH_CMPL auth_cmpl; /* Authentication complete indication. */ tBTA_DM_AUTHORIZE authorize; /* Authorization request. */ - tBTA_DM_LINK_UP link_up; /* ACL connection down event */ + tBTA_DM_LINK_UP link_up; /* ACL connection up event */ tBTA_DM_LINK_DOWN link_down; /* ACL connection down event */ tBTA_DM_BUSY_LEVEL busy_level; /* System busy level */ tBTA_DM_SP_CFM_REQ cfm_req; /* user confirm request */ diff --git a/components/bt/host/bluedroid/btc/core/btc_dm.c b/components/bt/host/bluedroid/btc/core/btc_dm.c index 266869fa20..1f9c761959 100644 --- a/components/bt/host/bluedroid/btc/core/btc_dm.c +++ b/components/bt/host/bluedroid/btc/core/btc_dm.c @@ -22,7 +22,7 @@ #include "common/bt_target.h" #include "btc/btc_storage.h" #include "btc/btc_ble_storage.h" -#include "esp_gap_ble_api.h" +#include "btc_gap_ble.h" #include "btm_int.h" #include "bta/bta_api.h" #include "bta/bta_gatt_api.h" @@ -408,11 +408,10 @@ static void btc_dm_auth_cmpl_evt (tBTA_DM_AUTH_CMPL *p_auth_cmpl) memcpy(param.auth_cmpl.bda, p_auth_cmpl->bd_addr, ESP_BD_ADDR_LEN); memcpy(param.auth_cmpl.device_name, p_auth_cmpl->bd_name, ESP_BT_GAP_MAX_BDNAME_LEN + 1); - ret = btc_transfer_context(&msg, ¶m, - sizeof(esp_bt_gap_cb_param_t), NULL); + ret = btc_inter_profile_call(&msg, ¶m); if (ret != BT_STATUS_SUCCESS) { - BTC_TRACE_ERROR("%s btc_transfer_context failed\n", __func__); + BTC_TRACE_ERROR("%s btc_inter_profile_call failed\n", __func__); } #endif /// BTC_GAP_BT_INCLUDED == TRUE @@ -431,11 +430,10 @@ static void btc_dm_pin_req_evt(tBTA_DM_PIN_REQ *p_pin_req) param.pin_req.min_16_digit = p_pin_req->min_16_digit; memcpy(param.pin_req.bda, p_pin_req->bd_addr, ESP_BD_ADDR_LEN); - ret = btc_transfer_context(&msg, ¶m, - sizeof(esp_bt_gap_cb_param_t), NULL); + ret = btc_inter_profile_call(&msg, ¶m); if (ret != BT_STATUS_SUCCESS) { - BTC_TRACE_ERROR("%s btc_transfer_context failed\n", __func__); + BTC_TRACE_ERROR("%s btc_inter_profile_call failed\n", __func__); } #endif /// BTC_GAP_BT_INCLUDED == TRUE } @@ -459,11 +457,10 @@ static void btc_dm_sp_cfm_req_evt(tBTA_DM_SP_CFM_REQ *p_cfm_req) param.cfm_req.num_val = p_cfm_req->num_val; memcpy(param.cfm_req.bda, p_cfm_req->bd_addr, ESP_BD_ADDR_LEN); - ret = btc_transfer_context(&msg, ¶m, - sizeof(esp_bt_gap_cb_param_t), NULL); + ret = btc_inter_profile_call(&msg, ¶m); if (ret != BT_STATUS_SUCCESS) { - BTC_TRACE_ERROR("%s btc_transfer_context failed\n", __func__); + BTC_TRACE_ERROR("%s btc_inter_profile_call failed\n", __func__); } #endif /// BTC_GAP_BT_INCLUDED == TRUE } @@ -480,11 +477,10 @@ static void btc_dm_sp_key_notif_evt(tBTA_DM_SP_KEY_NOTIF *p_key_notif) param.key_notif.passkey = p_key_notif->passkey; memcpy(param.key_notif.bda, p_key_notif->bd_addr, ESP_BD_ADDR_LEN); - ret = btc_transfer_context(&msg, ¶m, - sizeof(esp_bt_gap_cb_param_t), NULL); + ret = btc_inter_profile_call(&msg, ¶m); if (ret != BT_STATUS_SUCCESS) { - BTC_TRACE_ERROR("%s btc_transfer_context failed\n", __func__); + BTC_TRACE_ERROR("%s btc_inter_profile_call failed\n", __func__); } #endif /// BTC_GAP_BT_INCLUDED == TRUE } @@ -500,16 +496,44 @@ static void btc_dm_sp_key_req_evt(tBTA_DM_SP_KEY_REQ *p_key_req) msg.act = BTC_GAP_BT_KEY_REQ_EVT; memcpy(param.key_req.bda, p_key_req->bd_addr, ESP_BD_ADDR_LEN); - ret = btc_transfer_context(&msg, ¶m, - sizeof(esp_bt_gap_cb_param_t), NULL); + ret = btc_inter_profile_call(&msg, ¶m); if (ret != BT_STATUS_SUCCESS) { - BTC_TRACE_ERROR("%s btc_transfer_context failed\n", __func__); + BTC_TRACE_ERROR("%s btc_inter_profile_call failed\n", __func__); } #endif /// BTC_GAP_BT_INCLUDED == TRUE } #endif /// BT_SSP_INCLUDED == TRUE +static void btc_dm_dev_unpaired_evt(tBTA_DM_LINK_DOWN *p_link_down) +{ + esp_bt_gap_cb_param_t param; + BTC_TRACE_DEBUG("%s",__func__); + memcpy(param.remove_bond_dev_cmpl.bda, p_link_down->bd_addr, ESP_BD_ADDR_LEN); + btm_set_bond_type_dev(p_link_down->bd_addr, BOND_TYPE_UNKNOWN); + if (p_link_down->status == HCI_SUCCESS) { + //remove the bonded key in the config and nvs flash. + param.remove_bond_dev_cmpl.status = btc_storage_remove_bonded_device((bt_bdaddr_t *)param.remove_bond_dev_cmpl.bda); + } else { + param.remove_bond_dev_cmpl.status = ESP_BT_STATUS_FAIL; + } + +#if (BTC_GAP_BT_INCLUDED == TRUE) + bt_status_t ret; + btc_msg_t msg; + msg.sig = BTC_SIG_API_CB; + msg.pid = BTC_PID_GAP_BT; + msg.act = BTC_GAP_BT_REMOVE_BOND_DEV_COMPLETE_EVT; + + ret = btc_inter_profile_call(&msg, ¶m); + + if (ret != BT_STATUS_SUCCESS) { + BTC_TRACE_ERROR("%s btc_inter_profile_call failed\n", __func__); + } +#endif /// BTC_GAP_BT_INCLUDED == TRUE +} + + #if (BTC_DM_PM_INCLUDED == TRUE) static void btc_dm_pm_mode_chg_evt(tBTA_DM_MODE_CHG *p_mode_chg) { @@ -522,11 +546,10 @@ static void btc_dm_pm_mode_chg_evt(tBTA_DM_MODE_CHG *p_mode_chg) memcpy(param.mode_chg.bda, p_mode_chg->bd_addr, ESP_BD_ADDR_LEN); param.mode_chg.mode = p_mode_chg->mode; - ret = btc_transfer_context(&msg, ¶m, - sizeof(esp_bt_gap_cb_param_t), NULL); + ret = btc_inter_profile_call(&msg, ¶m); if (ret != BT_STATUS_SUCCESS) { - BTC_TRACE_ERROR("%s btc_transfer_context failed\n", __func__); + BTC_TRACE_ERROR("%s btc_inter_profile_call failed\n", __func__); } } #endif /// BTC_DM_PM_INCLUDED == TRUE @@ -675,16 +698,7 @@ void btc_dm_sec_cb_handler(btc_msg_t *msg) #endif ///BT_SSP_INCLUDED == TRUE case BTA_DM_DEV_UNPAIRED_EVT: { -#if (SMP_INCLUDED == TRUE) - bt_bdaddr_t bd_addr; - BTC_TRACE_DEBUG("BTA_DM_DEV_UNPAIRED_EVT"); - memcpy(bd_addr.address, p_data->link_down.bd_addr, sizeof(BD_ADDR)); - btm_set_bond_type_dev(p_data->link_down.bd_addr, BOND_TYPE_UNKNOWN); - if (p_data->link_down.status == HCI_SUCCESS) { - //remove the bonded key in the config and nvs flash. - btc_storage_remove_bonded_device(&bd_addr); - } -#endif /* #if (SMP_INCLUDED == TRUE) */ + btc_dm_dev_unpaired_evt(&p_data->link_down); break; } #if (BLE_INCLUDED == TRUE) @@ -896,11 +910,10 @@ void btc_dm_sec_cb_handler(btc_msg_t *msg) } if (rsp_app) { - ret = btc_transfer_context(&ble_msg, ¶m, - sizeof(esp_ble_gap_cb_param_t), NULL); + ret = btc_inter_profile_call(&ble_msg, ¶m); if (ret != BT_STATUS_SUCCESS) { - BTC_TRACE_ERROR("%s btc_transfer_context failed\n", __func__); + BTC_TRACE_ERROR("%s btc_inter_profile_call failed\n", __func__); } } btc_dm_sec_arg_deep_free(msg); diff --git a/components/bt/host/bluedroid/btc/profile/std/gap/btc_gap_bt.c b/components/bt/host/bluedroid/btc/profile/std/gap/btc_gap_bt.c index 7b711102f9..1b1200dade 100644 --- a/components/bt/host/bluedroid/btc/profile/std/gap/btc_gap_bt.c +++ b/components/bt/host/bluedroid/btc/profile/std/gap/btc_gap_bt.c @@ -975,6 +975,7 @@ void btc_gap_bt_cb_deep_free(btc_msg_t *msg) case BTC_GAP_BT_PIN_REQ_EVT: case BTC_GAP_BT_SET_AFH_CHANNELS_EVT: case BTC_GAP_BT_READ_REMOTE_NAME_EVT: + case BTC_GAP_BT_REMOVE_BOND_DEV_COMPLETE_EVT: #if (BT_SSP_INCLUDED == TRUE) case BTC_GAP_BT_CFM_REQ_EVT: case BTC_GAP_BT_KEY_NOTIF_EVT: @@ -1051,6 +1052,10 @@ void btc_gap_bt_cb_handler(btc_msg_t *msg) btc_gap_bt_cb_to_app(ESP_BT_GAP_MODE_CHG_EVT,(esp_bt_gap_cb_param_t *)msg->arg); break; #endif /// BTC_DM_PM_INCLUDED == TRUE + case BTC_GAP_BT_REMOVE_BOND_DEV_COMPLETE_EVT:{ + btc_gap_bt_cb_to_app(ESP_BT_GAP_REMOVE_BOND_DEV_COMPLETE_EVT,(esp_bt_gap_cb_param_t *)msg->arg); + break; + } default: BTC_TRACE_ERROR("%s: Unhandled event (%d)!\n", __FUNCTION__, msg->act); break; diff --git a/components/bt/host/bluedroid/btc/profile/std/include/btc_gap_bt.h b/components/bt/host/bluedroid/btc/profile/std/include/btc_gap_bt.h index ec36a1cd8c..a1dfa59e0b 100644 --- a/components/bt/host/bluedroid/btc/profile/std/include/btc_gap_bt.h +++ b/components/bt/host/bluedroid/btc/profile/std/include/btc_gap_bt.h @@ -37,6 +37,7 @@ typedef enum { BTC_GAP_BT_SET_AFH_CHANNELS_EVT, BTC_GAP_BT_READ_REMOTE_NAME_EVT, BTC_GAP_BT_MODE_CHG_EVT, + BTC_GAP_BT_REMOVE_BOND_DEV_COMPLETE_EVT, }btc_gap_bt_evt_t; typedef enum { diff --git a/components/bt/host/bluedroid/stack/btm/btm_pm.c b/components/bt/host/bluedroid/stack/btm/btm_pm.c index f7bf6f0cfb..30ba917138 100644 --- a/components/bt/host/bluedroid/stack/btm/btm_pm.c +++ b/components/bt/host/bluedroid/stack/btm/btm_pm.c @@ -194,6 +194,10 @@ tBTM_STATUS BTM_SetPowerMode (UINT8 pm_id, BD_ADDR remote_bda, tBTM_PM_PWR_MD *p mode = p_mode->mode & ~BTM_PM_MD_FORCE; p_acl_cb = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR); + if (p_acl_cb == NULL){ + return BTM_UNKNOWN_ADDR; + } + p_cb = p_acl_cb->p_pm_mode_db; if (mode != BTM_PM_MD_ACTIVE) { /* check if the requested mode is supported */