From be12c79c52106ca009aaa861cc3cc5b4b56df7a7 Mon Sep 17 00:00:00 2001 From: Sara Souza Date: Wed, 2 Dec 2020 20:01:38 -0300 Subject: [PATCH] xtensa/esp32: Changes in rtc driver to support rtc wdt driver --- arch/xtensa/src/esp32/esp32_rtc.c | 160 ++++++++++++------------------ arch/xtensa/src/esp32/esp32_rtc.h | 107 ++++++++++++++++++++ 2 files changed, 171 insertions(+), 96 deletions(-) diff --git a/arch/xtensa/src/esp32/esp32_rtc.c b/arch/xtensa/src/esp32/esp32_rtc.c index 2f0171fd29c..9e7e1307e1f 100644 --- a/arch/xtensa/src/esp32/esp32_rtc.c +++ b/arch/xtensa/src/esp32/esp32_rtc.c @@ -30,6 +30,7 @@ #include "hardware/esp32_rtccntl.h" #include "hardware/esp32_dport.h" #include "hardware/esp32_i2s.h" +#include "esp32_rtc.h" #include "xtensa.h" #include "xtensa_attr.h" @@ -79,18 +80,9 @@ #define RTC_FAST_CLK_FREQ_APPROX 8500000 -/* Number of cycles to wait from the 32k XTAL oscillator to - * consider it running. Larger values increase startup delay. - * Smaller values may cause false positive detection - * (i.e. oscillator runs for a few cycles and then stops). - */ - -#define SLOW_CLK_CAL_CYCLES 1024 - /* Disable logging from the ROM code. */ #define RTC_DISABLE_ROM_LOG ((1 << 0) | (1 << 16)) -#define EXT_OSC_FLAG BIT(3) /* Default initializer for esp32_rtc_sleep_config_t * This initializer sets all fields to "reasonable" values @@ -136,56 +128,6 @@ * Private Types ****************************************************************************/ -/* RTC SLOW_CLK frequency values */ - -enum esp32_rtc_slow_freq_e -{ - RTC_SLOW_FREQ_RTC = 0, /* Internal 150 kHz RC oscillator */ - RTC_SLOW_FREQ_32K_XTAL = 1, /* External 32 kHz XTAL */ - RTC_SLOW_FREQ_8MD256 = 2, /* Internal 8 MHz RC oscillator, divided by 256 */ -}; - -/* RTC FAST_CLK frequency values */ - -enum esp32_rtc_fast_freq_e -{ - RTC_FAST_FREQ_XTALD4 = 0, /* Main XTAL, divided by 4 */ - RTC_FAST_FREQ_8M = 1, /* Internal 8 MHz RC oscillator */ -}; - -/* This is almost the same as esp32_rtc_slow_freq_e, except that we define - * an extra enum member for the external 32k oscillator.For convenience, - * lower 2 bits should correspond to esp32_rtc_slow_freq_e values. - */ - -enum esp32_slow_clk_sel_e -{ - /* Internal 150 kHz RC oscillator */ - - SLOW_CLK_150K = RTC_SLOW_FREQ_RTC, - - /* External 32 kHz XTAL */ - - SLOW_CLK_32K_XTAL = RTC_SLOW_FREQ_32K_XTAL, - - /* Internal 8 MHz RC oscillator, divided by 256 */ - - SLOW_CLK_8MD256 = RTC_SLOW_FREQ_8MD256, - - /* External 32k oscillator connected to 32K_XP pin */ - - SLOW_CLK_32K_EXT_OSC = RTC_SLOW_FREQ_32K_XTAL | EXT_OSC_FLAG -}; - -/* Clock source to be calibrated using rtc_clk_cal function */ - -enum esp32_rtc_cal_sel_e -{ - RTC_CAL_RTC_MUX = 0, /* Currently selected RTC SLOW_CLK */ - RTC_CAL_8MD256 = 1, /* Internal 8 MHz RC oscillator, divided by 256 */ - RTC_CAL_32K_XTAL = 2 /* External 32 kHz XTAL */ -}; - /* RTC power and clock control initialization settings */ struct esp32_rtc_priv_s @@ -245,8 +187,6 @@ static void IRAM_ATTR esp32_rtc_clk_fast_freq_set( enum esp32_rtc_fast_freq_e fast_freq); static uint32_t IRAM_ATTR esp32_rtc_clk_cal_internal( enum esp32_rtc_cal_sel_e cal_clk, uint32_t slowclk_cycles); -static uint32_t IRAM_ATTR esp32_rtc_clk_cal(enum esp32_rtc_cal_sel_e cal_clk, - uint32_t slowclk_cycles); static void IRAM_ATTR esp32_rtc_clk_slow_freq_set( enum esp32_rtc_slow_freq_e slow_freq); static void esp32_select_rtc_slow_clk(enum esp32_slow_clk_sel_e slow_clk); @@ -475,41 +415,6 @@ static uint32_t IRAM_ATTR esp32_rtc_clk_cal_internal( return REG_GET_FIELD(TIMG_RTCCALICFG1_REG(0), TIMG_RTC_CALI_VALUE); } -/**************************************************************************** - * Name: esp32_rtc_clk_cal - * - * Description: - * Measure RTC slow clock's period, based on main XTAL frequency - * - * Input Parameters: - * cal_clk - clock to be measured - * slowclk_cycles - number of slow clock cycles to average - * - * Returned Value: - * Average slow clock period in microseconds, Q13.19 fixed point format - * or 0 if calibration has timed out - * - ****************************************************************************/ - -static uint32_t IRAM_ATTR esp32_rtc_clk_cal(enum esp32_rtc_cal_sel_e cal_clk, - uint32_t slowclk_cycles) -{ - enum esp32_rtc_xtal_freq_e xtal_freq; - uint64_t xtal_cycles; - uint64_t divider; - uint64_t period_64; - uint32_t period; - - xtal_freq = esp32_rtc_clk_xtal_freq_get(); - xtal_cycles = esp32_rtc_clk_cal_internal(cal_clk, slowclk_cycles); - divider = ((uint64_t)xtal_freq) * slowclk_cycles; - period_64 = ((xtal_cycles << RTC_CLK_CAL_FRACT) + divider / 2 - 1) - / divider; - period = (uint32_t)(period_64 & UINT32_MAX); - - return period; -} - /**************************************************************************** * Name: esp32_rtc_clk_slow_freq_set * @@ -574,6 +479,69 @@ static void esp32_select_rtc_slow_clk(enum esp32_slow_clk_sel_e slow_clk) * Public Functions ****************************************************************************/ +/**************************************************************************** + * Name: esp32_rtc_get_slow_clk_rtc + * + * Description: + * Get slow_clk_rtc source. + * + * Input Parameters: + * None + * + * Returned Value: + * The clock source: + * - SLOW_CK + * - CK_XTAL_32K + * - CK8M_D256_OUT + * + ****************************************************************************/ + +enum esp32_rtc_slow_freq_e IRAM_ATTR esp32_rtc_get_slow_clk(void) +{ + enum esp32_rtc_slow_freq_e slow_freq; + + /* Get the clock source for slow_clk_rtc */ + + slow_freq = REG_GET_FIELD(RTC_CNTL_CLK_CONF_REG, RTC_CNTL_ANA_CLK_RTC_SEL); + + return slow_freq; +} + +/**************************************************************************** + * Name: esp32_rtc_clk_cal + * + * Description: + * Measure RTC slow clock's period, based on main XTAL frequency + * + * Input Parameters: + * cal_clk - clock to be measured + * slowclk_cycles - number of slow clock cycles to average + * + * Returned Value: + * Average slow clock period in microseconds, Q13.19 fixed point format + * or 0 if calibration has timed out + * + ****************************************************************************/ + +uint32_t IRAM_ATTR esp32_rtc_clk_cal(enum esp32_rtc_cal_sel_e cal_clk, + uint32_t slowclk_cycles) +{ + enum esp32_rtc_xtal_freq_e xtal_freq; + uint64_t xtal_cycles; + uint64_t divider; + uint64_t period_64; + uint32_t period; + + xtal_freq = esp32_rtc_clk_xtal_freq_get(); + xtal_cycles = esp32_rtc_clk_cal_internal(cal_clk, slowclk_cycles); + divider = ((uint64_t)xtal_freq) * slowclk_cycles; + period_64 = ((xtal_cycles << RTC_CLK_CAL_FRACT) + divider / 2 - 1) + / divider; + period = (uint32_t)(period_64 & UINT32_MAX); + + return period; +} + enum esp32_rtc_xtal_freq_e rtc_get_xtal(void) __attribute__((alias("esp32_rtc_clk_xtal_freq_get"))); diff --git a/arch/xtensa/src/esp32/esp32_rtc.h b/arch/xtensa/src/esp32/esp32_rtc.h index 9fa886b4d24..20915158fb8 100644 --- a/arch/xtensa/src/esp32/esp32_rtc.h +++ b/arch/xtensa/src/esp32/esp32_rtc.h @@ -30,6 +30,7 @@ ****************************************************************************/ #include +#include "hardware/esp32_soc.h" #ifndef __ASSEMBLY__ @@ -42,6 +43,24 @@ extern "C" #define EXTERN extern #endif +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Number of cycles to wait from the 32k XTAL oscillator to + * consider it running. Larger values increase startup delay. + * Smaller values may cause false positive detection + * (i.e. oscillator runs for a few cycles and then stops). + */ + +#define SLOW_CLK_CAL_CYCLES 1024 + +/* Indicates that 32k oscillator gets input from external oscillator + * instead of a crystal. + */ + +#define EXT_OSC_FLAG BIT(3) + /**************************************************************************** * Public Types ****************************************************************************/ @@ -58,10 +77,98 @@ enum esp32_rtc_xtal_freq_e RTC_XTAL_FREQ_24M = 24, /* 24 MHz XTAL */ }; +/* RTC SLOW_CLK frequency values */ + +enum esp32_rtc_slow_freq_e +{ + RTC_SLOW_FREQ_RTC = 0, /* Internal 150 kHz RC oscillator */ + RTC_SLOW_FREQ_32K_XTAL = 1, /* External 32 kHz XTAL */ + RTC_SLOW_FREQ_8MD256 = 2, /* Internal 8 MHz RC oscillator, divided by 256 */ +}; + +/* RTC FAST_CLK frequency values */ + +enum esp32_rtc_fast_freq_e +{ + RTC_FAST_FREQ_XTALD4 = 0, /* Main XTAL, divided by 4 */ + RTC_FAST_FREQ_8M = 1, /* Internal 8 MHz RC oscillator */ +}; + +/* This is almost the same as esp32_rtc_slow_freq_e, except that we define + * an extra enum member for the external 32k oscillator. For convenience, + * lower 2 bits should correspond to esp32_rtc_slow_freq_e values. + */ + +enum esp32_slow_clk_sel_e +{ + /* Internal 150 kHz RC oscillator */ + + SLOW_CLK_150K = RTC_SLOW_FREQ_RTC, + + /* External 32 kHz XTAL */ + + SLOW_CLK_32K_XTAL = RTC_SLOW_FREQ_32K_XTAL, + + /* Internal 8 MHz RC oscillator, divided by 256 */ + + SLOW_CLK_8MD256 = RTC_SLOW_FREQ_8MD256, + + /* External 32k oscillator connected to 32K_XP pin */ + + SLOW_CLK_32K_EXT_OSC = RTC_SLOW_FREQ_32K_XTAL | EXT_OSC_FLAG +}; + +/* Clock source to be calibrated using rtc_clk_cal function */ + +enum esp32_rtc_cal_sel_e +{ + RTC_CAL_RTC_MUX = 0, /* Currently selected RTC SLOW_CLK */ + RTC_CAL_8MD256 = 1, /* Internal 8 MHz RC oscillator, divided by 256 */ + RTC_CAL_32K_XTAL = 2 /* External 32 kHz XTAL */ +}; + /**************************************************************************** * Public Function Prototypes ****************************************************************************/ +/**************************************************************************** + * Name: esp32_rtc_get_slow_clk_rtc + * + * Description: + * Get slow_clk_rtc source. + * + * Input Parameters: + * None + * + * Returned Value: + * The clock source: + * - SLOW_CK + * - CK_XTAL_32K + * - CK8M_D256_OUT + * + ****************************************************************************/ + +enum esp32_rtc_slow_freq_e esp32_rtc_get_slow_clk(void); + +/**************************************************************************** + * Name: esp32_rtc_clk_cal + * + * Description: + * Measure RTC slow clock's period, based on main XTAL frequency + * + * Input Parameters: + * cal_clk - clock to be measured + * slowclk_cycles - number of slow clock cycles to average + * + * Returned Value: + * Average slow clock period in microseconds, Q13.19 fixed point format + * or 0 if calibration has timed out + * + ****************************************************************************/ + +uint32_t esp32_rtc_clk_cal(enum esp32_rtc_cal_sel_e cal_clk, + uint32_t slowclk_cycles); + /**************************************************************************** * Name: esp32_rtc_clk_xtal_freq_get *