Skip to content

Commit 7863b3c

Browse files
author
Jiang Jiang Jian
committed
Merge branch 'fix/fix_32k_config_revoke_breaks_io_holding_v5.4' into 'release/v5.4'
fix(esp_system): fix ext 32k io revoking breaks sleep io holding (v5.4) See merge request espressif/esp-idf!42496
2 parents 59bbb31 + b20d8c1 commit 7863b3c

File tree

10 files changed

+54
-10
lines changed

10 files changed

+54
-10
lines changed

components/esp_system/port/soc/esp32/clk.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,9 @@ static void select_rtc_slow_clk(slow_clk_sel_t slow_clk)
6161
*/
6262
int retry_32k_xtal = RTC_XTAL_CAL_RETRY;
6363

64+
soc_rtc_slow_clk_src_t old_rtc_slow_clk_src = rtc_clk_slow_src_get();
6465
do {
66+
bool revoke_32k_enable = false;
6567
if (rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_XTAL32K) {
6668
/* 32k XTAL oscillator needs to be enabled and running before it can
6769
* be used. Hardware doesn't have a direct way of checking if the
@@ -85,13 +87,15 @@ static void select_rtc_slow_clk(slow_clk_sel_t slow_clk)
8587
}
8688
ESP_EARLY_LOGW(TAG, "32 kHz XTAL not found, switching to internal 150 kHz oscillator");
8789
rtc_slow_clk_src = SOC_RTC_SLOW_CLK_SRC_RC_SLOW;
90+
revoke_32k_enable = true;
8891
}
8992
}
9093
} else if (rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_RC_FAST_D256) {
9194
rtc_clk_8m_enable(true, true);
9295
}
9396
rtc_clk_slow_src_set(rtc_slow_clk_src);
94-
if (rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_XTAL32K) {
97+
if (revoke_32k_enable || \
98+
((old_rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_XTAL32K) && (rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_XTAL32K))) {
9599
rtc_clk_32k_enable(false);
96100
rtc_clk_32k_disable_external();
97101
}

components/esp_system/port/soc/esp32c2/clk.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,9 @@ static void select_rtc_slow_clk(slow_clk_sel_t slow_clk)
154154
*/
155155
int retry_ext_clk = 3;
156156

157+
soc_rtc_slow_clk_src_t old_rtc_slow_clk_src = rtc_clk_slow_src_get();
157158
do {
159+
bool revoke_32k_enable = false;
158160
if (rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_OSC_SLOW) {
159161
/* external clock needs to be connected to PIN0 before it can
160162
* be used. Here we use rtc_clk_cal function to count
@@ -174,13 +176,15 @@ static void select_rtc_slow_clk(slow_clk_sel_t slow_clk)
174176
}
175177
ESP_EARLY_LOGW(TAG, "external clock connected to pin0 not found, switching to internal 150 kHz oscillator");
176178
rtc_slow_clk_src = SOC_RTC_SLOW_CLK_SRC_RC_SLOW;
179+
revoke_32k_enable = true;
177180
}
178181
}
179182
} else if (rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_RC_FAST_D256) {
180183
rtc_clk_8m_enable(true, true);
181184
}
182185
rtc_clk_slow_src_set(rtc_slow_clk_src);
183-
if (rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_OSC_SLOW) {
186+
if (revoke_32k_enable || \
187+
((old_rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_OSC_SLOW) && (rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_OSC_SLOW))) {
184188
rtc_clk_32k_disable_external();
185189
}
186190
if (SLOW_CLK_CAL_CYCLES > 0) {

components/esp_system/port/soc/esp32c3/clk.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,9 @@ static void select_rtc_slow_clk(slow_clk_sel_t slow_clk)
146146
*/
147147
int retry_32k_xtal = 3;
148148

149+
soc_rtc_slow_clk_src_t old_rtc_slow_clk_src = rtc_clk_slow_src_get();
149150
do {
151+
bool revoke_32k_enable = false;
150152
if (rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_XTAL32K) {
151153
/* 32k XTAL oscillator needs to be enabled and running before it can
152154
* be used. Hardware doesn't have a direct way of checking if the
@@ -170,13 +172,15 @@ static void select_rtc_slow_clk(slow_clk_sel_t slow_clk)
170172
}
171173
ESP_EARLY_LOGW(TAG, "32 kHz XTAL not found, switching to internal 150 kHz oscillator");
172174
rtc_slow_clk_src = SOC_RTC_SLOW_CLK_SRC_RC_SLOW;
175+
revoke_32k_enable = true;
173176
}
174177
}
175178
} else if (rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_RC_FAST_D256) {
176179
rtc_clk_8m_enable(true, true);
177180
}
178181
rtc_clk_slow_src_set(rtc_slow_clk_src);
179-
if (rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_XTAL32K) {
182+
if (revoke_32k_enable || \
183+
((old_rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_XTAL32K) && (rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_XTAL32K))) {
180184
rtc_clk_32k_enable(false);
181185
rtc_clk_32k_disable_external();
182186
}

components/esp_system/port/soc/esp32c5/clk.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,9 @@ static void select_rtc_slow_clk(soc_rtc_slow_clk_src_t rtc_slow_clk_src)
138138
*/
139139
int retry_32k_xtal = 3;
140140

141+
soc_rtc_slow_clk_src_t old_rtc_slow_clk_src = rtc_clk_slow_src_get();
141142
do {
143+
bool revoke_32k_enable = false;
142144
if (rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_XTAL32K || rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_OSC_SLOW) {
143145
/* 32k XTAL oscillator needs to be enabled and running before it can
144146
* be used. Hardware doesn't have a direct way of checking if the
@@ -165,13 +167,16 @@ static void select_rtc_slow_clk(soc_rtc_slow_clk_src_t rtc_slow_clk_src)
165167
}
166168
ESP_EARLY_LOGW(TAG, "32 kHz clock not found, switching to internal 150 kHz oscillator");
167169
rtc_slow_clk_src = SOC_RTC_SLOW_CLK_SRC_RC_SLOW;
170+
revoke_32k_enable = true;
168171
}
169172
}
170173
}
171174
rtc_clk_slow_src_set(rtc_slow_clk_src);
172175
// Disable unused clock sources after clock source switching is complete.
173176
// Regardless of the clock source selection, the internal 136K clock source will always keep on.
174-
if ((rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_XTAL32K) && (rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_OSC_SLOW)) {
177+
if (revoke_32k_enable || \
178+
(((old_rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_XTAL32K) || (old_rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_OSC_SLOW)) && \
179+
((rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_XTAL32K) && (rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_OSC_SLOW)))) {
175180
rtc_clk_32k_enable(false);
176181
rtc_clk_32k_disable_external();
177182
}

components/esp_system/port/soc/esp32c6/clk.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,9 @@ static void select_rtc_slow_clk(soc_rtc_slow_clk_src_t rtc_slow_clk_src)
152152
*/
153153
int retry_32k_xtal = 3;
154154

155+
soc_rtc_slow_clk_src_t old_rtc_slow_clk_src = rtc_clk_slow_src_get();
155156
do {
157+
bool revoke_32k_enable = false;
156158
if (rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_XTAL32K || rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_OSC_SLOW) {
157159
/* 32k XTAL oscillator needs to be enabled and running before it can
158160
* be used. Hardware doesn't have a direct way of checking if the
@@ -179,6 +181,7 @@ static void select_rtc_slow_clk(soc_rtc_slow_clk_src_t rtc_slow_clk_src)
179181
}
180182
ESP_EARLY_LOGW(TAG, "32 kHz clock not found, switching to internal 150 kHz oscillator");
181183
rtc_slow_clk_src = SOC_RTC_SLOW_CLK_SRC_RC_SLOW;
184+
revoke_32k_enable = true;
182185
}
183186
}
184187
} else if (rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_RC32K) {
@@ -187,7 +190,9 @@ static void select_rtc_slow_clk(soc_rtc_slow_clk_src_t rtc_slow_clk_src)
187190
rtc_clk_slow_src_set(rtc_slow_clk_src);
188191
// Disable unused clock sources after clock source switching is complete.
189192
// Regardless of the clock source selection, the internal 136K clock source will always keep on.
190-
if ((rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_XTAL32K) && (rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_OSC_SLOW)) {
193+
if (revoke_32k_enable || \
194+
(((old_rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_XTAL32K) || (old_rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_OSC_SLOW)) && \
195+
((rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_XTAL32K) && (rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_OSC_SLOW)))) {
191196
rtc_clk_32k_enable(false);
192197
rtc_clk_32k_disable_external();
193198
}

components/esp_system/port/soc/esp32c61/clk.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,9 @@ static void select_rtc_slow_clk(soc_rtc_slow_clk_src_t rtc_slow_clk_src)
117117
*/
118118
int retry_32k_xtal = 3;
119119

120+
soc_rtc_slow_clk_src_t old_rtc_slow_clk_src = rtc_clk_slow_src_get();
120121
do {
122+
bool revoke_32k_enable = false;
121123
if (rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_XTAL32K || rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_OSC_SLOW) {
122124
/* 32k XTAL oscillator needs to be enabled and running before it can
123125
* be used. Hardware doesn't have a direct way of checking if the
@@ -144,13 +146,16 @@ static void select_rtc_slow_clk(soc_rtc_slow_clk_src_t rtc_slow_clk_src)
144146
}
145147
ESP_EARLY_LOGW(TAG, "32 kHz clock not found, switching to internal 150 kHz oscillator");
146148
rtc_slow_clk_src = SOC_RTC_SLOW_CLK_SRC_RC_SLOW;
149+
revoke_32k_enable = true;
147150
}
148151
}
149152
}
150153
rtc_clk_slow_src_set(rtc_slow_clk_src);
151154
// Disable unused clock sources after clock source switching is complete.
152155
// Regardless of the clock source selection, the internal 136K clock source will always keep on.
153-
if ((rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_XTAL32K) && (rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_OSC_SLOW)) {
156+
if (revoke_32k_enable || \
157+
(((old_rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_XTAL32K) || (old_rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_OSC_SLOW)) && \
158+
((rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_XTAL32K) && (rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_OSC_SLOW)))) {
154159
rtc_clk_32k_enable(false);
155160
rtc_clk_32k_disable_external();
156161
}

components/esp_system/port/soc/esp32h2/clk.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,9 @@ static void select_rtc_slow_clk(soc_rtc_slow_clk_src_t rtc_slow_clk_src)
150150
*/
151151
int retry_32k_xtal = 3;
152152

153+
soc_rtc_slow_clk_src_t old_rtc_slow_clk_src = rtc_clk_slow_src_get();
153154
do {
155+
bool revoke_32k_enable = false;
154156
if (rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_XTAL32K || rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_OSC_SLOW) {
155157
/* 32k XTAL oscillator needs to be enabled and running before it can
156158
* be used. Hardware doesn't have a direct way of checking if the
@@ -177,6 +179,7 @@ static void select_rtc_slow_clk(soc_rtc_slow_clk_src_t rtc_slow_clk_src)
177179
}
178180
ESP_EARLY_LOGW(TAG, "32 kHz clock not found, switching to internal 150 kHz oscillator");
179181
rtc_slow_clk_src = SOC_RTC_SLOW_CLK_SRC_RC_SLOW;
182+
revoke_32k_enable = true;
180183
}
181184
}
182185
} else if (rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_RC32K) {
@@ -185,7 +188,9 @@ static void select_rtc_slow_clk(soc_rtc_slow_clk_src_t rtc_slow_clk_src)
185188
rtc_clk_slow_src_set(rtc_slow_clk_src);
186189
// Disable unused clock sources after clock source switching is complete.
187190
// Regardless of the clock source selection, the internal 136K clock source will always keep on.
188-
if ((rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_XTAL32K) && (rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_OSC_SLOW)) {
191+
if (revoke_32k_enable || \
192+
(((old_rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_XTAL32K) || (old_rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_OSC_SLOW)) && \
193+
((rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_XTAL32K) && (rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_OSC_SLOW)))) {
189194
rtc_clk_32k_enable(false);
190195
rtc_clk_32k_disable_external();
191196
}

components/esp_system/port/soc/esp32p4/clk.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,9 @@ static void select_rtc_slow_clk(soc_rtc_slow_clk_src_t rtc_slow_clk_src)
160160
*/
161161
int retry_32k_xtal = 3;
162162

163+
soc_rtc_slow_clk_src_t old_rtc_slow_clk_src = rtc_clk_slow_src_get();
163164
do {
165+
bool revoke_32k_enable = false;
164166
if (rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_XTAL32K) {
165167
/* 32k XTAL oscillator needs to be enabled and running before it can
166168
* be used. Hardware doesn't have a direct way of checking if the
@@ -184,6 +186,7 @@ static void select_rtc_slow_clk(soc_rtc_slow_clk_src_t rtc_slow_clk_src)
184186
}
185187
ESP_EARLY_LOGW(TAG, "32 kHz clock not found, switching to internal 150 kHz oscillator");
186188
rtc_slow_clk_src = SOC_RTC_SLOW_CLK_SRC_RC_SLOW;
189+
revoke_32k_enable = true;
187190
}
188191
}
189192
} else if (rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_RC32K) {
@@ -193,7 +196,8 @@ static void select_rtc_slow_clk(soc_rtc_slow_clk_src_t rtc_slow_clk_src)
193196

194197
// Disable unused clock sources after clock source switching is complete.
195198
// Regardless of the clock source selection, the internal 136K clock source will always keep on.
196-
if (rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_XTAL32K) {
199+
if (revoke_32k_enable || \
200+
((old_rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_XTAL32K) && rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_XTAL32K)) {
197201
rtc_clk_32k_enable(false);
198202
}
199203
if (rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_RC32K) {

components/esp_system/port/soc/esp32s2/clk.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,9 @@ static void select_rtc_slow_clk(slow_clk_sel_t slow_clk)
149149
*/
150150
int retry_32k_xtal = RTC_XTAL_CAL_RETRY;
151151

152+
soc_rtc_slow_clk_src_t old_rtc_slow_clk_src = rtc_clk_slow_src_get();
152153
do {
154+
bool revoke_32k_enable = false;
153155
if (rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_XTAL32K) {
154156
/* 32k XTAL oscillator needs to be enabled and running before it can
155157
* be used. Hardware doesn't have a direct way of checking if the
@@ -173,13 +175,15 @@ static void select_rtc_slow_clk(slow_clk_sel_t slow_clk)
173175
}
174176
ESP_EARLY_LOGW(TAG, "32 kHz XTAL not found, switching to internal 90 kHz oscillator");
175177
rtc_slow_clk_src = SOC_RTC_SLOW_CLK_SRC_RC_SLOW;
178+
revoke_32k_enable = true;
176179
}
177180
}
178181
} else if (rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_RC_FAST_D256) {
179182
rtc_clk_8m_enable(true, true);
180183
}
181184
rtc_clk_slow_src_set(rtc_slow_clk_src);
182-
if (rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_XTAL32K) {
185+
if (revoke_32k_enable || \
186+
((old_rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_XTAL32K) && (rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_XTAL32K))) {
183187
rtc_clk_32k_enable(false);
184188
rtc_clk_32k_disable_external();
185189
}

components/esp_system/port/soc/esp32s3/clk.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,9 @@ static void select_rtc_slow_clk(slow_clk_sel_t slow_clk)
147147
*/
148148
int retry_32k_xtal = RTC_XTAL_CAL_RETRY;
149149

150+
soc_rtc_slow_clk_src_t old_rtc_slow_clk_src = rtc_clk_slow_src_get();
150151
do {
152+
bool revoke_32k_enable = false;
151153
if (rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_XTAL32K) {
152154
/* 32k XTAL oscillator needs to be enabled and running before it can
153155
* be used. Hardware doesn't have a direct way of checking if the
@@ -171,13 +173,15 @@ static void select_rtc_slow_clk(slow_clk_sel_t slow_clk)
171173
}
172174
ESP_EARLY_LOGW(TAG, "32 kHz XTAL not found, switching to internal 150 kHz oscillator");
173175
rtc_slow_clk_src = SOC_RTC_SLOW_CLK_SRC_RC_SLOW;
176+
revoke_32k_enable = true;
174177
}
175178
}
176179
} else if (rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_RC_FAST_D256) {
177180
rtc_clk_8m_enable(true, true);
178181
}
179182
rtc_clk_slow_src_set(rtc_slow_clk_src);
180-
if (rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_XTAL32K) {
183+
if (revoke_32k_enable || \
184+
((old_rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_XTAL32K) && (rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_XTAL32K))) {
181185
rtc_clk_32k_enable(false);
182186
rtc_clk_32k_disable_external();
183187
}

0 commit comments

Comments
 (0)