Merge branch 'feature/use_vsc_to_op_coex_st' into 'master'

feat(bt/Bluedroid): Implemented esp_coex_status_set/clear using vendor HCI

Closes BTQABR2023-66

See merge request espressif/esp-idf!25938
pull/12330/head
Wang Meng Yang 2023-09-20 16:52:51 +08:00
commit 7e91e901f0
14 zmienionych plików z 242 dodań i 5 usunięć

Wyświetl plik

@ -40,6 +40,13 @@ config BT_BLUEDROID_MEM_DEBUG
help
Bluedroid memory debug
config BT_BLUEDROID_ESP_COEX_VSC
bool "Enable Espressif Vendor-specific HCI commands for coexist status configuration"
depends on BT_BLUEDROID_ENABLED
default y
help
Enable Espressif Vendor-specific HCI commands for coexist status configuration
config BT_CLASSIC_ENABLED
bool "Classic Bluetooth"
depends on BT_BLUEDROID_ENABLED && IDF_TARGET_ESP32

Wyświetl plik

@ -47,3 +47,24 @@ esp_err_t esp_bt_dev_set_device_name(const char *name)
return (btc_transfer_context(&msg, &arg, sizeof(btc_dev_args_t), NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
}
#if (ESP_COEX_VSC_INCLUDED == TRUE)
esp_err_t esp_bt_dev_coex_status_config(esp_bt_dev_coex_type_t type, esp_bt_dev_coex_op_t op, uint8_t status)
{
btc_msg_t msg = {0};
btc_dev_args_t arg;
if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
return ESP_ERR_INVALID_STATE;
}
msg.sig = BTC_SIG_API_CALL;
msg.pid = BTC_PID_DEV;
msg.act = BTC_DEV_ACT_CFG_COEX_STATUS;
arg.cfg_coex_status.type = type;
arg.cfg_coex_status.op = op;
arg.cfg_coex_status.status = status;
return (btc_transfer_context(&msg, &arg, sizeof(btc_dev_args_t), NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
}
#endif

Wyświetl plik

@ -16,6 +16,27 @@
extern "C" {
#endif
// coexist status for MESH
#define ESP_BT_DEV_COEX_BLE_ST_MESH_CONFIG 0x08
#define ESP_BT_DEV_COEX_BLE_ST_MESH_TRAFFIC 0x10
#define ESP_BT_DEV_COEX_BLE_ST_MESH_STANDBY 0x20
// coexist status for A2DP
#define ESP_BT_DEV_COEX_BT_ST_A2DP_STREAMING 0x10
#define ESP_BT_DEV_COEX_BT_ST_A2DP_PAUSED 0x20
// coexist operation
#define ESP_BT_DEV_COEX_OP_CLEAR 0x00
#define ESP_BT_DEV_COEX_OP_SET 0x01
typedef uint8_t esp_bt_dev_coex_op_t;
/**
* @brief Bluetooth device coex type
*/
typedef enum {
ESP_BT_DEV_COEX_TYPE_BLE = 1,
ESP_BT_DEV_COEX_TYPE_BT,
} esp_bt_dev_coex_type_t;
/**
*
* @brief Get bluetooth device address. Must use after "esp_bluedroid_enable".
@ -42,6 +63,22 @@ const uint8_t *esp_bt_dev_get_address(void);
*/
esp_err_t esp_bt_dev_set_device_name(const char *name);
/**
* @brief Config bluetooth device coexis status. This function should be called after esp_bluedroid_enable()
* completes successfully.
*
* @param[in] type : coexist type to operate on
* @param[in] op : clear or set coexist status
* @param[in] status : coexist status to be configured
*
* @return
* - ESP_OK : Succeed
* - ESP_ERR_INVALID_ARG : if name is NULL pointer or empty, or string length out of limit
* - ESP_ERR_INVALID_STATE : if bluetooth stack is not yet enabled
* - ESP_FAIL : others
*/
esp_err_t esp_bt_dev_coex_status_config(esp_bt_dev_coex_type_t type, esp_bt_dev_coex_op_t op, uint8_t status);
#ifdef __cplusplus
}
#endif

Wyświetl plik

@ -692,6 +692,25 @@ void bta_dm_get_dev_name (tBTA_DM_MSG *p_data)
}
}
/*******************************************************************************
**
** Function bta_dm_cfg_coex_status
**
** Description config coexistance status
**
**
** Returns void
**
*******************************************************************************/
#if (ESP_COEX_VSC_INCLUDED == TRUE)
void bta_dm_cfg_coex_status (tBTA_DM_MSG *p_data)
{
BTM_ConfigCoexStatus(p_data->cfg_coex_status.op,
p_data->cfg_coex_status.type,
p_data->cfg_coex_status.status);
}
#endif
/*******************************************************************************
**
** Function bta_dm_set_afh_channels

Wyświetl plik

@ -202,6 +202,31 @@ void BTA_DmGetDeviceName(tBTA_GET_DEV_NAME_CBACK *p_cback)
}
}
/*******************************************************************************
**
** Function BTA_DmCfgCoexStatus
**
** Description This function configures the coexist status
**
**
** Returns void
**
*******************************************************************************/
#if (ESP_COEX_VSC_INCLUDED == TRUE)
void BTA_DmCfgCoexStatus(UINT8 op, UINT8 type, UINT8 status)
{
tBTA_DM_API_CFG_COEX_STATUS *p_msg;
if ((p_msg = (tBTA_DM_API_CFG_COEX_STATUS *) osi_malloc(sizeof(tBTA_DM_API_CFG_COEX_STATUS))) != NULL) {
p_msg->hdr.event = BTA_DM_API_CFG_COEX_ST_EVT;
p_msg->op = op;
p_msg->type = type;
p_msg->status = status;
bta_sys_sendmsg(p_msg);
}
}
#endif
#if (CLASSIC_BT_INCLUDED == TRUE)
void BTA_DmConfigEir(tBTA_DM_EIR_CONF *eir_config)

