Bluetooth: controller: PHY Update Procedure
Added support for Bluetooth v5.0 PHY Update Procedure in the Controller. Asymmetric PHY connections do not work for now due to the Radio mode not being setup in time in the ISR during tIFS period and the Radio already ramping up in the cached previous Radio mode to meet tIFS deadline. Subsequent commits will add this feature, by either double buffering the mode in software or using fast radio ramp up which gives enough time in the ISR to change the mode. Jira: ZEP-2086 Signed-off-by: Vinayak Kariappa Chettimada <vich@nordicsemi.no>
This commit is contained in:
parent
f19a1a348e
commit
c3adc7b0c7
9 changed files with 1045 additions and 140 deletions
|
@ -147,6 +147,13 @@ config BLUETOOTH_CONTROLLER_DATA_LENGTH_MAX
|
|||
help
|
||||
Set the maximum data length of PDU supported in the Controller.
|
||||
|
||||
config BLUETOOTH_CONTROLLER_PHY
|
||||
bool "PHY Update"
|
||||
default y
|
||||
help
|
||||
Enable support for Bluetooth 5.0 PHY Update Procedure in the
|
||||
Controller.
|
||||
|
||||
config BLUETOOTH_CONTROLLER_CHAN_SEL_2
|
||||
bool "Channel Selection Algorithm #2"
|
||||
default y
|
||||
|
@ -162,6 +169,32 @@ config BLUETOOTH_CONTROLLER_ADVANCED_FEATURES
|
|||
menu "Advanced features"
|
||||
visible if BLUETOOTH_CONTROLLER_ADVANCED_FEATURES
|
||||
|
||||
if BLUETOOTH_CONTROLLER_PHY
|
||||
|
||||
config BLUETOOTH_CONTROLLER_PHY_2M
|
||||
bool "2Mbps PHY Support"
|
||||
depends on !SOC_SERIES_NRF51X || BLUETOOTH_CONTROLLER_PHY_2M_NRF
|
||||
default y
|
||||
help
|
||||
Enable support for Bluetooth 5.0 2Mbps PHY in the Controller.
|
||||
|
||||
config BLUETOOTH_CONTROLLER_PHY_2M_NRF
|
||||
bool "2Mbps Nordic Semiconductor PHY Support (Open Text)"
|
||||
depends on SOC_SERIES_NRF51X
|
||||
select BLUETOOTH_CONTROLLER_PHY_2M
|
||||
help
|
||||
Enable support for Nordic Semiconductor proprietary 2Mbps PHY in the
|
||||
Controller. Encrypted connections are not supported.
|
||||
|
||||
config BLUETOOTH_CONTROLLER_PHY_CODED
|
||||
bool "Coded PHY Support"
|
||||
depends on SOC_NRF52840
|
||||
default y
|
||||
help
|
||||
Enable support for Bluetooth 5.0 Coded PHY in the Controller.
|
||||
|
||||
endif # BLUETOOTH_CONTROLLER_PHY
|
||||
|
||||
config BLUETOOTH_CONTROLLER_WORKER_PRIO
|
||||
prompt "Radio and Ticker's Worker IRQ priority"
|
||||
int
|
||||
|
|
|
@ -60,11 +60,39 @@ void radio_reset(void)
|
|||
RADIO_POWER_POWER_Msk);
|
||||
}
|
||||
|
||||
void radio_phy_set(u8_t phy)
|
||||
void radio_phy_set(u8_t phy, u8_t flags)
|
||||
{
|
||||
NRF_RADIO->MODE =
|
||||
(((phy) ? (u32_t)phy : RADIO_MODE_MODE_Ble_1Mbit) <<
|
||||
RADIO_MODE_MODE_Pos) & RADIO_MODE_MODE_Msk;
|
||||
u32_t mode;
|
||||
|
||||
switch (phy) {
|
||||
case BIT(0):
|
||||
default:
|
||||
mode = RADIO_MODE_MODE_Ble_1Mbit;
|
||||
break;
|
||||
|
||||
#if defined(CONFIG_SOC_SERIES_NRF51X)
|
||||
case BIT(1):
|
||||
mode = RADIO_MODE_MODE_Nrf_2Mbit;
|
||||
break;
|
||||
|
||||
#elif defined(CONFIG_SOC_SERIES_NRF52X)
|
||||
case BIT(1):
|
||||
mode = RADIO_MODE_MODE_Ble_2Mbit;
|
||||
break;
|
||||
|
||||
#if defined(CONFIG_SOC_NRF52840)
|
||||
case BIT(2):
|
||||
if (flags & 0x01) {
|
||||
mode = RADIO_MODE_MODE_Ble_LR125Kbit;
|
||||
} else {
|
||||
mode = RADIO_MODE_MODE_Ble_LR500Kbit;
|
||||
}
|
||||
break;
|
||||
#endif /* CONFIG_SOC_NRF52840 */
|
||||
#endif /* CONFIG_SOC_SERIES_NRF52X */
|
||||
}
|
||||
|
||||
NRF_RADIO->MODE = (mode << RADIO_MODE_MODE_Pos) & RADIO_MODE_MODE_Msk;
|
||||
}
|
||||
|
||||
void radio_tx_power_set(u32_t power)
|
||||
|
@ -96,12 +124,12 @@ void radio_aa_set(u8_t *aa)
|
|||
|
||||
void radio_pkt_configure(u8_t bits_len, u8_t max_len, u8_t flags)
|
||||
{
|
||||
u8_t p16 = (flags >> 1) & 0x01; /* 16-bit preamble */
|
||||
u8_t dc = flags & 0x01; /* Adv or Data channel */
|
||||
u32_t extra;
|
||||
u8_t phy;
|
||||
|
||||
#if defined(CONFIG_SOC_SERIES_NRF51X)
|
||||
ARG_UNUSED(p16);
|
||||
ARG_UNUSED(phy);
|
||||
|
||||
extra = 0;
|
||||
|
||||
|
@ -109,9 +137,32 @@ void radio_pkt_configure(u8_t bits_len, u8_t max_len, u8_t flags)
|
|||
if (dc) {
|
||||
bits_len = 5;
|
||||
}
|
||||
#else /* !CONFIG_SOC_SERIES_NRF51X */
|
||||
extra = (((p16) ? RADIO_PCNF0_PLEN_16bit : RADIO_PCNF0_PLEN_8bit) <<
|
||||
RADIO_PCNF0_PLEN_Pos) & RADIO_PCNF0_PLEN_Msk;
|
||||
#elif defined(CONFIG_SOC_SERIES_NRF52X)
|
||||
extra = 0;
|
||||
|
||||
phy = (flags >> 1) & 0x07; /* phy */
|
||||
switch (phy) {
|
||||
case BIT(0):
|
||||
default:
|
||||
extra |= (RADIO_PCNF0_PLEN_8bit << RADIO_PCNF0_PLEN_Pos) &
|
||||
RADIO_PCNF0_PLEN_Msk;
|
||||
break;
|
||||
|
||||
case BIT(1):
|
||||
extra |= (RADIO_PCNF0_PLEN_16bit << RADIO_PCNF0_PLEN_Pos) &
|
||||
RADIO_PCNF0_PLEN_Msk;
|
||||
break;
|
||||
|
||||
#if defined(CONFIG_SOC_NRF52840)
|
||||
case BIT(2):
|
||||
extra |= (RADIO_PCNF0_PLEN_LongRange << RADIO_PCNF0_PLEN_Pos) &
|
||||
RADIO_PCNF0_PLEN_Msk;
|
||||
extra |= (2UL << RADIO_PCNF0_CILEN_Pos) & RADIO_PCNF0_CILEN_Msk;
|
||||
extra |= (3UL << RADIO_PCNF0_TERMLEN_Pos) &
|
||||
RADIO_PCNF0_TERMLEN_Msk;
|
||||
break;
|
||||
#endif /* CONFIG_SOC_NRF52840 */
|
||||
}
|
||||
|
||||
/* To use same Data Channel PDU structure with nRF5 specific overhead
|
||||
* byte, include the S1 field in radio packet configuration.
|
||||
|
@ -120,7 +171,7 @@ void radio_pkt_configure(u8_t bits_len, u8_t max_len, u8_t flags)
|
|||
extra |= (RADIO_PCNF0_S1INCL_Include <<
|
||||
RADIO_PCNF0_S1INCL_Pos) & RADIO_PCNF0_S1INCL_Msk;
|
||||
}
|
||||
#endif /* !CONFIG_SOC_SERIES_NRF51X */
|
||||
#endif /* CONFIG_SOC_SERIES_NRF52X */
|
||||
|
||||
NRF_RADIO->PCNF0 = (((1UL) << RADIO_PCNF0_S0LEN_Pos) &
|
||||
RADIO_PCNF0_S0LEN_Msk) |
|
||||
|
@ -555,28 +606,7 @@ void *radio_ccm_tx_pkt_set(struct ccm *ccm, void *pkt)
|
|||
NRF_CCM->EVENTS_ENDCRYPT = 0;
|
||||
NRF_CCM->EVENTS_ERROR = 0;
|
||||
|
||||
#if defined(CONFIG_SOC_SERIES_NRF51X)
|
||||
/* set up PPI to enable CCM */
|
||||
NRF_PPI->CH[6].EEP = (u32_t)&(NRF_RADIO->EVENTS_READY);
|
||||
NRF_PPI->CH[6].TEP = (u32_t)&(NRF_CCM->TASKS_KSGEN);
|
||||
NRF_PPI->CHENSET = PPI_CHEN_CH6_Msk;
|
||||
#elif 0
|
||||
/* encrypt tx packet */
|
||||
NRF_CCM->INTENSET = CCM_INTENSET_ENDCRYPT_Msk;
|
||||
NRF_CCM->TASKS_KSGEN = 1;
|
||||
while (NRF_CCM->EVENTS_ENDCRYPT == 0) {
|
||||
__WFE();
|
||||
__SEV();
|
||||
__WFE();
|
||||
}
|
||||
NRF_CCM->INTENCLR = CCM_INTENCLR_ENDCRYPT_Msk;
|
||||
NVIC_ClearPendingIRQ(CCM_AAR_IRQn);
|
||||
|
||||
LL_ASSERT(NRF_CCM->EVENTS_ERROR == 0);
|
||||
#else
|
||||
/* start KSGEN early, but dont wait for ENDCRYPT */
|
||||
NRF_CCM->TASKS_KSGEN = 1;
|
||||
#endif
|
||||
|
||||
return _pkt_scratch;
|
||||
}
|
||||
|
|
|
@ -26,7 +26,7 @@ void isr_radio(void);
|
|||
void radio_isr_set(radio_isr_fp fp_radio_isr);
|
||||
|
||||
void radio_reset(void);
|
||||
void radio_phy_set(u8_t phy);
|
||||
void radio_phy_set(u8_t phy, u8_t flags);
|
||||
void radio_tx_power_set(u32_t power);
|
||||
void radio_freq_chan_set(u32_t chan);
|
||||
void radio_whiten_iv_set(u32_t iv);
|
||||
|
|
|
@ -895,6 +895,89 @@ static void le_read_max_data_len(struct net_buf *buf, struct net_buf **evt)
|
|||
rp->status = 0x00;
|
||||
}
|
||||
#endif /* CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH */
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CONTROLLER_PHY)
|
||||
static u8_t ffs(u8_t x)
|
||||
{
|
||||
u8_t i;
|
||||
|
||||
if (!x) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (i = 0; !(x & BIT(i)); i++) {
|
||||
}
|
||||
|
||||
return i + 1;
|
||||
}
|
||||
|
||||
static void le_read_phy(struct net_buf *buf, struct net_buf **evt)
|
||||
{
|
||||
struct bt_hci_cp_le_read_phy *cmd = (void *) buf->data;
|
||||
struct bt_hci_rp_le_read_phy *rp;
|
||||
u16_t handle;
|
||||
u32_t status;
|
||||
|
||||
handle = sys_le16_to_cpu(cmd->handle);
|
||||
|
||||
rp = cmd_complete(evt, sizeof(*rp));
|
||||
|
||||
status = ll_phy_get(handle, &rp->tx_phy, &rp->rx_phy);
|
||||
|
||||
rp->status = (!status) ? 0x00 : BT_HCI_ERR_CMD_DISALLOWED;
|
||||
rp->handle = sys_cpu_to_le16(handle);
|
||||
rp->tx_phy = ffs(rp->tx_phy);
|
||||
rp->rx_phy = ffs(rp->rx_phy);
|
||||
}
|
||||
|
||||
static void le_set_default_phy(struct net_buf *buf, struct net_buf **evt)
|
||||
{
|
||||
struct bt_hci_cp_le_set_default_phy *cmd = (void *)buf->data;
|
||||
struct bt_hci_evt_cc_status *ccst;
|
||||
u32_t status;
|
||||
|
||||
if (cmd->all_phys & BT_HCI_LE_PHY_TX_ANY) {
|
||||
cmd->tx_phys = 0x07;
|
||||
}
|
||||
if (cmd->all_phys & BT_HCI_LE_PHY_RX_ANY) {
|
||||
cmd->rx_phys = 0x07;
|
||||
}
|
||||
|
||||
status = ll_phy_default_set(cmd->tx_phys, cmd->rx_phys);
|
||||
|
||||
ccst = cmd_complete(evt, sizeof(*ccst));
|
||||
ccst->status = (!status) ? 0x00 : BT_HCI_ERR_INVALID_LL_PARAM;
|
||||
}
|
||||
|
||||
static void le_set_phy(struct net_buf *buf, struct net_buf **evt)
|
||||
{
|
||||
struct bt_hci_cp_le_set_phy *cmd = (void *)buf->data;
|
||||
u32_t status;
|
||||
u16_t handle;
|
||||
u16_t phy_opts;
|
||||
|
||||
handle = sys_le16_to_cpu(cmd->handle);
|
||||
phy_opts = sys_le16_to_cpu(cmd->phy_opts);
|
||||
|
||||
if (cmd->all_phys & BT_HCI_LE_PHY_TX_ANY) {
|
||||
cmd->tx_phys = 0x07;
|
||||
}
|
||||
if (cmd->all_phys & BT_HCI_LE_PHY_RX_ANY) {
|
||||
cmd->rx_phys = 0x07;
|
||||
}
|
||||
if (phy_opts & 0x03) {
|
||||
phy_opts -= 1;
|
||||
phy_opts &= 1;
|
||||
} else {
|
||||
phy_opts = 0;
|
||||
}
|
||||
|
||||
status = ll_phy_req_send(handle, cmd->tx_phys, phy_opts,
|
||||
cmd->rx_phys);
|
||||
|
||||
*evt = cmd_status((!status) ? 0x00 : BT_HCI_ERR_CMD_DISALLOWED);
|
||||
}
|
||||
#endif /* CONFIG_BLUETOOTH_CONTROLLER_PHY */
|
||||
#endif /* CONFIG_BLUETOOTH_CONN */
|
||||
|
||||
static int controller_cmd_handle(u8_t ocf, struct net_buf *cmd,
|
||||
|
@ -1039,6 +1122,20 @@ static int controller_cmd_handle(u8_t ocf, struct net_buf *cmd,
|
|||
le_read_max_data_len(cmd, evt);
|
||||
break;
|
||||
#endif /* CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH */
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CONTROLLER_PHY)
|
||||
case BT_OCF(BT_HCI_OP_LE_READ_PHY):
|
||||
le_read_phy(cmd, evt);
|
||||
break;
|
||||
|
||||
case BT_OCF(BT_HCI_OP_LE_SET_DEFAULT_PHY):
|
||||
le_set_default_phy(cmd, evt);
|
||||
break;
|
||||
|
||||
case BT_OCF(BT_HCI_OP_LE_SET_PHY):
|
||||
le_set_phy(cmd, evt);
|
||||
break;
|
||||
#endif /* CONFIG_BLUETOOTH_CONTROLLER_PHY */
|
||||
#endif /* CONFIG_BLUETOOTH_CONN */
|
||||
|
||||
default:
|
||||
|
@ -1361,7 +1458,6 @@ static void enc_refresh_complete(struct pdu_data *pdu_data, u16_t handle,
|
|||
ep->status = 0x00;
|
||||
ep->handle = sys_cpu_to_le16(handle);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CONTROLLER_LE_PING)
|
||||
static void auth_payload_timeout_exp(struct pdu_data *pdu_data, u16_t handle,
|
||||
|
@ -1398,6 +1494,35 @@ static void le_chan_sel_algo(struct pdu_data *pdu_data, u16_t handle,
|
|||
}
|
||||
#endif /* CONFIG_BLUETOOTH_CONTROLLER_CHAN_SEL_2 */
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CONTROLLER_PHY)
|
||||
static void le_phy_upd_complete(struct pdu_data *pdu_data, u16_t handle,
|
||||
struct net_buf *buf)
|
||||
{
|
||||
struct bt_hci_evt_le_phy_update_complete *sep;
|
||||
struct radio_le_phy_upd_cmplt *radio_le_phy_upd_cmplt;
|
||||
|
||||
radio_le_phy_upd_cmplt = (struct radio_le_phy_upd_cmplt *)
|
||||
pdu_data->payload.lldata;
|
||||
|
||||
if (!(event_mask & BT_EVT_MASK_LE_META_EVENT) ||
|
||||
!(le_event_mask & BT_EVT_MASK_LE_PHY_UPDATE_COMPLETE)) {
|
||||
BT_WARN("handle: 0x%04x, status: %x, tx: %x, rx: %x.", handle,
|
||||
radio_le_phy_upd_cmplt->status,
|
||||
ffs(radio_le_phy_upd_cmplt->tx),
|
||||
ffs(radio_le_phy_upd_cmplt->rx));
|
||||
return;
|
||||
}
|
||||
|
||||
sep = meta_evt(buf, BT_HCI_EVT_LE_PHY_UPDATE_COMPLETE, sizeof(*sep));
|
||||
|
||||
sep->status = radio_le_phy_upd_cmplt->status;
|
||||
sep->handle = sys_cpu_to_le16(handle);
|
||||
sep->tx_phy = ffs(radio_le_phy_upd_cmplt->tx);
|
||||
sep->rx_phy = ffs(radio_le_phy_upd_cmplt->rx);
|
||||
}
|
||||
#endif /* CONFIG_BLUETOOTH_CONTROLLER_PHY */
|
||||
#endif /* CONFIG_BLUETOOTH_CONN */
|
||||
|
||||
static void encode_control(struct radio_pdu_node_rx *node_rx,
|
||||
struct pdu_data *pdu_data, struct net_buf *buf)
|
||||
{
|
||||
|
@ -1433,7 +1558,6 @@ static void encode_control(struct radio_pdu_node_rx *node_rx,
|
|||
case NODE_RX_TYPE_ENC_REFRESH:
|
||||
enc_refresh_complete(pdu_data, handle, buf);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CONTROLLER_LE_PING)
|
||||
case NODE_RX_TYPE_APTO:
|
||||
|
@ -1447,12 +1571,19 @@ static void encode_control(struct radio_pdu_node_rx *node_rx,
|
|||
break;
|
||||
#endif /* CONFIG_BLUETOOTH_CONTROLLER_CHAN_SEL_2 */
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CONTROLLER_PHY)
|
||||
case NODE_RX_TYPE_PHY_UPDATE:
|
||||
le_phy_upd_complete(pdu_data, handle, buf);
|
||||
return;
|
||||
#endif /* CONFIG_BLUETOOTH_CONTROLLER_PHY */
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CONTROLLER_CONN_RSSI)
|
||||
case NODE_RX_TYPE_RSSI:
|
||||
BT_INFO("handle: 0x%04x, rssi: -%d dB.", handle,
|
||||
pdu_data->payload.rssi);
|
||||
return;
|
||||
#endif /* CONFIG_BLUETOOTH_CONTROLLER_CONN_RSSI */
|
||||
#endif /* CONFIG_BLUETOOTH_CONN */
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CONTROLLER_ADV_INDICATION)
|
||||
case NODE_RX_TYPE_ADV_INDICATION:
|
||||
|
@ -1775,6 +1906,9 @@ s8_t hci_get_class(struct radio_pdu_node_rx *node_rx)
|
|||
#if defined(CONFIG_BLUETOOTH_CONTROLLER_CHAN_SEL_2)
|
||||
case NODE_RX_TYPE_CHAN_SEL_ALGO:
|
||||
#endif
|
||||
#if defined(CONFIG_BLUETOOTH_CONTROLLER_PHY)
|
||||
case NODE_RX_TYPE_PHY_UPDATE:
|
||||
#endif /* CONFIG_BLUETOOTH_CONTROLLER_PHY */
|
||||
return HCI_CLASS_EVT_CONNECTION;
|
||||
default:
|
||||
return -1;
|
||||
|
|
|
@ -55,4 +55,10 @@ void ll_length_max_get(u16_t *max_tx_octets, u16_t *max_tx_time,
|
|||
u16_t *max_rx_octets, u16_t *max_rx_time);
|
||||
#endif /* CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH */
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CONTROLLER_PHY)
|
||||
u32_t ll_phy_get(u16_t handle, u8_t *tx, u8_t *rx);
|
||||
u32_t ll_phy_default_set(u8_t tx, u8_t rx);
|
||||
u32_t ll_phy_req_send(u16_t handle, u8_t tx, u8_t flags, u8_t rx);
|
||||
#endif /* CONFIG_BLUETOOTH_CONTROLLER_PHY */
|
||||
|
||||
#endif /* _LL_H_ */
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -32,14 +32,16 @@
|
|||
CONFIG_BLUETOOTH_CONTROLLER_TX_BUFFER_SIZE
|
||||
#endif
|
||||
|
||||
#define BIT64(n) (1ULL << (n))
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CONTROLLER_LE_PING)
|
||||
#define RADIO_BLE_FEAT_BIT_PING BIT(BT_LE_FEAT_BIT_PING)
|
||||
#define RADIO_BLE_FEAT_BIT_PING BIT64(BT_LE_FEAT_BIT_PING)
|
||||
#else /* !CONFIG_BLUETOOTH_CONTROLLER_LE_PING */
|
||||
#define RADIO_BLE_FEAT_BIT_PING 0
|
||||
#endif /* !CONFIG_BLUETOOTH_CONTROLLER_LE_PING */
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH_MAX)
|
||||
#define RADIO_BLE_FEAT_BIT_DLE BIT(BT_LE_FEAT_BIT_DLE)
|
||||
#define RADIO_BLE_FEAT_BIT_DLE BIT64(BT_LE_FEAT_BIT_DLE)
|
||||
#define RADIO_LL_LENGTH_OCTETS_RX_MAX \
|
||||
CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH_MAX
|
||||
#else
|
||||
|
@ -48,11 +50,23 @@
|
|||
#endif /* CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH_MAX */
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CONTROLLER_CHAN_SEL_2)
|
||||
#define RADIO_BLE_FEAT_BIT_CHAN_SEL_2 BIT(BT_LE_FEAT_BIT_CHAN_SEL_ALGO_2)
|
||||
#define RADIO_BLE_FEAT_BIT_CHAN_SEL_2 BIT64(BT_LE_FEAT_BIT_CHAN_SEL_ALGO_2)
|
||||
#else /* !CONFIG_BLUETOOTH_CONTROLLER_CHAN_SEL_2 */
|
||||
#define RADIO_BLE_FEAT_BIT_CHAN_SEL_2 0
|
||||
#endif /* !CONFIG_BLUETOOTH_CONTROLLER_CHAN_SEL_2 */
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CONTROLLER_PHY_2M)
|
||||
#define RADIO_BLE_FEAT_BIT_PHY_2M BIT64(BT_LE_FEAT_BIT_PHY_2M)
|
||||
#else /* !CONFIG_BLUETOOTH_CONTROLLER_PHY_2M */
|
||||
#define RADIO_BLE_FEAT_BIT_PHY_2M 0
|
||||
#endif /* !CONFIG_BLUETOOTH_CONTROLLER_PHY_2M */
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CONTROLLER_PHY_CODED)
|
||||
#define RADIO_BLE_FEAT_BIT_PHY_CODED BIT64(BT_LE_FEAT_BIT_PHY_CODED)
|
||||
#else /* !CONFIG_BLUETOOTH_CONTROLLER_PHY_CODED */
|
||||
#define RADIO_BLE_FEAT_BIT_PHY_CODED 0
|
||||
#endif /* !CONFIG_BLUETOOTH_CONTROLLER_PHY_CODED */
|
||||
|
||||
/*****************************************************************************
|
||||
* Timer Resources (Controller defined)
|
||||
****************************************************************************/
|
||||
|
@ -110,6 +124,8 @@
|
|||
BIT(BT_LE_FEAT_BIT_SLAVE_FEAT_REQ) | \
|
||||
RADIO_BLE_FEAT_BIT_PING | \
|
||||
RADIO_BLE_FEAT_BIT_DLE | \
|
||||
RADIO_BLE_FEAT_BIT_PHY_2M | \
|
||||
RADIO_BLE_FEAT_BIT_PHY_CODED | \
|
||||
RADIO_BLE_FEAT_BIT_CHAN_SEL_2)
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CONTROLLER_WORKER_PRIO)
|
||||
|
@ -215,6 +231,10 @@ enum radio_pdu_node_rx_type {
|
|||
|
||||
NODE_RX_TYPE_CHAN_SEL_ALGO,
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CONTROLLER_PHY)
|
||||
NODE_RX_TYPE_PHY_UPDATE,
|
||||
#endif /* CONFIG_BLUETOOTH_CONTROLLER_PHY */
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CONTROLLER_CONN_RSSI)
|
||||
NODE_RX_TYPE_RSSI,
|
||||
#endif /* CONFIG_BLUETOOTH_CONTROLLER_CONN_RSSI */
|
||||
|
@ -253,6 +273,12 @@ struct radio_le_chan_sel_algo {
|
|||
u8_t chan_sel_algo;
|
||||
} __packed;
|
||||
|
||||
struct radio_le_phy_upd_cmplt {
|
||||
u8_t status;
|
||||
u8_t tx;
|
||||
u8_t rx;
|
||||
} __packed;
|
||||
|
||||
struct radio_pdu_node_rx_hdr {
|
||||
union {
|
||||
sys_snode_t node; /* used by slist */
|
||||
|
|
|
@ -17,6 +17,10 @@ enum llcp {
|
|||
#if defined(CONFIG_BLUETOOTH_CONTROLLER_LE_PING)
|
||||
LLCP_PING,
|
||||
#endif /* CONFIG_BLUETOOTH_CONTROLLER_LE_PING */
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CONTROLLER_PHY)
|
||||
LLCP_PHY_UPD,
|
||||
#endif /* CONFIG_BLUETOOTH_CONTROLLER_PHY */
|
||||
};
|
||||
|
||||
|
||||
|
@ -60,6 +64,15 @@ struct connection {
|
|||
u16_t max_rx_octets;
|
||||
#endif /* CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH */
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CONTROLLER_PHY)
|
||||
u8_t phy_pref_tx:3;
|
||||
u8_t phy_tx:3;
|
||||
u8_t phy_pref_flags:1;
|
||||
u8_t phy_flags:1;
|
||||
u8_t phy_pref_rx:3;
|
||||
u8_t phy_rx:3;
|
||||
#endif /* CONFIG_BLUETOOTH_CONTROLLER_PHY */
|
||||
|
||||
u16_t supervision_reload;
|
||||
u16_t supervision_expire;
|
||||
u16_t procedure_reload;
|
||||
|
@ -131,6 +144,17 @@ struct connection {
|
|||
u8_t chm[5];
|
||||
u16_t instant;
|
||||
} chan_map;
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CONTROLLER_PHY)
|
||||
struct {
|
||||
u8_t initiate:1;
|
||||
u8_t cmd:1;
|
||||
u8_t tx:3;
|
||||
u8_t rx:3;
|
||||
u16_t instant;
|
||||
} phy_upd_ind;
|
||||
#endif /* CONFIG_BLUETOOTH_CONTROLLER_PHY */
|
||||
|
||||
struct {
|
||||
u8_t error_code;
|
||||
u8_t rand[8];
|
||||
|
@ -175,6 +199,22 @@ struct connection {
|
|||
} llcp_length;
|
||||
#endif /* CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH */
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CONTROLLER_PHY)
|
||||
struct {
|
||||
u8_t req;
|
||||
u8_t ack;
|
||||
u8_t state:2;
|
||||
#define LLCP_PHY_STATE_REQ 0
|
||||
#define LLCP_PHY_STATE_ACK_WAIT 1
|
||||
#define LLCP_PHY_STATE_RSP_WAIT 2
|
||||
#define LLCP_PHY_STATE_UPD 3
|
||||
u8_t tx:3;
|
||||
u8_t rx:3;
|
||||
u8_t flags:1;
|
||||
u8_t cmd:1;
|
||||
} llcp_phy;
|
||||
#endif /* CONFIG_BLUETOOTH_CONTROLLER_PHY */
|
||||
|
||||
u8_t sn:1;
|
||||
u8_t nesn:1;
|
||||
u8_t pause_rx:1;
|
||||
|
|
|
@ -121,7 +121,7 @@ enum pdu_data_llctrl_type {
|
|||
PDU_DATA_LLCTRL_TYPE_LENGTH_RSP = 0x15,
|
||||
PDU_DATA_LLCTRL_TYPE_PHY_REQ = 0x16,
|
||||
PDU_DATA_LLCTRL_TYPE_PHY_RSP = 0x17,
|
||||
PDU_DATA_LLCTRL_TYPE_PHY_UPDATE_IND = 0x18,
|
||||
PDU_DATA_LLCTRL_TYPE_PHY_UPD_IND = 0x18,
|
||||
PDU_DATA_LLCTRL_TYPE_MIN_USED_CHAN_IND = 0x19,
|
||||
};
|
||||
|
||||
|
@ -224,7 +224,7 @@ struct pdu_data_llctrl_phy_req_rsp {
|
|||
u8_t rx_phys;
|
||||
} __packed;
|
||||
|
||||
struct pdu_data_llctrl_phy_update_ind {
|
||||
struct pdu_data_llctrl_phy_upd_ind {
|
||||
u8_t m_to_s_phy;
|
||||
u8_t s_to_m_phy;
|
||||
u16_t instant;
|
||||
|
@ -256,7 +256,7 @@ struct pdu_data_llctrl {
|
|||
struct pdu_data_llctrl_length_req_rsp length_rsp;
|
||||
struct pdu_data_llctrl_phy_req_rsp phy_req;
|
||||
struct pdu_data_llctrl_phy_req_rsp phy_rsp;
|
||||
struct pdu_data_llctrl_phy_update_ind phy_update_ind;
|
||||
struct pdu_data_llctrl_phy_upd_ind phy_upd_ind;
|
||||
struct pdu_data_llctrl_min_used_chans_ind min_used_chans_ind;
|
||||
} __packed ctrldata;
|
||||
} __packed;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue