Bluetooth: Controller: Review rework of jitter in aux offset
Review rework of the fix to remove the jitter in aux offset and sync offset values. Force select BT_TICKER_REMAINDER_GET and BT_TICKER_LAZY_GET features when Extended Advertising and Periodic Advertising is supported. Rename ticks and microsecond offset value struct members for primary PDU event offset (to auxiliary PDU event). Converted HAL_TICKER_REMOVE_JITTER and HAL_TICKER_ADD_JITTER macro to functions. Signed-off-by: Vinayak Kariappa Chettimada <vich@nordicsemi.no>
This commit is contained in:
parent
b6cf8bb580
commit
f6a3da9c21
|
@ -43,6 +43,9 @@ config BT_LLL_VENDOR_NORDIC
|
||||||
select BT_CTLR_TIFS_HW_SUPPORT
|
select BT_CTLR_TIFS_HW_SUPPORT
|
||||||
select BT_CTLR_ULL_LLL_PRIO_SUPPORT
|
select BT_CTLR_ULL_LLL_PRIO_SUPPORT
|
||||||
|
|
||||||
|
select BT_TICKER_REMAINDER_GET if BT_BROADCASTER && BT_CTLR_ADV_EXT
|
||||||
|
select BT_TICKER_LAZY_GET if BT_CTLR_ADV_PERIODIC
|
||||||
|
|
||||||
default y
|
default y
|
||||||
help
|
help
|
||||||
Use Nordic Lower Link Layer implementation.
|
Use Nordic Lower Link Layer implementation.
|
||||||
|
@ -709,7 +712,6 @@ config BT_TICKER_LOW_LAT
|
||||||
|
|
||||||
config BT_TICKER_REMAINDER_GET
|
config BT_TICKER_REMAINDER_GET
|
||||||
bool "Ticker Next Slot Get with Remainder"
|
bool "Ticker Next Slot Get with Remainder"
|
||||||
default y if BT_BROADCASTER && BT_CTLR_ADV_EXT
|
|
||||||
help
|
help
|
||||||
This option enables ticker interface to iterate through active
|
This option enables ticker interface to iterate through active
|
||||||
ticker nodes, returning tick to expire and remainder from a reference
|
ticker nodes, returning tick to expire and remainder from a reference
|
||||||
|
@ -717,7 +719,6 @@ config BT_TICKER_REMAINDER_GET
|
||||||
|
|
||||||
config BT_TICKER_LAZY_GET
|
config BT_TICKER_LAZY_GET
|
||||||
bool "Ticker Next Slot Get with Lazy"
|
bool "Ticker Next Slot Get with Lazy"
|
||||||
default y if BT_CTLR_ADV_PERIODIC
|
|
||||||
help
|
help
|
||||||
This option enables ticker interface to iterate through active
|
This option enables ticker interface to iterate through active
|
||||||
ticker nodes, returning tick to expire and lazy count from a reference
|
ticker nodes, returning tick to expire and lazy count from a reference
|
||||||
|
|
|
@ -130,8 +130,8 @@ struct lll_adv_aux {
|
||||||
/* Store used by primary channel PDU event to fill the
|
/* Store used by primary channel PDU event to fill the
|
||||||
* auxiliary offset to this auxiliary PDU event.
|
* auxiliary offset to this auxiliary PDU event.
|
||||||
*/
|
*/
|
||||||
uint32_t ticks_offset;
|
uint32_t ticks_pri_pdu_offset;
|
||||||
uint32_t us_offset;
|
uint32_t us_pri_pdu_offset;
|
||||||
|
|
||||||
struct lll_adv_pdu data;
|
struct lll_adv_pdu data;
|
||||||
#if defined(CONFIG_BT_CTLR_ADV_PDU_LINK)
|
#if defined(CONFIG_BT_CTLR_ADV_PDU_LINK)
|
||||||
|
|
|
@ -1050,7 +1050,7 @@ void radio_tmr_tifs_set(uint32_t tifs)
|
||||||
|
|
||||||
uint32_t radio_tmr_start(uint8_t trx, uint32_t ticks_start, uint32_t remainder)
|
uint32_t radio_tmr_start(uint8_t trx, uint32_t ticks_start, uint32_t remainder)
|
||||||
{
|
{
|
||||||
HAL_TICKER_REMOVE_JITTER(ticks_start, remainder);
|
hal_ticker_remove_jitter(&ticks_start, &remainder);
|
||||||
|
|
||||||
nrf_timer_task_trigger(EVENT_TIMER, NRF_TIMER_TASK_CLEAR);
|
nrf_timer_task_trigger(EVENT_TIMER, NRF_TIMER_TASK_CLEAR);
|
||||||
EVENT_TIMER->MODE = 0;
|
EVENT_TIMER->MODE = 0;
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define HAL_TICKER_CNTR_CLK_FREQ_HZ 32768U
|
#define HAL_TICKER_CNTR_CLK_FREQ_HZ 32768U
|
||||||
|
#define HAL_TICKER_CNTR_CLK_UNIT_FS 30517578125UL
|
||||||
|
|
||||||
/* Macro defining the minimum counter compare offset */
|
/* Macro defining the minimum counter compare offset */
|
||||||
#define HAL_TICKER_CNTR_CMP_OFFSET_MIN 3
|
#define HAL_TICKER_CNTR_CMP_OFFSET_MIN 3
|
||||||
|
@ -24,44 +25,28 @@
|
||||||
*/
|
*/
|
||||||
#define HAL_TICKER_US_TO_TICKS(x) \
|
#define HAL_TICKER_US_TO_TICKS(x) \
|
||||||
( \
|
( \
|
||||||
((uint32_t)(((uint64_t) (x) * 1000000000UL) / 30517578125UL)) \
|
((uint32_t)(((uint64_t) (x) * 1000000000UL) / \
|
||||||
& HAL_TICKER_CNTR_MASK \
|
HAL_TICKER_CNTR_CLK_UNIT_FS)) & HAL_TICKER_CNTR_MASK \
|
||||||
)
|
)
|
||||||
|
|
||||||
/* Macro returning remainder in picoseconds */
|
/* Macro to translate tick units to microseconds. */
|
||||||
|
#define HAL_TICKER_TICKS_TO_US(x) \
|
||||||
|
( \
|
||||||
|
((uint32_t)(((uint64_t)(x) * HAL_TICKER_CNTR_CLK_UNIT_FS) / \
|
||||||
|
1000000000UL)) \
|
||||||
|
)
|
||||||
|
|
||||||
|
/* Macro returning remainder in picoseconds (to fit in 32-bits) */
|
||||||
#define HAL_TICKER_REMAINDER(x) \
|
#define HAL_TICKER_REMAINDER(x) \
|
||||||
( \
|
( \
|
||||||
( \
|
( \
|
||||||
((uint64_t) (x) * 1000000000UL) \
|
((uint64_t) (x) * 1000000000UL) \
|
||||||
- ((uint64_t)HAL_TICKER_US_TO_TICKS(x) * 30517578125UL) \
|
- ((uint64_t)HAL_TICKER_US_TO_TICKS(x) * \
|
||||||
|
HAL_TICKER_CNTR_CLK_UNIT_FS) \
|
||||||
) \
|
) \
|
||||||
/ 1000UL \
|
/ 1000UL \
|
||||||
)
|
)
|
||||||
|
|
||||||
/* Macro to remove ticks and return positive remainder value in microseconds */
|
|
||||||
#define HAL_TICKER_REMOVE_JITTER(t, r) \
|
|
||||||
{ \
|
|
||||||
if ((!(r / 1000000UL)) || (r & BIT(31))) { \
|
|
||||||
t--; \
|
|
||||||
r += 30517578UL; \
|
|
||||||
} \
|
|
||||||
r /= 1000000UL; \
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Macro to add ticks and return positive remainder value in microseconds */
|
|
||||||
#define HAL_TICKER_ADD_JITTER(t, r) \
|
|
||||||
{ \
|
|
||||||
if ((!(r / 1000000UL)) || (r & BIT(31))) { \
|
|
||||||
t++; \
|
|
||||||
r += 30517578UL; \
|
|
||||||
} \
|
|
||||||
r /= 1000000UL; \
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Macro to translate tick units to microseconds. */
|
|
||||||
#define HAL_TICKER_TICKS_TO_US(x) \
|
|
||||||
((uint32_t)(((uint64_t)(x) * 30517578125UL) / 1000000000UL))
|
|
||||||
|
|
||||||
/* Macro defining the remainder resolution/range
|
/* Macro defining the remainder resolution/range
|
||||||
* ~ 1000000 * HAL_TICKER_TICKS_TO_US(1)
|
* ~ 1000000 * HAL_TICKER_TICKS_TO_US(1)
|
||||||
*/
|
*/
|
||||||
|
@ -71,3 +56,30 @@
|
||||||
/* Macro defining the margin for positioning re-scheduled nodes */
|
/* Macro defining the margin for positioning re-scheduled nodes */
|
||||||
#define HAL_TICKER_RESCHEDULE_MARGIN \
|
#define HAL_TICKER_RESCHEDULE_MARGIN \
|
||||||
HAL_TICKER_US_TO_TICKS(150)
|
HAL_TICKER_US_TO_TICKS(150)
|
||||||
|
|
||||||
|
/* Remove ticks and return positive remainder value in microseconds */
|
||||||
|
static inline void hal_ticker_remove_jitter(uint32_t *ticks,
|
||||||
|
uint32_t *remainder)
|
||||||
|
{
|
||||||
|
/* Is remainder less than 1 us */
|
||||||
|
if ((*remainder & BIT(31)) || !(*remainder / 1000000UL)) {
|
||||||
|
*ticks -= 1U;
|
||||||
|
*remainder += HAL_TICKER_CNTR_CLK_UNIT_FS / 1000UL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* pico seconds to micro seconds unit */
|
||||||
|
*remainder /= 1000000UL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add ticks and return positive remainder value in microseconds */
|
||||||
|
static inline void hal_ticker_add_jitter(uint32_t *ticks, uint32_t *remainder)
|
||||||
|
{
|
||||||
|
/* Is remainder less than 1 us */
|
||||||
|
if ((*remainder & BIT(31)) || !(*remainder / 1000000UL)) {
|
||||||
|
*ticks += 1U;
|
||||||
|
*remainder += HAL_TICKER_CNTR_CLK_UNIT_FS / 1000UL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* pico seconds to micro seconds unit */
|
||||||
|
*remainder /= 1000000UL;
|
||||||
|
}
|
||||||
|
|
|
@ -1316,8 +1316,8 @@ static void isr_done(void *param)
|
||||||
lll_aux = lll->aux;
|
lll_aux = lll->aux;
|
||||||
if (lll_aux) {
|
if (lll_aux) {
|
||||||
(void)ull_adv_aux_lll_offset_fill(pdu,
|
(void)ull_adv_aux_lll_offset_fill(pdu,
|
||||||
lll_aux->ticks_offset,
|
lll_aux->ticks_pri_pdu_offset,
|
||||||
lll_aux->us_offset,
|
lll_aux->us_pri_pdu_offset,
|
||||||
start_us);
|
start_us);
|
||||||
}
|
}
|
||||||
#else /* !CONFIG_BT_CTLR_ADV_EXT */
|
#else /* !CONFIG_BT_CTLR_ADV_EXT */
|
||||||
|
|
|
@ -1503,24 +1503,24 @@ static void mfy_aux_offset_get(void *param)
|
||||||
} while (id != ticker_id);
|
} while (id != ticker_id);
|
||||||
|
|
||||||
/* Adjust ticks to expire based on remainder value */
|
/* Adjust ticks to expire based on remainder value */
|
||||||
HAL_TICKER_REMOVE_JITTER(ticks_to_expire, remainder);
|
hal_ticker_remove_jitter(&ticks_to_expire, &remainder);
|
||||||
|
|
||||||
/* Store the ticks offset for population in other advertising primary
|
/* Store the ticks offset for population in other advertising primary
|
||||||
* channel PDUs.
|
* channel PDUs.
|
||||||
*/
|
*/
|
||||||
lll_aux->ticks_offset = ticks_to_expire;
|
lll_aux->ticks_pri_pdu_offset = ticks_to_expire;
|
||||||
|
|
||||||
/* NOTE: as first primary channel PDU does not use remainder, the packet
|
/* NOTE: as first primary channel PDU does not use remainder, the packet
|
||||||
* timer is started one tick in advance to start the radio with
|
* timer is started one tick in advance to start the radio with
|
||||||
* microsecond precision, hence compensate for the higher start_us value
|
* microsecond precision, hence compensate for the higher start_us value
|
||||||
* captured at radio start of the first primary channel PDU.
|
* captured at radio start of the first primary channel PDU.
|
||||||
*/
|
*/
|
||||||
lll_aux->ticks_offset += 1U;
|
lll_aux->ticks_pri_pdu_offset += 1U;
|
||||||
|
|
||||||
/* Store the microsecond remainder offset for population in other
|
/* Store the microsecond remainder offset for population in other
|
||||||
* advertising primary channel PDUs.
|
* advertising primary channel PDUs.
|
||||||
*/
|
*/
|
||||||
lll_aux->us_offset = remainder;
|
lll_aux->us_pri_pdu_offset = remainder;
|
||||||
|
|
||||||
/* Fill the aux offset in the first Primary channel PDU */
|
/* Fill the aux offset in the first Primary channel PDU */
|
||||||
/* FIXME: we are in ULL_LOW context, fill offset in LLL context? */
|
/* FIXME: we are in ULL_LOW context, fill offset in LLL context? */
|
||||||
|
|
|
@ -1831,11 +1831,17 @@ static void mfy_sync_offset_get(void *param)
|
||||||
LL_ASSERT(id != TICKER_NULL);
|
LL_ASSERT(id != TICKER_NULL);
|
||||||
} while (id != ticker_id);
|
} while (id != ticker_id);
|
||||||
|
|
||||||
HAL_TICKER_REMOVE_JITTER(ticks_to_expire, remainder);
|
/* Reduced a tick for negative remainder and return positive remainder
|
||||||
|
* value.
|
||||||
|
*/
|
||||||
|
hal_ticker_remove_jitter(&ticks_to_expire, &remainder);
|
||||||
sync_remainder_us = remainder;
|
sync_remainder_us = remainder;
|
||||||
|
|
||||||
|
/* Add a tick for negative remainder and return positive remainder
|
||||||
|
* value.
|
||||||
|
*/
|
||||||
remainder = sync->aux_remainder;
|
remainder = sync->aux_remainder;
|
||||||
HAL_TICKER_ADD_JITTER(ticks_to_expire, remainder);
|
hal_ticker_add_jitter(&ticks_to_expire, &remainder);
|
||||||
aux_remainder_us = remainder;
|
aux_remainder_us = remainder;
|
||||||
|
|
||||||
pdu = lll_adv_aux_data_latest_peek(adv->lll.aux);
|
pdu = lll_adv_aux_data_latest_peek(adv->lll.aux);
|
||||||
|
|
Loading…
Reference in a new issue