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