1 /*
2 * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 // The LL layer for ESP32-H2 MODEM SYSCON register operations
8
9 #pragma once
10
11 #include <stdlib.h>
12 #include "soc/soc.h"
13 #include "hal/assert.h"
14 #include "modem/modem_syscon_struct.h"
15 #include "hal/modem_clock_types.h"
16
17 #ifdef __cplusplus
18 extern "C" {
19 #endif
20
21 __attribute__((always_inline))
modem_syscon_ll_enable_test_clk(modem_syscon_dev_t * hw,bool en)22 static inline void modem_syscon_ll_enable_test_clk(modem_syscon_dev_t *hw, bool en)
23 {
24 hw->test_conf.clk_en = en;
25 }
26
27
28 __attribute__((always_inline))
modem_syscon_ll_enable_data_dump_mux_clock(modem_syscon_dev_t * hw,bool en)29 static inline void modem_syscon_ll_enable_data_dump_mux_clock(modem_syscon_dev_t *hw, bool en)
30 {
31 // ESP32H2 Not Support
32 }
33
34 __attribute__((always_inline))
modem_syscon_ll_enable_etm_clock(modem_syscon_dev_t * hw,bool en)35 static inline void modem_syscon_ll_enable_etm_clock(modem_syscon_dev_t *hw, bool en)
36 {
37 hw->clk_conf.clk_etm_en = en;
38 }
39
40 __attribute__((always_inline))
modem_syscon_ll_enable_ieee802154_apb_clock(modem_syscon_dev_t * hw,bool en)41 static inline void modem_syscon_ll_enable_ieee802154_apb_clock(modem_syscon_dev_t *hw, bool en)
42 {
43 hw->clk_conf.clk_zb_apb_en = en;
44 }
45
46 __attribute__((always_inline))
modem_syscon_ll_enable_ieee802154_mac_clock(modem_syscon_dev_t * hw,bool en)47 static inline void modem_syscon_ll_enable_ieee802154_mac_clock(modem_syscon_dev_t *hw, bool en)
48 {
49 hw->clk_conf.clk_zb_mac_en = en;
50 }
51
52 __attribute__((always_inline))
modem_syscon_ll_enable_modem_sec_clock(modem_syscon_dev_t * hw,bool en)53 static inline void modem_syscon_ll_enable_modem_sec_clock(modem_syscon_dev_t *hw, bool en)
54 {
55 hw->clk_conf.clk_modem_sec_en = en;
56 hw->clk_conf.clk_modem_sec_ecb_en = en;
57 hw->clk_conf.clk_modem_sec_ccm_en = en;
58 hw->clk_conf.clk_modem_sec_bah_en = en;
59 hw->clk_conf.clk_modem_sec_apb_en = en;
60 }
61
62 __attribute__((always_inline))
modem_syscon_ll_enable_ble_timer_apb(modem_syscon_dev_t * hw,bool en)63 static inline void modem_syscon_ll_enable_ble_timer_apb(modem_syscon_dev_t *hw, bool en)
64 {
65 hw->clk_conf.clk_ble_timer_apb_en = en;
66 }
67
68 __attribute__((always_inline))
modem_syscon_ll_enable_ble_timer_clock(modem_syscon_dev_t * hw,bool en)69 static inline void modem_syscon_ll_enable_ble_timer_clock(modem_syscon_dev_t *hw, bool en)
70 {
71 hw->clk_conf.clk_ble_timer_en = en;
72 }
73
74 __attribute__((always_inline))
modem_syscon_ll_enable_data_dump_clock(modem_syscon_dev_t * hw,bool en)75 static inline void modem_syscon_ll_enable_data_dump_clock(modem_syscon_dev_t *hw, bool en)
76 {
77 hw->clk_conf.clk_data_dump_en = en;
78 }
79
80 __attribute__((always_inline))
modem_syscon_ll_enable_etm_force_clock(modem_syscon_dev_t * hw)81 static inline void modem_syscon_ll_enable_etm_force_clock(modem_syscon_dev_t *hw)
82 {
83 hw->clk_conf_force_on.clk_etm_fo = 1;
84 }
85
86 __attribute__((always_inline))
modem_syscon_ll_enable_modem_sec_force_clock(modem_syscon_dev_t * hw)87 static inline void modem_syscon_ll_enable_modem_sec_force_clock(modem_syscon_dev_t *hw)
88 {
89 hw->clk_conf_force_on.clk_modem_sec_fo = 1;
90 }
91
92 __attribute__((always_inline))
modem_syscon_ll_enable_ble_timer_force_clock(modem_syscon_dev_t * hw)93 static inline void modem_syscon_ll_enable_ble_timer_force_clock(modem_syscon_dev_t *hw)
94 {
95 hw->clk_conf_force_on.clk_ble_timer_fo = 1;
96 }
97
98 __attribute__((always_inline))
modem_syscon_ll_enable_data_dump_force_clock(modem_syscon_dev_t * hw)99 static inline void modem_syscon_ll_enable_data_dump_force_clock(modem_syscon_dev_t *hw)
100 {
101 hw->clk_conf_force_on.clk_data_dump_fo = 1;
102 }
103
104 __attribute__((always_inline))
modem_syscon_ll_reset_fe(modem_syscon_dev_t * hw)105 static inline void modem_syscon_ll_reset_fe(modem_syscon_dev_t *hw)
106 {
107 hw->modem_rst_conf.rst_fe = 1;
108 hw->modem_rst_conf.rst_fe = 0;
109 }
110
111 __attribute__((always_inline))
modem_syscon_ll_reset_btmac_apb(modem_syscon_dev_t * hw)112 static inline void modem_syscon_ll_reset_btmac_apb(modem_syscon_dev_t *hw)
113 {
114 hw->modem_rst_conf.rst_btmac_apb = 1;
115 hw->modem_rst_conf.rst_btmac_apb = 0;
116 }
117
118 __attribute__((always_inline))
modem_syscon_ll_reset_btmac(modem_syscon_dev_t * hw)119 static inline void modem_syscon_ll_reset_btmac(modem_syscon_dev_t *hw)
120 {
121 hw->modem_rst_conf.rst_btmac = 1;
122 hw->modem_rst_conf.rst_btmac = 0;
123 }
124
125 __attribute__((always_inline))
modem_syscon_ll_reset_btbb_apb(modem_syscon_dev_t * hw)126 static inline void modem_syscon_ll_reset_btbb_apb(modem_syscon_dev_t *hw)
127 {
128 hw->modem_rst_conf.rst_btbb_apb = 1;
129 hw->modem_rst_conf.rst_btbb_apb = 0;
130 }
131
132 __attribute__((always_inline))
modem_syscon_ll_reset_btbb(modem_syscon_dev_t * hw)133 static inline void modem_syscon_ll_reset_btbb(modem_syscon_dev_t *hw)
134 {
135 hw->modem_rst_conf.rst_btbb = 1;
136 hw->modem_rst_conf.rst_btbb = 0;
137 }
138
139 __attribute__((always_inline))
modem_syscon_ll_reset_etm(modem_syscon_dev_t * hw)140 static inline void modem_syscon_ll_reset_etm(modem_syscon_dev_t *hw)
141 {
142 hw->modem_rst_conf.rst_etm = 1;
143 hw->modem_rst_conf.rst_etm = 0;
144 }
145
146 __attribute__((always_inline))
modem_syscon_ll_reset_zbmac(modem_syscon_dev_t * hw)147 static inline void modem_syscon_ll_reset_zbmac(modem_syscon_dev_t *hw)
148 {
149 hw->modem_rst_conf.rst_zbmac = 1;
150 hw->modem_rst_conf.rst_zbmac = 0;
151 }
152
153 __attribute__((always_inline))
modem_syscon_ll_reset_modem_sec(modem_syscon_dev_t * hw)154 static inline void modem_syscon_ll_reset_modem_sec(modem_syscon_dev_t *hw)
155 {
156 hw->modem_rst_conf.rst_modem_ecb = 1;
157 hw->modem_rst_conf.rst_modem_ccm = 1;
158 hw->modem_rst_conf.rst_modem_bah = 1;
159 hw->modem_rst_conf.rst_modem_sec = 1;
160 hw->modem_rst_conf.rst_modem_ecb = 0;
161 hw->modem_rst_conf.rst_modem_ccm = 0;
162 hw->modem_rst_conf.rst_modem_bah = 0;
163 hw->modem_rst_conf.rst_modem_sec = 0;
164 }
165
166 __attribute__((always_inline))
modem_syscon_ll_reset_ble_timer(modem_syscon_dev_t * hw)167 static inline void modem_syscon_ll_reset_ble_timer(modem_syscon_dev_t *hw)
168 {
169 hw->modem_rst_conf.rst_ble_timer = 1;
170 hw->modem_rst_conf.rst_ble_timer = 0;
171 }
172
173 __attribute__((always_inline))
modem_syscon_ll_reset_data_dump(modem_syscon_dev_t * hw)174 static inline void modem_syscon_ll_reset_data_dump(modem_syscon_dev_t *hw)
175 {
176 hw->modem_rst_conf.rst_data_dump = 1;
177 hw->modem_rst_conf.rst_data_dump = 0;
178 }
179
180 __attribute__((always_inline))
modem_syscon_ll_reset_all(modem_syscon_dev_t * hw)181 static inline void modem_syscon_ll_reset_all(modem_syscon_dev_t *hw)
182 {
183 hw->modem_rst_conf.val = 0xffffffff;
184 hw->modem_rst_conf.val = 0;
185 }
186
187
188 __attribute__((always_inline))
modem_syscon_ll_clk_conf1_configure(modem_syscon_dev_t * hw,bool en,uint32_t mask)189 static inline void modem_syscon_ll_clk_conf1_configure(modem_syscon_dev_t *hw, bool en, uint32_t mask)
190 {
191 if(en){
192 hw->clk_conf1.val = hw->clk_conf1.val | mask;
193 } else {
194 hw->clk_conf1.val = hw->clk_conf1.val & ~mask;
195 }
196 }
197
198 __attribute__((always_inline))
modem_syscon_ll_enable_fe_16m_clock(modem_syscon_dev_t * hw,bool en)199 static inline void modem_syscon_ll_enable_fe_16m_clock(modem_syscon_dev_t *hw, bool en)
200 {
201 hw->clk_conf1.clk_fe_16m_en = en;
202 }
203
204 __attribute__((always_inline))
modem_syscon_ll_enable_fe_32m_clock(modem_syscon_dev_t * hw,bool en)205 static inline void modem_syscon_ll_enable_fe_32m_clock(modem_syscon_dev_t *hw, bool en)
206 {
207 hw->clk_conf1.clk_fe_32m_en = en;
208 }
209
210
211 __attribute__((always_inline))
modem_syscon_ll_enable_fe_sdm_clock(modem_syscon_dev_t * hw,bool en)212 static inline void modem_syscon_ll_enable_fe_sdm_clock(modem_syscon_dev_t *hw, bool en)
213 {
214 hw->clk_conf1.clk_fe_sdm_en = en;
215 }
216
217 __attribute__((always_inline))
modem_syscon_ll_enable_fe_adc_clock(modem_syscon_dev_t * hw,bool en)218 static inline void modem_syscon_ll_enable_fe_adc_clock(modem_syscon_dev_t *hw, bool en)
219 {
220 hw->clk_conf1.clk_fe_adc_en = en;
221 }
222
223 __attribute__((always_inline))
modem_syscon_ll_enable_fe_apb_clock(modem_syscon_dev_t * hw,bool en)224 static inline void modem_syscon_ll_enable_fe_apb_clock(modem_syscon_dev_t *hw, bool en)
225 {
226 hw->clk_conf1.clk_fe_apb_en = en;
227 }
228
229 __attribute__((always_inline))
modem_syscon_ll_enable_bt_apb_clock(modem_syscon_dev_t * hw,bool en)230 static inline void modem_syscon_ll_enable_bt_apb_clock(modem_syscon_dev_t *hw, bool en)
231 {
232 hw->clk_conf1.clk_bt_apb_en = en;
233 }
234
235 __attribute__((always_inline))
modem_syscon_ll_enable_bt_clock(modem_syscon_dev_t * hw,bool en)236 static inline void modem_syscon_ll_enable_bt_clock(modem_syscon_dev_t *hw, bool en)
237 {
238 hw->clk_conf1.clk_bt_en = en;
239 }
240
241 __attribute__((always_inline))
modem_syscon_ll_enable_fe_force_clock(modem_syscon_dev_t * hw,bool en)242 static inline void modem_syscon_ll_enable_fe_force_clock(modem_syscon_dev_t *hw, bool en)
243 {
244 hw->clk_conf1_force_on.clk_fe_fo = en;
245 }
246
247 __attribute__((always_inline))
modem_syscon_ll_enable_bt_force_clock(modem_syscon_dev_t * hw,bool en)248 static inline void modem_syscon_ll_enable_bt_force_clock(modem_syscon_dev_t *hw, bool en)
249 {
250 hw->clk_conf1_force_on.clk_bt_fo = en;
251 }
252
253 __attribute__((always_inline))
modem_syscon_ll_get_date(modem_syscon_dev_t * hw)254 static inline uint32_t modem_syscon_ll_get_date(modem_syscon_dev_t *hw)
255 {
256 return hw->date.val;
257 }
258
259 #ifdef __cplusplus
260 }
261 #endif
262