Bluetooth: Controller: Add BT_CTLR_EVENT_OVERHEAD_RESERVE_MAX Kconfig
Add BT_CTLR_EVENT_OVERHEAD_RESERVE_MAX Kconfig to allow the omit of EVENT_OVERHEAD_START_US and EVENT_OVERHEAD_END_US in the time reservation calculations. Signed-off-by: Vinayak Kariappa Chettimada <vich@nordicsemi.no>
This commit is contained in:
parent
1ab007a2ba
commit
3c2b1f952c
9 changed files with 152 additions and 24 deletions
|
@ -632,6 +632,17 @@ config BT_CTLR_CENTRAL_RESERVE_MAX
|
|||
Note, currently this value is only used to space multiple central
|
||||
connections and not for actual ticker time reservations.
|
||||
|
||||
config BT_CTLR_EVENT_OVERHEAD_RESERVE_MAX
|
||||
bool "Reserve maximum event overhead in time reservations"
|
||||
default y
|
||||
help
|
||||
Use radio event scheduling CPU time overhead in calculations of event
|
||||
time reservations.
|
||||
|
||||
If this option is disabled, then Peripheral ACL and Peripheral ISO
|
||||
role will not include CPU time overhead. Other role will continue to
|
||||
use CPU overheads in their event time reservations.
|
||||
|
||||
config BT_CTLR_SLOT_RESERVATION_UPDATE
|
||||
bool "Update event length reservation after PHY or DLE update"
|
||||
depends on (BT_CTLR_DATA_LENGTH || BT_CTLR_PHY)
|
||||
|
|
|
@ -97,6 +97,7 @@ uint8_t ll_create_connection(uint16_t scan_interval, uint16_t scan_window,
|
|||
uint16_t max_tx_time;
|
||||
uint16_t max_rx_time;
|
||||
memq_link_t *link;
|
||||
uint32_t slot_us;
|
||||
uint8_t hop;
|
||||
int err;
|
||||
|
||||
|
@ -360,10 +361,13 @@ conn_is_valid:
|
|||
#endif /* CONFIG_BT_CTLR_ADV_EXT */
|
||||
#endif /* CONFIG_BT_CTLR_DATA_LENGTH */
|
||||
|
||||
conn->ull.ticks_slot = HAL_TICKER_US_TO_TICKS_CEIL(
|
||||
EVENT_OVERHEAD_START_US + EVENT_OVERHEAD_END_US +
|
||||
ready_delay_us + max_tx_time + EVENT_IFS_US + max_rx_time +
|
||||
(EVENT_CLOCK_JITTER_US << 1));
|
||||
/* Calculate event time reservation */
|
||||
slot_us = max_tx_time + max_rx_time;
|
||||
slot_us += EVENT_IFS_US + (EVENT_CLOCK_JITTER_US << 1);
|
||||
slot_us += ready_delay_us;
|
||||
slot_us += EVENT_OVERHEAD_START_US + EVENT_OVERHEAD_END_US;
|
||||
|
||||
conn->ull.ticks_slot = HAL_TICKER_US_TO_TICKS_CEIL(slot_us);
|
||||
|
||||
#if defined(CONFIG_BT_CTLR_PRIVACY)
|
||||
ull_filter_scan_update(filter_policy);
|
||||
|
|
|
@ -864,9 +864,15 @@ uint8_t ull_central_iso_setup(uint16_t cis_handle,
|
|||
} else if (CONFIG_BT_CTLR_CENTRAL_SPACING > 0) {
|
||||
uint32_t cis_offset;
|
||||
|
||||
cis_offset = MAX((HAL_TICKER_TICKS_TO_US(conn->ull.ticks_slot) +
|
||||
(EVENT_TICKER_RES_MARGIN_US << 1U) + cig->sync_delay -
|
||||
cis->sync_delay), *cis_offset_min);
|
||||
cis_offset = HAL_TICKER_TICKS_TO_US(conn->ull.ticks_slot) +
|
||||
(EVENT_TICKER_RES_MARGIN_US << 1U);
|
||||
|
||||
cis_offset += cig->sync_delay - cis->sync_delay;
|
||||
|
||||
if (cis_offset < *cis_offset_min) {
|
||||
cis_offset = *cis_offset_min;
|
||||
}
|
||||
|
||||
cis->offset = cis_offset;
|
||||
#endif /* CONFIG_BT_CTLR_CENTRAL_SPACING */
|
||||
|
||||
|
@ -942,8 +948,9 @@ int ull_central_iso_cis_offset_get(uint16_t cis_handle,
|
|||
#endif /* CONFIG_BT_CTLR_CENTRAL_SPACING != 0 */
|
||||
|
||||
*cis_offset_min = HAL_TICKER_TICKS_TO_US(conn->ull.ticks_slot) +
|
||||
(EVENT_TICKER_RES_MARGIN_US << 1U) +
|
||||
cig->sync_delay - cis->sync_delay;
|
||||
(EVENT_TICKER_RES_MARGIN_US << 1U);
|
||||
|
||||
*cis_offset_min += cig->sync_delay - cis->sync_delay;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -984,7 +991,6 @@ static void mfy_cig_offset_get(void *param)
|
|||
offset_min_us += cig->sync_delay - cis->sync_delay;
|
||||
|
||||
conn = ll_conn_get(cis->lll.acl_handle);
|
||||
|
||||
conn_interval_us = (uint32_t)conn->lll.interval * CONN_INT_UNIT_US;
|
||||
while (offset_min_us >= (conn_interval_us + PDU_CIS_OFFSET_MIN_US)) {
|
||||
offset_min_us -= conn_interval_us;
|
||||
|
|
|
@ -1233,7 +1233,7 @@ void ull_conn_done(struct node_rx_event_done *done)
|
|||
#if defined(CONFIG_BT_CTLR_SLOT_RESERVATION_UPDATE)
|
||||
#if defined(CONFIG_BT_CTLR_DATA_LENGTH) || defined(CONFIG_BT_CTLR_PHY)
|
||||
if (lll->evt_len_upd) {
|
||||
uint32_t ready_delay, rx_time, tx_time, ticks_slot;
|
||||
uint32_t ready_delay, rx_time, tx_time, ticks_slot, slot_us;
|
||||
|
||||
lll->evt_len_upd = 0;
|
||||
#if defined(CONFIG_BT_CTLR_PHY)
|
||||
|
@ -1257,10 +1257,18 @@ void ull_conn_done(struct node_rx_event_done *done)
|
|||
tx_time = PDU_DC_MAX_US(lll->dle.eff.max_tx_octets, 0);
|
||||
rx_time = PDU_DC_MAX_US(lll->dle.eff.max_rx_octets, 0);
|
||||
#endif /* CONFIG_BT_CTLR_PHY */
|
||||
ticks_slot = HAL_TICKER_US_TO_TICKS_CEIL(
|
||||
EVENT_OVERHEAD_START_US + EVENT_OVERHEAD_END_US +
|
||||
ready_delay + EVENT_IFS_US + rx_time + tx_time +
|
||||
(EVENT_CLOCK_JITTER_US << 1));
|
||||
|
||||
/* Calculate event time reservation */
|
||||
slot_us = tx_time + rx_time;
|
||||
slot_us += EVENT_IFS_US + (EVENT_CLOCK_JITTER_US << 1);
|
||||
slot_us += ready_delay;
|
||||
|
||||
if (IS_ENABLED(CONFIG_BT_CTLR_EVENT_OVERHEAD_RESERVE_MAX) ||
|
||||
!conn->lll.role) {
|
||||
slot_us += EVENT_OVERHEAD_START_US + EVENT_OVERHEAD_END_US;
|
||||
}
|
||||
|
||||
ticks_slot = HAL_TICKER_US_TO_TICKS_CEIL(slot_us);
|
||||
if (ticks_slot > conn->ull.ticks_slot) {
|
||||
ticks_slot_plus = ticks_slot - conn->ull.ticks_slot;
|
||||
} else {
|
||||
|
|
|
@ -972,7 +972,9 @@ void ull_conn_iso_start(struct ll_conn *conn, uint16_t cis_handle,
|
|||
/* Below is time reservation for sequential packing */
|
||||
slot_us = cis->lll.sub_interval * cis->lll.nse;
|
||||
|
||||
slot_us += EVENT_OVERHEAD_START_US + EVENT_OVERHEAD_END_US;
|
||||
if (IS_ENABLED(CONFIG_BT_CTLR_EVENT_OVERHEAD_RESERVE_MAX)) {
|
||||
slot_us += EVENT_OVERHEAD_START_US + EVENT_OVERHEAD_END_US;
|
||||
}
|
||||
|
||||
/* FIXME: How to use ready_delay_us in the time reservation?
|
||||
* i.e. when CISes use different PHYs? Is that even
|
||||
|
|
|
@ -89,6 +89,7 @@ void ull_periph_setup(struct node_rx_hdr *rx, struct node_rx_ftr *ftr,
|
|||
uint16_t max_rx_time;
|
||||
uint16_t win_offset;
|
||||
memq_link_t *link;
|
||||
uint32_t slot_us;
|
||||
uint8_t chan_sel;
|
||||
void *node;
|
||||
|
||||
|
@ -360,10 +361,19 @@ void ull_periph_setup(struct node_rx_hdr *rx, struct node_rx_ftr *ftr,
|
|||
#endif /* !CONFIG_BT_CTLR_DATA_LENGTH */
|
||||
|
||||
#if defined(CONFIG_BT_CTLR_PHY)
|
||||
ready_delay_us = lll_radio_rx_ready_delay_get(lll->phy_rx, 1);
|
||||
#else
|
||||
ready_delay_us = lll_radio_rx_ready_delay_get(0, 0);
|
||||
#endif
|
||||
ready_delay_us = lll_radio_rx_ready_delay_get(lll->phy_rx, PHY_FLAGS_S8);
|
||||
#else /* CONFIG_BT_CTLR_PHY */
|
||||
ready_delay_us = lll_radio_rx_ready_delay_get(0U, 0U);
|
||||
#endif /* CONFIG_BT_CTLR_PHY */
|
||||
|
||||
/* Calculate event time reservation */
|
||||
slot_us = max_rx_time + max_tx_time;
|
||||
slot_us += EVENT_IFS_US + (EVENT_CLOCK_JITTER_US << 1);
|
||||
slot_us += ready_delay_us;
|
||||
|
||||
if (IS_ENABLED(CONFIG_BT_CTLR_EVENT_OVERHEAD_RESERVE_MAX)) {
|
||||
slot_us += EVENT_OVERHEAD_START_US + EVENT_OVERHEAD_END_US;
|
||||
}
|
||||
|
||||
/* TODO: active_to_start feature port */
|
||||
conn->ull.ticks_active_to_start = 0U;
|
||||
|
@ -371,10 +381,7 @@ void ull_periph_setup(struct node_rx_hdr *rx, struct node_rx_ftr *ftr,
|
|||
HAL_TICKER_US_TO_TICKS(EVENT_OVERHEAD_XTAL_US);
|
||||
conn->ull.ticks_preempt_to_start =
|
||||
HAL_TICKER_US_TO_TICKS(EVENT_OVERHEAD_PREEMPT_MIN_US);
|
||||
conn->ull.ticks_slot = HAL_TICKER_US_TO_TICKS_CEIL(
|
||||
EVENT_OVERHEAD_START_US + EVENT_OVERHEAD_END_US +
|
||||
ready_delay_us + max_rx_time + EVENT_IFS_US + max_tx_time +
|
||||
(EVENT_CLOCK_JITTER_US << 1));
|
||||
conn->ull.ticks_slot = HAL_TICKER_US_TO_TICKS_CEIL(slot_us);
|
||||
|
||||
ticks_slot_offset = MAX(conn->ull.ticks_active_to_start,
|
||||
conn->ull.ticks_prepare_to_start);
|
||||
|
|
|
@ -110,6 +110,10 @@ uint8_t ll_cis_accept(uint16_t handle)
|
|||
} else {
|
||||
cis_offset_min = HAL_TICKER_TICKS_TO_US(conn->ull.ticks_slot) +
|
||||
(EVENT_TICKER_RES_MARGIN_US << 1U);
|
||||
|
||||
if (!IS_ENABLED(CONFIG_BT_CTLR_EVENT_OVERHEAD_RESERVE_MAX)) {
|
||||
cis_offset_min += EVENT_OVERHEAD_START_US + EVENT_OVERHEAD_END_US;
|
||||
}
|
||||
}
|
||||
|
||||
/* Accept request */
|
||||
|
|
76
tests/bluetooth/init/prj_ctlr_5_x_dbg.conf
Normal file
76
tests/bluetooth/init/prj_ctlr_5_x_dbg.conf
Normal file
|
@ -0,0 +1,76 @@
|
|||
CONFIG_BT=y
|
||||
CONFIG_BT_CTLR=y
|
||||
CONFIG_BT_LL_SW_SPLIT=y
|
||||
CONFIG_BT_CTLR_DUP_FILTER_LEN=16
|
||||
CONFIG_BT_CTLR_CONN_PARAM_REQ=y
|
||||
CONFIG_BT_CTLR_LE_PING=y
|
||||
CONFIG_BT_CTLR_PRIVACY=n
|
||||
CONFIG_BT_CTLR_EXT_SCAN_FP=n
|
||||
CONFIG_BT_DATA_LEN_UPDATE=n
|
||||
CONFIG_BT_PHY_UPDATE=y
|
||||
CONFIG_BT_CTLR_CHAN_SEL_2=y
|
||||
CONFIG_BT_CTLR_MIN_USED_CHAN=y
|
||||
CONFIG_BT_CTLR_ADV_EXT=y
|
||||
CONFIG_BT_CTLR_ADV_PERIODIC=y
|
||||
CONFIG_BT_CTLR_ADV_ISO=y
|
||||
CONFIG_BT_CTLR_SYNC_PERIODIC=y
|
||||
CONFIG_BT_CTLR_SYNC_ISO=y
|
||||
CONFIG_BT_CTLR_CENTRAL_ISO=y
|
||||
CONFIG_BT_CTLR_PERIPHERAL_ISO=y
|
||||
CONFIG_BT_CTLR_DTM_HCI=y
|
||||
CONFIG_BT_CTLR_ADVANCED_FEATURES=y
|
||||
CONFIG_BT_CTLR_PHY_2M=y
|
||||
CONFIG_BT_CTLR_PHY_2M_NRF=y
|
||||
CONFIG_BT_CTLR_PHY_CODED=y
|
||||
CONFIG_BT_CTLR_ADV_AUX_PDU_BACK2BACK=y
|
||||
CONFIG_BT_CTLR_LLL_PRIO=0
|
||||
CONFIG_BT_CTLR_ULL_HIGH_PRIO=1
|
||||
CONFIG_BT_CTLR_XTAL_ADVANCED=n
|
||||
CONFIG_BT_CTLR_SCHED_ADVANCED=y
|
||||
CONFIG_BT_CTLR_RADIO_ENABLE_FAST=y
|
||||
CONFIG_BT_CTLR_TIFS_HW=n
|
||||
CONFIG_BT_CTLR_FAST_ENC=y
|
||||
CONFIG_BT_CTLR_TX_RETRY_DISABLE=y
|
||||
CONFIG_BT_CTLR_CONN_RSSI=y
|
||||
CONFIG_BT_CTLR_ADV_INDICATION=y
|
||||
CONFIG_BT_CTLR_SCAN_REQ_NOTIFY=y
|
||||
CONFIG_BT_CTLR_SCAN_REQ_RSSI=y
|
||||
CONFIG_BT_CTLR_SCAN_INDICATION=y
|
||||
CONFIG_BT_CTLR_EVENT_OVERHEAD_RESERVE_MAX=n
|
||||
CONFIG_BT_CTLR_PROFILE_ISR=y
|
||||
CONFIG_BT_CTLR_DEBUG_PINS=y
|
||||
CONFIG_BT_CTLR_TEST=y
|
||||
CONFIG_BT_HCI_VS_EXT=y
|
||||
CONFIG_BT_HCI_MESH_EXT=n
|
||||
CONFIG_BT_PERIPHERAL=y
|
||||
CONFIG_BT_CENTRAL=y
|
||||
CONFIG_BT_EXT_ADV=y
|
||||
CONFIG_BT_PER_ADV=y
|
||||
CONFIG_BT_PER_ADV_SYNC=y
|
||||
CONFIG_BT_ISO_BROADCASTER=y
|
||||
CONFIG_BT_ISO_SYNC_RECEIVER=y
|
||||
CONFIG_BT_ISO_CENTRAL=y
|
||||
CONFIG_BT_ISO_PERIPHERAL=y
|
||||
CONFIG_BT_SMP=y
|
||||
CONFIG_BT_SIGNING=y
|
||||
CONFIG_BT_SMP_SC_ONLY=y
|
||||
CONFIG_BT_TINYCRYPT_ECC=y
|
||||
CONFIG_BT_USE_DEBUG_KEYS=y
|
||||
CONFIG_BT_L2CAP_DYNAMIC_CHANNEL=y
|
||||
CONFIG_BT_GATT_CLIENT=y
|
||||
CONFIG_BT_DEBUG_MONITOR_UART=y
|
||||
CONFIG_BT_HCI_CORE_LOG_LEVEL_DBG=y
|
||||
CONFIG_BT_CONN_LOG_LEVEL_DBG=y
|
||||
CONFIG_BT_KEYS_LOG_LEVEL_DBG=y
|
||||
CONFIG_BT_L2CAP_LOG_LEVEL_DBG=y
|
||||
CONFIG_BT_SMP_LOG_LEVEL_DBG=y
|
||||
CONFIG_BT_HCI_DRIVER_LOG_LEVEL_DBG=y
|
||||
CONFIG_BT_SMP_SELFTEST=y
|
||||
CONFIG_BT_ATT_LOG_LEVEL_DBG=y
|
||||
CONFIG_BT_GATT_LOG_LEVEL_DBG=y
|
||||
CONFIG_BT_BREDR=n
|
||||
CONFIG_DEBUG=y
|
||||
CONFIG_FLASH=y
|
||||
CONFIG_SOC_FLASH_NRF_RADIO_SYNC_TICKER=n
|
||||
CONFIG_ZTEST=y
|
||||
CONFIG_ZTEST_NEW_API=y
|
|
@ -122,6 +122,16 @@ tests:
|
|||
integration_platforms:
|
||||
- nrf52840dk_nrf52840
|
||||
- nrf52dk_nrf52832
|
||||
bluetooth.init.test_ctlr_5_x_dbg:
|
||||
extra_args:
|
||||
- CONF_FILE=prj_ctlr_5_x_dbg.conf
|
||||
- DTC_OVERLAY_FILE=pa_lna.overlay
|
||||
platform_allow:
|
||||
- nrf52840dk_nrf52840
|
||||
- nrf52dk_nrf52832
|
||||
integration_platforms:
|
||||
- nrf52840dk_nrf52840
|
||||
- nrf52dk_nrf52832
|
||||
bluetooth.init.test_ctlr_sw_switch_single_timer:
|
||||
extra_args:
|
||||
- CONF_FILE=prj_ctlr.conf
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue