Bluetooth: controller: Fill event counter in sync info
Fill the referenced event counter of the Periodic Advertising SYNC_IND PDU into the sync info struct in the Common Extended Advertising Header Format. Signed-off-by: Vinayak Kariappa Chettimada <vich@nordicsemi.no>
This commit is contained in:
parent
8896da1d60
commit
dc48999ee1
4 changed files with 55 additions and 36 deletions
|
@ -85,37 +85,6 @@ void lll_adv_sync_prepare(void *param)
|
||||||
LL_ASSERT(!err || err == -EINPROGRESS);
|
LL_ASSERT(!err || err == -EINPROGRESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
void lll_adv_sync_offset_fill(uint32_t ticks_offset, uint32_t start_us,
|
|
||||||
struct pdu_adv *pdu)
|
|
||||||
{
|
|
||||||
struct pdu_adv_com_ext_adv *p;
|
|
||||||
struct pdu_adv_sync_info *si;
|
|
||||||
struct pdu_adv_hdr *h;
|
|
||||||
uint8_t *ptr;
|
|
||||||
|
|
||||||
p = (void *)&pdu->adv_ext_ind;
|
|
||||||
h = (void *)p->ext_hdr_adi_adv_data;
|
|
||||||
ptr = (uint8_t *)h + sizeof(*h);
|
|
||||||
|
|
||||||
if (h->adv_addr) {
|
|
||||||
ptr += BDADDR_SIZE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (h->adi) {
|
|
||||||
ptr += sizeof(struct pdu_adv_adi);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (h->aux_ptr) {
|
|
||||||
ptr += sizeof(struct pdu_adv_aux_ptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
si = (void *)ptr;
|
|
||||||
si->offs = (HAL_TICKER_TICKS_TO_US(ticks_offset) - start_us) / 30;
|
|
||||||
if (si->offs_units) {
|
|
||||||
si->offs /= 10;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int init_reset(void)
|
static int init_reset(void)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -7,7 +7,5 @@
|
||||||
int lll_adv_sync_init(void);
|
int lll_adv_sync_init(void);
|
||||||
int lll_adv_sync_reset(void);
|
int lll_adv_sync_reset(void);
|
||||||
void lll_adv_sync_prepare(void *param);
|
void lll_adv_sync_prepare(void *param);
|
||||||
void lll_adv_sync_offset_fill(uint32_t ticks_offset, uint32_t start_us,
|
|
||||||
struct pdu_adv *pdu);
|
|
||||||
|
|
||||||
extern uint16_t ull_adv_sync_lll_handle_get(struct lll_adv_sync *lll);
|
extern uint16_t ull_adv_sync_lll_handle_get(struct lll_adv_sync *lll);
|
||||||
|
|
|
@ -77,6 +77,10 @@
|
||||||
/* Standard allows 2 us timing uncertainty inside the event */
|
/* Standard allows 2 us timing uncertainty inside the event */
|
||||||
#define EVENT_MAFS_MAX_US (EVENT_MAFS_US + 2)
|
#define EVENT_MAFS_MAX_US (EVENT_MAFS_US + 2)
|
||||||
|
|
||||||
|
/* SyncInfo field Sync Packet Offset Units field encoding */
|
||||||
|
#define SYNC_PKT_OFFS_UNIT_30_US 30
|
||||||
|
#define SYNC_PKT_OFFS_UNIT_300_US 300
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Macros to return correct Data Channel PDU time
|
* Macros to return correct Data Channel PDU time
|
||||||
* Note: formula is valid for 1M, 2M and Coded S8
|
* Note: formula is valid for 1M, 2M and Coded S8
|
||||||
|
|
|
@ -43,6 +43,10 @@ static inline void sync_release(struct ll_adv_sync_set *sync);
|
||||||
static inline uint16_t sync_handle_get(struct ll_adv_sync_set *sync);
|
static inline uint16_t sync_handle_get(struct ll_adv_sync_set *sync);
|
||||||
static inline uint8_t sync_stop(struct ll_adv_sync_set *sync);
|
static inline uint8_t sync_stop(struct ll_adv_sync_set *sync);
|
||||||
static void mfy_sync_offset_get(void *param);
|
static void mfy_sync_offset_get(void *param);
|
||||||
|
static inline struct pdu_adv_sync_info *sync_info_get(struct pdu_adv *pdu);
|
||||||
|
static inline void sync_info_offset_fill(struct pdu_adv_sync_info *si,
|
||||||
|
uint32_t ticks_offset,
|
||||||
|
uint32_t start_us);
|
||||||
static void ticker_cb(uint32_t ticks_at_expire, uint32_t remainder,
|
static void ticker_cb(uint32_t ticks_at_expire, uint32_t remainder,
|
||||||
uint16_t lazy, void *param);
|
uint16_t lazy, void *param);
|
||||||
static void ticker_op_cb(uint32_t status, void *param);
|
static void ticker_op_cb(uint32_t status, void *param);
|
||||||
|
@ -730,7 +734,9 @@ static inline uint8_t sync_stop(struct ll_adv_sync_set *sync)
|
||||||
static void mfy_sync_offset_get(void *param)
|
static void mfy_sync_offset_get(void *param)
|
||||||
{
|
{
|
||||||
struct ll_adv_set *adv = param;
|
struct ll_adv_set *adv = param;
|
||||||
|
struct lll_adv_sync *lll_sync;
|
||||||
struct ll_adv_sync_set *sync;
|
struct ll_adv_sync_set *sync;
|
||||||
|
struct pdu_adv_sync_info *si;
|
||||||
uint32_t ticks_to_expire;
|
uint32_t ticks_to_expire;
|
||||||
uint32_t ticks_current;
|
uint32_t ticks_current;
|
||||||
struct pdu_adv *pdu;
|
struct pdu_adv *pdu;
|
||||||
|
@ -738,7 +744,8 @@ static void mfy_sync_offset_get(void *param)
|
||||||
uint8_t retry;
|
uint8_t retry;
|
||||||
uint8_t id;
|
uint8_t id;
|
||||||
|
|
||||||
sync = (void *)HDR_LLL2EVT(adv->lll.sync);
|
lll_sync = adv->lll.sync;
|
||||||
|
sync = (void *)HDR_LLL2EVT(lll_sync);
|
||||||
ticker_id = TICKER_ID_ADV_SYNC_BASE + sync_handle_get(sync);
|
ticker_id = TICKER_ID_ADV_SYNC_BASE + sync_handle_get(sync);
|
||||||
|
|
||||||
id = TICKER_NULL;
|
id = TICKER_NULL;
|
||||||
|
@ -775,10 +782,51 @@ static void mfy_sync_offset_get(void *param)
|
||||||
/* NOTE: as remainder not used in scheduling primary PDU
|
/* NOTE: as remainder not used in scheduling primary PDU
|
||||||
* packet timer starts transmission after 1 tick hence the +1.
|
* packet timer starts transmission after 1 tick hence the +1.
|
||||||
*/
|
*/
|
||||||
sync->lll.ticks_offset = ticks_to_expire + 1;
|
lll_sync->ticks_offset = ticks_to_expire + 1;
|
||||||
|
|
||||||
pdu = lll_adv_aux_data_curr_get(adv->lll.aux);
|
pdu = lll_adv_aux_data_curr_get(adv->lll.aux);
|
||||||
lll_adv_sync_offset_fill(ticks_to_expire, 0, pdu);
|
si = sync_info_get(pdu);
|
||||||
|
sync_info_offset_fill(si, ticks_to_expire, 0);
|
||||||
|
si->evt_cntr = lll_sync->event_counter + lll_sync->latency_prepare;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline struct pdu_adv_sync_info *sync_info_get(struct pdu_adv *pdu)
|
||||||
|
{
|
||||||
|
struct pdu_adv_com_ext_adv *p;
|
||||||
|
struct pdu_adv_hdr *h;
|
||||||
|
uint8_t *ptr;
|
||||||
|
|
||||||
|
p = (void *)&pdu->adv_ext_ind;
|
||||||
|
h = (void *)p->ext_hdr_adi_adv_data;
|
||||||
|
ptr = (uint8_t *)h + sizeof(*h);
|
||||||
|
|
||||||
|
if (h->adv_addr) {
|
||||||
|
ptr += BDADDR_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (h->adi) {
|
||||||
|
ptr += sizeof(struct pdu_adv_adi);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (h->aux_ptr) {
|
||||||
|
ptr += sizeof(struct pdu_adv_aux_ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (void *)ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void sync_info_offset_fill(struct pdu_adv_sync_info *si,
|
||||||
|
uint32_t ticks_offset,
|
||||||
|
uint32_t start_us)
|
||||||
|
{
|
||||||
|
uint32_t offs;
|
||||||
|
|
||||||
|
offs = HAL_TICKER_TICKS_TO_US(ticks_offset) - start_us;
|
||||||
|
if (si->offs_units) {
|
||||||
|
si->offs = offs / SYNC_PKT_OFFS_UNIT_300_US;
|
||||||
|
} else {
|
||||||
|
si->offs = offs / SYNC_PKT_OFFS_UNIT_30_US;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ticker_cb(uint32_t ticks_at_expire, uint32_t remainder,
|
static void ticker_cb(uint32_t ticks_at_expire, uint32_t remainder,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue