Bluetooth: Controller: Add PDU time calculation for S2 Coded PHY
Add PDU time calculation macro for S2 and S8 Coded PHY. Rename PKT_AC_US to PDU_AC_MAX_US. Signed-off-by: Vinayak Kariappa Chettimada <vich@nordicsemi.no>
This commit is contained in:
parent
88b155de31
commit
1ce46fd7a6
8 changed files with 82 additions and 48 deletions
|
@ -236,8 +236,8 @@ void lll_scan_prepare_connect_req(struct lll_scan *lll, struct pdu_adv *pdu_tx,
|
|||
|
||||
conn_interval_us = (uint32_t)lll_conn->interval * CONN_INT_UNIT_US;
|
||||
conn_offset_us = radio_tmr_end_get() + EVENT_IFS_US +
|
||||
PKT_AC_US(sizeof(struct pdu_adv_connect_ind),
|
||||
phy == PHY_LEGACY ? PHY_1M : phy);
|
||||
PDU_AC_MAX_US(sizeof(struct pdu_adv_connect_ind),
|
||||
(phy == PHY_LEGACY) ? PHY_1M : phy);
|
||||
|
||||
/* Add transmitWindowDelay to default calculated connection offset:
|
||||
* 1.25ms for a legacy PDU, 2.5ms for an LE Uncoded PHY and 3.75ms for
|
||||
|
|
|
@ -772,9 +772,9 @@ static int isr_rx_pdu(struct lll_scan *lll, struct lll_scan_aux *lll_aux,
|
|||
ull = HDR_LLL2ULL(lll);
|
||||
if (pdu_end_us > (HAL_TICKER_TICKS_TO_US(ull->ticks_slot) -
|
||||
EVENT_IFS_US -
|
||||
PKT_AC_US(aux_connect_req_len, phy_aux) -
|
||||
PDU_AC_MAX_US(aux_connect_req_len, phy_aux) -
|
||||
EVENT_IFS_US -
|
||||
PKT_AC_US(aux_connect_rsp_len, phy_aux) -
|
||||
PDU_AC_MAX_US(aux_connect_rsp_len, phy_aux) -
|
||||
EVENT_OVERHEAD_START_US -
|
||||
EVENT_TICKER_RES_MARGIN_US)) {
|
||||
return -ETIME;
|
||||
|
|
|
@ -124,6 +124,8 @@
|
|||
#define PHY_1M BIT(0)
|
||||
#define PHY_2M BIT(1)
|
||||
#define PHY_CODED BIT(2)
|
||||
#define PHY_FLAGS_S2 0
|
||||
#define PHY_FLAGS_S8 BIT(0)
|
||||
|
||||
#if defined(CONFIG_BT_CTLR_PHY_CODED)
|
||||
#define CODED_PHY_PREAMBLE_TIME_US 80
|
||||
|
@ -133,40 +135,58 @@
|
|||
#define CODED_PHY_CRC_SIZE 24
|
||||
#define CODED_PHY_TERM2_SIZE 3
|
||||
|
||||
#define FEC_BLOCK1_TIME_US ((CODED_PHY_ACCESS_ADDRESS_TIME_US) + \
|
||||
#define FEC_BLOCK1_US ((CODED_PHY_ACCESS_ADDRESS_TIME_US) + \
|
||||
(CODED_PHY_CI_TIME_US) + \
|
||||
(CODED_PHY_TERM1_TIME_US))
|
||||
#define FEC_BLOCK2_TIME_US(octets, mic) (((((PDU_HEADER_SIZE) + \
|
||||
(octets) + \
|
||||
(mic))<<3) + \
|
||||
(CODED_PHY_CRC_SIZE) + \
|
||||
(CODED_PHY_TERM2_SIZE))<<3)
|
||||
|
||||
#define PDU_MAX_US(octets, mic, phy) (((phy) & PHY_CODED) ? \
|
||||
/* cs = 0, S2 coding scheme, use PHY_FLAGS_S2
|
||||
* cs = 1, S8 coding scheme, use PHY_FLAGS_S8
|
||||
*
|
||||
* Not using the term CI, Coding Indicator, where in the Spec its defined value
|
||||
* of 0 is S8 encoding, 1 is S2 encoding.
|
||||
*/
|
||||
#define FEC_BLOCK2_US(octets, mic, cs) (((((PDU_HEADER_SIZE) + \
|
||||
(octets) + \
|
||||
(mic)) << 3) + \
|
||||
(CODED_PHY_CRC_SIZE) + \
|
||||
(CODED_PHY_TERM2_SIZE)) << \
|
||||
(1 + (((cs) & 0x01) << 1)))
|
||||
|
||||
#define PDU_US(octets, mic, phy, cs) (((phy) & PHY_CODED) ? \
|
||||
((CODED_PHY_PREAMBLE_TIME_US) + \
|
||||
(FEC_BLOCK1_TIME_US) + \
|
||||
FEC_BLOCK2_TIME_US((octets), (mic))) : \
|
||||
(FEC_BLOCK1_US) + \
|
||||
FEC_BLOCK2_US((octets), (mic), \
|
||||
(cs))) : \
|
||||
(((PDU_PREAMBLE_SIZE(phy) + \
|
||||
(PDU_ACCESS_ADDR_SIZE) + \
|
||||
(PDU_HEADER_SIZE) + \
|
||||
(octets) + \
|
||||
(mic) + \
|
||||
(PDU_CRC_SIZE))<<3) / \
|
||||
(PDU_CRC_SIZE)) << 3) / \
|
||||
BIT(((phy) & 0x03) >> 1)))
|
||||
|
||||
#define PDU_MAX_US(octets, mic, phy) PDU_US((octets), (mic), (phy), \
|
||||
PHY_FLAGS_S8)
|
||||
|
||||
#else /* !CONFIG_BT_CTLR_PHY_CODED */
|
||||
#define PDU_MAX_US(octets, mic, phy) (((PDU_PREAMBLE_SIZE(phy) + \
|
||||
#define PDU_US(octets, mic, phy, cs) (((PDU_PREAMBLE_SIZE(phy) + \
|
||||
(PDU_ACCESS_ADDR_SIZE) + \
|
||||
(PDU_HEADER_SIZE) + \
|
||||
(octets) + \
|
||||
(mic) + \
|
||||
(PDU_CRC_SIZE))<<3) / \
|
||||
(PDU_CRC_SIZE)) << 3) / \
|
||||
BIT(((phy) & 0x03) >> 1))
|
||||
|
||||
#define PDU_MAX_US(octets, mic, phy) PDU_US((octets), (mic), (phy), 0)
|
||||
#endif /* !CONFIG_BT_CTLR_PHY_CODED */
|
||||
|
||||
#define PDU_DC_MAX_US(octets, phy) PDU_MAX_US((octets), (PDU_MIC_SIZE), (phy))
|
||||
|
||||
#define PKT_AC_US(octets, phy) PDU_MAX_US((octets), 0, (phy))
|
||||
#define PDU_DC_US(octets, mic, phy, cs) PDU_US((octets), (mic), (phy), (cs))
|
||||
|
||||
#define PDU_AC_MAX_US(octets, phy) PDU_MAX_US((octets), 0, (phy))
|
||||
|
||||
#define PDU_AC_US(octets, phy, cs) PDU_US((octets), 0, (phy), (cs))
|
||||
|
||||
#define PKT_BIS_US(octets, mic, phy) PDU_MAX_US((octets), (mic), (phy))
|
||||
|
||||
|
|
|
@ -1942,15 +1942,26 @@ uint8_t ull_adv_time_update(struct ll_adv_set *adv, struct pdu_adv *pdu,
|
|||
uint32_t ticks_plus;
|
||||
struct lll_adv *lll;
|
||||
uint32_t time_ticks;
|
||||
uint8_t phy_flags;
|
||||
uint16_t time_us;
|
||||
uint8_t chan_map;
|
||||
uint8_t chan_cnt;
|
||||
uint32_t ret;
|
||||
uint8_t phy;
|
||||
|
||||
lll = &adv->lll;
|
||||
|
||||
#if defined(CONFIG_BT_CTLR_ADV_EXT)
|
||||
phy = lll->phy_p;
|
||||
phy_flags = lll->phy_flags;
|
||||
#else
|
||||
phy = PHY_1M;
|
||||
phy_flags = 0U;
|
||||
#endif
|
||||
|
||||
chan_map = lll->chan_map;
|
||||
chan_cnt = util_ones_count_get(&chan_map, sizeof(chan_map));
|
||||
time_us = adv_time_get(pdu, pdu_scan, chan_cnt, PHY_1M);
|
||||
time_us = adv_time_get(pdu, pdu_scan, chan_cnt, phy, phy_flags);
|
||||
time_ticks = HAL_TICKER_US_TO_TICKS(time_us);
|
||||
if (adv->ull.ticks_slot > time_ticks) {
|
||||
ticks_minus = adv->ull.ticks_slot - time_ticks;
|
||||
|
|
|
@ -1135,7 +1135,7 @@ static uint16_t aux_time_get(struct ll_adv_aux_set *aux, struct pdu_adv *pdu,
|
|||
if ((pdu->adv_ext_ind.adv_mode & BT_HCI_LE_ADV_PROP_CONN) ==
|
||||
BT_HCI_LE_ADV_PROP_CONN) {
|
||||
const uint16_t conn_req_us =
|
||||
PKT_AC_US((INITA_SIZE + ADVA_SIZE + LLDATA_SIZE),
|
||||
PDU_AC_MAX_US((INITA_SIZE + ADVA_SIZE + LLDATA_SIZE),
|
||||
lll->phy_s);
|
||||
const uint16_t conn_rsp_us =
|
||||
PKT_AC_US((PDU_AC_EXT_HEADER_SIZE_MIN + ADVA_SIZE +
|
||||
|
@ -1145,7 +1145,7 @@ static uint16_t aux_time_get(struct ll_adv_aux_set *aux, struct pdu_adv *pdu,
|
|||
} else if ((pdu->adv_ext_ind.adv_mode & BT_HCI_LE_ADV_PROP_SCAN) ==
|
||||
BT_HCI_LE_ADV_PROP_SCAN) {
|
||||
const uint16_t scan_req_us =
|
||||
PKT_AC_US((SCANA_SIZE + ADVA_SIZE), lll->phy_s);
|
||||
PDU_AC_MAX_US((SCANA_SIZE + ADVA_SIZE), lll->phy_s);
|
||||
const uint16_t scan_rsp_us =
|
||||
PKT_AC_US(pdu_scan->len, lll->phy_s);
|
||||
|
||||
|
|
|
@ -7029,13 +7029,16 @@ static uint8_t force_md_cnt_calc(struct lll_conn *lll_conn, uint32_t tx_rate)
|
|||
{
|
||||
uint32_t time_incoming, time_outgoing;
|
||||
uint8_t force_md_cnt;
|
||||
uint8_t phy_flags;
|
||||
uint8_t mic_size;
|
||||
uint8_t phy;
|
||||
|
||||
#if defined(CONFIG_BT_CTLR_PHY)
|
||||
phy = lll_conn->phy_tx;
|
||||
phy_flags = lll_conn->phy_flags;
|
||||
#else /* !CONFIG_BT_CTLR_PHY */
|
||||
phy = PHY_1M;
|
||||
phy_flags = 0U;
|
||||
#endif /* !CONFIG_BT_CTLR_PHY */
|
||||
|
||||
#if defined(CONFIG_BT_CTLR_LE_ENC)
|
||||
|
@ -7046,8 +7049,9 @@ static uint8_t force_md_cnt_calc(struct lll_conn *lll_conn, uint32_t tx_rate)
|
|||
|
||||
time_incoming = (LL_LENGTH_OCTETS_RX_MAX << 3) *
|
||||
1000000UL / tx_rate;
|
||||
time_outgoing = PDU_MAX_US(LL_LENGTH_OCTETS_RX_MAX, mic_size, phy) +
|
||||
PDU_MAX_US(0U, 0U, phy) +
|
||||
time_outgoing = PDU_DC_US(LL_LENGTH_OCTETS_RX_MAX, mic_size, phy,
|
||||
phy_flags) +
|
||||
PDU_DC_US(0U, 0U, phy, PHY_FLAGS_S8) +
|
||||
(EVENT_IFS_US << 1);
|
||||
|
||||
force_md_cnt = 0U;
|
||||
|
@ -7056,7 +7060,8 @@ static uint8_t force_md_cnt_calc(struct lll_conn *lll_conn, uint32_t tx_rate)
|
|||
uint32_t time_keep_alive;
|
||||
|
||||
delta = (time_incoming << 1) - time_outgoing;
|
||||
time_keep_alive = (PDU_MAX_US(0U, 0U, phy) + EVENT_IFS_US) << 1;
|
||||
time_keep_alive = (PDU_DC_US(0U, 0U, phy, PHY_FLAGS_S8) +
|
||||
EVENT_IFS_US) << 1;
|
||||
force_md_cnt = (delta + (time_keep_alive - 1)) /
|
||||
time_keep_alive;
|
||||
BT_DBG("Time: incoming= %u, expected outgoing= %u, delta= %u, "
|
||||
|
|
|
@ -382,7 +382,7 @@ void ull_scan_aux_setup(memq_link_t *link, struct node_rx_hdr *rx)
|
|||
aux->ull.ticks_slot =
|
||||
HAL_TICKER_US_TO_TICKS(EVENT_OVERHEAD_START_US +
|
||||
ready_delay_us +
|
||||
PKT_AC_US(PDU_AC_EXT_PAYLOAD_SIZE_MAX,
|
||||
PDU_AC_MAX_US(PDU_AC_EXT_PAYLOAD_SIZE_MAX,
|
||||
lll_aux->phy) +
|
||||
EVENT_OVERHEAD_END_US);
|
||||
|
||||
|
|
|
@ -467,11 +467,9 @@ void ull_sync_setup(struct ll_scan_set *scan, struct ll_scan_aux_set *aux,
|
|||
HAL_TICKER_US_TO_TICKS(EVENT_OVERHEAD_XTAL_US);
|
||||
sync->ull.ticks_preempt_to_start =
|
||||
HAL_TICKER_US_TO_TICKS(EVENT_OVERHEAD_PREEMPT_MIN_US);
|
||||
sync->ull.ticks_slot =
|
||||
HAL_TICKER_US_TO_TICKS(EVENT_OVERHEAD_START_US +
|
||||
ready_delay_us +
|
||||
PKT_AC_US(PDU_AC_EXT_PAYLOAD_SIZE_MAX,
|
||||
lll->phy) +
|
||||
sync->ull.ticks_slot = HAL_TICKER_US_TO_TICKS(
|
||||
EVENT_OVERHEAD_START_US + ready_delay_us +
|
||||
PDU_AC_MAX_US(PDU_AC_EXT_PAYLOAD_SIZE_MAX, lll->phy) +
|
||||
EVENT_OVERHEAD_END_US);
|
||||
|
||||
ticks_slot_offset = MAX(sync->ull.ticks_active_to_start,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue