2626#include "esp_private/esp_clk.h"
2727#include "bootloader_clock.h"
2828#include "soc/syscon_reg.h"
29+ #include "hal/gpio_ll.h"
2930
3031ESP_LOG_ATTR_TAG (TAG , "clk" );
3132
@@ -225,6 +226,8 @@ __attribute__((weak)) void esp_perip_clk_init(void)
225226 /* For reason that only reset CPU, do not disable the clocks
226227 * that have been enabled before reset.
227228 */
229+ uint32_t hwcrypto_mask_in_perip1 = (SYSTEM_CRYPTO_HMAC_CLK_EN | SYSTEM_CRYPTO_DS_CLK_EN | SYSTEM_CRYPTO_RSA_CLK_EN | SYSTEM_CRYPTO_SHA_CLK_EN | SYSTEM_CRYPTO_AES_CLK_EN );
230+
228231 if ((rst_reas [0 ] == RESET_REASON_CPU0_MWDT0 || rst_reas [0 ] == RESET_REASON_CPU0_SW ||
229232 rst_reas [0 ] == RESET_REASON_CPU0_RTC_WDT || rst_reas [0 ] == RESET_REASON_CPU0_MWDT1 )
230233#if !CONFIG_ESP_SYSTEM_SINGLE_CORE_MODE
@@ -233,82 +236,91 @@ __attribute__((weak)) void esp_perip_clk_init(void)
233236#endif
234237 ) {
235238 common_perip_clk = ~READ_PERI_REG (SYSTEM_PERIP_CLK_EN0_REG );
236- hwcrypto_perip_clk = ~READ_PERI_REG (SYSTEM_PERIP_CLK_EN1_REG );
239+ common_perip_clk1 = (~READ_PERI_REG (SYSTEM_PERIP_CLK_EN1_REG )) & (~hwcrypto_mask_in_perip1 );
240+ hwcrypto_perip_clk = (~READ_PERI_REG (SYSTEM_PERIP_CLK_EN1_REG )) & hwcrypto_mask_in_perip1 ;
237241 wifi_bt_sdio_clk = ~READ_PERI_REG (SYSTEM_WIFI_CLK_EN_REG );
238242 } else {
239- common_perip_clk = SYSTEM_WDG_CLK_EN |
240- SYSTEM_I2S0_CLK_EN |
243+ common_perip_clk =
244+ SYSTEM_WDG_CLK_EN |
245+ SYSTEM_I2S0_CLK_EN |
241246#if CONFIG_ESP_CONSOLE_UART_NUM != 0
242- SYSTEM_UART_CLK_EN |
247+ SYSTEM_UART_CLK_EN |
243248#endif
244249#if CONFIG_ESP_CONSOLE_UART_NUM != 1
245- SYSTEM_UART1_CLK_EN |
250+ SYSTEM_UART1_CLK_EN |
246251#endif
252+ SYSTEM_USB_CLK_EN |
253+ SYSTEM_SPI2_CLK_EN |
254+ SYSTEM_I2C_EXT0_CLK_EN |
255+ SYSTEM_UHCI0_CLK_EN |
256+ SYSTEM_RMT_CLK_EN |
257+ SYSTEM_PCNT_CLK_EN |
258+ SYSTEM_LEDC_CLK_EN |
259+ SYSTEM_TIMERGROUP1_CLK_EN |
260+ SYSTEM_SPI3_CLK_EN |
261+ SYSTEM_SPI4_CLK_EN |
262+ SYSTEM_PWM0_CLK_EN |
263+ SYSTEM_TWAI_CLK_EN |
264+ SYSTEM_PWM1_CLK_EN |
265+ SYSTEM_I2S1_CLK_EN |
266+ SYSTEM_SPI2_DMA_CLK_EN |
267+ SYSTEM_SPI3_DMA_CLK_EN |
268+ SYSTEM_PWM2_CLK_EN |
269+ SYSTEM_PWM3_CLK_EN ;
270+ common_perip_clk1 =
247271#if CONFIG_ESP_CONSOLE_UART_NUM != 2
248- SYSTEM_UART2_CLK_EN |
272+ SYSTEM_UART2_CLK_EN |
249273#endif
250- SYSTEM_USB_CLK_EN |
251- SYSTEM_SPI2_CLK_EN |
252- SYSTEM_I2C_EXT0_CLK_EN |
253- SYSTEM_UHCI0_CLK_EN |
254- SYSTEM_RMT_CLK_EN |
255- SYSTEM_PCNT_CLK_EN |
256- SYSTEM_LEDC_CLK_EN |
257- SYSTEM_TIMERGROUP1_CLK_EN |
258- SYSTEM_SPI3_CLK_EN |
259- SYSTEM_SPI4_CLK_EN |
260- SYSTEM_PWM0_CLK_EN |
261- SYSTEM_TWAI_CLK_EN |
262- SYSTEM_PWM1_CLK_EN |
263- SYSTEM_I2S1_CLK_EN |
264- SYSTEM_SPI2_DMA_CLK_EN |
265- SYSTEM_SPI3_DMA_CLK_EN |
266- SYSTEM_PWM2_CLK_EN |
267- SYSTEM_PWM3_CLK_EN ;
268- common_perip_clk1 = 0 ;
269- hwcrypto_perip_clk = SYSTEM_CRYPTO_AES_CLK_EN |
270- SYSTEM_CRYPTO_SHA_CLK_EN |
271- SYSTEM_CRYPTO_RSA_CLK_EN ;
272- wifi_bt_sdio_clk = SYSTEM_WIFI_CLK_WIFI_EN |
273- SYSTEM_WIFI_CLK_BT_EN_M |
274- SYSTEM_WIFI_CLK_I2C_CLK_EN |
275- SYSTEM_WIFI_CLK_UNUSED_BIT12 |
276- SYSTEM_WIFI_CLK_SDIO_HOST_EN ;
274+ 0 ;
275+ hwcrypto_perip_clk =
276+ SYSTEM_CRYPTO_AES_CLK_EN |
277+ SYSTEM_CRYPTO_SHA_CLK_EN |
278+ SYSTEM_CRYPTO_RSA_CLK_EN ;
279+ wifi_bt_sdio_clk =
280+ SYSTEM_WIFI_CLK_WIFI_EN |
281+ SYSTEM_WIFI_CLK_BT_EN_M |
282+ SYSTEM_WIFI_CLK_I2C_CLK_EN |
283+ SYSTEM_WIFI_CLK_UNUSED_BIT12 |
284+ SYSTEM_WIFI_CLK_SDIO_HOST_EN ;
277285
278286#if !CONFIG_USJ_ENABLE_USB_SERIAL_JTAG && !CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG_ENABLED
279287 /* This function only called on startup thus is thread safe. To avoid build errors/warnings
280288 * declare __DECLARE_RCC_ATOMIC_ENV here. */
281289 int __DECLARE_RCC_ATOMIC_ENV __attribute__((unused ));
282290 // Disable USB-Serial-JTAG clock and it's pad if not used
283- usb_serial_jtag_ll_phy_enable_pad (false );
291+ usb_serial_jtag_ll_phy_enable_pad (false ); // should not reset USJ registers in the code below, otherwises, usb pad will be enabled again
284292 usb_serial_jtag_ll_enable_bus_clock (false);
285293#endif
286294 }
287295
288296 //Reset the communication peripherals like I2C, SPI, UART, I2S and bring them to known state.
289- common_perip_clk |= SYSTEM_I2S0_CLK_EN |
297+ common_perip_clk |=
298+ SYSTEM_I2S0_CLK_EN |
290299#if CONFIG_ESP_CONSOLE_UART_NUM != 0
291- SYSTEM_UART_CLK_EN |
300+ SYSTEM_UART_CLK_EN |
292301#endif
293302#if CONFIG_ESP_CONSOLE_UART_NUM != 1
294- SYSTEM_UART1_CLK_EN |
303+ SYSTEM_UART1_CLK_EN |
295304#endif
305+ SYSTEM_USB_CLK_EN |
306+ SYSTEM_SPI2_CLK_EN |
307+ SYSTEM_I2C_EXT0_CLK_EN |
308+ SYSTEM_UHCI0_CLK_EN |
309+ SYSTEM_RMT_CLK_EN |
310+ SYSTEM_UHCI1_CLK_EN |
311+ SYSTEM_SPI3_CLK_EN |
312+ SYSTEM_SPI4_CLK_EN |
313+ SYSTEM_I2C_EXT1_CLK_EN |
314+ SYSTEM_I2S1_CLK_EN |
315+ SYSTEM_SPI2_DMA_CLK_EN |
316+ SYSTEM_SPI3_DMA_CLK_EN ;
317+ common_perip_clk1 |=
296318#if CONFIG_ESP_CONSOLE_UART_NUM != 2
297- SYSTEM_UART2_CLK_EN |
319+ SYSTEM_UART2_CLK_EN |
298320#endif
299- SYSTEM_USB_CLK_EN |
300- SYSTEM_SPI2_CLK_EN |
301- SYSTEM_I2C_EXT0_CLK_EN |
302- SYSTEM_UHCI0_CLK_EN |
303- SYSTEM_RMT_CLK_EN |
304- SYSTEM_UHCI1_CLK_EN |
305- SYSTEM_SPI3_CLK_EN |
306- SYSTEM_SPI4_CLK_EN |
307- SYSTEM_I2C_EXT1_CLK_EN |
308- SYSTEM_I2S1_CLK_EN |
309- SYSTEM_SPI2_DMA_CLK_EN |
310- SYSTEM_SPI3_DMA_CLK_EN ;
311- common_perip_clk1 = 0 ;
321+ 0 ;
322+
323+ common_perip_clk1 &= ~SYSTEM_USB_DEVICE_CLK_EN ; // ignore USB-Serial-JTAG module, which has already been handled above (for non-CPU-reset cases)
312324
313325 /* Disable some peripheral clocks. */
314326 CLEAR_PERI_REG_MASK (SYSTEM_PERIP_CLK_EN0_REG , common_perip_clk );
0 commit comments