Wyświetl plik

@ -25,6 +25,9 @@
#include "bta/bta_api.h"
#include "bta/bta_sys.h"
#include "bta_dm_int.h"
#if (ESP_COEX_VSC_INCLUDED == TRUE)
#include "stack/btm_api.h"
#endif
#include "osi/allocator.h"
#include <string.h>
@ -59,6 +62,9 @@ const tBTA_DM_ACTION bta_dm_action[BTA_DM_MAX_EVT] = {
bta_dm_disable, /* BTA_DM_API_DISABLE_EVT */
bta_dm_set_dev_name, /* BTA_DM_API_SET_NAME_EVT */
bta_dm_get_dev_name, /* BTA_DM_API_GET_NAME_EVT */
#if (ESP_COEX_VSC_INCLUDED == TRUE)
bta_dm_cfg_coex_status, /* BTA_DM_API_CFG_COEX_ST_EVT */
#endif
#if (CLASSIC_BT_INCLUDED == TRUE)
bta_dm_config_eir, /* BTA_DM_API_CONFIG_EIR_EVT */
bta_dm_set_page_timeout, /* BTA_DM_API_PAGE_TO_SET_EVT */
@ -464,12 +470,16 @@ void BTA_DmCoexEventTrigger(uint32_t event)
case BTA_COEX_EVT_ACL_DISCONNECTED:
break;
case BTA_COEX_EVT_STREAMING_STARTED:
esp_coex_status_bit_set(ESP_COEX_ST_TYPE_BT, ESP_COEX_BT_ST_A2DP_STREAMING);
esp_coex_status_bit_clear(ESP_COEX_ST_TYPE_BT, ESP_COEX_BT_ST_A2DP_PAUSED);
#if (ESP_COEX_VSC_INCLUDED == TRUE)
BTM_ConfigCoexStatus(BTM_COEX_OP_SET, BTM_COEX_TYPE_BT, BTM_COEX_BT_ST_A2DP_STREAMING);
BTM_ConfigCoexStatus(BTM_COEX_OP_CLEAR, BTM_COEX_TYPE_BT, BTM_COEX_BT_ST_A2DP_PAUSED);
#endif
break;
case BTA_COEX_EVT_STREAMING_STOPPED:
esp_coex_status_bit_clear(ESP_COEX_ST_TYPE_BT, ESP_COEX_BT_ST_A2DP_STREAMING);
esp_coex_status_bit_clear(ESP_COEX_ST_TYPE_BT, ESP_COEX_BT_ST_A2DP_PAUSED);
#if (ESP_COEX_VSC_INCLUDED == TRUE)
BTM_ConfigCoexStatus(BTM_COEX_OP_CLEAR, BTM_COEX_TYPE_BT, BTM_COEX_BT_ST_A2DP_STREAMING);
BTM_ConfigCoexStatus(BTM_COEX_OP_CLEAR, BTM_COEX_TYPE_BT, BTM_COEX_BT_ST_A2DP_PAUSED);
#endif
break;
default:
break;

Wyświetl plik

@ -54,6 +54,9 @@ enum {
BTA_DM_API_DISABLE_EVT,
BTA_DM_API_SET_NAME_EVT,
BTA_DM_API_GET_NAME_EVT,
#if (ESP_COEX_VSC_INCLUDED == TRUE)
BTA_DM_API_CFG_COEX_ST_EVT,
#endif
#if (CLASSIC_BT_INCLUDED == TRUE)
BTA_DM_API_CONFIG_EIR_EVT,
BTA_DM_API_PAGE_TO_SET_EVT,
@ -244,6 +247,15 @@ typedef struct {
tBTA_GET_DEV_NAME_CBACK *p_cback;
} tBTA_DM_API_GET_NAME;
#if (ESP_COEX_VSC_INCLUDED == TRUE)
typedef struct {
BT_HDR hdr;
UINT8 op;
UINT8 type;
UINT8 status;
} tBTA_DM_API_CFG_COEX_STATUS;
#endif
/* data type for BTA_DM_API_CONFIG_EIR_EVT */
typedef struct {
BT_HDR hdr;
@ -1090,6 +1102,9 @@ typedef union {
tBTA_DM_API_SET_NAME set_name;
tBTA_DM_API_GET_NAME get_name;
#if (ESP_COEX_VSC_INCLUDED == TRUE)
tBTA_DM_API_CFG_COEX_STATUS cfg_coex_status;
#endif
tBTA_DM_API_CONFIG_EIR config_eir;
tBTA_DM_API_SET_AFH_CHANNELS set_afh_channels;
@ -1593,6 +1608,9 @@ extern void bta_dm_enable (tBTA_DM_MSG *p_data);
extern void bta_dm_disable (tBTA_DM_MSG *p_data);
extern void bta_dm_set_dev_name (tBTA_DM_MSG *p_data);
extern void bta_dm_get_dev_name (tBTA_DM_MSG *p_data);
#if (ESP_COEX_VSC_INCLUDED == TRUE)
extern void bta_dm_cfg_coex_status(tBTA_DM_MSG *p_data);
#endif
#if (CLASSIC_BT_INCLUDED == TRUE)
extern void bta_dm_config_eir (tBTA_DM_MSG *p_data);
extern void bta_dm_set_page_timeout (tBTA_DM_MSG *p_data);

Wyświetl plik

@ -1713,6 +1713,20 @@ extern void BTA_DmSetDeviceName(const char *p_name);
*******************************************************************************/
extern void BTA_DmGetDeviceName(tBTA_GET_DEV_NAME_CBACK *p_cback);
/*******************************************************************************
**
** Function BTA_DmCfgCoexStatus
**
** Description This function configures coexist status.
**
**
** Returns void
**
*******************************************************************************/
#if (ESP_COEX_VSC_INCLUDED == TRUE)
extern void BTA_DmCfgCoexStatus(UINT8 op, UINT8 type, UINT8 status);
#endif
/*******************************************************************************
**
** Function BTA_DmGetRemoteName

Wyświetl plik

@ -23,6 +23,10 @@ void btc_dev_arg_deep_free(btc_msg_t *msg)
}
break;
}
#if (ESP_COEX_VSC_INCLUDED == TRUE)
case BTC_DEV_ACT_CFG_COEX_STATUS:
break;
#endif
default:
BTC_TRACE_DEBUG("Unhandled deep free %d\n", msg->act);
break;
@ -39,6 +43,13 @@ void btc_dev_call_handler(btc_msg_t *msg)
case BTC_DEV_ACT_SET_DEVICE_NAME:
BTA_DmSetDeviceName(arg->set_dev_name.device_name);
break;
#if (ESP_COEX_VSC_INCLUDED == TRUE)
case BTC_DEV_ACT_CFG_COEX_STATUS:
BTA_DmCfgCoexStatus(arg->cfg_coex_status.op,
arg->cfg_coex_status.type,
arg->cfg_coex_status.status);
break;
#endif
default:
break;
}

Wyświetl plik

@ -12,7 +12,10 @@
#include "btc/btc_task.h"
typedef enum {
BTC_DEV_ACT_SET_DEVICE_NAME
BTC_DEV_ACT_SET_DEVICE_NAME,
#if (ESP_COEX_VSC_INCLUDED == TRUE)
BTC_DEV_ACT_CFG_COEX_STATUS,
#endif
} btc_dev_act_t;
/* btc_dev_args_t */
@ -21,6 +24,15 @@ typedef union {
struct set_bt_dev_name_args {
char *device_name;
} set_dev_name;
#if (ESP_COEX_VSC_INCLUDED == TRUE)
// BTC_DEV_ACT_CFG_COEX_STATUS
struct cfg_bt_dev_coex_st_args {
esp_bt_dev_coex_type_t type;
esp_bt_dev_coex_op_t op;
uint8_t status;
} cfg_coex_status;
#endif
} btc_dev_args_t;
void btc_dev_call_handler(btc_msg_t *msg);

Wyświetl plik

@ -361,6 +361,13 @@
#define UC_BT_BLUEDROID_MEM_DEBUG FALSE
#endif
//ESP COEXIST VSC
#ifdef CONFIG_BT_BLUEDROID_ESP_COEX_VSC
#define UC_BT_BLUEDROID_ESP_COEX_VSC CONFIG_BT_BLUEDROID_ESP_COEX_VSC
#else
#define UC_BT_BLUEDROID_ESP_COEX_VSC FALSE
#endif
/**********************************************************
* Trace reference

Wyświetl plik

@ -45,6 +45,12 @@
/* OS Configuration from User config (eg: sdkconfig) */
#define BT_BTU_TASK_STACK_SIZE UC_BTU_TASK_STACK_SIZE
#if (UC_BT_BLUEDROID_ESP_COEX_VSC == TRUE)
#define ESP_COEX_VSC_INCLUDED TRUE
#else
#define ESP_COEX_VSC_INCLUDED FALSE
#endif
/******************************************************************************
**
** Classic BT features

Wyświetl plik

@ -688,6 +688,19 @@ tBTM_STATUS BTM_VendorSpecificCommand(UINT16 opcode, UINT8 param_len,
}
#if (ESP_COEX_VSC_INCLUDED == TRUE)
tBTM_STATUS BTM_ConfigCoexStatus(tBTM_COEX_OPERATION op, tBTM_COEX_TYPE type, UINT8 status)
{
UINT8 param[3];
UINT8 *p = (UINT8 *)param;
UINT8_TO_STREAM(p, type);
UINT8_TO_STREAM(p, op);
UINT8_TO_STREAM(p, status);
return BTM_VendorSpecificCommand(HCI_VENDOR_COMMON_COEX_STATUS_CMD_OPCODE, 3, param, NULL);
}
#endif
/*******************************************************************************
**

Wyświetl plik

@ -195,6 +195,28 @@ typedef void (tBTM_UPDATE_WHITELIST_CBACK) (UINT8 status, tBTM_WL_OPERATION wl_o
typedef void (tBTM_SET_LOCAL_PRIVACY_CBACK) (UINT8 status);
/*******************************
** Device Coexist status
********************************/
#if (ESP_COEX_VSC_INCLUDED == TRUE)
// coexist status for MESH
#define BTM_COEX_BLE_ST_MESH_CONFIG 0x08
#define BTM_COEX_BLE_ST_MESH_TRAFFIC 0x10
#define BTM_COEX_BLE_ST_MESH_STANDBY 0x20
// coexist status for A2DP
#define BTM_COEX_BT_ST_A2DP_STREAMING 0x10
#define BTM_COEX_BT_ST_A2DP_PAUSED 0x20
// coexist operation
#define BTM_COEX_OP_CLEAR 0x00
#define BTM_COEX_OP_SET 0x01
typedef UINT8 tBTM_COEX_OPERATION;
typedef enum {
BTM_COEX_TYPE_BLE = 1,
BTM_COEX_TYPE_BT,
} tBTM_COEX_TYPE;
#endif
/*****************************************************************************
** DEVICE DISCOVERY - Inquiry, Remote Name, Discovery, Class of Device
@ -2150,6 +2172,21 @@ tBTM_STATUS BTM_VendorSpecificCommand(UINT16 opcode,
UINT8 *p_param_buf,
tBTM_VSC_CMPL_CB *p_cb);
/*******************************************************************************
**
** Function BTM_ConfigCoexStatus
**
** Description Config coexist status through vendor specific HCI command.
**
** Returns
** BTM_SUCCESS Command sent. Does not expect command complete
** event. (command cmpl callback param is NULL)
** BTM_NO_RESOURCES Command not sent. No resources.
**
*******************************************************************************/
#if (ESP_COEX_VSC_INCLUDED == TRUE)
tBTM_STATUS BTM_ConfigCoexStatus(tBTM_COEX_OPERATION op, tBTM_COEX_TYPE type, UINT8 status);
#endif
/*******************************************************************************
**