Bluetooth: controller: Explicit AC and DC packet configure
In the Controller's radio hal, explicitly differentiate between Advertisement and Data channel packet configuration. Also, remove nRF5x specific extra overhead in Advertisement PDU structure. Change-id: I942b88a160af78f8900d7e49fb5f36c8aa493b97 Signed-off-by: Vinayak Chettimada <vinayak.kariappa.chettimada@nordicsemi.no>
This commit is contained in:
parent
56f8af92cf
commit
9fcd0827fd
5 changed files with 39 additions and 34 deletions
|
@ -94,31 +94,41 @@ void radio_aa_set(u8_t *aa)
|
|||
NRF_RADIO->BASE0 = (aa[2] << 24) | (aa[1] << 16) | (aa[0] << 8);
|
||||
}
|
||||
|
||||
void radio_pkt_configure(u8_t preamble16, u8_t bits_len, u8_t max_len)
|
||||
void radio_pkt_configure(u8_t bits_len, u8_t max_len, u8_t flags)
|
||||
{
|
||||
#if defined(CONFIG_SOC_SERIES_NRF51X)
|
||||
ARG_UNUSED(preamble16);
|
||||
u8_t p16 = (flags >> 1) & 0x01; /* 16-bit preamble */
|
||||
u8_t dc = flags & 0x01; /* Adv or Data channel */
|
||||
u32_t extra;
|
||||
|
||||
if (bits_len == 8) {
|
||||
#if defined(CONFIG_SOC_SERIES_NRF51X)
|
||||
ARG_UNUSED(p16);
|
||||
|
||||
extra = 0;
|
||||
|
||||
/* nRF51 supports only 27 byte PDU when using h/w CCM for encryption. */
|
||||
if (dc) {
|
||||
bits_len = 5;
|
||||
}
|
||||
#endif
|
||||
#else /* !CONFIG_SOC_SERIES_NRF51X */
|
||||
extra = (((p16) ? RADIO_PCNF0_PLEN_16bit : RADIO_PCNF0_PLEN_8bit) <<
|
||||
RADIO_PCNF0_PLEN_Pos) & RADIO_PCNF0_PLEN_Msk;
|
||||
|
||||
NRF_RADIO->PCNF0 = ((((1UL) << RADIO_PCNF0_S0LEN_Pos) &
|
||||
/* To use same Data Channel PDU structure with nRF5 specific overhead
|
||||
* byte, include the S1 field in radio packet configuration.
|
||||
*/
|
||||
if (dc) {
|
||||
extra |= (RADIO_PCNF0_S1INCL_Include <<
|
||||
RADIO_PCNF0_S1INCL_Pos) & RADIO_PCNF0_S1INCL_Msk;
|
||||
}
|
||||
#endif /* !CONFIG_SOC_SERIES_NRF51X */
|
||||
|
||||
NRF_RADIO->PCNF0 = (((1UL) << RADIO_PCNF0_S0LEN_Pos) &
|
||||
RADIO_PCNF0_S0LEN_Msk) |
|
||||
((((u32_t)bits_len) << RADIO_PCNF0_LFLEN_Pos) &
|
||||
RADIO_PCNF0_LFLEN_Msk) |
|
||||
#if !defined(CONFIG_SOC_SERIES_NRF51X)
|
||||
(((RADIO_PCNF0_S1INCL_Include) <<
|
||||
RADIO_PCNF0_S1INCL_Pos) &
|
||||
RADIO_PCNF0_S1INCL_Msk) |
|
||||
((((preamble16) ? RADIO_PCNF0_PLEN_16bit :
|
||||
RADIO_PCNF0_PLEN_8bit) << RADIO_PCNF0_PLEN_Pos) &
|
||||
RADIO_PCNF0_PLEN_Msk) |
|
||||
#endif
|
||||
((((u32_t)8-bits_len) <<
|
||||
RADIO_PCNF0_S1LEN_Pos) &
|
||||
RADIO_PCNF0_S1LEN_Msk));
|
||||
((((u32_t)8-bits_len) << RADIO_PCNF0_S1LEN_Pos) &
|
||||
RADIO_PCNF0_S1LEN_Msk) |
|
||||
extra;
|
||||
|
||||
NRF_RADIO->PCNF1 = (((((u32_t)max_len) << RADIO_PCNF1_MAXLEN_Pos) &
|
||||
RADIO_PCNF1_MAXLEN_Msk) |
|
||||
|
|
|
@ -31,7 +31,7 @@ void radio_tx_power_set(u32_t power);
|
|||
void radio_freq_chan_set(u32_t chan);
|
||||
void radio_whiten_iv_set(u32_t iv);
|
||||
void radio_aa_set(u8_t *aa);
|
||||
void radio_pkt_configure(u8_t preamble16, u8_t bits_len, u8_t max_len);
|
||||
void radio_pkt_configure(u8_t bits_len, u8_t max_len, u8_t flags);
|
||||
void radio_pkt_rx_set(void *rx_packet);
|
||||
void radio_pkt_tx_set(void *tx_packet);
|
||||
void radio_rx_enable(void);
|
||||
|
|
|
@ -4309,7 +4309,7 @@ static void adv_obs_configure(u8_t phy)
|
|||
|
||||
adv_obs_conn_configure(phy);
|
||||
radio_aa_set((u8_t *)&aa);
|
||||
radio_pkt_configure(phy, 6, 37);
|
||||
radio_pkt_configure(8, PDU_AC_PAYLOAD_SIZE_MAX, (phy << 1));
|
||||
radio_crc_configure(((0x5bUL) | ((0x06UL) << 8) | ((0x00UL) << 16)),
|
||||
0x555555);
|
||||
}
|
||||
|
@ -6112,12 +6112,12 @@ static void rx_packet_set(struct connection *conn, struct pdu_data *pdu_data_rx)
|
|||
|
||||
phy = RADIO_PHY_CONN;
|
||||
if (conn->enc_rx) {
|
||||
radio_pkt_configure(phy, 8, (max_rx_octets + 4));
|
||||
radio_pkt_configure(8, (max_rx_octets + 4), (phy << 1) | 0x01);
|
||||
|
||||
radio_pkt_rx_set(radio_ccm_rx_pkt_set(&conn->ccm_rx,
|
||||
pdu_data_rx));
|
||||
} else {
|
||||
radio_pkt_configure(phy, 8, max_rx_octets);
|
||||
radio_pkt_configure(8, max_rx_octets, (phy << 1) | 0x01);
|
||||
|
||||
radio_pkt_rx_set(pdu_data_rx);
|
||||
}
|
||||
|
@ -6136,12 +6136,12 @@ static void tx_packet_set(struct connection *conn, struct pdu_data *pdu_data_tx)
|
|||
|
||||
phy = RADIO_PHY_CONN;
|
||||
if (conn->enc_tx) {
|
||||
radio_pkt_configure(phy, 8, (max_tx_octets + 4));
|
||||
radio_pkt_configure(8, (max_tx_octets + 4), (phy << 1) | 0x01);
|
||||
|
||||
radio_pkt_tx_set(radio_ccm_tx_pkt_set(&conn->ccm_tx,
|
||||
pdu_data_tx));
|
||||
} else {
|
||||
radio_pkt_configure(phy, 8, max_tx_octets);
|
||||
radio_pkt_configure(8, max_tx_octets, (phy << 1) | 0x01);
|
||||
|
||||
radio_pkt_tx_set(pdu_data_tx);
|
||||
}
|
||||
|
|
|
@ -324,7 +324,6 @@ void ll_adv_params_set(u16_t interval, u8_t adv_type,
|
|||
pdu->len = BDADDR_SIZE;
|
||||
}
|
||||
pdu->rx_addr = _ll_adv_params.rx_addr;
|
||||
pdu->resv = 0;
|
||||
|
||||
/* update the current scan data */
|
||||
radio_adv_data = radio_scan_data_get();
|
||||
|
@ -337,7 +336,6 @@ void ll_adv_params_set(u16_t interval, u8_t adv_type,
|
|||
if (pdu->len == 0) {
|
||||
pdu->len = BDADDR_SIZE;
|
||||
}
|
||||
pdu->resv = 0;
|
||||
}
|
||||
|
||||
void ll_adv_data_set(u8_t len, u8_t const *const data)
|
||||
|
@ -384,7 +382,6 @@ void ll_adv_data_set(u8_t len, u8_t const *const data)
|
|||
memcpy(&pdu->payload.adv_ind.data[0], data, len);
|
||||
pdu->len = BDADDR_SIZE + len;
|
||||
}
|
||||
pdu->resv = 0;
|
||||
|
||||
/* commit the update so controller picks it. */
|
||||
radio_adv_data->last = last;
|
||||
|
@ -418,7 +415,6 @@ void ll_scan_data_set(u8_t len, u8_t const *const data)
|
|||
memcpy(&pdu->payload.scan_rsp.addr[0], &_ll_adv_params.adv_addr[0],
|
||||
BDADDR_SIZE);
|
||||
memcpy(&pdu->payload.scan_rsp.data[0], data, len);
|
||||
pdu->resv = 0;
|
||||
|
||||
/* commit the update so controller picks it. */
|
||||
radio_scan_data->last = last;
|
||||
|
|
|
@ -12,8 +12,9 @@
|
|||
|
||||
/* PDU Sizes */
|
||||
#define PDU_EM_SIZE_MAX 3
|
||||
#define PDU_AC_SIZE_OVERHEAD 3
|
||||
#define PDU_AC_SIZE_MAX (37 + PDU_AC_SIZE_OVERHEAD)
|
||||
#define PDU_AC_SIZE_OVERHEAD 2
|
||||
#define PDU_AC_PAYLOAD_SIZE_MAX 37
|
||||
#define PDU_AC_SIZE_MAX (PDU_AC_PAYLOAD_SIZE_MAX + PDU_AC_SIZE_OVERHEAD)
|
||||
|
||||
struct pdu_adv_payload_adv_ind {
|
||||
u8_t addr[BDADDR_SIZE];
|
||||
|
@ -79,8 +80,6 @@ struct pdu_adv {
|
|||
|
||||
u8_t len:8;
|
||||
|
||||
u8_t resv:8; /* TODO: remove nRF specific code */
|
||||
|
||||
union {
|
||||
struct pdu_adv_payload_adv_ind adv_ind;
|
||||
struct pdu_adv_payload_direct_ind direct_ind;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue