/* * Copyright (c) 2016-2018 Nordic Semiconductor ASA * Copyright (c) 2016 Vinayak Kariappa Chettimada * * SPDX-License-Identifier: Apache-2.0 */ /** \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 ((uint8_t)((uint8_t)0 - 1)) #define TICKER_NULL_REMAINDER 0 #define TICKER_NULL_PERIOD 0 #define TICKER_NULL_SLOT 0 #define TICKER_NULL_LAZY 0 #define TICKER_NULL_MUST_EXPIRE 0 /** * @} */ /** \brief Timer node type size. */ #if defined(CONFIG_BT_TICKER_EXT) #if defined(CONFIG_BT_TICKER_SLOT_AGNOSTIC) #define TICKER_NODE_T_SIZE 40 #elif defined(CONFIG_BT_TICKER_LOW_LAT) #define TICKER_NODE_T_SIZE 44 #else #define TICKER_NODE_T_SIZE 48 #endif /* CONFIG_BT_TICKER_SLOT_AGNOSTIC */ #else /* CONFIG_BT_TICKER_EXT */ #if defined(CONFIG_BT_TICKER_SLOT_AGNOSTIC) #define TICKER_NODE_T_SIZE 36 #elif defined(CONFIG_BT_TICKER_LOW_LAT) #define TICKER_NODE_T_SIZE 40 #else #define TICKER_NODE_T_SIZE 44 #endif /* CONFIG_BT_TICKER_SLOT_AGNOSTIC */ #endif /* CONFIG_BT_TICKER_EXT */ /** \brief Timer user type size. */ #define TICKER_USER_T_SIZE 8 /** \brief Timer user operation type size. */ #if defined(CONFIG_BT_TICKER_EXT) #if defined(CONFIG_BT_TICKER_SLOT_AGNOSTIC) #define TICKER_USER_OP_T_SIZE 44 #else /* !CONFIG_BT_TICKER_SLOT_AGNOSTIC */ #if defined(CONFIG_BT_TICKER_REMAINDER) #define TICKER_USER_OP_T_SIZE 52 #else /* !CONFIG_BT_TICKER_REMAINDER */ #define TICKER_USER_OP_T_SIZE 48 #endif /* !CONFIG_BT_TICKER_REMAINDER */ #endif /* !CONFIG_BT_TICKER_SLOT_AGNOSTIC */ #else /* !CONFIG_BT_TICKER_EXT */ #if defined(CONFIG_BT_TICKER_SLOT_AGNOSTIC) #define TICKER_USER_OP_T_SIZE 40 #else /* !CONFIG_BT_TICKER_SLOT_AGNOSTIC */ #if defined(CONFIG_BT_TICKER_REMAINDER) #define TICKER_USER_OP_T_SIZE 48 #else /* !CONFIG_BT_TICKER_REMAINDER */ #define TICKER_USER_OP_T_SIZE 44 #endif /* !CONFIG_BT_TICKER_REMAINDER */ #endif /* !CONFIG_BT_TICKER_SLOT_AGNOSTIC */ #endif /* !CONFIG_BT_TICKER_EXT */ #define TICKER_CALL_ID_NONE 0 #define TICKER_CALL_ID_ISR 1 #define TICKER_CALL_ID_TRIGGER 2 #define TICKER_CALL_ID_WORKER 3 #define TICKER_CALL_ID_JOB 4 #define TICKER_CALL_ID_PROGRAM 5 /* Use to ensure callback is invoked in all intervals, even when latencies * occur. */ #define TICKER_LAZY_MUST_EXPIRE 0xFFFF /* Use in ticker_start to set lazy to 0 and do not change the must_expire * state. */ #define TICKER_LAZY_MUST_EXPIRE_KEEP 0xFFFE /* Set this priority to ensure ticker node is always scheduled. Only one * ticker node can have priority TICKER_PRIORITY_CRITICAL at a time */ #define TICKER_PRIORITY_CRITICAL -128 typedef uint8_t (*ticker_caller_id_get_cb_t)(uint8_t user_id); typedef void (*ticker_sched_cb_t)(uint8_t caller_id, uint8_t callee_id, uint8_t chain, void *instance); typedef void (*ticker_trigger_set_cb_t)(uint32_t value); /** \brief Timer timeout function type. */ typedef void (*ticker_timeout_func) (uint32_t ticks_at_expire, uint32_t ticks_drift, uint32_t remainder, uint16_t lazy, uint8_t force, void *context); struct ticker_expire_info { uint32_t ticks_to_expire; uint32_t remainder; uint16_t lazy; }; struct ticker_ext_context { void *context; struct ticker_expire_info *other_expire_info; }; /** \brief Timer operation complete function type. */ typedef void (*ticker_op_func) (uint32_t status, void *op_context); /** \brief Timer operation match callback function type. */ typedef bool (*ticker_op_match_func) (uint8_t ticker_id, uint32_t ticks_slot, uint32_t ticks_to_expire, 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 */ uint8_t ticker_init(uint8_t instance_index, uint8_t count_node, void *node, uint8_t count_user, void *user, uint8_t count_op, void *user_op, ticker_caller_id_get_cb_t caller_id_get_cb, ticker_sched_cb_t sched_cb, ticker_trigger_set_cb_t trigger_set_cb); bool ticker_is_initialized(uint8_t instance_index); void ticker_trigger(uint8_t instance_index); void ticker_worker(void *param); void ticker_job(void *param); uint8_t ticker_start(uint8_t instance_index, uint8_t user_id, uint8_t ticker_id, uint32_t ticks_anchor, uint32_t ticks_first, uint32_t ticks_periodic, uint32_t remainder_periodic, uint16_t lazy, uint32_t ticks_slot, ticker_timeout_func fp_timeout_func, void *context, ticker_op_func fp_op_func, void *op_context); uint8_t ticker_start_us(uint8_t instance_index, uint8_t user_id, uint8_t ticker_id, uint32_t ticks_anchor, uint32_t ticks_first, uint32_t remainder_first, uint32_t ticks_periodic, uint32_t remainder_periodic, uint16_t lazy, uint32_t ticks_slot, ticker_timeout_func fp_timeout_func, void *context, ticker_op_func fp_op_func, void *op_context); uint8_t ticker_update(uint8_t instance_index, uint8_t user_id, uint8_t ticker_id, uint32_t ticks_drift_plus, uint32_t ticks_drift_minus, uint32_t ticks_slot_plus, uint32_t ticks_slot_minus, uint16_t lazy, uint8_t force, ticker_op_func fp_op_func, void *op_context); uint8_t ticker_yield_abs(uint8_t instance_index, uint8_t user_id, uint8_t ticker_id, uint32_t ticks_at_yield, ticker_op_func fp_op_func, void *op_context); uint8_t ticker_stop(uint8_t instance_index, uint8_t user_id, uint8_t ticker_id, ticker_op_func fp_op_func, void *op_context); uint8_t ticker_stop_abs(uint8_t instance_index, uint8_t user_id, uint8_t ticker_id, uint32_t ticks_at_stop, ticker_op_func fp_op_func, void *op_context); uint8_t ticker_next_slot_get(uint8_t instance_index, uint8_t user_id, uint8_t *ticker_id, uint32_t *ticks_current, uint32_t *ticks_to_expire, ticker_op_func fp_op_func, void *op_context); uint8_t ticker_next_slot_get_ext(uint8_t instance_index, uint8_t user_id, uint8_t *ticker_id, uint32_t *ticks_current, uint32_t *ticks_to_expire, uint32_t *remainder, uint16_t *lazy, ticker_op_match_func fp_op_match_func, void *match_op_context, ticker_op_func fp_op_func, void *op_context); uint8_t ticker_job_idle_get(uint8_t instance_index, uint8_t user_id, ticker_op_func fp_op_func, void *op_context); void ticker_job_sched(uint8_t instance_index, uint8_t user_id); uint32_t ticker_ticks_now_get(void); uint32_t ticker_ticks_diff_get(uint32_t ticks_now, uint32_t ticks_old); #if !defined(CONFIG_BT_TICKER_LOW_LAT) && \ !defined(CONFIG_BT_TICKER_SLOT_AGNOSTIC) uint8_t ticker_priority_set(uint8_t instance_index, uint8_t user_id, uint8_t ticker_id, int8_t priority, ticker_op_func fp_op_func, void *op_context); #endif /* !CONFIG_BT_TICKER_LOW_LAT && !CONFIG_BT_TICKER_SLOT_AGNOSTIC */ #if defined(CONFIG_BT_TICKER_EXT) struct ticker_ext { #if !defined(CONFIG_BT_TICKER_SLOT_AGNOSTIC) uint32_t ticks_slot_window;/* Window in which the slot * reservation may be re-scheduled * to avoid collision */ uint32_t ticks_drift; /* Actual drift since last expiry */ uint8_t reschedule_state; /* State of re-scheduling of the * node. See defines * TICKER_RESCHEDULE_STATE_XXX */ #endif /* CONFIG_BT_TICKER_SLOT_AGNOSTIC */ #if defined(CONFIG_BT_TICKER_EXT_EXPIRE_INFO) uint8_t expire_info_id; /* Other ticker ID for which * the ext_timeout_func should include expire * info for * Set to TICKER_NULL if not used */ ticker_timeout_func ext_timeout_func; void *other_expire_info; #endif /* CONFIG_BT_TICKER_EXT_EXPIRE_INFO */ }; uint8_t ticker_start_ext(uint8_t instance_index, uint8_t user_id, uint8_t ticker_id, uint32_t ticks_anchor, uint32_t ticks_first, uint32_t ticks_periodic, uint32_t remainder_periodic, uint16_t lazy, uint32_t ticks_slot, ticker_timeout_func fp_timeout_func, void *context, ticker_op_func fp_op_func, void *op_context, struct ticker_ext *ext_data); #if defined(CONFIG_BT_TICKER_EXT_EXPIRE_INFO) uint8_t ticker_update_ext(uint8_t instance_index, uint8_t user_id, uint8_t ticker_id, uint32_t ticks_drift_plus, uint32_t ticks_drift_minus, uint32_t ticks_slot_plus, uint32_t ticks_slot_minus, uint16_t lazy, uint8_t force, ticker_op_func fp_op_func, void *op_context, uint8_t must_expire, uint8_t expire_info_id); #else /* !CONFIG_BT_TICKER_EXT_EXPIRE_INFO */ uint8_t ticker_update_ext(uint8_t instance_index, uint8_t user_id, uint8_t ticker_id, uint32_t ticks_drift_plus, uint32_t ticks_drift_minus, uint32_t ticks_slot_plus, uint32_t ticks_slot_minus, uint16_t lazy, uint8_t force, ticker_op_func fp_op_func, void *op_context, uint8_t must_expire); #endif /* !CONFIG_BT_TICKER_EXT_EXPIRE_INFO */ #endif /* CONFIG_BT_TICKER_EXT */