Refactor ticker execution context dependency out into HAL folder. This decouples ticker from mayfly, enabling porting towards a more tasklet (if and when kernel gets the support) style execution contexts type implementation support. Signed-off-by: Vinayak Kariappa Chettimada <vich@nordicsemi.no>
175 lines
3.2 KiB
C
175 lines
3.2 KiB
C
/*
|
|
* Copyright (c) 2016-2018 Nordic Semiconductor ASA
|
|
* Copyright (c) 2016 Vinayak Kariappa Chettimada
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#include <stdbool.h>
|
|
|
|
#include <zephyr/types.h>
|
|
|
|
#include "hal/cntr.h"
|
|
|
|
#include "util/memq.h"
|
|
#include "util/mayfly.h"
|
|
|
|
#include "ticker/ticker.h"
|
|
|
|
#include "common/log.h"
|
|
#include "hal/debug.h"
|
|
|
|
#if defined(CONFIG_BT_LL_SW)
|
|
#define TICKER_MAYFLY_CALL_ID_TRIGGER MAYFLY_CALL_ID_0
|
|
#define TICKER_MAYFLY_CALL_ID_WORKER MAYFLY_CALL_ID_0
|
|
#define TICKER_MAYFLY_CALL_ID_JOB MAYFLY_CALL_ID_1
|
|
#define TICKER_MAYFLY_CALL_ID_PROGRAM MAYFLY_CALL_ID_PROGRAM
|
|
static u8_t const caller_id_lut[] = {
|
|
TICKER_CALL_ID_WORKER,
|
|
TICKER_CALL_ID_JOB,
|
|
TICKER_CALL_ID_NONE,
|
|
TICKER_CALL_ID_PROGRAM
|
|
};
|
|
#else
|
|
#error Unknown LL variant.
|
|
#endif
|
|
|
|
u8_t hal_ticker_instance0_caller_id_get(u8_t user_id)
|
|
{
|
|
u8_t caller_id;
|
|
|
|
LL_ASSERT(user_id < sizeof(caller_id_lut));
|
|
|
|
caller_id = caller_id_lut[user_id];
|
|
LL_ASSERT(caller_id != TICKER_CALL_ID_NONE);
|
|
|
|
return caller_id;
|
|
}
|
|
|
|
void hal_ticker_instance0_sched(u8_t caller_id, u8_t callee_id, u8_t chain,
|
|
void *instance)
|
|
{
|
|
/* return value not checked as we allow multiple calls to schedule
|
|
* before being actually needing the work to complete before new
|
|
* schedule.
|
|
*/
|
|
switch (caller_id) {
|
|
case TICKER_CALL_ID_TRIGGER:
|
|
switch (callee_id) {
|
|
case TICKER_CALL_ID_WORKER:
|
|
{
|
|
static memq_link_t link;
|
|
static struct mayfly m = {0, 0, &link, NULL,
|
|
ticker_worker};
|
|
|
|
m.param = instance;
|
|
|
|
mayfly_enqueue(TICKER_MAYFLY_CALL_ID_TRIGGER,
|
|
TICKER_MAYFLY_CALL_ID_WORKER,
|
|
chain,
|
|
&m);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
LL_ASSERT(0);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case TICKER_CALL_ID_WORKER:
|
|
switch (callee_id) {
|
|
case TICKER_CALL_ID_JOB:
|
|
{
|
|
static memq_link_t link;
|
|
static struct mayfly m = {0, 0, &link, NULL,
|
|
ticker_job};
|
|
|
|
m.param = instance;
|
|
|
|
mayfly_enqueue(TICKER_MAYFLY_CALL_ID_WORKER,
|
|
TICKER_MAYFLY_CALL_ID_JOB,
|
|
chain,
|
|
&m);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
LL_ASSERT(0);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case TICKER_CALL_ID_JOB:
|
|
switch (callee_id) {
|
|
case TICKER_CALL_ID_WORKER:
|
|
{
|
|
static memq_link_t link;
|
|
static struct mayfly m = {0, 0, &link, NULL,
|
|
ticker_worker};
|
|
|
|
m.param = instance;
|
|
|
|
mayfly_enqueue(TICKER_MAYFLY_CALL_ID_JOB,
|
|
TICKER_MAYFLY_CALL_ID_WORKER,
|
|
chain,
|
|
&m);
|
|
}
|
|
break;
|
|
|
|
case TICKER_CALL_ID_JOB:
|
|
{
|
|
static memq_link_t link;
|
|
static struct mayfly m = {0, 0, &link, NULL,
|
|
ticker_job};
|
|
|
|
m.param = instance;
|
|
|
|
mayfly_enqueue(TICKER_MAYFLY_CALL_ID_JOB,
|
|
TICKER_MAYFLY_CALL_ID_JOB,
|
|
chain,
|
|
&m);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
LL_ASSERT(0);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case TICKER_CALL_ID_PROGRAM:
|
|
switch (callee_id) {
|
|
case TICKER_CALL_ID_JOB:
|
|
{
|
|
static memq_link_t link;
|
|
static struct mayfly m = {0, 0, &link, NULL,
|
|
ticker_job};
|
|
|
|
m.param = instance;
|
|
|
|
/* TODO: scheduler lock, if preemptive threads used */
|
|
mayfly_enqueue(TICKER_MAYFLY_CALL_ID_PROGRAM,
|
|
TICKER_MAYFLY_CALL_ID_JOB,
|
|
chain,
|
|
&m);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
LL_ASSERT(0);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
LL_ASSERT(0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void hal_ticker_instance0_trigger_set(u32_t value)
|
|
{
|
|
cntr_cmp_set(0, value);
|
|
}
|