Skip to content

Commit da66cff

Browse files
sylvioalvescarlescufi
authored andcommitted
clock: esp32s3: add peripheral initialization
Update clock control source to enable proper ESP32S3 clock init. Signed-off-by: Sylvio Alves <[email protected]>
1 parent 839b97e commit da66cff

File tree

1 file changed

+107
-1
lines changed

1 file changed

+107
-1
lines changed

drivers/clock_control/clock_control_esp32.c

Lines changed: 107 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,12 @@
2121
#include <zephyr/dt-bindings/clock/esp32s2_clock.h>
2222
#include "esp32s2/rom/rtc.h"
2323
#include "soc/dport_reg.h"
24+
#elif defined(CONFIG_SOC_ESP32S3)
25+
#define DT_CPU_COMPAT cdns_tensilica_xtensa_lx7
26+
#include <zephyr/dt-bindings/clock/esp32s3_clock.h>
27+
#include "esp32s3/rom/rtc.h"
28+
#include "soc/dport_reg.h"
29+
#include "esp32s3/clk.h"
2430
#elif CONFIG_IDF_TARGET_ESP32C3
2531
#define DT_CPU_COMPAT espressif_riscv
2632
#include <zephyr/dt-bindings/clock/esp32c3_clock.h>
@@ -49,7 +55,7 @@ struct esp32_clock_config {
4955
};
5056

5157
static uint8_t const xtal_freq[] = {
52-
#if defined(CONFIG_SOC_ESP32) || defined(CONFIG_SOC_ESP32_NET)
58+
#if defined(CONFIG_SOC_ESP32) || defined(CONFIG_SOC_ESP32_NET) || defined(CONFIG_SOC_ESP32S3)
5359
[ESP32_CLK_XTAL_24M] = 24,
5460
[ESP32_CLK_XTAL_26M] = 26,
5561
[ESP32_CLK_XTAL_40M] = 40,
@@ -317,6 +323,106 @@ static void esp32_clock_perip_init(void)
317323
}
318324
#endif
319325

