Skip to content

Commit 4ac8a75

Browse files
Raffael Rostagnonashif
authored andcommitted
drivers: clock_control: esp32c2: Add support
Support for ESP32C2 and ESP8684 Signed-off-by: Raffael Rostagno <[email protected]>
1 parent fad55d1 commit 4ac8a75

File tree

4 files changed

+159
-16
lines changed

4 files changed

+159
-16
lines changed

drivers/clock_control/clock_control_esp32.c

Lines changed: 75 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,15 @@
2828
#include <zephyr/dt-bindings/clock/esp32s3_clock.h>
2929
#include <esp32s3/rom/rtc.h>
3030
#include <soc/dport_reg.h>
31-
#elif CONFIG_SOC_SERIES_ESP32C3
31+
#elif defined(CONFIG_SOC_SERIES_ESP32C2)
32+
#define DT_CPU_COMPAT espressif_riscv
33+
#include <zephyr/dt-bindings/clock/esp32c2_clock.h>
34+
#include <esp32c2/rom/rtc.h>
35+
#elif defined(CONFIG_SOC_SERIES_ESP32C3)
3236
#define DT_CPU_COMPAT espressif_riscv
3337
#include <zephyr/dt-bindings/clock/esp32c3_clock.h>
3438
#include <esp32c3/rom/rtc.h>
35-
#elif CONFIG_SOC_SERIES_ESP32C6
39+
#elif defined(CONFIG_SOC_SERIES_ESP32C6)
3640
#define DT_CPU_COMPAT espressif_riscv
3741
#include <zephyr/dt-bindings/clock/esp32c6_clock.h>
3842
#include <soc/lp_clkrst_reg.h>
@@ -71,7 +75,7 @@ static bool reset_reason_is_cpu_reset(void)
7175

7276
if ((rst_reason == RESET_REASON_CPU0_MWDT0 || rst_reason == RESET_REASON_CPU0_SW ||
7377
rst_reason == RESET_REASON_CPU0_RTC_WDT
74-
#if !defined(CONFIG_SOC_SERIES_ESP32)
78+
#if !defined(CONFIG_SOC_SERIES_ESP32) && !defined(CONFIG_SOC_SERIES_ESP32C2)
7579
|| rst_reason == RESET_REASON_CPU0_MWDT1
7680
#endif
7781
)) {
@@ -153,7 +157,9 @@ static void esp32_clock_perip_init(void)
153157
* that have been enabled before reset.
154158
*/
155159
if (reset_reason_is_cpu_reset()) {
156-
#if (defined(CONFIG_SOC_SERIES_ESP32C3) || defined(CONFIG_SOC_SERIES_ESP32S3))
160+
#if defined(CONFIG_SOC_SERIES_ESP32C2) || \
161+
defined(CONFIG_SOC_SERIES_ESP32C3) || \
162+
defined(CONFIG_SOC_SERIES_ESP32S3)
157163
common_perip_clk = ~READ_PERI_REG(SYSTEM_PERIP_CLK_EN0_REG);
158164
hwcrypto_perip_clk = ~READ_PERI_REG(SYSTEM_PERIP_CLK_EN1_REG);
159165
wifi_bt_sdio_clk = ~READ_PERI_REG(SYSTEM_WIFI_CLK_EN_REG);
@@ -168,7 +174,18 @@ static void esp32_clock_perip_init(void)
168174
#endif
169175
} else {
170176
common_perip_clk =
171-
#if (defined(CONFIG_SOC_SERIES_ESP32C3) || defined(CONFIG_SOC_SERIES_ESP32S3))
177+
#if defined(CONFIG_SOC_SERIES_ESP32C2)
178+
SYSTEM_SPI2_CLK_EN |
179+
#if ESP_CONSOLE_UART_NUM != 0
180+
SYSTEM_UART_CLK_EN |
181+
#endif
182+
#if ESP_CONSOLE_UART_NUM != 1
183+
SYSTEM_UART1_CLK_EN |
184+
#endif
185+
SYSTEM_LEDC_CLK_EN |
186+
SYSTEM_I2C_EXT0_CLK_EN |
187+
SYSTEM_LEDC_CLK_EN;
188+
#elif (defined(CONFIG_SOC_SERIES_ESP32C3) || defined(CONFIG_SOC_SERIES_ESP32S3))
172189
SYSTEM_WDG_CLK_EN |
173190
SYSTEM_I2S0_CLK_EN |
174191
#if ESP_CONSOLE_UART_NUM != 0
@@ -224,7 +241,7 @@ static void esp32_clock_perip_init(void)
224241
DPORT_SPI3_DMA_CLK_EN |
225242
#endif /* CONFIG_SOC_SERIES_ESP32S2 */
226243
DPORT_PWM3_CLK_EN;
227-
#endif /* CONFIG_SOC_SERIES_ESP32C3 || CONFIG_SOC_SERIES_ESP32S3 */
244+
#endif
228245

229246
#if !defined(CONFIG_SOC_SERIES_ESP32)
230247
common_perip_clk1 = 0;
@@ -241,14 +258,22 @@ static void esp32_clock_perip_init(void)
241258
DPORT_CRYPTO_SHA_CLK_EN |
242259
DPORT_CRYPTO_RSA_CLK_EN;
243260
#endif /* CONFIG_SOC_SERIES_ESP32S2 */
261+
#if defined(CONFIG_SOC_SERIES_ESP32C2)
262+
SYSTEM_CRYPTO_SHA_CLK_EN;
263+
#endif
244264
#if (defined(CONFIG_SOC_SERIES_ESP32C3) || defined(CONFIG_SOC_SERIES_ESP32S3))
245265
SYSTEM_CRYPTO_AES_CLK_EN |
246266
SYSTEM_CRYPTO_SHA_CLK_EN |
247267
SYSTEM_CRYPTO_RSA_CLK_EN;
248268
#endif /* CONFIG_SOC_SERIES_ESP32C3 || CONFIG_SOC_SERIES_ESP32S3 */
249269

250270
wifi_bt_sdio_clk =
251-
#if (defined(CONFIG_SOC_SERIES_ESP32C3) || defined(CONFIG_SOC_SERIES_ESP32S3))
271+
#if defined(CONFIG_SOC_SERIES_ESP32C2)
272+
SYSTEM_WIFI_CLK_WIFI_EN |
273+
SYSTEM_WIFI_CLK_BT_EN_M |
274+
SYSTEM_WIFI_CLK_UNUSED_BIT5 |
275+
SYSTEM_WIFI_CLK_UNUSED_BIT12;
276+
#elif (defined(CONFIG_SOC_SERIES_ESP32C3) || defined(CONFIG_SOC_SERIES_ESP32S3))
252277
SYSTEM_WIFI_CLK_WIFI_EN |
253278
SYSTEM_WIFI_CLK_BT_EN_M |
254279
SYSTEM_WIFI_CLK_I2C_CLK_EN |
@@ -269,7 +294,16 @@ static void esp32_clock_perip_init(void)
269294

270295
/* Reset peripherals like I2C, SPI, UART, I2S and bring them to known state */
271296
common_perip_clk |=
272-
#if (defined(CONFIG_SOC_SERIES_ESP32C3) || defined(CONFIG_SOC_SERIES_ESP32S3))
297+
#if defined(CONFIG_SOC_SERIES_ESP32C2)
298+
SYSTEM_SPI2_CLK_EN |
299+
#if ESP_CONSOLE_UART_NUM != 0
300+
SYSTEM_UART_CLK_EN |
301+
#endif
302+
#if ESP_CONSOLE_UART_NUM != 1
303+
SYSTEM_UART1_CLK_EN |
304+
#endif
305+
SYSTEM_I2C_EXT0_CLK_EN;
306+
#elif (defined(CONFIG_SOC_SERIES_ESP32C3) || defined(CONFIG_SOC_SERIES_ESP32S3))
273307
SYSTEM_I2S0_CLK_EN |
274308
#if ESP_CONSOLE_UART_NUM != 0
275309
SYSTEM_UART_CLK_EN |
@@ -354,7 +388,9 @@ static void esp32_clock_perip_init(void)
354388
#endif /* CONFIG_SOC_SERIES_ESP32S2 */
355389

356390
/* Disable some peripheral clocks. */
357-
#if (defined(CONFIG_SOC_SERIES_ESP32C3) || defined(CONFIG_SOC_SERIES_ESP32S3))
391+
#if defined(CONFIG_SOC_SERIES_ESP32C2) || \
392+
defined(CONFIG_SOC_SERIES_ESP32C3) || \
393+
defined(CONFIG_SOC_SERIES_ESP32S3)
358394
CLEAR_PERI_REG_MASK(SYSTEM_PERIP_CLK_EN0_REG, common_perip_clk);
359395
SET_PERI_REG_MASK(SYSTEM_PERIP_RST_EN0_REG, common_perip_clk);
360396

@@ -371,7 +407,9 @@ static void esp32_clock_perip_init(void)
371407
#endif
372408

373409
/* Disable hardware crypto clocks. */
374-
#if (defined(CONFIG_SOC_SERIES_ESP32C3) || defined(CONFIG_SOC_SERIES_ESP32S3))
410+
#if defined(CONFIG_SOC_SERIES_ESP32C2) || \
411+
defined(CONFIG_SOC_SERIES_ESP32C3) || \
412+
defined(CONFIG_SOC_SERIES_ESP32S3)
375413
CLEAR_PERI_REG_MASK(SYSTEM_PERIP_CLK_EN1_REG, hwcrypto_perip_clk);
376414
SET_PERI_REG_MASK(SYSTEM_PERIP_RST_EN1_REG, hwcrypto_perip_clk);
377415
#elif defined(CONFIG_SOC_SERIES_ESP32)
@@ -391,7 +429,9 @@ static void esp32_clock_perip_init(void)
391429
#endif /* CONFIG_SOC_SERIES_ESP32S3 */
392430

393431
/* Disable WiFi/BT/SDIO clocks. */
394-
#if (defined(CONFIG_SOC_SERIES_ESP32C3) || defined(CONFIG_SOC_SERIES_ESP32S3))
432+
#if defined(CONFIG_SOC_SERIES_ESP32C2) || \
433+
defined(CONFIG_SOC_SERIES_ESP32C3) || \
434+
defined(CONFIG_SOC_SERIES_ESP32S3)
395435
CLEAR_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, wifi_bt_sdio_clk);
396436
SET_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_EN);
397437
#else /* CONFIG_SOC_SERIES_ESP32 || CONFIG_SOC_SERIES_ESP32S2 */
@@ -403,7 +443,9 @@ static void esp32_clock_perip_init(void)
403443
DPORT_SET_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_EN);
404444
#endif
405445

406-
#if (defined(CONFIG_SOC_SERIES_ESP32C3) || defined(CONFIG_SOC_SERIES_ESP32S3))
446+
#if defined(CONFIG_SOC_SERIES_ESP32C2) || \
447+
defined(CONFIG_SOC_SERIES_ESP32C3) || \
448+
defined(CONFIG_SOC_SERIES_ESP32S3)
407449
/* Set WiFi light sleep clock source to RTC slow clock */
408450
REG_SET_FIELD(SYSTEM_BT_LPCK_DIV_INT_REG, SYSTEM_BT_LPCK_DIV_NUM, 0);
409451
CLEAR_PERI_REG_MASK(SYSTEM_BT_LPCK_DIV_FRAC_REG, SYSTEM_LPCLK_SEL_8M);
@@ -418,7 +460,9 @@ static void esp32_clock_perip_init(void)
418460
/* Enable RNG clock. */
419461
periph_module_enable(PERIPH_RNG_MODULE);
420462

421-
#if (defined(CONFIG_SOC_SERIES_ESP32C3) || defined(CONFIG_SOC_SERIES_ESP32S3))
463+
#if defined(CONFIG_SOC_SERIES_ESP32C2) || \
464+
defined(CONFIG_SOC_SERIES_ESP32C3) || \
465+
defined(CONFIG_SOC_SERIES_ESP32S3)
422466
periph_module_enable(PERIPH_TIMG0_MODULE);
423467
#endif
424468
}
@@ -494,6 +538,17 @@ static int esp32_select_rtc_slow_clk(uint8_t slow_clk)
494538
int retry_32k_xtal = 3;
495539

496540
do {
541+
#if defined(CONFIG_SOC_SERIES_ESP32C2)
542+
if (rtc_slow_clk_src == ESP32_RTC_SLOW_CLK_SRC_OSC_SLOW) {
543+
/* external clock needs to be connected to PIN0 before it can
544+
* be used. Here we use rtc_clk_cal function to count
545+
* the number of ext clk cycles in the given number of ext clk
546+
* cycles. If the ext clk has not started up, calibration
547+
* will time out, returning 0.
548+
*/
549+
LOG_DBG("waiting for external clock by pin0 to start up");
550+
rtc_clk_32k_enable_external();
551+
#else
497552
if (rtc_slow_clk_src == ESP32_RTC_SLOW_CLK_SRC_XTAL32K) {
498553
/* 32k XTAL oscillator needs to be enabled and running before it can
499554
* be used. Hardware doesn't have a direct way of checking if the
@@ -508,11 +563,17 @@ static int esp32_select_rtc_slow_clk(uint8_t slow_clk)
508563
} else if (slow_clk == ESP32_RTC_SLOW_CLK_32K_EXT_OSC) {
509564
rtc_clk_32k_enable_external();
510565
}
566+
#endif
511567
/* When CONFIG_RTC_CLK_CAL_CYCLES is set to 0, clock calibration will not be
512568
* performed at startup.
513569
*/
514570
if (CONFIG_RTC_CLK_CAL_CYCLES > 0) {
571+
#if defined(CONFIG_SOC_SERIES_ESP32C2)
572+
cal_val = rtc_clk_cal(RTC_CAL_32K_OSC_SLOW,
573+
CONFIG_RTC_CLK_CAL_CYCLES);
574+
#else
515575
cal_val = rtc_clk_cal(RTC_CAL_32K_XTAL, CONFIG_RTC_CLK_CAL_CYCLES);
576+
#endif
516577
if (cal_val == 0) {
517578
if (retry_32k_xtal-- > 0) {
518579
continue;
@@ -624,7 +685,7 @@ static int esp32_cpu_clock_configure(const struct esp32_cpu_clock_config *cpu_cf
624685
esp_cpu_set_cycle_count((uint64_t)esp_cpu_get_cycle_count() * rtc_clk_cfg.cpu_freq_mhz /
625686
old_config.freq_mhz);
626687

627-
#if !defined(CONFIG_SOC_SERIES_ESP32C6)
688+
#if !defined(CONFIG_SOC_SERIES_ESP32C2) && !defined(CONFIG_SOC_SERIES_ESP32C6)
628689
#if ESP_ROM_UART_CLK_IS_XTAL
629690
uart_clock_src_hz = (uint32_t)rtc_clk_xtal_freq_get() * MHZ(1);
630691
#else

include/zephyr/drivers/clock_control/esp32_clock_control.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
#include <zephyr/dt-bindings/clock/esp32s2_clock.h>
1414
#elif defined(CONFIG_SOC_SERIES_ESP32S3)
1515
#include <zephyr/dt-bindings/clock/esp32s3_clock.h>
16+
#elif defined(CONFIG_SOC_SERIES_ESP32C2)
17+
#include <zephyr/dt-bindings/clock/esp32c2_clock.h>
1618
#elif defined(CONFIG_SOC_SERIES_ESP32C3)
1719
#include <zephyr/dt-bindings/clock/esp32c3_clock.h>
1820
#elif defined(CONFIG_SOC_SERIES_ESP32C6)
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
/*
2+
* Copyright (c) 2024 Espressif Systems (Shanghai) Co., Ltd.
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#ifndef ZEPHYR_INCLUDE_DT_BINDINGS_CLOCK_ESP32C2_H_
8+
#define ZEPHYR_INCLUDE_DT_BINDINGS_CLOCK_ESP32C2_H_
9+
10+
/* Supported CPU clock Sources */
11+
#define ESP32_CPU_CLK_SRC_XTAL 0U
12+
#define ESP32_CPU_CLK_SRC_PLL 1U
13+
#define ESP32_CLK_SRC_RC_FAST 2U
14+
15+
/* Supported CPU frequencies */
16+
#define ESP32_CLK_CPU_PLL_40M 40000000
17+
#define ESP32_CLK_CPU_PLL_60M 60000000
18+
#define ESP32_CLK_CPU_PLL_80M 80000000
19+
#define ESP32_CLK_CPU_PLL_120M 120000000
20+
#define ESP32_CLK_CPU_RC_FAST_FREQ 8750000
21+
22+
/* Supported XTAL frequencies */
23+
#define ESP32_CLK_XTAL_26M 26000000
24+
#define ESP32_CLK_XTAL_32M 32000000
25+
#define ESP32_CLK_XTAL_40M 40000000
26+
27+
/* Supported RTC fast clock sources */
28+
#define ESP32_RTC_FAST_CLK_SRC_XTAL_D2 0
29+
#define ESP32_RTC_FAST_CLK_SRC_RC_FAST 1
30+
31+
/* Supported RTC slow clock sources */
32+
#define ESP32_RTC_SLOW_CLK_SRC_RC_SLOW 0
33+
#define ESP32_RTC_SLOW_CLK_SRC_OSC_SLOW 1
34+
#define ESP32_RTC_SLOW_CLK_SRC_RC_FAST_D256 2
35+
36+
/* RTC slow clock frequencies */
37+
#define ESP32_RTC_SLOW_CLK_SRC_RC_SLOW_FREQ 136000
38+
#define ESP32_RTC_SLOW_CLK_SRC_OSC_SLOW_FREQ 32768
39+
#define ESP32_RTC_SLOW_CLK_SRC_RC_FAST_D256_FREQ 68359
40+
41+
/* Modules IDs
42+
* These IDs are actually offsets in CLK and RST Control registers.
43+
* These IDs shouldn't be changed unless there is a Hardware change
44+
* from Espressif.
45+
*
46+
* Basic Modules
47+
* Registers: DPORT_PERIP_CLK_EN_REG, DPORT_PERIP_RST_EN_REG
48+
*/
49+
#define ESP32_LEDC_MODULE 0
50+
#define ESP32_UART0_MODULE 1
51+
#define ESP32_UART1_MODULE 2
52+
#define ESP32_I2C0_MODULE 3
53+
#define ESP32_TIMG0_MODULE 4
54+
#define ESP32_TIMG1_MODULE 5 /* No timg1 on esp32c2, TODO: IDF-3825 */
55+
#define ESP32_UHCI0_MODULE 6
56+
#define ESP32_SPI_MODULE 7 /* SPI1 */
57+
#define ESP32_SPI2_MODULE 8 /* SPI2 */
58+
#define ESP32_RNG_MODULE 9
59+
#define ESP32_WIFI_MODULE 10
60+
#define ESP32_BT_MODULE 11
61+
#define ESP32_WIFI_BT_COMMON_MODULE 12
62+
#define ESP32_BT_BASEBAND_MODULE 13
63+
#define ESP32_BT_LC_MODULE 14
64+
#define ESP32_AES_MODULE 15
65+
#define ESP32_SHA_MODULE 16
66+
#define ESP32_ECC_MODULE 17
67+
#define ESP32_GDMA_MODULE 18
68+
#define ESP32_SYSTIMER_MODULE 19
69+
#define ESP32_SARADC_MODULE 20
70+
#define ESP32_TEMPSENSOR_MODULE 21
71+
#define ESP32_MODEM_RPA_MODULE 22
72+
#define ESP32_MODULE_MAX 23
73+
74+
#endif /* ZEPHYR_INCLUDE_DT_BINDINGS_CLOCK_ESP32C2_H_ */

tests/boards/espressif_esp32/rtc_clk/src/rtc_clk_test.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
#define DT_CPU_COMPAT espressif_xtensa_lx6
1616
#elif defined(CONFIG_SOC_SERIES_ESP32S2) || defined(CONFIG_SOC_SERIES_ESP32S3)
1717
#define DT_CPU_COMPAT espressif_xtensa_lx7
18-
#elif defined(CONFIG_SOC_SERIES_ESP32C3) || defined(CONFIG_SOC_SERIES_ESP32C6)
18+
#elif defined(CONFIG_SOC_SERIES_ESP32C2) || defined(CONFIG_SOC_SERIES_ESP32C3) || \
19+
defined(CONFIG_SOC_SERIES_ESP32C6)
1920
#define DT_CPU_COMPAT espressif_riscv
2021
#endif
2122

@@ -74,8 +75,13 @@ ZTEST(rtc_clk, test_cpu_xtal_src)
7475

7576
uint32_t rtc_pll_src_freq_mhz[] = {
7677
ESP32_CLK_CPU_PLL_80M,
78+
#if defined(CONFIG_SOC_SERIES_ESP32C2)
79+
ESP32_CLK_CPU_PLL_120M,
80+
#else
7781
ESP32_CLK_CPU_PLL_160M,
78-
#if !defined(CONFIG_SOC_SERIES_ESP32C3) && !defined(CONFIG_SOC_SERIES_ESP32C6)
82+
#endif
83+
#if !defined(CONFIG_SOC_SERIES_ESP32C2) && !defined(CONFIG_SOC_SERIES_ESP32C3) && \
84+
!defined(CONFIG_SOC_SERIES_ESP32C6)
7985
ESP32_CLK_CPU_PLL_240M,
8086
#endif
8187
};

0 commit comments

Comments
 (0)