5 #include "qm_ss_timer.h"
7 static void (*callback[QM_SS_TIMER_NUM])(
void *data);
8 static void *callback_data[QM_SS_TIMER_NUM];
9 static uint32_t qm_ss_timer_base[QM_SS_TIMER_NUM] = {QM_SS_TIMER_0_BASE};
15 if (callback[timer]) {
16 callback[timer](callback_data[timer]);
19 ctrl = __builtin_arc_lr(qm_ss_timer_base[timer] + QM_SS_TIMER_CONTROL);
20 ctrl &= ~BIT(QM_SS_TIMER_CONTROL_INT_PENDING_OFFSET);
21 __builtin_arc_sr(ctrl, qm_ss_timer_base[timer] + QM_SS_TIMER_CONTROL);
26 qm_ss_timer_isr(QM_SS_TIMER_0);
33 QM_CHECK(cfg != NULL, -EINVAL);
34 QM_CHECK(timer < QM_SS_TIMER_NUM, -EINVAL);
36 ctrl = cfg->
watchdog_mode << QM_SS_TIMER_CONTROL_WATCHDOG_OFFSET;
37 ctrl |= cfg->
inc_run_only << QM_SS_TIMER_CONTROL_NON_HALTED_OFFSET;
38 ctrl |= cfg->
int_en << QM_SS_TIMER_CONTROL_INT_EN_OFFSET;
40 __builtin_arc_sr(ctrl, qm_ss_timer_base[timer] + QM_SS_TIMER_CONTROL);
41 __builtin_arc_sr(cfg->
count,
42 qm_ss_timer_base[timer] + QM_SS_TIMER_LIMIT);
52 QM_CHECK(timer < QM_SS_TIMER_NUM, -EINVAL);
54 __builtin_arc_sr(count, qm_ss_timer_base[timer] + QM_SS_TIMER_COUNT);
61 QM_CHECK(timer < QM_SS_TIMER_NUM, -EINVAL);
62 QM_CHECK(count != NULL, -EINVAL);
64 *count = __builtin_arc_lr(qm_ss_timer_base[timer] + QM_SS_TIMER_COUNT);
69 #if (ENABLE_RESTORE_CONTEXT)
71 qm_ss_timer_context_t *
const ctx)
75 QM_CHECK(timer < QM_SS_TIMER_NUM, -EINVAL);
76 QM_CHECK(ctx != NULL, -EINVAL);
78 controller = qm_ss_timer_base[timer];
80 ctx->timer_control = __builtin_arc_lr(controller + QM_SS_TIMER_CONTROL);
81 ctx->timer_limit = __builtin_arc_lr(controller + QM_SS_TIMER_LIMIT);
82 ctx->timer_count = __builtin_arc_lr(controller + QM_SS_TIMER_COUNT);
88 const qm_ss_timer_context_t *
const ctx)
92 QM_CHECK(timer < QM_SS_TIMER_NUM, -EINVAL);
93 QM_CHECK(ctx != NULL, -EINVAL);
95 controller = qm_ss_timer_base[timer];
97 __builtin_arc_sr(ctx->timer_control, controller + QM_SS_TIMER_CONTROL);
98 __builtin_arc_sr(ctx->timer_limit, controller + QM_SS_TIMER_LIMIT);
99 __builtin_arc_sr(ctx->timer_count, controller + QM_SS_TIMER_COUNT);
105 qm_ss_timer_context_t *
const ctx)
114 const qm_ss_timer_context_t *
const ctx)
bool inc_run_only
Increments in run state only.
QM_ISR_DECLARE(qm_ss_timer_0_isr)
ISR for SS Timer 0 interrupt.
void(* callback)(void *data)
User callback.
int qm_ss_timer_get(const qm_ss_timer_t timer, uint32_t *const count)
Get SS timer count value.
qm_ss_timer_t
Sensor Subsystem Timers.
uint32_t count
Final count value.
bool watchdog_mode
Watchdog mode.
Sensor Subsystem Timer Configuration Type.
int qm_ss_timer_set_config(const qm_ss_timer_t timer, const qm_ss_timer_config_t *const cfg)
Set the SS timer configuration.
int qm_ss_timer_set(const qm_ss_timer_t timer, const uint32_t count)
Set SS timer count value.
bool int_en
Interrupt enable.
void * callback_data
Callback user data.