mirror of
https://github.com/espressif/esp-nimble.git
synced 2026-07-30 14:47:53 +00:00
nimble/ll: Add hci set host supported features
With this patch, host is able to set features flags with HCI command from Bluetooth v5.2
This commit is contained in:
@@ -199,34 +199,42 @@ extern STATS_SECT_DECL(ble_ll_stats) ble_ll_stats;
|
||||
#define BLE_LL_STATE_SYNC (6)
|
||||
|
||||
/* LL Features */
|
||||
#define BLE_LL_FEAT_LE_ENCRYPTION (0x00000001)
|
||||
#define BLE_LL_FEAT_CONN_PARM_REQ (0x00000002)
|
||||
#define BLE_LL_FEAT_EXTENDED_REJ (0x00000004)
|
||||
#define BLE_LL_FEAT_SLAVE_INIT (0x00000008)
|
||||
#define BLE_LL_FEAT_LE_PING (0x00000010)
|
||||
#define BLE_LL_FEAT_DATA_LEN_EXT (0x00000020)
|
||||
#define BLE_LL_FEAT_LL_PRIVACY (0x00000040)
|
||||
#define BLE_LL_FEAT_EXT_SCAN_FILT (0x00000080)
|
||||
#define BLE_LL_FEAT_LE_2M_PHY (0x00000100)
|
||||
#define BLE_LL_FEAT_STABLE_MOD_ID_TX (0x00000200)
|
||||
#define BLE_LL_FEAT_STABLE_MOD_ID_RX (0x00000400)
|
||||
#define BLE_LL_FEAT_LE_CODED_PHY (0x00000800)
|
||||
#define BLE_LL_FEAT_EXT_ADV (0x00001000)
|
||||
#define BLE_LL_FEAT_PERIODIC_ADV (0x00002000)
|
||||
#define BLE_LL_FEAT_CSA2 (0x00004000)
|
||||
#define BLE_LL_FEAT_LE_POWER_CLASS_1 (0x00008000)
|
||||
#define BLE_LL_FEAT_MIN_USED_CHAN (0x00010000)
|
||||
#define BLE_LL_FEAT_CTE_REQ (0x00020000)
|
||||
#define BLE_LL_FEAT_CTE_RSP (0x00040000)
|
||||
#define BLE_LL_FEAT_CTE_TX (0x00080000)
|
||||
#define BLE_LL_FEAT_CTE_RX (0x00100000)
|
||||
#define BLE_LL_FEAT_CTE_AOD (0x00200000)
|
||||
#define BLE_LL_FEAT_CTE_AOA (0x00400000)
|
||||
#define BLE_LL_FEAT_CTE_RECV (0x00800000)
|
||||
#define BLE_LL_FEAT_SYNC_TRANS_SEND (0x01000000)
|
||||
#define BLE_LL_FEAT_SYNC_TRANS_RECV (0x02000000)
|
||||
#define BLE_LL_FEAT_SCA_UPDATE (0x04000000)
|
||||
#define BLE_LL_FEAT_REM_PKEY (0x08000000)
|
||||
#define BLE_LL_FEAT_LE_ENCRYPTION (0x0000000001)
|
||||
#define BLE_LL_FEAT_CONN_PARM_REQ (0x0000000002)
|
||||
#define BLE_LL_FEAT_EXTENDED_REJ (0x0000000004)
|
||||
#define BLE_LL_FEAT_SLAVE_INIT (0x0000000008)
|
||||
#define BLE_LL_FEAT_LE_PING (0x0000000010)
|
||||
#define BLE_LL_FEAT_DATA_LEN_EXT (0x0000000020)
|
||||
#define BLE_LL_FEAT_LL_PRIVACY (0x0000000040)
|
||||
#define BLE_LL_FEAT_EXT_SCAN_FILT (0x0000000080)
|
||||
#define BLE_LL_FEAT_LE_2M_PHY (0x0000000100)
|
||||
#define BLE_LL_FEAT_STABLE_MOD_ID_TX (0x0000000200)
|
||||
#define BLE_LL_FEAT_STABLE_MOD_ID_RX (0x0000000400)
|
||||
#define BLE_LL_FEAT_LE_CODED_PHY (0x0000000800)
|
||||
#define BLE_LL_FEAT_EXT_ADV (0x0000001000)
|
||||
#define BLE_LL_FEAT_PERIODIC_ADV (0x0000002000)
|
||||
#define BLE_LL_FEAT_CSA2 (0x0000004000)
|
||||
#define BLE_LL_FEAT_LE_POWER_CLASS_1 (0x0000008000)
|
||||
#define BLE_LL_FEAT_MIN_USED_CHAN (0x0000010000)
|
||||
#define BLE_LL_FEAT_CTE_REQ (0x0000020000)
|
||||
#define BLE_LL_FEAT_CTE_RSP (0x0000040000)
|
||||
#define BLE_LL_FEAT_CTE_TX (0x0000080000)
|
||||
#define BLE_LL_FEAT_CTE_RX (0x0000100000)
|
||||
#define BLE_LL_FEAT_CTE_AOD (0x0000200000)
|
||||
#define BLE_LL_FEAT_CTE_AOA (0x0000400000)
|
||||
#define BLE_LL_FEAT_CTE_RECV (0x0000800000)
|
||||
#define BLE_LL_FEAT_SYNC_TRANS_SEND (0x0001000000)
|
||||
#define BLE_LL_FEAT_SYNC_TRANS_RECV (0x0002000000)
|
||||
#define BLE_LL_FEAT_SCA_UPDATE (0x0004000000)
|
||||
#define BLE_LL_FEAT_REM_PKEY (0x0008000000)
|
||||
#define BLE_LL_FEAT_CIS_MASTER (0x0010000000)
|
||||
#define BLE_LL_FEAT_CIS_SLAVE (0x0020000000)
|
||||
#define BLE_LL_FEAT_ISO_BROADCASTER (0x0040000000)
|
||||
#define BLE_LL_FEAT_SYNC_RECV (0x0080000000)
|
||||
#define BLE_LL_FEAT_ISO_HOST_SUPPORT (0x0100000000)
|
||||
#define BLE_LL_FEAT_POWER_CTRL_REQ (0x0200000000)
|
||||
#define BLE_LL_FEAT_POWER_CHANGE_IND (0x0400000000)
|
||||
#define BLE_LL_FEAT_PATH_LOSS_MON (0x0800000000)
|
||||
|
||||
/* This is initial mask, so if feature exchange will not happen,
|
||||
* but host will want to use this procedure, we will try. If not
|
||||
@@ -234,9 +242,11 @@ extern STATS_SECT_DECL(ble_ll_stats) ble_ll_stats;
|
||||
* Look at LL Features above to find out what is allowed
|
||||
*/
|
||||
#define BLE_LL_CONN_INITIAL_FEATURES (0x00000022)
|
||||
|
||||
#define BLE_LL_CONN_CLEAR_FEATURE(connsm, feature) (connsm->conn_features &= ~(feature))
|
||||
|
||||
/* All the features which can be controlled by the Host */
|
||||
#define BLE_LL_HOST_CONTROLLED_FEATURES (BLE_LL_FEAT_ISO_HOST_SUPPORT)
|
||||
|
||||
/* LL timing */
|
||||
#define BLE_LL_IFS (150) /* usecs */
|
||||
#define BLE_LL_MAFS (300) /* usecs */
|
||||
@@ -519,6 +529,9 @@ void ble_ll_wfr_timer_exp(void *arg);
|
||||
/* Read set of features supported by the Link Layer */
|
||||
uint64_t ble_ll_read_supp_features(void);
|
||||
|
||||
/* Set host supported features */
|
||||
int ble_ll_set_host_feat(const uint8_t *cmdbuf, uint8_t len);
|
||||
|
||||
/* Read set of states supported by the Link Layer */
|
||||
uint64_t ble_ll_read_supp_states(void);
|
||||
|
||||
|
||||
@@ -247,6 +247,9 @@ uint8_t g_dev_addr[BLE_DEV_ADDR_LEN];
|
||||
/** Our random address */
|
||||
uint8_t g_random_addr[BLE_DEV_ADDR_LEN];
|
||||
|
||||
/** Our supported features which can be controller by the host */
|
||||
uint64_t g_ble_ll_supported_host_features = 0;
|
||||
|
||||
static const uint16_t g_ble_ll_pdu_header_tx_time[BLE_PHY_NUM_MODE] =
|
||||
{
|
||||
[BLE_PHY_MODE_1M] =
|
||||
@@ -1277,6 +1280,46 @@ ble_ll_read_supp_features(void)
|
||||
return g_ble_ll_data.ll_supp_features;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the features controlled by the host.
|
||||
*
|
||||
* @return HCI command status
|
||||
*/
|
||||
int
|
||||
ble_ll_set_host_feat(const uint8_t *cmdbuf, uint8_t len)
|
||||
{
|
||||
const struct ble_hci_le_set_host_feat_cp *cmd = (const void *) cmdbuf;
|
||||
uint64_t mask;
|
||||
|
||||
if (len != sizeof(*cmd)) {
|
||||
return BLE_ERR_INV_HCI_CMD_PARMS;
|
||||
}
|
||||
|
||||
if (!SLIST_EMPTY(&g_ble_ll_conn_active_list)) {
|
||||
return BLE_ERR_CMD_DISALLOWED;
|
||||
}
|
||||
|
||||
if ((cmd->bit_num > 0x3F) || (cmd->val > 1)) {
|
||||
return BLE_ERR_INV_HCI_CMD_PARMS;
|
||||
}
|
||||
|
||||
mask = (uint64_t)1 << (cmd->bit_num);
|
||||
if (!(mask & BLE_LL_HOST_CONTROLLED_FEATURES)) {
|
||||
return BLE_ERR_INV_HCI_CMD_PARMS;
|
||||
}
|
||||
|
||||
if (!(mask & g_ble_ll_supported_host_features)) {
|
||||
return BLE_ERR_UNSUPPORTED;
|
||||
}
|
||||
|
||||
if (cmd->val == 0) {
|
||||
g_ble_ll_data.ll_supp_features &= ~(mask);
|
||||
} else {
|
||||
g_ble_ll_data.ll_supp_features |= mask;
|
||||
}
|
||||
|
||||
return BLE_ERR_SUCCESS;
|
||||
}
|
||||
/**
|
||||
* Flush a link layer packet queue.
|
||||
*
|
||||
|
||||
@@ -1143,6 +1143,11 @@ ble_ll_hci_le_cmd_proc(const uint8_t *cmdbuf, uint8_t len, uint16_t ocf,
|
||||
case BLE_HCI_OCF_LE_SET_DEFAULT_SYNC_TRANSFER_PARAMS:
|
||||
rc = ble_ll_set_default_sync_transfer_params(cmdbuf, len);
|
||||
break;
|
||||
#endif
|
||||
#if MYNEWT_VAL(BLE_VERSION) >= 52
|
||||
case BLE_HCI_OCF_LE_SET_HOST_FEAT:
|
||||
rc = ble_ll_set_host_feat(cmdbuf, len);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
rc = BLE_ERR_UNKNOWN_HCI_CMD;
|
||||
|
||||
@@ -825,6 +825,12 @@ struct ble_hci_le_set_default_periodic_sync_transfer_params_cp {
|
||||
#define BLE_HCI_OCF_LE_GENERATE_DHKEY_V2 (0x005E)
|
||||
#define BLE_HCI_OCF_LE_MODIFY_SCA (0x005F)
|
||||
|
||||
#define BLE_HCI_OCF_LE_SET_HOST_FEAT (0x0074)
|
||||
struct ble_hci_le_set_host_feat_cp {
|
||||
uint8_t bit_num;
|
||||
uint8_t val;
|
||||
} __attribute__((packed));
|
||||
|
||||
/* Command Specific Definitions */
|
||||
/* --- Set controller to host flow control (OGF 0x03, OCF 0x0031) --- */
|
||||
#define BLE_HCI_CTLR_TO_HOST_FC_OFF (0)
|
||||
|
||||
Reference in New Issue
Block a user