mirror of
https://github.com/apache/nuttx.git
synced 2026-05-30 21:36:28 +08:00
xtensa/esp32: Changes in rtc driver to support rtc wdt driver
This commit is contained in:
committed by
Abdelatif Guettouche
parent
ecede04263
commit
be12c79c52
@@ -30,6 +30,7 @@
|
|||||||
#include "hardware/esp32_rtccntl.h"
|
#include "hardware/esp32_rtccntl.h"
|
||||||
#include "hardware/esp32_dport.h"
|
#include "hardware/esp32_dport.h"
|
||||||
#include "hardware/esp32_i2s.h"
|
#include "hardware/esp32_i2s.h"
|
||||||
|
#include "esp32_rtc.h"
|
||||||
#include "xtensa.h"
|
#include "xtensa.h"
|
||||||
#include "xtensa_attr.h"
|
#include "xtensa_attr.h"
|
||||||
|
|
||||||
@@ -79,18 +80,9 @@
|
|||||||
|
|
||||||
#define RTC_FAST_CLK_FREQ_APPROX 8500000
|
#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. */
|
/* Disable logging from the ROM code. */
|
||||||
|
|
||||||
#define RTC_DISABLE_ROM_LOG ((1 << 0) | (1 << 16))
|
#define RTC_DISABLE_ROM_LOG ((1 << 0) | (1 << 16))
|
||||||
#define EXT_OSC_FLAG BIT(3)
|
|
||||||
|
|
||||||
/* Default initializer for esp32_rtc_sleep_config_t
|
/* Default initializer for esp32_rtc_sleep_config_t
|
||||||
* This initializer sets all fields to "reasonable" values
|
* This initializer sets all fields to "reasonable" values
|
||||||
@@ -136,56 +128,6 @@
|
|||||||
* Private Types
|
* 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 */
|
/* RTC power and clock control initialization settings */
|
||||||
|
|
||||||
struct esp32_rtc_priv_s
|
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);
|
enum esp32_rtc_fast_freq_e fast_freq);
|
||||||
static uint32_t IRAM_ATTR esp32_rtc_clk_cal_internal(
|
static uint32_t IRAM_ATTR esp32_rtc_clk_cal_internal(
|
||||||
enum esp32_rtc_cal_sel_e cal_clk, uint32_t slowclk_cycles);
|
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(
|
static void IRAM_ATTR esp32_rtc_clk_slow_freq_set(
|
||||||
enum esp32_rtc_slow_freq_e slow_freq);
|
enum esp32_rtc_slow_freq_e slow_freq);
|
||||||
static void esp32_select_rtc_slow_clk(enum esp32_slow_clk_sel_e slow_clk);
|
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);
|
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
|
* 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
|
* 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)
|
enum esp32_rtc_xtal_freq_e rtc_get_xtal(void)
|
||||||
__attribute__((alias("esp32_rtc_clk_xtal_freq_get")));
|
__attribute__((alias("esp32_rtc_clk_xtal_freq_get")));
|
||||||
|
|
||||||
|
|||||||
@@ -30,6 +30,7 @@
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#include <nuttx/config.h>
|
#include <nuttx/config.h>
|
||||||
|
#include "hardware/esp32_soc.h"
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
@@ -42,6 +43,24 @@ extern "C"
|
|||||||
#define EXTERN extern
|
#define EXTERN extern
|
||||||
#endif
|
#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
|
* Public Types
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
@@ -58,10 +77,98 @@ enum esp32_rtc_xtal_freq_e
|
|||||||
RTC_XTAL_FREQ_24M = 24, /* 24 MHz XTAL */
|
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
|
* 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
|
* Name: esp32_rtc_clk_xtal_freq_get
|
||||||
*
|
*
|
||||||
|
|||||||
Reference in New Issue
Block a user