Bluetooth: controller: Move common LLL from vendor file
Split lll_prepare and lll_resume from Nordic LLL to common file for reuse by all vendors. The split also supports new JIT Scheduling by defining a common place to calculate event prepare priority. The module may also house other common parts of the LLL currently re-implemented identically by vendors. Signed-off-by: Morten Priess <mtpr@oticon.com>
This commit is contained in:
parent
385f232ae2
commit
7dd5820920
5 changed files with 75 additions and 30 deletions
|
@ -21,6 +21,7 @@ zephyr_library_sources_ifdef(
|
||||||
if(CONFIG_BT_LL_SW_SPLIT)
|
if(CONFIG_BT_LL_SW_SPLIT)
|
||||||
zephyr_library_sources(
|
zephyr_library_sources(
|
||||||
ll_sw/ull.c
|
ll_sw/ull.c
|
||||||
|
ll_sw/lll_common.c
|
||||||
)
|
)
|
||||||
if(CONFIG_BT_BROADCASTER)
|
if(CONFIG_BT_BROADCASTER)
|
||||||
zephyr_library_sources(
|
zephyr_library_sources(
|
||||||
|
|
|
@ -419,3 +419,13 @@ void ull_rx_sched(void);
|
||||||
void ull_rx_sched_done(void);
|
void ull_rx_sched_done(void);
|
||||||
void *ull_event_done_extra_get(void);
|
void *ull_event_done_extra_get(void);
|
||||||
void *ull_event_done(void *param);
|
void *ull_event_done(void *param);
|
||||||
|
|
||||||
|
int lll_prepare(lll_is_abort_cb_t is_abort_cb,
|
||||||
|
lll_abort_cb_t abort_cb,
|
||||||
|
lll_prepare_cb_t prepare_cb, int8_t event_prio,
|
||||||
|
struct lll_prepare_param *prepare_param);
|
||||||
|
int lll_resume_enqueue(lll_prepare_cb_t resume_cb, int resume_prio);
|
||||||
|
int lll_prepare_resolve(lll_is_abort_cb_t is_abort_cb, lll_abort_cb_t abort_cb,
|
||||||
|
lll_prepare_cb_t prepare_cb, int prio,
|
||||||
|
struct lll_prepare_param *prepare_param,
|
||||||
|
uint8_t is_resume, uint8_t is_dequeue);
|
||||||
|
|
60
subsys/bluetooth/controller/ll_sw/lll_common.c
Normal file
60
subsys/bluetooth/controller/ll_sw/lll_common.c
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2021 Nordic Semiconductor ASA
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <zephyr/types.h>
|
||||||
|
#include <device.h>
|
||||||
|
|
||||||
|
#include "util/mem.h"
|
||||||
|
#include "util/memq.h"
|
||||||
|
|
||||||
|
#include "lll.h"
|
||||||
|
|
||||||
|
#define BT_DBG_ENABLED IS_ENABLED(CONFIG_BT_DEBUG_HCI_DRIVER)
|
||||||
|
#define LOG_MODULE_NAME bt_ctlr_lll_common
|
||||||
|
#include "common/log.h"
|
||||||
|
#include "hal/debug.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Common entry point for LLL event prepare invocations from ULL.
|
||||||
|
*
|
||||||
|
* This function will resolve the event priority and invoke the LLL
|
||||||
|
* lll_prepare_resolve, which decides if event should be programmed in
|
||||||
|
* the radio via the prepare callback function, or queued in the prepare
|
||||||
|
* pipeline.
|
||||||
|
*
|
||||||
|
* @param is_abort_cb Callback for checking if event is aborted
|
||||||
|
* @param abort_cb Callback for aborting event
|
||||||
|
* @param prepare_cb Callback for event prepare
|
||||||
|
* @param event_prio Priority of event [-128..127]
|
||||||
|
* @param prepare_param Prepare data
|
||||||
|
*
|
||||||
|
* @return 0: Prepare was successfully completed
|
||||||
|
* 1: TICKER_STATUS_FAILURE: Preemption ticker stop error
|
||||||
|
* 2: TICKER_STATUS_BUSY: Preemption ticker stop error
|
||||||
|
* -EINPROGRESS: Event already in progress and prepare was queued
|
||||||
|
*/
|
||||||
|
int lll_prepare(lll_is_abort_cb_t is_abort_cb, lll_abort_cb_t abort_cb,
|
||||||
|
lll_prepare_cb_t prepare_cb, int8_t event_prio,
|
||||||
|
struct lll_prepare_param *prepare_param)
|
||||||
|
{
|
||||||
|
/* TODO: Calculate priority */
|
||||||
|
|
||||||
|
return lll_prepare_resolve(is_abort_cb, abort_cb, prepare_cb,
|
||||||
|
prepare_param, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void lll_resume(void *param)
|
||||||
|
{
|
||||||
|
struct lll_event *next;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
next = param;
|
||||||
|
ret = lll_prepare_resolve(next->is_abort_cb, next->abort_cb,
|
||||||
|
next->prepare_cb, &next->prepare_param,
|
||||||
|
next->is_resume, 1);
|
||||||
|
LL_ASSERT(!ret || ret == -EINPROGRESS);
|
||||||
|
}
|
|
@ -65,10 +65,6 @@ static int init_reset(void);
|
||||||
#if defined(CONFIG_BT_CTLR_LOW_LAT_ULL_DONE)
|
#if defined(CONFIG_BT_CTLR_LOW_LAT_ULL_DONE)
|
||||||
static inline void done_inc(void);
|
static inline void done_inc(void);
|
||||||
#endif /* CONFIG_BT_CTLR_LOW_LAT_ULL_DONE */
|
#endif /* CONFIG_BT_CTLR_LOW_LAT_ULL_DONE */
|
||||||
static int prepare(lll_is_abort_cb_t is_abort_cb, lll_abort_cb_t abort_cb,
|
|
||||||
lll_prepare_cb_t prepare_cb, int prio,
|
|
||||||
struct lll_prepare_param *prepare_param,
|
|
||||||
uint8_t is_resume, uint8_t is_dequeue);
|
|
||||||
static int resume_enqueue(lll_prepare_cb_t resume_cb, int resume_prio);
|
static int resume_enqueue(lll_prepare_cb_t resume_cb, int resume_prio);
|
||||||
static void isr_race(void *param);
|
static void isr_race(void *param);
|
||||||
|
|
||||||
|
@ -246,25 +242,6 @@ int lll_reset(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int lll_prepare(lll_is_abort_cb_t is_abort_cb, lll_abort_cb_t abort_cb,
|
|
||||||
lll_prepare_cb_t prepare_cb, int prio,
|
|
||||||
struct lll_prepare_param *prepare_param)
|
|
||||||
{
|
|
||||||
return prepare(is_abort_cb, abort_cb, prepare_cb, prio, prepare_param,
|
|
||||||
0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void lll_resume(void *param)
|
|
||||||
{
|
|
||||||
struct lll_event *next;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
next = param;
|
|
||||||
ret = prepare(next->is_abort_cb, next->abort_cb, next->prepare_cb,
|
|
||||||
next->prio, &next->prepare_param, next->is_resume, 1);
|
|
||||||
LL_ASSERT(!ret || ret == -EINPROGRESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
void lll_disable(void *param)
|
void lll_disable(void *param)
|
||||||
{
|
{
|
||||||
/* LLL disable of current event, done is generated */
|
/* LLL disable of current event, done is generated */
|
||||||
|
@ -618,10 +595,10 @@ static inline bool is_done_sync(void)
|
||||||
#endif /* !CONFIG_BT_CTLR_LOW_LAT_ULL_DONE */
|
#endif /* !CONFIG_BT_CTLR_LOW_LAT_ULL_DONE */
|
||||||
}
|
}
|
||||||
|
|
||||||
static int prepare(lll_is_abort_cb_t is_abort_cb, lll_abort_cb_t abort_cb,
|
int lll_prepare_resolve(lll_is_abort_cb_t is_abort_cb, lll_abort_cb_t abort_cb,
|
||||||
lll_prepare_cb_t prepare_cb, int prio,
|
lll_prepare_cb_t prepare_cb, int prio,
|
||||||
struct lll_prepare_param *prepare_param,
|
struct lll_prepare_param *prepare_param,
|
||||||
uint8_t is_resume, uint8_t is_dequeue)
|
uint8_t is_resume, uint8_t is_dequeue)
|
||||||
{
|
{
|
||||||
struct lll_event *p;
|
struct lll_event *p;
|
||||||
uint8_t idx;
|
uint8_t idx;
|
||||||
|
|
|
@ -4,9 +4,6 @@
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int lll_prepare(lll_is_abort_cb_t is_abort_cb, lll_abort_cb_t abort_cb,
|
|
||||||
lll_prepare_cb_t prepare_cb, int prio,
|
|
||||||
struct lll_prepare_param *prepare_param);
|
|
||||||
int lll_prepare_done(void *param);
|
int lll_prepare_done(void *param);
|
||||||
int lll_done(void *param);
|
int lll_done(void *param);
|
||||||
bool lll_is_done(void *param);
|
bool lll_is_done(void *param);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue