2022-03-25 06:41:25 -04:00
/*
* SPDX - FileCopyrightText : 2022 Espressif Systems ( Shanghai ) CO LTD
*
* SPDX - License - Identifier : Apache - 2.0
*/
# pragma once
# ifdef __cplusplus
extern " C " {
# endif
2022-04-24 03:12:14 -04:00
/*
2022-03-25 06:41:25 -04:00
* * * * * * * * * * * * * * * * * * * * * * * * ESP32C2 Root Clock Source * * * * * * * * * * * * * * * * * * * * * * * * * * *
* 1 ) Internal 20 MHz RC Oscillator : RC_FAST ( usually referred as FOSC or CK8M / CLK8M in TRM and reg . description )
*
* This RC oscillator generates a ~ 17.5 MHz clock signal output as the RC_FAST_CLK .
* The ~ 17.5 MHz signal output is also passed into a configurable divider , which by default divides the input clock
* frequency by 256 , to generate a RC_FAST_D256_CLK ( usually referred as 8 md256 or simply d256 in reg . description ) .
*
* The exact frequency of RC_FAST_CLK can be computed in runtime through calibration on the RC_FAST_D256_CLK .
*
* 2 ) External 40 MHz Crystal Clock : XTAL
*
* 3 ) Internal 1500 kHz RC Oscillator : RC_SLOW ( usually referrred as RTC in TRM or reg . description )
*
* This RC oscillator generates a ~ 150 kHz clock signal output as the RC_SLOW_CLK . The exact frequency of this clock
* can be computed in runtime through calibration .
*
2022-04-21 06:24:03 -04:00
* 4 ) External Slow Clock ( optional ) : OSC_SLOW
2022-03-25 06:41:25 -04:00
*
2022-04-21 06:24:03 -04:00
* A clock signal generated by an external circuit with frequency no more than 150 kHz can be connected to GPIO0 pin
* to be the clock source for the RTC_SLOW_CLK .
2022-03-25 06:41:25 -04:00
*
2022-04-21 06:24:03 -04:00
* OSC_SLOW_CLK can also be calibrated to get its exact frequency .
2022-03-25 06:41:25 -04:00
*/
/* With the default value of CK8M_DFREQ = 100, RC_FAST clock frequency is 17.5 MHz +/- 7% */
# define SOC_CLK_RC_FAST_FREQ_APPROX 17500000
# define SOC_CLK_RC_SLOW_FREQ_APPROX 150000
# define SOC_CLK_RC_FAST_D256_FREQ_APPROX (SOC_CLK_RC_FAST_FREQ_APPROX / 256)
2022-04-21 06:24:03 -04:00
# define SOC_CLK_OSC_SLOW_FREQ_APPROX 32768
2022-03-25 06:41:25 -04:00
/**
* @ brief Root clock
2022-05-11 03:52:09 -04:00
* Naming convention : SOC_ROOT_CLK_ { loc } _ { type } _ [ attr ]
2022-03-25 06:41:25 -04:00
* { loc } : EXT , INT
* { type } : XTAL , RC
2022-05-11 03:52:09 -04:00
* [ attr ] - optional : [ frequency ] , FAST , SLOW
2022-03-25 06:41:25 -04:00
*/
typedef enum {
SOC_ROOT_CLK_INT_RC_FAST , /*!< Internal 8MHz RC oscillator */
SOC_ROOT_CLK_INT_RC_SLOW , /*!< Internal 150kHz RC oscillator */
SOC_ROOT_CLK_EXT_XTAL , /*!< External 40MHz crystal */
2022-04-21 06:24:03 -04:00
SOC_ROOT_CLK_EXT_OSC_SLOW , /*!< External slow clock signal at GPIO0 */
2022-03-25 06:41:25 -04:00
} soc_root_clk_t ;
/**
* @ brief CPU_CLK mux inputs , which are the supported clock sources for the CPU_CLK
2022-04-21 06:24:03 -04:00
* @ note Enum values are matched with the register field values on purpose
2022-03-25 06:41:25 -04:00
*/
typedef enum {
2022-04-21 06:24:03 -04:00
SOC_CPU_CLK_SRC_XTAL = 0 , /*!< Select XTAL_CLK as CPU_CLK source */
SOC_CPU_CLK_SRC_PLL = 1 , /*!< Select PLL_CLK as CPU_CLK source (PLL_CLK is the output of 40MHz crystal oscillator frequency multiplier, 480MHz) */
SOC_CPU_CLK_SRC_RC_FAST = 2 , /*!< Select RC_FAST_CLK as CPU_CLK source */
2022-03-25 06:41:25 -04:00
} soc_cpu_clk_src_t ;
/**
* @ brief RTC_SLOW_CLK mux inputs , which are the supported clock sources for the RTC_SLOW_CLK
2022-04-21 06:24:03 -04:00
* @ note Enum values are matched with the register field values on purpose
2022-03-25 06:41:25 -04:00
*/
typedef enum {
2022-04-21 06:24:03 -04:00
SOC_RTC_SLOW_CLK_SRC_RC_SLOW = 0 , /*!< Select RC_SLOW_CLK as RTC_SLOW_CLK source */
SOC_RTC_SLOW_CLK_SRC_OSC_SLOW = 1 , /*!< Select OSC_SLOW_CLK as RTC_SLOW_CLK source */
SOC_RTC_SLOW_CLK_SRC_RC_FAST_D256 = 2 , /*!< Select RC_FAST_D256_CLK (referred as FOSC_DIV or 8m_d256/8md256 in TRM and reg. description) as RTC_SLOW_CLK source */
2022-03-25 06:41:25 -04:00
} soc_rtc_slow_clk_src_t ;
/**
* @ brief RTC_FAST_CLK mux inputs , which are the supported clock sources for the RTC_FAST_CLK
2022-04-21 06:24:03 -04:00
* @ note Enum values are matched with the register field values on purpose
2022-03-25 06:41:25 -04:00
*/
typedef enum {
2022-04-21 06:24:03 -04:00
SOC_RTC_FAST_CLK_SRC_XTAL_D2 = 0 , /*!< Select XTAL_D2_CLK (may referred as XTAL_CLK_DIV_2) as RTC_FAST_CLK source */
2022-03-25 06:41:25 -04:00
SOC_RTC_FAST_CLK_SRC_XTAL_DIV = SOC_RTC_FAST_CLK_SRC_XTAL_D2 , /*!< Alias name for `SOC_RTC_FAST_CLK_SRC_XTAL_D2` */
2022-04-21 06:24:03 -04:00
SOC_RTC_FAST_CLK_SRC_RC_FAST = 1 , /*!< Select RC_FAST_CLK as RTC_FAST_CLK source */
2022-03-25 06:41:25 -04:00
} soc_rtc_fast_clk_src_t ;
/**
2022-04-21 06:24:03 -04:00
* @ brief Supported clock sources for modules ( CPU , peripherals , RTC , etc . )
2022-05-11 03:52:09 -04:00
* Naming convention : SOC_MOD_CLK_ { [ upstream ] clock_name } _ [ attr ]
* { [ upstream ] clock_name } : ( BB ) PLL etc .
* [ attr ] - optional : FAST , SLOW , D < divider > , F < freq >
2022-04-13 01:12:30 -04:00
* @ note enum starts from 1 , to save 0 for special purpose
2022-03-25 06:41:25 -04:00
*/
typedef enum {
// For CPU domain
SOC_MOD_CLK_CPU = 1 , /*< CPU_CLK can be sourced from XTAL, PLL, or RC_FAST by configuring soc_cpu_clk_src_t */
// For RTC domain
SOC_MOD_CLK_RTC_FAST = 2 , /*< RTC_FAST_CLK can be sourced from XTAL_D2 or RC_FAST by configuring soc_rtc_fast_clk_src_t */
SOC_MOD_CLK_RTC_SLOW = 3 , /*< RTC_SLOW_CLK can be sourced from RC_SLOW, XTAL32K, or RC_FAST_D256 by configuring soc_rtc_slow_clk_src_t */
// For digital domain: peripherals, WIFI, BLE
SOC_MOD_CLK_PLL_F40M = 4 , /*< PLL_F40M_CLK is derived from PLL, and has a fixed frequency of 40MHz */
SOC_MOD_CLK_PLL_F60M = 5 , /*< PLL_F60M_CLK is derived from PLL, and has a fixed frequency of 60MHz */
SOC_MOD_CLK_PLL_F80M = 6 , /*< PLL_F80M_CLK is derived from PLL, and has a fixed frequency of 80MHz */
2022-04-21 06:24:03 -04:00
SOC_MOD_CLK_OSC_SLOW = 7 , /*< OSC_SLOW_CLK comes from an external slow clock signal, passing a clock gating to the peripherals */
2022-03-25 06:41:25 -04:00
SOC_MOD_CLK_RC_FAST = 8 , /*< RC_FAST_CLK comes from the internal 20MHz rc oscillator, passing a clock gating to the peripherals */
SOC_MOD_CLK_RC_FAST_D256 = 9 , /*< RC_FAST_D256_CLK comes from the internal 20MHz rc oscillator, divided by 256, and passing a clock gating to the peripherals */
SOC_MOD_CLK_XTAL = 10 , /*< XTAL_CLK comes from the external 40MHz crystal */
} soc_module_clk_t ;
2022-04-13 01:12:30 -04:00
//////////////////////////////////////////////////GPTimer///////////////////////////////////////////////////////////////
2022-03-25 06:41:25 -04:00
2022-04-13 01:12:30 -04:00
/**
* @ brief Array initializer for all supported clock sources of GPTimer
* The following code can be used to iterate all possible clocks :
* @ code { c }
* soc_periph_gptimer_clk_src_t gptimer_clks [ ] = ( soc_periph_gptimer_clk_src_t ) SOC_GPTIMER_CLKS ;
* for ( size_t i = 0 ; i < sizeof ( gptimer_clks ) / sizeof ( gptimer_clks [ 0 ] ) ; i + + ) {
* soc_periph_gptimer_clk_src_t clk = gptimer_clks [ i ] ;
* // Test GPTimer with the clock `clk`
* }
* @ endcode
*/
# define SOC_GPTIMER_CLKS {SOC_MOD_CLK_PLL_F40M, SOC_MOD_CLK_XTAL}
/**
* @ brief Type of GPTimer clock source
*/
2022-03-25 06:41:25 -04:00
typedef enum {
2022-04-13 01:12:30 -04:00
GPTIMER_CLK_SRC_PLL_F40M = SOC_MOD_CLK_PLL_F40M , /*!< Select PLL_F40M as the source clock */
GPTIMER_CLK_SRC_XTAL = SOC_MOD_CLK_XTAL , /*!< Select XTAL as the source clock */
GPTIMER_CLK_SRC_DEFAULT = SOC_MOD_CLK_PLL_F40M , /*!< Select PLL_F40M as the default choice */
2022-03-25 06:41:25 -04:00
} soc_periph_gptimer_clk_src_t ;
2022-04-13 01:12:30 -04:00
/**
* @ brief Type of Timer Group clock source , reserved for the legacy timer group driver
*/
typedef enum {
TIMER_SRC_CLK_PLL_F40M = SOC_MOD_CLK_PLL_F40M , /*!< Timer group clock source is PLL_F40M */
TIMER_SRC_CLK_XTAL = SOC_MOD_CLK_XTAL , /*!< Timer group clock source is XTAL */
TIMER_SRC_CLK_DEFAULT = SOC_MOD_CLK_PLL_F40M , /*!< Timer group clock source default choice is PLL_F40M */
} soc_periph_tg_clk_src_legacy_t ;
//////////////////////////////////////////////////Temp Sensor///////////////////////////////////////////////////////////
/**
* @ brief Array initializer for all supported clock sources of Temperature Sensor
*/
# define SOC_TEMP_SENSOR_CLKS {SOC_MOD_CLK_XTAL, SOC_MOD_CLK_RC_FAST}
/**
* @ brief Type of Temp Sensor clock source
*/
2022-03-25 06:41:25 -04:00
typedef enum {
2022-04-13 01:12:30 -04:00
TEMPERATURE_SENSOR_CLK_SRC_XTAL = SOC_MOD_CLK_XTAL , /*!< Select XTAL as the source clock */
TEMPERATURE_SENSOR_CLK_SRC_RC_FAST = SOC_MOD_CLK_RC_FAST , /*!< Select RC_FAST as the source clock */
TEMPERATURE_SENSOR_CLK_SRC_DEFAULT = SOC_MOD_CLK_XTAL , /*!< Select XTAL as the default choice */
2022-03-25 06:41:25 -04:00
} soc_periph_temperature_sensor_clk_src_t ;
2022-04-29 00:10:05 -04:00
///////////////////////////////////////////////////UART/////////////////////////////////////////////////////////////////
/**
* @ brief Type of UART clock source , reserved for the legacy UART driver
*/
typedef enum {
UART_SCLK_PLL_F40M = SOC_MOD_CLK_PLL_F40M , /*!< UART source clock is APB CLK */
UART_SCLK_RTC = SOC_MOD_CLK_RC_FAST , /*!< UART source clock is RC_FAST */
UART_SCLK_XTAL = SOC_MOD_CLK_XTAL , /*!< UART source clock is XTAL */
UART_SCLK_DEFAULT = SOC_MOD_CLK_PLL_F40M , /*!< UART source clock default choice is PLL_F40M */
} soc_periph_uart_clk_src_legacy_t ;
2022-03-25 06:41:25 -04:00
# ifdef __cplusplus
}
# endif