xtensa/esp32: Changes in rtc driver to support rtc wdt driver

This commit is contained in:
Sara Souza 2020-12-02 20:01:38 -03:00 committed by Abdelatif Guettouche
parent ecede04263
commit be12c79c52
2 changed files with 171 additions and 96 deletions

View File

@ -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")));

View File

@ -30,6 +30,7 @@
****************************************************************************/
#include <nuttx/config.h>
#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
*