1 // Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 #pragma once
16
17 #ifdef __cplusplus
18 extern "C" {
19 #endif
20
21 #include <stdint.h>
22 #include <stdbool.h>
23 #include "esp_attr.h"
24 #include "soc/periph_defs.h"
25 #include "soc/dport_reg.h"
26 #include "soc/dport_access.h"
27
periph_ll_get_clk_en_mask(periph_module_t periph)28 static inline uint32_t periph_ll_get_clk_en_mask(periph_module_t periph)
29 {
30 switch (periph) {
31 case PERIPH_LEDC_MODULE:
32 return DPORT_LEDC_CLK_EN;
33 case PERIPH_UART0_MODULE:
34 return DPORT_UART_CLK_EN;
35 case PERIPH_UART1_MODULE:
36 return DPORT_UART1_CLK_EN;
37 case PERIPH_UART2_MODULE:
38 return DPORT_UART2_CLK_EN;
39 case PERIPH_I2C0_MODULE:
40 return DPORT_I2C_EXT0_CLK_EN;
41 case PERIPH_I2C1_MODULE:
42 return DPORT_I2C_EXT1_CLK_EN;
43 case PERIPH_I2S0_MODULE:
44 return DPORT_I2S0_CLK_EN;
45 case PERIPH_I2S1_MODULE:
46 return DPORT_I2S1_CLK_EN;
47 case PERIPH_TIMG0_MODULE:
48 return DPORT_TIMERGROUP_CLK_EN;
49 case PERIPH_TIMG1_MODULE:
50 return DPORT_TIMERGROUP1_CLK_EN;
51 case PERIPH_PWM0_MODULE:
52 return DPORT_PWM0_CLK_EN;
53 case PERIPH_PWM1_MODULE:
54 return DPORT_PWM1_CLK_EN;
55 case PERIPH_PWM2_MODULE:
56 return DPORT_PWM2_CLK_EN;
57 case PERIPH_PWM3_MODULE:
58 return DPORT_PWM3_CLK_EN;
59 case PERIPH_UHCI0_MODULE:
60 return DPORT_UHCI0_CLK_EN;
61 case PERIPH_UHCI1_MODULE:
62 return DPORT_UHCI1_CLK_EN;
63 case PERIPH_RMT_MODULE:
64 return DPORT_RMT_CLK_EN;
65 case PERIPH_PCNT_MODULE:
66 return DPORT_PCNT_CLK_EN;
67 case PERIPH_SPI_MODULE:
68 return DPORT_SPI01_CLK_EN;
69 case PERIPH_HSPI_MODULE:
70 return DPORT_SPI2_CLK_EN;
71 case PERIPH_VSPI_MODULE:
72 return DPORT_SPI3_CLK_EN;
73 case PERIPH_SPI_DMA_MODULE:
74 return DPORT_SPI_DMA_CLK_EN;
75 case PERIPH_SDMMC_MODULE:
76 return DPORT_WIFI_CLK_SDIO_HOST_EN;
77 case PERIPH_SDIO_SLAVE_MODULE:
78 return DPORT_WIFI_CLK_SDIOSLAVE_EN;
79 case PERIPH_TWAI_MODULE:
80 return DPORT_TWAI_CLK_EN;
81 case PERIPH_EMAC_MODULE:
82 return DPORT_WIFI_CLK_EMAC_EN;
83 case PERIPH_RNG_MODULE:
84 return DPORT_WIFI_CLK_RNG_EN;
85 case PERIPH_WIFI_MODULE:
86 return DPORT_WIFI_CLK_WIFI_EN_M;
87 case PERIPH_BT_MODULE:
88 return DPORT_WIFI_CLK_BT_EN_M;
89 case PERIPH_WIFI_BT_COMMON_MODULE:
90 return DPORT_WIFI_CLK_WIFI_BT_COMMON_M;
91 case PERIPH_BT_BASEBAND_MODULE:
92 return DPORT_BT_BASEBAND_EN;
93 case PERIPH_BT_LC_MODULE:
94 return DPORT_BT_LC_EN;
95 case PERIPH_AES_MODULE:
96 return DPORT_PERI_EN_AES;
97 case PERIPH_SHA_MODULE:
98 return DPORT_PERI_EN_SHA;
99 case PERIPH_RSA_MODULE:
100 return DPORT_PERI_EN_RSA;
101 default:
102 return 0;
103 }
104 }
105
periph_ll_get_rst_en_mask(periph_module_t periph,bool enable)106 static inline uint32_t periph_ll_get_rst_en_mask(periph_module_t periph, bool enable)
107 {
108 switch (periph) {
109 case PERIPH_LEDC_MODULE:
110 return DPORT_LEDC_RST;
111 case PERIPH_UART0_MODULE:
112 return DPORT_UART_RST;
113 case PERIPH_UART1_MODULE:
114 return DPORT_UART1_RST;
115 case PERIPH_UART2_MODULE:
116 return DPORT_UART2_RST;
117 case PERIPH_I2C0_MODULE:
118 return DPORT_I2C_EXT0_RST;
119 case PERIPH_I2C1_MODULE:
120 return DPORT_I2C_EXT1_RST;
121 case PERIPH_I2S0_MODULE:
122 return DPORT_I2S0_RST;
123 case PERIPH_I2S1_MODULE:
124 return DPORT_I2S1_RST;
125 case PERIPH_TIMG0_MODULE:
126 return DPORT_TIMERGROUP_RST;
127 case PERIPH_TIMG1_MODULE:
128 return DPORT_TIMERGROUP1_RST;
129 case PERIPH_PWM0_MODULE:
130 return DPORT_PWM0_RST;
131 case PERIPH_PWM1_MODULE:
132 return DPORT_PWM1_RST;
133 case PERIPH_PWM2_MODULE:
134 return DPORT_PWM2_RST;
135 case PERIPH_PWM3_MODULE:
136 return DPORT_PWM3_RST;
137 case PERIPH_UHCI0_MODULE:
138 return DPORT_UHCI0_RST;
139 case PERIPH_UHCI1_MODULE:
140 return DPORT_UHCI1_RST;
141 case PERIPH_RMT_MODULE:
142 return DPORT_RMT_RST;
143 case PERIPH_PCNT_MODULE:
144 return DPORT_PCNT_RST;
145 case PERIPH_SPI_MODULE:
146 return DPORT_SPI01_RST;
147 case PERIPH_HSPI_MODULE:
148 return DPORT_SPI2_RST;
149 case PERIPH_VSPI_MODULE:
150 return DPORT_SPI3_RST;
151 case PERIPH_SPI_DMA_MODULE:
152 return DPORT_SPI_DMA_RST;
153 case PERIPH_SDMMC_MODULE:
154 return DPORT_SDIO_HOST_RST;
155 case PERIPH_SDIO_SLAVE_MODULE:
156 return DPORT_SDIO_RST;
157 case PERIPH_TWAI_MODULE:
158 return DPORT_TWAI_RST;
159 case PERIPH_EMAC_MODULE:
160 return DPORT_EMAC_RST;
161 case PERIPH_AES_MODULE:
162 if (enable == true) {
163 // Clear reset on digital signature & secure boot units, otherwise AES unit is held in reset also.
164 return (DPORT_PERI_EN_AES | DPORT_PERI_EN_DIGITAL_SIGNATURE | DPORT_PERI_EN_SECUREBOOT);
165 } else {
166 //Don't return other units to reset, as this pulls reset on RSA & SHA units, respectively.
167 return DPORT_PERI_EN_AES;
168 }
169 case PERIPH_SHA_MODULE:
170 if (enable == true) {
171 // Clear reset on secure boot, otherwise SHA is held in reset
172 return (DPORT_PERI_EN_SHA | DPORT_PERI_EN_SECUREBOOT);
173 } else {
174 // Don't assert reset on secure boot, otherwise AES is held in reset
175 return DPORT_PERI_EN_SHA;
176 }
177 case PERIPH_RSA_MODULE:
178 if (enable == true) {
179 // Also clear reset on digital signature, otherwise RSA is held in reset
180 return (DPORT_PERI_EN_RSA | DPORT_PERI_EN_DIGITAL_SIGNATURE);
181 } else {
182 // Don't reset digital signature unit, as this resets AES also
183 return DPORT_PERI_EN_RSA;
184 }
185 default:
186 return 0;
187 }
188 }
189
periph_ll_get_clk_en_reg(periph_module_t periph)190 static inline uint32_t periph_ll_get_clk_en_reg(periph_module_t periph)
191 {
192 switch (periph) {
193 case PERIPH_AES_MODULE:
194 case PERIPH_SHA_MODULE:
195 case PERIPH_RSA_MODULE:
196 return DPORT_PERI_CLK_EN_REG;
197 case PERIPH_SDMMC_MODULE:
198 case PERIPH_SDIO_SLAVE_MODULE:
199 case PERIPH_EMAC_MODULE:
200 case PERIPH_RNG_MODULE:
201 case PERIPH_WIFI_MODULE:
202 case PERIPH_BT_MODULE:
203 case PERIPH_WIFI_BT_COMMON_MODULE:
204 case PERIPH_BT_BASEBAND_MODULE:
205 case PERIPH_BT_LC_MODULE:
206 return DPORT_WIFI_CLK_EN_REG;
207 default:
208 return DPORT_PERIP_CLK_EN_REG;
209 }
210 }
211
periph_ll_get_rst_en_reg(periph_module_t periph)212 static inline uint32_t periph_ll_get_rst_en_reg(periph_module_t periph)
213 {
214 switch (periph) {
215 case PERIPH_AES_MODULE:
216 case PERIPH_SHA_MODULE:
217 case PERIPH_RSA_MODULE:
218 return DPORT_PERI_RST_EN_REG;
219 case PERIPH_SDMMC_MODULE:
220 case PERIPH_SDIO_SLAVE_MODULE:
221 case PERIPH_EMAC_MODULE:
222 case PERIPH_RNG_MODULE:
223 case PERIPH_WIFI_MODULE:
224 case PERIPH_BT_MODULE:
225 case PERIPH_WIFI_BT_COMMON_MODULE:
226 case PERIPH_BT_BASEBAND_MODULE:
227 case PERIPH_BT_LC_MODULE:
228 return DPORT_CORE_RST_EN_REG;
229 default:
230 return DPORT_PERIP_RST_EN_REG;
231 }
232 }
233
periph_ll_enable_clk_clear_rst(periph_module_t periph)234 static inline void periph_ll_enable_clk_clear_rst(periph_module_t periph)
235 {
236 DPORT_SET_PERI_REG_MASK(periph_ll_get_clk_en_reg(periph), periph_ll_get_clk_en_mask(periph));
237 DPORT_CLEAR_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, true));
238 }
239
periph_ll_disable_clk_set_rst(periph_module_t periph)240 static inline void periph_ll_disable_clk_set_rst(periph_module_t periph)
241 {
242 DPORT_CLEAR_PERI_REG_MASK(periph_ll_get_clk_en_reg(periph), periph_ll_get_clk_en_mask(periph));
243 DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false));
244 }
245
periph_ll_wifi_bt_module_enable_clk_clear_rst(void)246 static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void)
247 {
248 DPORT_SET_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_BT_COMMON_M);
249 DPORT_CLEAR_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, 0);
250 }
251
periph_ll_wifi_bt_module_disable_clk_set_rst(void)252 static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void)
253 {
254 DPORT_CLEAR_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_BT_COMMON_M);
255 DPORT_SET_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, 0);
256 }
257
periph_ll_reset(periph_module_t periph)258 static inline void periph_ll_reset(periph_module_t periph)
259 {
260 DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false));
261 DPORT_CLEAR_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false));
262 }
263
periph_ll_periph_enabled(periph_module_t periph)264 static inline bool IRAM_ATTR periph_ll_periph_enabled(periph_module_t periph)
265 {
266 return DPORT_REG_GET_BIT(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)) == 0 &&
267 DPORT_REG_GET_BIT(periph_ll_get_clk_en_reg(periph), periph_ll_get_clk_en_mask(periph)) != 0;
268 }
269
periph_ll_wifi_module_enable_clk_clear_rst(void)270 static inline void periph_ll_wifi_module_enable_clk_clear_rst(void)
271 {
272 DPORT_SET_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_EN_M);
273 DPORT_CLEAR_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, 0);
274 }
275
periph_ll_wifi_module_disable_clk_set_rst(void)276 static inline void periph_ll_wifi_module_disable_clk_set_rst(void)
277 {
278 DPORT_CLEAR_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_EN_M);
279 DPORT_SET_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, 0);
280 }
281
282 #ifdef __cplusplus
283 }
284 #endif
285