1 /*
2 * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6 #pragma once
7
8 #include <stdint.h>
9 #include <stdbool.h>
10 #include "soc/systimer_struct.h"
11 #include "soc/clk_tree_defs.h"
12 #include "hal/assert.h"
13
14 #ifdef __cplusplus
15 extern "C" {
16 #endif
17
18 // All these functions get invoked either from ISR or HAL that linked to IRAM.
19 // Always inline these functions even no gcc optimization is applied.
20
21 /******************* Clock *************************/
22
systimer_ll_enable_clock(systimer_dev_t * dev,bool en)23 __attribute__((always_inline)) static inline void systimer_ll_enable_clock(systimer_dev_t *dev, bool en)
24 {
25 dev->conf.clk_en = en;
26 }
27
systimer_ll_set_clock_source(soc_periph_systimer_clk_src_t clk_src)28 static inline void systimer_ll_set_clock_source(soc_periph_systimer_clk_src_t clk_src)
29 {
30 (void)clk_src;
31 }
32
systimer_ll_get_clock_source(void)33 static inline soc_periph_systimer_clk_src_t systimer_ll_get_clock_source(void)
34 {
35 return SYSTIMER_CLK_SRC_XTAL;
36 }
37
38 /******************* Counter *************************/
39
systimer_ll_enable_counter(systimer_dev_t * dev,uint32_t counter_id,bool en)40 __attribute__((always_inline)) static inline void systimer_ll_enable_counter(systimer_dev_t *dev, uint32_t counter_id, bool en)
41 {
42 // ESP32-S2 only has one counter in systimer group
43 (void)dev;
44 (void)counter_id;
45 }
46
systimer_ll_counter_can_stall_by_cpu(systimer_dev_t * dev,uint32_t counter_id,uint32_t cpu_id,bool can)47 __attribute__((always_inline)) static inline void systimer_ll_counter_can_stall_by_cpu(systimer_dev_t *dev, uint32_t counter_id, uint32_t cpu_id, bool can)
48 {
49 (void)dev;
50 (void)counter_id;
51 (void)cpu_id;
52 (void)can;
53 }
54
systimer_ll_counter_snapshot(systimer_dev_t * dev,uint32_t counter_id)55 __attribute__((always_inline)) static inline void systimer_ll_counter_snapshot(systimer_dev_t *dev, uint32_t counter_id)
56 {
57 (void)counter_id;
58 dev->update.timer_update = 1;
59 }
60
systimer_ll_is_counter_value_valid(systimer_dev_t * dev,uint32_t counter_id)61 __attribute__((always_inline)) static inline bool systimer_ll_is_counter_value_valid(systimer_dev_t *dev, uint32_t counter_id)
62 {
63 (void)counter_id;
64 return dev->update.timer_value_valid;
65 }
66
systimer_ll_set_counter_value(systimer_dev_t * dev,uint32_t counter_id,uint64_t value)67 __attribute__((always_inline)) static inline void systimer_ll_set_counter_value(systimer_dev_t *dev, uint32_t counter_id, uint64_t value)
68 {
69 (void)counter_id;
70 dev->load_hi.timer_load_hi = value >> 32;
71 dev->load_lo.timer_load_lo = value;
72 }
73
systimer_ll_get_counter_value_low(systimer_dev_t * dev,uint32_t counter_id)74 __attribute__((always_inline)) static inline uint32_t systimer_ll_get_counter_value_low(systimer_dev_t *dev, uint32_t counter_id)
75 {
76 return dev->value_lo.timer_value_lo;
77 }
78
systimer_ll_get_counter_value_high(systimer_dev_t * dev,uint32_t counter_id)79 __attribute__((always_inline)) static inline uint32_t systimer_ll_get_counter_value_high(systimer_dev_t *dev, uint32_t counter_id)
80 {
81 return dev->value_hi.timer_value_hi;
82 }
83
systimer_ll_apply_counter_value(systimer_dev_t * dev,uint32_t counter_id)84 __attribute__((always_inline)) static inline void systimer_ll_apply_counter_value(systimer_dev_t *dev, uint32_t counter_id)
85 {
86 dev->load.timer_load = 1;
87 }
88
systimer_ll_set_step_for_pll(systimer_dev_t * dev,uint32_t step)89 __attribute__((always_inline)) static inline void systimer_ll_set_step_for_pll(systimer_dev_t *dev, uint32_t step)
90 {
91 dev->step.timer_pll_step = step;
92 }
93
systimer_ll_set_step_for_xtal(systimer_dev_t * dev,uint32_t step)94 __attribute__((always_inline)) static inline void systimer_ll_set_step_for_xtal(systimer_dev_t *dev, uint32_t step)
95 {
96 dev->step.timer_xtal_step = step;
97 }
98
99 /******************* Alarm *************************/
100
systimer_ll_set_alarm_target(systimer_dev_t * dev,uint32_t alarm_id,uint64_t value)101 __attribute__((always_inline)) static inline void systimer_ll_set_alarm_target(systimer_dev_t *dev, uint32_t alarm_id, uint64_t value)
102 {
103 dev->target_val[alarm_id].hi.timer_target_hi = value >> 32;
104 dev->target_val[alarm_id].lo.timer_target_lo = value;
105 }
106
systimer_ll_get_alarm_target(systimer_dev_t * dev,uint32_t alarm_id)107 __attribute__((always_inline)) static inline uint64_t systimer_ll_get_alarm_target(systimer_dev_t *dev, uint32_t alarm_id)
108 {
109 return ((uint64_t)(dev->target_val[alarm_id].hi.timer_target_hi) << 32) | dev->target_val[alarm_id].lo.timer_target_lo;
110 }
111
systimer_ll_connect_alarm_counter(systimer_dev_t * dev,uint32_t alarm_id,uint32_t counter_id)112 __attribute__((always_inline)) static inline void systimer_ll_connect_alarm_counter(systimer_dev_t *dev, uint32_t alarm_id, uint32_t counter_id)
113 {
114 // On esp32-s2, counter int the systimer is fixed connectred to other three alarm comparators
115 (void)dev;
116 (void)alarm_id;
117 (void)counter_id;
118 }
119
systimer_ll_enable_alarm_oneshot(systimer_dev_t * dev,uint32_t alarm_id)120 __attribute__((always_inline)) static inline void systimer_ll_enable_alarm_oneshot(systimer_dev_t *dev, uint32_t alarm_id)
121 {
122 dev->target_conf[alarm_id].target_period_mode = 0;
123 }
124
systimer_ll_enable_alarm_period(systimer_dev_t * dev,uint32_t alarm_id)125 __attribute__((always_inline)) static inline void systimer_ll_enable_alarm_period(systimer_dev_t *dev, uint32_t alarm_id)
126 {
127 dev->target_conf[alarm_id].target_period_mode = 1;
128 }
129
systimer_ll_set_alarm_period(systimer_dev_t * dev,uint32_t alarm_id,uint32_t period)130 __attribute__((always_inline)) static inline void systimer_ll_set_alarm_period(systimer_dev_t *dev, uint32_t alarm_id, uint32_t period)
131 {
132 HAL_ASSERT(period < (1 << 30));
133 dev->target_conf[alarm_id].target_period = period;
134 }
135
systimer_ll_get_alarm_period(systimer_dev_t * dev,uint32_t alarm_id)136 __attribute__((always_inline)) static inline uint32_t systimer_ll_get_alarm_period(systimer_dev_t *dev, uint32_t alarm_id)
137 {
138 return dev->target_conf[alarm_id].target_period;
139 }
140
systimer_ll_apply_alarm_value(systimer_dev_t * dev,uint32_t alarm_id)141 __attribute__((always_inline)) static inline void systimer_ll_apply_alarm_value(systimer_dev_t *dev, uint32_t alarm_id)
142 {
143 (void)dev;
144 (void)alarm_id;
145 }
146
systimer_ll_enable_alarm(systimer_dev_t * dev,uint32_t alarm_id,bool en)147 __attribute__((always_inline)) static inline void systimer_ll_enable_alarm(systimer_dev_t *dev, uint32_t alarm_id, bool en)
148 {
149 dev->target_conf[alarm_id].target_work_en = en;
150 }
151
152 /******************* Interrupt *************************/
153
systimer_ll_enable_alarm_int(systimer_dev_t * dev,uint32_t alarm_id,bool en)154 __attribute__((always_inline)) static inline void systimer_ll_enable_alarm_int(systimer_dev_t *dev, uint32_t alarm_id, bool en)
155 {
156 if (en) {
157 dev->int_ena.val |= 1 << alarm_id;
158 } else {
159 dev->int_ena.val &= ~(1 << alarm_id);
160 }
161 }
162
systimer_ll_is_alarm_int_fired(systimer_dev_t * dev,uint32_t alarm_id)163 __attribute__((always_inline)) static inline bool systimer_ll_is_alarm_int_fired(systimer_dev_t *dev, uint32_t alarm_id)
164 {
165 return dev->int_raw.val & (1 << alarm_id);
166 }
167
systimer_ll_clear_alarm_int(systimer_dev_t * dev,uint32_t alarm_id)168 __attribute__((always_inline)) static inline void systimer_ll_clear_alarm_int(systimer_dev_t *dev, uint32_t alarm_id)
169 {
170 dev->int_clr.val |= 1 << alarm_id;
171 }
172
173 #ifdef __cplusplus
174 }
175 #endif
176