326+
#if defined(CONFIG_SOC_ESP32S3)
327+
static void esp32_clock_perip_init(void)
328+
{
329+
uint32_t common_perip_clk, hwcrypto_perip_clk, wifi_bt_sdio_clk = 0;
330+
uint32_t common_perip_clk1 = 0;
331+
332+
soc_reset_reason_t rst_reason = esp_rom_get_reset_reason(0);
333+
334+
/* For reason that only reset CPU, do not disable the clocks
335+
* that have been enabled before reset.
336+
*/
337+
if (rst_reason == RESET_REASON_CPU0_MWDT0 || rst_reason == RESET_REASON_CPU0_SW ||
338+
rst_reason == RESET_REASON_CPU0_RTC_WDT || rst_reason == RESET_REASON_CPU0_MWDT1) {
339+
common_perip_clk = ~READ_PERI_REG(SYSTEM_PERIP_CLK_EN0_REG);
340+
hwcrypto_perip_clk = ~READ_PERI_REG(SYSTEM_PERIP_CLK_EN1_REG);
341+
wifi_bt_sdio_clk = ~READ_PERI_REG(SYSTEM_WIFI_CLK_EN_REG);
342+
} else {
343+
common_perip_clk = SYSTEM_WDG_CLK_EN |
344+
SYSTEM_I2S0_CLK_EN |
345+
SYSTEM_UART1_CLK_EN |
346+
SYSTEM_UART2_CLK_EN |
347+
SYSTEM_USB_CLK_EN |
348+
SYSTEM_SPI2_CLK_EN |
349+
SYSTEM_I2C_EXT0_CLK_EN |
350+
SYSTEM_UHCI0_CLK_EN |
351+
SYSTEM_RMT_CLK_EN |
352+
SYSTEM_PCNT_CLK_EN |
353+
SYSTEM_LEDC_CLK_EN |
354+
SYSTEM_TIMERGROUP1_CLK_EN |
355+
SYSTEM_SPI3_CLK_EN |
356+
SYSTEM_SPI4_CLK_EN |
357+
SYSTEM_PWM0_CLK_EN |
358+
SYSTEM_TWAI_CLK_EN |
359+
SYSTEM_PWM1_CLK_EN |
360+
SYSTEM_I2S1_CLK_EN |
361+
SYSTEM_SPI2_DMA_CLK_EN |
362+
SYSTEM_SPI3_DMA_CLK_EN |
363+
SYSTEM_PWM2_CLK_EN |
364+
SYSTEM_PWM3_CLK_EN;
365+
366+
common_perip_clk1 = 0;
367+
368+
hwcrypto_perip_clk = SYSTEM_CRYPTO_AES_CLK_EN |
369+
SYSTEM_CRYPTO_SHA_CLK_EN |
370+
SYSTEM_CRYPTO_RSA_CLK_EN;
371+
372+
wifi_bt_sdio_clk = SYSTEM_WIFI_CLK_WIFI_EN |
373+
SYSTEM_WIFI_CLK_BT_EN_M |
374+
SYSTEM_WIFI_CLK_UNUSED_BIT5 |
375+
SYSTEM_WIFI_CLK_UNUSED_BIT12 |
376+
SYSTEM_WIFI_CLK_SDIO_HOST_EN;
377+
}
378+
379+
/* Reset peripherals like I2C, SPI, UART, I2S and bring them to known state */
380+
common_perip_clk |= SYSTEM_I2S0_CLK_EN |
381+
SYSTEM_UART1_CLK_EN |
382+
SYSTEM_UART2_CLK_EN |
383+
SYSTEM_USB_CLK_EN |
384+
SYSTEM_SPI2_CLK_EN |
385+
SYSTEM_I2C_EXT0_CLK_EN |
386+
SYSTEM_UHCI0_CLK_EN |
387+
SYSTEM_RMT_CLK_EN |
388+
SYSTEM_UHCI1_CLK_EN |
389+
SYSTEM_SPI3_CLK_EN |
390+
SYSTEM_SPI4_CLK_EN |
391+
SYSTEM_I2C_EXT1_CLK_EN |
392+
SYSTEM_I2S1_CLK_EN |
393+
SYSTEM_SPI2_DMA_CLK_EN |
394+
SYSTEM_SPI3_DMA_CLK_EN;
395+
396+
common_perip_clk1 = 0;
397+
398+
/* Disable some peripheral clocks. */
399+
CLEAR_PERI_REG_MASK(SYSTEM_PERIP_CLK_EN0_REG, common_perip_clk);
400+
SET_PERI_REG_MASK(SYSTEM_PERIP_RST_EN0_REG, common_perip_clk);
401+
402+
CLEAR_PERI_REG_MASK(SYSTEM_PERIP_CLK_EN1_REG, common_perip_clk1);
403+
SET_PERI_REG_MASK(SYSTEM_PERIP_RST_EN1_REG, common_perip_clk1);
404+
405+
/* Disable hardware crypto clocks. */
406+
CLEAR_PERI_REG_MASK(SYSTEM_PERIP_CLK_EN1_REG, hwcrypto_perip_clk);
407+
SET_PERI_REG_MASK(SYSTEM_PERIP_RST_EN1_REG, hwcrypto_perip_clk);
408+
409+
/* Disable WiFi/BT/SDIO clocks. */
410+
CLEAR_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, wifi_bt_sdio_clk);
411+
SET_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_EN);
412+
413+
/* Set WiFi light sleep clock source to RTC slow clock */
414+
REG_SET_FIELD(SYSTEM_BT_LPCK_DIV_INT_REG, SYSTEM_BT_LPCK_DIV_NUM, 0);
415+
CLEAR_PERI_REG_MASK(SYSTEM_BT_LPCK_DIV_FRAC_REG, SYSTEM_LPCLK_SEL_8M);
416+
SET_PERI_REG_MASK(SYSTEM_BT_LPCK_DIV_FRAC_REG, SYSTEM_LPCLK_SEL_RTC_SLOW);
417+
418+
/* Enable RNG clock. */
419+
periph_module_enable(PERIPH_RNG_MODULE);
420+
421+
esp_rom_uart_tx_wait_idle(0);
422+
esp_rom_uart_set_clock_baudrate(0, UART_CLK_FREQ_ROM, 115200);
423+
}
424+
#endif
425+
320426
#if defined(CONFIG_SOC_ESP32C3)
321427
static void esp32_clock_perip_init(void)
322428
{

0 commit comments

Comments
 (0)