Merge branch 'feature/add_rtc_xtal_cal_retry_option' into 'master'
esp32: Add a Kconfig option - Number of attempts to repeat 32k XTAL calibration Closes IDF-1479 See merge request espressif/esp-idf!7930
This commit is contained in:
commit
92a646aa4e
4 changed files with 47 additions and 6 deletions
|
@ -524,6 +524,16 @@ menu "ESP32-specific"
|
||||||
In case more value will help improve the definition of the launch of the crystal.
|
In case more value will help improve the definition of the launch of the crystal.
|
||||||
If the crystal could not start, it will be switched to internal RC.
|
If the crystal could not start, it will be switched to internal RC.
|
||||||
|
|
||||||
|
config ESP32_RTC_XTAL_CAL_RETRY
|
||||||
|
int "Number of attempts to repeat 32k XTAL calibration"
|
||||||
|
default 1
|
||||||
|
depends on ESP32_RTC_CLK_SRC_EXT_CRYS
|
||||||
|
help
|
||||||
|
Number of attempts to repeat 32k XTAL calibration
|
||||||
|
before giving up and switching to the internal RC.
|
||||||
|
Increase this option if the 32k crystal oscillator
|
||||||
|
does not start and switches to internal RC.
|
||||||
|
|
||||||
config ESP32_RTC_XTAL_BOOTSTRAP_CYCLES
|
config ESP32_RTC_XTAL_BOOTSTRAP_CYCLES
|
||||||
int "Bootstrap cycles for external 32kHz crystal"
|
int "Bootstrap cycles for external 32kHz crystal"
|
||||||
depends on ESP32_RTC_CLK_SRC_EXT_CRYS
|
depends on ESP32_RTC_CLK_SRC_EXT_CRYS
|
||||||
|
|
|
@ -41,8 +41,19 @@
|
||||||
*/
|
*/
|
||||||
#define SLOW_CLK_CAL_CYCLES CONFIG_ESP32_RTC_CLK_CAL_CYCLES
|
#define SLOW_CLK_CAL_CYCLES CONFIG_ESP32_RTC_CLK_CAL_CYCLES
|
||||||
|
|
||||||
|
#ifdef CONFIG_ESP32_RTC_XTAL_CAL_RETRY
|
||||||
|
#define RTC_XTAL_CAL_RETRY CONFIG_ESP32_RTC_XTAL_CAL_RETRY
|
||||||
|
#else
|
||||||
|
#define RTC_XTAL_CAL_RETRY 1
|
||||||
|
#endif
|
||||||
|
|
||||||
#define MHZ (1000000)
|
#define MHZ (1000000)
|
||||||
|
|
||||||
|
/* Lower threshold for a reasonably-looking calibration value for a 32k XTAL.
|
||||||
|
* The ideal value (assuming 32768 Hz frequency) is 1000000/32768*(2**19) = 16*10^6.
|
||||||
|
*/
|
||||||
|
#define MIN_32K_XTAL_CAL_VAL 15000000L
|
||||||
|
|
||||||
/* Indicates that this 32k oscillator gets input from external oscillator, rather
|
/* Indicates that this 32k oscillator gets input from external oscillator, rather
|
||||||
* than a crystal.
|
* than a crystal.
|
||||||
*/
|
*/
|
||||||
|
@ -172,6 +183,11 @@ static void select_rtc_slow_clk(slow_clk_sel_t slow_clk)
|
||||||
{
|
{
|
||||||
rtc_slow_freq_t rtc_slow_freq = slow_clk & RTC_CNTL_ANA_CLK_RTC_SEL_V;
|
rtc_slow_freq_t rtc_slow_freq = slow_clk & RTC_CNTL_ANA_CLK_RTC_SEL_V;
|
||||||
uint32_t cal_val = 0;
|
uint32_t cal_val = 0;
|
||||||
|
/* number of times to repeat 32k XTAL calibration
|
||||||
|
* before giving up and switching to the internal RC
|
||||||
|
*/
|
||||||
|
int retry_32k_xtal = RTC_XTAL_CAL_RETRY;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (rtc_slow_freq == RTC_SLOW_FREQ_32K_XTAL) {
|
if (rtc_slow_freq == RTC_SLOW_FREQ_32K_XTAL) {
|
||||||
/* 32k XTAL oscillator needs to be enabled and running before it can
|
/* 32k XTAL oscillator needs to be enabled and running before it can
|
||||||
|
@ -190,7 +206,10 @@ static void select_rtc_slow_clk(slow_clk_sel_t slow_clk)
|
||||||
// When SLOW_CLK_CAL_CYCLES is set to 0, clock calibration will not be performed at startup.
|
// When SLOW_CLK_CAL_CYCLES is set to 0, clock calibration will not be performed at startup.
|
||||||
if (SLOW_CLK_CAL_CYCLES > 0) {
|
if (SLOW_CLK_CAL_CYCLES > 0) {
|
||||||
cal_val = rtc_clk_cal(RTC_CAL_32K_XTAL, SLOW_CLK_CAL_CYCLES);
|
cal_val = rtc_clk_cal(RTC_CAL_32K_XTAL, SLOW_CLK_CAL_CYCLES);
|
||||||
if (cal_val == 0 || cal_val < 15000000L) {
|
if (cal_val == 0 || cal_val < MIN_32K_XTAL_CAL_VAL) {
|
||||||
|
if (retry_32k_xtal-- > 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
ESP_EARLY_LOGW(TAG, "32 kHz XTAL not found, switching to internal 150 kHz oscillator");
|
ESP_EARLY_LOGW(TAG, "32 kHz XTAL not found, switching to internal 150 kHz oscillator");
|
||||||
rtc_slow_freq = RTC_SLOW_FREQ_RTC;
|
rtc_slow_freq = RTC_SLOW_FREQ_RTC;
|
||||||
}
|
}
|
||||||
|
|
|
@ -457,6 +457,16 @@ menu "ESP32S2-specific"
|
||||||
In case more value will help improve the definition of the launch of the crystal.
|
In case more value will help improve the definition of the launch of the crystal.
|
||||||
If the crystal could not start, it will be switched to internal RC.
|
If the crystal could not start, it will be switched to internal RC.
|
||||||
|
|
||||||
|
config ESP32S2_RTC_XTAL_CAL_RETRY
|
||||||
|
int "Number of attempts to repeat 32k XTAL calibration"
|
||||||
|
default 3
|
||||||
|
depends on ESP32S2_RTC_CLK_SRC_EXT_CRYS
|
||||||
|
help
|
||||||
|
Number of attempts to repeat 32k XTAL calibration
|
||||||
|
before giving up and switching to the internal RC.
|
||||||
|
Increase this option if the 32k crystal oscillator
|
||||||
|
does not start and switches to internal RC.
|
||||||
|
|
||||||
config ESP32S2_DISABLE_BASIC_ROM_CONSOLE
|
config ESP32S2_DISABLE_BASIC_ROM_CONSOLE
|
||||||
bool "Permanently disable BASIC ROM Console"
|
bool "Permanently disable BASIC ROM Console"
|
||||||
default n
|
default n
|
||||||
|
|
|
@ -42,6 +42,12 @@
|
||||||
*/
|
*/
|
||||||
#define SLOW_CLK_CAL_CYCLES CONFIG_ESP32S2_RTC_CLK_CAL_CYCLES
|
#define SLOW_CLK_CAL_CYCLES CONFIG_ESP32S2_RTC_CLK_CAL_CYCLES
|
||||||
|
|
||||||
|
#ifdef CONFIG_ESP32S2_RTC_XTAL_CAL_RETRY
|
||||||
|
#define RTC_XTAL_CAL_RETRY CONFIG_ESP32S2_RTC_XTAL_CAL_RETRY
|
||||||
|
#else
|
||||||
|
#define RTC_XTAL_CAL_RETRY 1
|
||||||
|
#endif
|
||||||
|
|
||||||
#define MHZ (1000000)
|
#define MHZ (1000000)
|
||||||
|
|
||||||
/* Lower threshold for a reasonably-looking calibration value for a 32k XTAL.
|
/* Lower threshold for a reasonably-looking calibration value for a 32k XTAL.
|
||||||
|
@ -148,11 +154,7 @@ static void select_rtc_slow_clk(slow_clk_sel_t slow_clk)
|
||||||
/* number of times to repeat 32k XTAL calibration
|
/* number of times to repeat 32k XTAL calibration
|
||||||
* before giving up and switching to the internal RC
|
* before giving up and switching to the internal RC
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_IDF_TARGET_ESP32
|
int retry_32k_xtal = RTC_XTAL_CAL_RETRY;
|
||||||
int retry_32k_xtal = 1; /* don't change the behavior for the ESP32 */
|
|
||||||
#else
|
|
||||||
int retry_32k_xtal = 3;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (rtc_slow_freq == RTC_SLOW_FREQ_32K_XTAL) {
|
if (rtc_slow_freq == RTC_SLOW_FREQ_32K_XTAL) {
|
||||||
|
|
Loading…
Reference in a new issue