Skip to content

Commit f1e6e66

Browse files
committed
Merge branch 'bugfix/usb_dp_pin_unusable_after_cpu_reset' into 'master'
fix(gpio): fix USB DP pin unusable after CPU reset for S3/C3 Closes IDFGH-16345 See merge request espressif/esp-idf!41694
2 parents e0b6934 + 15c5178 commit f1e6e66

File tree

2 files changed

+70
-56
lines changed
  • components/esp_system/port/soc

2 files changed

+70
-56
lines changed

components/esp_system/port/soc/esp32c3/clk.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -215,10 +215,13 @@ __attribute__((weak)) void esp_perip_clk_init(void)
215215
/* For reason that only reset CPU, do not disable the clocks
216216
* that have been enabled before reset.
217217
*/
218+
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);
219+
218220
if (rst_reason == RESET_REASON_CPU0_MWDT0 || rst_reason == RESET_REASON_CPU0_SW ||
219221
rst_reason == RESET_REASON_CPU0_RTC_WDT || rst_reason == RESET_REASON_CPU0_MWDT1) {
220222
common_perip_clk = ~READ_PERI_REG(SYSTEM_PERIP_CLK_EN0_REG);
221-
hwcrypto_perip_clk = ~READ_PERI_REG(SYSTEM_PERIP_CLK_EN1_REG);
223+
common_perip_clk1 = (~READ_PERI_REG(SYSTEM_PERIP_CLK_EN1_REG)) & (~hwcrypto_mask_in_perip1);
224+
hwcrypto_perip_clk = (~READ_PERI_REG(SYSTEM_PERIP_CLK_EN1_REG)) & hwcrypto_mask_in_perip1;
222225
wifi_bt_sdio_clk = ~READ_PERI_REG(SYSTEM_WIFI_CLK_EN_REG);
223226
} else {
224227
common_perip_clk = SYSTEM_WDG_CLK_EN |
@@ -238,7 +241,6 @@ __attribute__((weak)) void esp_perip_clk_init(void)
238241
SYSTEM_SPI3_CLK_EN |
239242
SYSTEM_SPI4_CLK_EN |
240243
SYSTEM_TWAI_CLK_EN |
241-
SYSTEM_I2S0_CLK_EN |
242244
SYSTEM_SPI2_DMA_CLK_EN |
243245
SYSTEM_SPI3_DMA_CLK_EN;
244246

@@ -256,7 +258,7 @@ __attribute__((weak)) void esp_perip_clk_init(void)
256258
* declare __DECLARE_RCC_ATOMIC_ENV here. */
257259
int __DECLARE_RCC_ATOMIC_ENV __attribute__((unused));
258260
// Disable USB-Serial-JTAG clock and it's pad if not used
259-
usb_serial_jtag_ll_phy_enable_pad(false);
261+
usb_serial_jtag_ll_phy_enable_pad(false); // should not reset USJ registers in the code below, otherwises, usb pad will be enabled again
260262
usb_serial_jtag_ll_enable_bus_clock(false);
261263
#endif
262264
}
@@ -277,10 +279,10 @@ __attribute__((weak)) void esp_perip_clk_init(void)
277279
SYSTEM_SPI3_CLK_EN |
278280
SYSTEM_SPI4_CLK_EN |
279281
SYSTEM_I2C_EXT1_CLK_EN |
280-
SYSTEM_I2S0_CLK_EN |
281282
SYSTEM_SPI2_DMA_CLK_EN |
282283
SYSTEM_SPI3_DMA_CLK_EN;
283-
common_perip_clk1 = 0;
284+
285+
common_perip_clk &= ~SYSTEM_USB_DEVICE_CLK_EN; // ignore USB-Serial-JTAG module, which has already been handled above (for non-CPU-reset cases)
284286

285287
/* Change I2S clock to audio PLL first. Because if I2S uses 160MHz clock,
286288
* the current is not reduced when disable I2S clock.

components/esp_system/port/soc/esp32s3/clk.c

Lines changed: 63 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
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

3031
ESP_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

Comments
 (0)