diff --git a/components/bt/host/bluedroid/api/esp_bt_device.c b/components/bt/host/bluedroid/api/esp_bt_device.c index 83eac0013e..ae4ff8ec93 100644 --- a/components/bt/host/bluedroid/api/esp_bt_device.c +++ b/components/bt/host/bluedroid/api/esp_bt_device.c @@ -101,31 +101,3 @@ esp_err_t esp_bt_config_file_path_update(const char *file_path) return btc_config_file_path_update(file_path); } - -esp_err_t esp_bt_dev_vendor_command_send(esp_bt_dev_vendor_cmd_params_t *vendor_cmd_param) -{ - btc_msg_t msg = {0}; - btc_dev_args_t arg; - - if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) { - return ESP_ERR_INVALID_STATE; - } - - if (!vendor_cmd_param || !vendor_cmd_param->p_param_buf || !vendor_cmd_param->param_len) { - return ESP_ERR_NOT_ALLOWED; - } - // If command is not a VSC, return error - if ((vendor_cmd_param->opcode & VENDOR_HCI_CMD_MASK) != VENDOR_HCI_CMD_MASK) { - return ESP_ERR_NOT_ALLOWED; - } - - msg.sig = BTC_SIG_API_CALL; - msg.pid = BTC_PID_DEV; - msg.act = BTC_DEV_ACT_VENDOR_HCI_CMD_EVT; - arg.vendor_cmd_send.opcode = vendor_cmd_param->opcode; - arg.vendor_cmd_send.param_len = vendor_cmd_param->param_len; - arg.vendor_cmd_send.p_param_buf = vendor_cmd_param->p_param_buf; - - return (btc_transfer_context(&msg, &arg, sizeof(btc_dev_args_t), btc_dev_call_arg_deep_copy, btc_dev_call_arg_deep_free) - == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); -} diff --git a/components/bt/host/bluedroid/api/esp_gap_ble_api.c b/components/bt/host/bluedroid/api/esp_gap_ble_api.c index 5bffb69c88..6640c93243 100644 --- a/components/bt/host/bluedroid/api/esp_gap_ble_api.c +++ b/components/bt/host/bluedroid/api/esp_gap_ble_api.c @@ -1618,3 +1618,31 @@ esp_err_t esp_ble_gap_set_periodic_adv_sync_trans_params(esp_bd_addr_t addr, con == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); } #endif //#if (BLE_FEAT_PERIODIC_ADV_SYNC_TRANSFER == TRUE) + +esp_err_t esp_ble_gap_vendor_command_send(esp_ble_vendor_cmd_params_t *vendor_cmd_param) +{ + btc_msg_t msg = {0}; + btc_ble_gap_args_t arg; + + if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) { + return ESP_ERR_INVALID_STATE; + } + + if (!vendor_cmd_param || !vendor_cmd_param->p_param_buf || !vendor_cmd_param->param_len) { + return ESP_ERR_NOT_ALLOWED; + } + // If command is not a VSC, return error + if ((vendor_cmd_param->opcode & VENDOR_HCI_CMD_MASK) != VENDOR_HCI_CMD_MASK) { + return ESP_ERR_NOT_ALLOWED; + } + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GAP_BLE; + msg.act = BTC_GAP_BLE_ACT_VENDOR_HCI_CMD_EVT; + arg.vendor_cmd_send.opcode = vendor_cmd_param->opcode; + arg.vendor_cmd_send.param_len = vendor_cmd_param->param_len; + arg.vendor_cmd_send.p_param_buf = vendor_cmd_param->p_param_buf; + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), btc_gap_ble_arg_deep_copy, btc_gap_ble_arg_deep_free) + == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} diff --git a/components/bt/host/bluedroid/api/include/api/esp_bt_device.h b/components/bt/host/bluedroid/api/include/api/esp_bt_device.h index 80ff4141d7..6948c62479 100644 --- a/components/bt/host/bluedroid/api/include/api/esp_bt_device.h +++ b/components/bt/host/bluedroid/api/include/api/esp_bt_device.h @@ -29,17 +29,6 @@ extern "C" { #define ESP_BT_DEV_COEX_OP_SET 0x01 typedef uint8_t esp_bt_dev_coex_op_t; -#define VENDOR_HCI_CMD_MASK (0x3F << 10) /**!< 0xFC00 */ - -/** - * @brief Vendor HCI command parameters - */ -typedef struct { - uint16_t opcode; /*!< vendor hci command opcode */ - uint8_t param_len; /*!< the length of parameter */ - uint8_t *p_param_buf; /*!< the point of parameter buffer */ -} esp_bt_dev_vendor_cmd_params_t; - /** * @brief Bluetooth device coex type */ @@ -51,7 +40,6 @@ typedef enum { /// BT device callback events typedef enum { ESP_BT_DEV_NAME_RES_EVT = 0, /*!< Device name result event */ - ESP_BT_DEV_VENDOR_CMD_COMPLETE_EVT, /*!< When vendor hci command complete, the event comes */ ESP_BT_DEV_EVT_MAX, } esp_bt_dev_cb_event_t; @@ -64,14 +52,6 @@ typedef union { esp_bt_status_t status; /*!< Status of getting device name */ char *name; /*!< Name of Bluetooth device */ } name_res; /*!< discovery result parameter struct */ - /** - * @brief ESP_BT_DEV_VENDOR_CMD_COMPLETE_EVT - */ - struct vendor_cmd_cmpl_evt_param { - uint16_t opcode; /*!< vendor hci command opcode */ - uint16_t param_len; /*!< The lenght of parameter buffer */ - uint8_t *p_param_buf; /*!< The point of parameter buffer */ - } vendor_cmd_cmpl; /*!< Event parameter of ESP_BT_DEV_VENDOR_CMD_COMPLETE_EVT */ } esp_bt_dev_cb_param_t; /** @@ -160,19 +140,6 @@ esp_err_t esp_bt_dev_coex_status_config(esp_bt_dev_coex_type_t type, esp_bt_dev_ */ esp_err_t esp_bt_config_file_path_update(const char *file_path); -/** - * @brief This function is called to send vendor hci comamnd. - * - * - * - * @param[in] vendor_cmd_param: vendor hci command parameters - * - * @return - * - ESP_OK : success - * - other : failed - */ -esp_err_t esp_bt_dev_vendor_command_send(esp_bt_dev_vendor_cmd_params_t *vendor_cmd_param); - #ifdef __cplusplus } #endif diff --git a/components/bt/host/bluedroid/api/include/api/esp_gap_ble_api.h b/components/bt/host/bluedroid/api/include/api/esp_gap_ble_api.h index 4ce9055e60..5134cde0f1 100644 --- a/components/bt/host/bluedroid/api/include/api/esp_gap_ble_api.h +++ b/components/bt/host/bluedroid/api/include/api/esp_gap_ble_api.h @@ -225,6 +225,7 @@ typedef enum { // BLE_INCLUDED ESP_GAP_BLE_ADV_CLEAR_COMPLETE_EVT, /*!< When clear advertising complete, the event comes */ ESP_GAP_BLE_SET_RPA_TIMEOUT_COMPLETE_EVT, /*!< When set the Resolvable Private Address (RPA) timeout completes, the event comes */ + ESP_GAP_BLE_VENDOR_CMD_COMPLETE_EVT, /*!< When vendor hci command complete, the event comes */ ESP_GAP_BLE_EVT_MAX, /*!< when maximum advertising event complete, the event comes */ } esp_gap_ble_cb_event_t; @@ -239,6 +240,8 @@ typedef uint8_t esp_gap_ble_channels[ESP_GAP_BLE_CHANNELS_LEN]; /// Scan response data maximum length #define ESP_BLE_SCAN_RSP_DATA_LEN_MAX 31 +#define VENDOR_HCI_CMD_MASK (0x3F << 10) /**!< 0xFC00 */ + /* relate to BTM_BLE_AD_TYPE_xxx in stack/btm_ble_api.h */ /// The type of advertising data(not adv_type) typedef enum { @@ -365,6 +368,15 @@ typedef enum { DTM_TEST_STOP_EVT, } esp_ble_dtm_update_evt_t; +/** + * @brief Vendor HCI command parameters + */ +typedef struct { + uint16_t opcode; /*!< vendor hci command opcode */ + uint8_t param_len; /*!< the length of parameter */ + uint8_t *p_param_buf; /*!< the point of parameter buffer */ +} esp_ble_vendor_cmd_params_t; + #if (BLE_42_FEATURE_SUPPORT == TRUE) /** * @brief DTM TX parameters @@ -1478,6 +1490,14 @@ typedef union { esp_ble_dtm_update_evt_t update_evt; /*!< DTM state change event, 0x00: DTM TX start, 0x01: DTM RX start, 0x02:DTM end */ uint16_t num_of_pkt; /*!< number of packets received, only valid if update_evt is DTM_TEST_STOP_EVT and shall be reported as 0 for a transmitter */ } dtm_state_update; /*!< Event parameter of ESP_GAP_BLE_DTM_TEST_UPDATE_EVT */ + /** + * @brief ESP_GAP_BLE_VENDOR_CMD_COMPLETE_EVT + */ + struct vendor_cmd_cmpl_evt_param { + uint16_t opcode; /*!< vendor hci command opcode */ + uint16_t param_len; /*!< The length of parameter buffer */ + uint8_t *p_param_buf; /*!< The point of parameter buffer */ + } vendor_cmd_cmpl; /*!< Event parameter of ESP_GAP_BLE_VENDOR_CMD_COMPLETE_EVT */ } esp_ble_gap_cb_param_t; /** @@ -2564,6 +2584,19 @@ esp_err_t esp_ble_dtm_stop(void); */ esp_err_t esp_ble_gap_clear_advertising(void); +/** + * @brief This function is called to send vendor hci command. + * + * + * + * @param[in] vendor_cmd_param: vendor hci command parameters + * + * @return + * - ESP_OK : success + * - other : failed + */ +esp_err_t esp_ble_gap_vendor_command_send(esp_ble_vendor_cmd_params_t *vendor_cmd_param); + #ifdef __cplusplus } #endif diff --git a/components/bt/host/bluedroid/btc/core/btc_dev.c b/components/bt/host/bluedroid/btc/core/btc_dev.c index 52274fac6a..798af78f2b 100644 --- a/components/bt/host/bluedroid/btc/core/btc_dev.c +++ b/components/bt/host/bluedroid/btc/core/btc_dev.c @@ -42,43 +42,6 @@ static void btc_dev_get_dev_name_callback(UINT8 status, char *name) } } -static void btc_dev_vendor_hci_cmd_complete_callback(tBTA_VSC_CMPL *p_param) -{ - bool param_invalid = false; - if ((!p_param) || (!p_param->param_len) || (!p_param->p_param_buf)) { - BTC_TRACE_ERROR("%s param error\n", __func__); - param_invalid = true; - } - - esp_bt_dev_cb_param_t param = {0}; - bt_status_t ret; - btc_msg_t msg = {0}; - - msg.sig = BTC_SIG_API_CB; - msg.pid = BTC_PID_DEV; - msg.act = ESP_BT_DEV_VENDOR_CMD_COMPLETE_EVT; - if (!param_invalid) { - param.vendor_cmd_cmpl.opcode = p_param->opcode; - param.vendor_cmd_cmpl.param_len = p_param->param_len; - param.vendor_cmd_cmpl.p_param_buf = p_param->p_param_buf; - } else { - if (p_param) { - param.vendor_cmd_cmpl.opcode = p_param->opcode; - } else { - param.vendor_cmd_cmpl.opcode = 0; - } - param.vendor_cmd_cmpl.param_len = 0; - param.vendor_cmd_cmpl.p_param_buf = NULL; - } - - ret = btc_transfer_context(&msg, ¶m, sizeof(esp_bt_dev_cb_param_t), btc_dev_cb_arg_deep_copy, btc_dev_cb_arg_deep_free); - - if (ret != BT_STATUS_SUCCESS) { - BTC_TRACE_ERROR("%s btc_transfer_context failed\n", __func__); - } -} - - void btc_dev_call_arg_deep_free(btc_msg_t *msg) { BTC_TRACE_DEBUG("%s \n", __func__); @@ -96,13 +59,6 @@ void btc_dev_call_arg_deep_free(btc_msg_t *msg) case BTC_DEV_ACT_CFG_COEX_STATUS: #endif break; - case BTC_DEV_ACT_VENDOR_HCI_CMD_EVT: { - uint8_t *p_param_buf = ((btc_dev_args_t *)msg->arg)->vendor_cmd_send.p_param_buf; - if (p_param_buf) { - osi_free(p_param_buf); - } - break; - } default: BTC_TRACE_DEBUG("Unhandled deep free %d\n", msg->act); break; @@ -116,17 +72,6 @@ void btc_dev_call_arg_deep_copy(btc_msg_t *msg, void *p_dest, void *p_src) btc_dev_args_t *src = (btc_dev_args_t *)p_src; switch (msg->act) { - case BTC_DEV_ACT_VENDOR_HCI_CMD_EVT: { - if (src->vendor_cmd_send.param_len) { - dst->vendor_cmd_send.p_param_buf = osi_malloc(src->vendor_cmd_send.param_len); - if (dst->vendor_cmd_send.p_param_buf) { - memcpy(dst->vendor_cmd_send.p_param_buf, src->vendor_cmd_send.p_param_buf, src->vendor_cmd_send.param_len); - } else { - BTC_TRACE_ERROR("%s %d no mem\n",__func__, msg->act); - } - } - break; - } case BTC_DEV_ACT_SET_DEVICE_NAME:{ dst->set_dev_name.device_name = (char *)osi_malloc((BTC_MAX_LOC_BD_NAME_LEN + 1) * sizeof(char)); if (dst->set_dev_name.device_name) { @@ -154,18 +99,6 @@ void btc_dev_cb_arg_deep_copy(btc_msg_t *msg, void *p_dest, void *p_src) esp_bt_dev_cb_param_t *dst = (esp_bt_dev_cb_param_t *) p_dest; switch (msg->act) { - case ESP_BT_DEV_VENDOR_CMD_COMPLETE_EVT: { - if (src->vendor_cmd_cmpl.param_len) { - dst->vendor_cmd_cmpl.p_param_buf = osi_malloc(src->vendor_cmd_cmpl.param_len); - if (dst->vendor_cmd_cmpl.p_param_buf) { - memcpy(dst->vendor_cmd_cmpl.p_param_buf, src->vendor_cmd_cmpl.p_param_buf, - src->vendor_cmd_cmpl.param_len); - } else { - BTC_TRACE_ERROR("%s, malloc failed\n", __func__); - } - } - break; - } case ESP_BT_DEV_NAME_RES_EVT:{ dst->name_res.name = (char *)osi_malloc((BTC_MAX_LOC_BD_NAME_LEN + 1) * sizeof(char)); if (dst->name_res.name) { @@ -194,13 +127,6 @@ void btc_dev_cb_arg_deep_free(btc_msg_t *msg) } break; } - case ESP_BT_DEV_VENDOR_CMD_COMPLETE_EVT: { - uint8_t *value = ((esp_bt_dev_cb_param_t *)msg->arg)->vendor_cmd_cmpl.p_param_buf; - if (value) { - osi_free(value); - } - break; - } default: BTC_TRACE_DEBUG("Unhandled deep free %d\n", msg->act); break; @@ -227,12 +153,6 @@ void btc_dev_call_handler(btc_msg_t *msg) arg->cfg_coex_status.status); break; #endif - case BTC_DEV_ACT_VENDOR_HCI_CMD_EVT: - BTA_DmsendVendorHciCmd(arg->vendor_cmd_send.opcode, - arg->vendor_cmd_send.param_len, - arg->vendor_cmd_send.p_param_buf, - btc_dev_vendor_hci_cmd_complete_callback); - break; default: break; } @@ -247,7 +167,7 @@ void btc_dev_cb_handler(btc_msg_t *msg) if (msg->act < ESP_BT_DEV_EVT_MAX) { btc_dev_cb_to_app(msg->act, param); } else { - BTC_TRACE_ERROR("%s, unknow msg->act = %d", __func__, msg->act); + BTC_TRACE_ERROR("%s, unknown msg->act = %d", __func__, msg->act); } btc_dev_cb_arg_deep_free(msg); diff --git a/components/bt/host/bluedroid/btc/include/btc/btc_dev.h b/components/bt/host/bluedroid/btc/include/btc/btc_dev.h index 7515997136..f213309c53 100644 --- a/components/bt/host/bluedroid/btc/include/btc/btc_dev.h +++ b/components/bt/host/bluedroid/btc/include/btc/btc_dev.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -17,7 +17,6 @@ typedef enum { #if (ESP_COEX_VSC_INCLUDED == TRUE) BTC_DEV_ACT_CFG_COEX_STATUS, #endif - BTC_DEV_ACT_VENDOR_HCI_CMD_EVT, } btc_dev_act_t; /* btc_dev_args_t */ @@ -35,13 +34,6 @@ typedef union { uint8_t status; } cfg_coex_status; #endif - - //BTC_DEV_VENDOR_HCI_CMD_EVT - struct vendor_cmd_send_args { - uint16_t opcode; - uint8_t param_len; - uint8_t *p_param_buf; - } vendor_cmd_send; } btc_dev_args_t; void btc_dev_call_handler(btc_msg_t *msg); diff --git a/components/bt/host/bluedroid/btc/profile/std/gap/btc_gap_ble.c b/components/bt/host/bluedroid/btc/profile/std/gap/btc_gap_ble.c index 88a5bbb649..27849250d1 100644 --- a/components/bt/host/bluedroid/btc/profile/std/gap/btc_gap_ble.c +++ b/components/bt/host/bluedroid/btc/profile/std/gap/btc_gap_ble.c @@ -1271,6 +1271,42 @@ void btc_dtm_stop_callback(void *p1) } } +static void btc_ble_vendor_hci_cmd_complete_callback(tBTA_VSC_CMPL *p_param) +{ + bool param_invalid = false; + if ((!p_param) || (!p_param->param_len) || (!p_param->p_param_buf)) { + BTC_TRACE_ERROR("%s param error\n", __func__); + param_invalid = true; + } + + esp_ble_gap_cb_param_t param = {0}; + bt_status_t ret; + btc_msg_t msg = {0}; + + msg.sig = BTC_SIG_API_CB; + msg.pid = BTC_PID_GAP_BLE; + msg.act = ESP_GAP_BLE_VENDOR_CMD_COMPLETE_EVT; + if (!param_invalid) { + param.vendor_cmd_cmpl.opcode = p_param->opcode; + param.vendor_cmd_cmpl.param_len = p_param->param_len; + param.vendor_cmd_cmpl.p_param_buf = p_param->p_param_buf; + } else { + if (p_param) { + param.vendor_cmd_cmpl.opcode = p_param->opcode; + } else { + param.vendor_cmd_cmpl.opcode = 0; + } + param.vendor_cmd_cmpl.param_len = 0; + param.vendor_cmd_cmpl.p_param_buf = NULL; + } + + ret = btc_transfer_context(&msg, ¶m, sizeof(esp_ble_gap_cb_param_t), btc_gap_ble_cb_deep_copy, btc_gap_ble_cb_deep_free); + + if (ret != BT_STATUS_SUCCESS) { + BTC_TRACE_ERROR("%s btc_transfer_context failed\n", __func__); + } +} + void btc_get_whitelist_size(uint16_t *length) { BTM_BleGetWhiteListSize(length); @@ -1618,6 +1654,19 @@ void btc_gap_ble_arg_deep_copy(btc_msg_t *msg, void *p_dest, void *p_src) break; } #endif // #if (BLE_50_FEATURE_SUPPORT == TRUE) + case BTC_GAP_BLE_ACT_VENDOR_HCI_CMD_EVT: { + btc_ble_gap_args_t *src = (btc_ble_gap_args_t *)p_src; + btc_ble_gap_args_t *dst = (btc_ble_gap_args_t *)p_dest; + if (src->vendor_cmd_send.param_len) { + dst->vendor_cmd_send.p_param_buf = osi_malloc(src->vendor_cmd_send.param_len); + if (dst->vendor_cmd_send.p_param_buf) { + memcpy(dst->vendor_cmd_send.p_param_buf, src->vendor_cmd_send.p_param_buf, src->vendor_cmd_send.param_len); + } else { + BTC_TRACE_ERROR("%s %d no mem\n",__func__, msg->act); + } + } + break; + } default: BTC_TRACE_ERROR("Unhandled deep copy %d\n", msg->act); break; @@ -1626,7 +1675,22 @@ void btc_gap_ble_arg_deep_copy(btc_msg_t *msg, void *p_dest, void *p_src) void btc_gap_ble_cb_deep_copy(btc_msg_t *msg, void *p_dest, void *p_src) { + esp_ble_gap_cb_param_t *src = (esp_ble_gap_cb_param_t *)p_src; + esp_ble_gap_cb_param_t *dst = (esp_ble_gap_cb_param_t *) p_dest; + switch (msg->act) { + case ESP_GAP_BLE_VENDOR_CMD_COMPLETE_EVT: { + if (src->vendor_cmd_cmpl.param_len) { + dst->vendor_cmd_cmpl.p_param_buf = osi_malloc(src->vendor_cmd_cmpl.param_len); + if (dst->vendor_cmd_cmpl.p_param_buf) { + memcpy(dst->vendor_cmd_cmpl.p_param_buf, src->vendor_cmd_cmpl.p_param_buf, + src->vendor_cmd_cmpl.param_len); + } else { + BTC_TRACE_ERROR("%s, malloc failed\n", __func__); + } + } + break; + } default: BTC_TRACE_ERROR("%s, Unhandled deep copy %d\n", __func__, msg->act); break; @@ -1724,6 +1788,13 @@ void btc_gap_ble_arg_deep_free(btc_msg_t *msg) break; } #endif // #if (BLE_50_FEATURE_SUPPORT == TRUE) + case BTC_GAP_BLE_ACT_VENDOR_HCI_CMD_EVT: { + uint8_t *p_param_buf = ((btc_ble_gap_args_t *)msg->arg)->vendor_cmd_send.p_param_buf; + if (p_param_buf) { + osi_free(p_param_buf); + } + break; + } default: BTC_TRACE_DEBUG("Unhandled deep free %d\n", msg->act); break; @@ -1741,6 +1812,13 @@ void btc_gap_ble_cb_deep_free(btc_msg_t *msg) } break; } + case ESP_GAP_BLE_VENDOR_CMD_COMPLETE_EVT: { + uint8_t *value = ((esp_ble_gap_cb_param_t *)msg->arg)->vendor_cmd_cmpl.p_param_buf; + if (value) { + osi_free(value); + } + break; + } default: BTC_TRACE_DEBUG("Unhandled deep free %d", msg->act); break; @@ -2216,6 +2294,12 @@ void btc_gap_ble_call_handler(btc_msg_t *msg) btc_ble_dtm_enhance_rx_start(arg_5->dtm_enh_rx_start.rx_channel, arg_5->dtm_enh_rx_start.phy, arg_5->dtm_enh_rx_start.modulation_index, btc_dtm_rx_start_callback); break; #endif // if (BLE_50_FEATURE_SUPPORT == TRUE) + case BTC_GAP_BLE_ACT_VENDOR_HCI_CMD_EVT: + BTA_DmsendVendorHciCmd(arg->vendor_cmd_send.opcode, + arg->vendor_cmd_send.param_len, + arg->vendor_cmd_send.p_param_buf, + btc_ble_vendor_hci_cmd_complete_callback); + break; default: break; } diff --git a/components/bt/host/bluedroid/btc/profile/std/include/btc_gap_ble.h b/components/bt/host/bluedroid/btc/profile/std/include/btc_gap_ble.h index 59edf631d7..f790804cb4 100644 --- a/components/bt/host/bluedroid/btc/profile/std/include/btc_gap_ble.h +++ b/components/bt/host/bluedroid/btc/profile/std/include/btc_gap_ble.h @@ -103,6 +103,7 @@ typedef enum { BTC_GAP_BLE_ACT_CLEAR_ADV, #endif // #if (BLE_42_FEATURE_SUPPORT == TRUE) BTC_GAP_BLE_ACT_SET_RESOLVABLE_PRIVATE_ADDRESS_TIMEOUT, + BTC_GAP_BLE_ACT_VENDOR_HCI_CMD_EVT, } btc_gap_ble_act_t; /* btc_ble_gap_args_t */ @@ -253,6 +254,12 @@ typedef union { struct dtm_rx_start_args { uint8_t rx_channel; } dtm_rx_start; + //BTC_DEV_VENDOR_HCI_CMD_EVT + struct vendor_cmd_send_args { + uint16_t opcode; + uint8_t param_len; + uint8_t *p_param_buf; + } vendor_cmd_send; } btc_ble_gap_args_t; #if (BLE_50_FEATURE_SUPPORT == TRUE)