Bluetooth: controller: Refactor out drift compensation code

Refactor out drift compensation implementation so as to
reuse it for Periodic Sync feature.

Signed-off-by: Vinayak Kariappa Chettimada <vich@nordicsemi.no>
This commit is contained in:
Vinayak Kariappa Chettimada 2020-08-11 10:38:23 +05:30 committed by Carles Cufí
commit 732de50f67
7 changed files with 59 additions and 56 deletions

View file

@ -307,7 +307,7 @@ enum {
}; };
struct event_done_extra_slave { struct event_done_extra_drift {
uint32_t start_to_address_actual_us; uint32_t start_to_address_actual_us;
uint32_t window_widening_event_us; uint32_t window_widening_event_us;
uint32_t preamble_to_addr_us; uint32_t preamble_to_addr_us;
@ -322,9 +322,11 @@ struct event_done_extra {
#if defined(CONFIG_BT_CTLR_LE_ENC) #if defined(CONFIG_BT_CTLR_LE_ENC)
uint8_t mic_state; uint8_t mic_state;
#endif /* CONFIG_BT_CTLR_LE_ENC */ #endif /* CONFIG_BT_CTLR_LE_ENC */
#if defined(CONFIG_BT_PERIPHERAL) || defined(CONFIG_BT_CTLR_SCAN_PERIODIC)
union { union {
struct event_done_extra_slave slave; struct event_done_extra_drift drift;
}; };
#endif /* CONFIG_BT_PERIPHERAL || CONFIG_BT_CTLR_SCAN_PERIODIC */
}; };
}; };
}; };

View file

@ -632,11 +632,11 @@ static void isr_done(void *param)
addr_us_get(0); addr_us_get(0);
#endif /* !CONFIG_BT_CTLR_PHY */ #endif /* !CONFIG_BT_CTLR_PHY */
e->slave.start_to_address_actual_us = e->drift.start_to_address_actual_us =
radio_tmr_aa_restore() - radio_tmr_ready_get(); radio_tmr_aa_restore() - radio_tmr_ready_get();
e->slave.window_widening_event_us = e->drift.window_widening_event_us =
lll->slave.window_widening_event_us; lll->slave.window_widening_event_us;
e->slave.preamble_to_addr_us = preamble_to_addr_us; e->drift.preamble_to_addr_us = preamble_to_addr_us;
/* Reset window widening, as anchor point sync-ed */ /* Reset window widening, as anchor point sync-ed */
lll->slave.window_widening_event_us = 0; lll->slave.window_widening_event_us = 0;

View file

@ -1319,6 +1319,50 @@ void *ull_event_done(void *param)
return evdone; return evdone;
} }
/**
* @brief Extract timing from completed event
*
* @param node_rx_event_done[in] Done event containing fresh timing information
* @param ticks_drift_plus[out] Positive part of drift uncertainty window
* @param ticks_drift_minus[out] Negative part of drift uncertainty window
*/
void ull_drift_ticks_get(struct node_rx_event_done *done,
uint32_t *ticks_drift_plus,
uint32_t *ticks_drift_minus)
{
uint32_t start_to_address_expected_us;
uint32_t start_to_address_actual_us;
uint32_t window_widening_event_us;
uint32_t preamble_to_addr_us;
start_to_address_actual_us =
done->extra.drift.start_to_address_actual_us;
window_widening_event_us =
done->extra.drift.window_widening_event_us;
preamble_to_addr_us =
done->extra.drift.preamble_to_addr_us;
start_to_address_expected_us = EVENT_JITTER_US +
EVENT_TICKER_RES_MARGIN_US +
window_widening_event_us +
preamble_to_addr_us;
if (start_to_address_actual_us <= start_to_address_expected_us) {
*ticks_drift_plus =
HAL_TICKER_US_TO_TICKS(window_widening_event_us);
*ticks_drift_minus =
HAL_TICKER_US_TO_TICKS((start_to_address_expected_us -
start_to_address_actual_us));
} else {
*ticks_drift_plus =
HAL_TICKER_US_TO_TICKS(start_to_address_actual_us);
*ticks_drift_minus =
HAL_TICKER_US_TO_TICKS(EVENT_JITTER_US +
EVENT_TICKER_RES_MARGIN_US +
preamble_to_addr_us);
}
}
static inline int init_reset(void) static inline int init_reset(void)
{ {
memq_link_t *link; memq_link_t *link;

View file

@ -1096,8 +1096,8 @@ void ull_conn_done(struct node_rx_event_done *done)
if (0) { if (0) {
#if defined(CONFIG_BT_PERIPHERAL) #if defined(CONFIG_BT_PERIPHERAL)
} else if (lll->role) { } else if (lll->role) {
ull_slave_done(done, &ticks_drift_plus, ull_drift_ticks_get(done, &ticks_drift_plus,
&ticks_drift_minus); &ticks_drift_minus);
if (!conn->tx_head) { if (!conn->tx_head) {
ull_conn_tx_demux(UINT8_MAX); ull_conn_tx_demux(UINT8_MAX);
@ -1281,8 +1281,7 @@ void ull_conn_done(struct node_rx_event_done *done)
} }
/* update conn ticker */ /* update conn ticker */
if ((ticks_drift_plus != 0U) || (ticks_drift_minus != 0U) || if (ticks_drift_plus || ticks_drift_minus || lazy || force) {
(lazy != 0U) || (force != 0U)) {
uint8_t ticker_id = TICKER_ID_CONN_BASE + lll->handle; uint8_t ticker_id = TICKER_ID_CONN_BASE + lll->handle;
struct ll_conn *conn = lll->hdr.parent; struct ll_conn *conn = lll->hdr.parent;
uint32_t ticker_status; uint32_t ticker_status;

View file

@ -41,3 +41,6 @@ void *ull_update_mark(void *param);
void *ull_update_unmark(void *param); void *ull_update_unmark(void *param);
void *ull_update_mark_get(void); void *ull_update_mark_get(void);
int ull_disable(void *param); int ull_disable(void *param);
void ull_drift_ticks_get(struct node_rx_event_done *done,
uint32_t *ticks_drift_plus,
uint32_t *ticks_drift_minus);

View file

@ -329,49 +329,6 @@ void ull_slave_setup(memq_link_t *link, struct node_rx_hdr *rx,
#endif #endif
} }
/**
* @brief Extract timing from completed event
*
* @param node_rx_event_done[in] Done event containing fresh timing information
* @param ticks_drift_plus[out] Positive part of drift uncertainty window
* @param ticks_drift_minus[out] Negative part of drift uncertainty window
*/
void ull_slave_done(struct node_rx_event_done *done, uint32_t *ticks_drift_plus,
uint32_t *ticks_drift_minus)
{
uint32_t start_to_address_expected_us;
uint32_t start_to_address_actual_us;
uint32_t window_widening_event_us;
uint32_t preamble_to_addr_us;
start_to_address_actual_us =
done->extra.slave.start_to_address_actual_us;
window_widening_event_us =
done->extra.slave.window_widening_event_us;
preamble_to_addr_us =
done->extra.slave.preamble_to_addr_us;
start_to_address_expected_us = EVENT_JITTER_US +
EVENT_TICKER_RES_MARGIN_US +
window_widening_event_us +
preamble_to_addr_us;
if (start_to_address_actual_us <= start_to_address_expected_us) {
*ticks_drift_plus =
HAL_TICKER_US_TO_TICKS(window_widening_event_us);
*ticks_drift_minus =
HAL_TICKER_US_TO_TICKS((start_to_address_expected_us -
start_to_address_actual_us));
} else {
*ticks_drift_plus =
HAL_TICKER_US_TO_TICKS(start_to_address_actual_us);
*ticks_drift_minus =
HAL_TICKER_US_TO_TICKS(EVENT_JITTER_US +
EVENT_TICKER_RES_MARGIN_US +
preamble_to_addr_us);
}
}
void ull_slave_latency_cancel(struct ll_conn *conn, uint16_t handle) void ull_slave_latency_cancel(struct ll_conn *conn, uint16_t handle)
{ {
/* break peripheral latency */ /* break peripheral latency */

View file

@ -6,8 +6,6 @@
void ull_slave_setup(memq_link_t *link, struct node_rx_hdr *rx, void ull_slave_setup(memq_link_t *link, struct node_rx_hdr *rx,
struct node_rx_ftr *ftr, struct lll_conn *lll); struct node_rx_ftr *ftr, struct lll_conn *lll);
void ull_slave_done(struct node_rx_event_done *done, uint32_t *ticks_drift_plus,
uint32_t *ticks_drift_minus);
void ull_slave_latency_cancel(struct ll_conn *conn, uint16_t handle); void ull_slave_latency_cancel(struct ll_conn *conn, uint16_t handle);
void ull_slave_ticker_cb(uint32_t ticks_at_expire, uint32_t remainder, uint16_t lazy, void ull_slave_ticker_cb(uint32_t ticks_at_expire, uint32_t remainder,
void *param); uint16_t lazy, void *param);