Extend radio ticker nodes for support in-timeslice execution Added interface for abort the radio Added interface for check whether the radio is idle Added interface for get ticker IDs for timeslice ticker node Added interface for check whether radio ticker is running Added interface for check whether radio ticker is initialized Signed-off-by: Vinayak Kariappa Chettimada <vich@nordicsemi.no> Signed-off-by: Andrzej Puzdrowski <andrzej.puzdrowski@nordicsemi.no>
123 lines
3.5 KiB
C
123 lines
3.5 KiB
C
/*
|
|
* Copyright (c) 2016 Nordic Semiconductor ASA
|
|
* Copyright (c) 2016 Vinayak Kariappa Chettimada
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#ifndef _TICKER_H_
|
|
#define _TICKER_H_
|
|
|
|
/** \brief Macro to translate microseconds to tick units.
|
|
*
|
|
* \note This returns the floor value.
|
|
*/
|
|
#define TICKER_US_TO_TICKS(x) \
|
|
( \
|
|
((u32_t)(((u64_t) (x) * 1000000000UL) / 30517578125UL)) \
|
|
& 0x00FFFFFF \
|
|
)
|
|
|
|
/** \brief Macro returning remainder in nanoseconds over-and-above a tick unit.
|
|
*/
|
|
#define TICKER_REMAINDER(x) \
|
|
( \
|
|
( \
|
|
((u64_t) (x) * 1000000000UL) \
|
|
- ((u64_t) TICKER_US_TO_TICKS(x) * 30517578125UL) \
|
|
) \
|
|
/ 1000UL \
|
|
)
|
|
|
|
/** \brief Macro to translate tick units to microseconds.
|
|
*/
|
|
#define TICKER_TICKS_TO_US(x) \
|
|
((u32_t)(((u64_t) (x) * 30517578125UL) / 1000000000UL))
|
|
|
|
/** \defgroup Timer API return codes.
|
|
*
|
|
* @{
|
|
*/
|
|
#define TICKER_STATUS_SUCCESS 0 /**< Success. */
|
|
#define TICKER_STATUS_FAILURE 1 /**< Failure. */
|
|
#define TICKER_STATUS_BUSY 2 /**< Busy, requested feature will
|
|
* complete later in time as job is
|
|
* disabled or at lower execution
|
|
* priority than the caller.
|
|
*/
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/** \defgroup Timer API common defaults parameter values.
|
|
*
|
|
* @{
|
|
*/
|
|
#define TICKER_NULL ((u8_t)((u8_t)0 - 1))
|
|
#define TICKER_NULL_REMAINDER 0
|
|
#define TICKER_NULL_PERIOD 0
|
|
#define TICKER_NULL_SLOT 0
|
|
#define TICKER_NULL_LAZY 0
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/** \brief Timer node type size.
|
|
*/
|
|
#define TICKER_NODE_T_SIZE 36
|
|
|
|
/** \brief Timer user type size.
|
|
*/
|
|
#define TICKER_USER_T_SIZE 8
|
|
|
|
/** \brief Timer user operation type size.
|
|
*/
|
|
#define TICKER_USER_OP_T_SIZE 44
|
|
|
|
/** \brief Timer timeout function type.
|
|
*/
|
|
typedef void (*ticker_timeout_func) (u32_t ticks_at_expire, u32_t remainder,
|
|
u16_t lazy, void *context);
|
|
|
|
/** \brief Timer operation complete function type.
|
|
*/
|
|
typedef void (*ticker_op_func) (u32_t status, void *op_context);
|
|
|
|
/** \brief Timer module initialization.
|
|
*
|
|
* \param[in] instance_index Timer mode instance 0 or 1 (uses RTC0 CMP0 or
|
|
* CMP1 respectively).
|
|
* \param[in] count_node Max. no. of ticker nodes to initialize.
|
|
* \param[in] node
|
|
* \param[in] count_user
|
|
* \param[in] user
|
|
* \param[in] count_op
|
|
* \param[in] user_op
|
|
*/
|
|
u32_t ticker_init(u8_t instance_index, u8_t count_node, void *node,
|
|
u8_t count_user, void *user, u8_t count_op, void *user_op);
|
|
bool ticker_is_initialized(u8_t instance_index);
|
|
void ticker_trigger(u8_t instance_index);
|
|
u32_t ticker_start(u8_t instance_index, u8_t user_id, u8_t ticker_id,
|
|
u32_t ticks_anchor, u32_t ticks_first, u32_t ticks_periodic,
|
|
u32_t remainder_periodic, u16_t lazy, u16_t ticks_slot,
|
|
ticker_timeout_func ticker_timeout_func, void *context,
|
|
ticker_op_func fp_op_func, void *op_context);
|
|
u32_t ticker_update(u8_t instance_index, u8_t user_id, u8_t ticker_id,
|
|
u16_t ticks_drift_plus, u16_t ticks_drift_minus,
|
|
u16_t ticks_slot_plus, u16_t ticks_slot_minus, u16_t lazy,
|
|
u8_t force, ticker_op_func fp_op_func, void *op_context);
|
|
u32_t ticker_stop(u8_t instance_index, u8_t user_id, u8_t ticker_id,
|
|
ticker_op_func fp_op_func, void *op_context);
|
|
u32_t ticker_next_slot_get(u8_t instance_index, u8_t user_id,
|
|
u8_t *ticker_id_head, u32_t *ticks_current,
|
|
u32_t *ticks_to_expire,
|
|
ticker_op_func fp_op_func, void *op_context);
|
|
u32_t ticker_job_idle_get(u8_t instance_index, u8_t user_id,
|
|
ticker_op_func fp_op_func, void *op_context);
|
|
void ticker_job_sched(u8_t instance_index, u8_t user_id);
|
|
u32_t ticker_ticks_now_get(void);
|
|
u32_t ticker_ticks_diff_get(u32_t ticks_now, u32_t ticks_old);
|
|
|
|
#endif
|