Skip to content

Commit 4bb6a01

Browse files
esp-wzhespressif-bot
authored andcommitted
fix(esp_system): fix ext 32k io revoking breaks sleep io holding
1 parent d816c3f commit 4bb6a01

File tree

12 files changed

+66
-12
lines changed

12 files changed

+66
-12
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
@@ -167,7 +167,9 @@ static void select_rtc_slow_clk(soc_rtc_slow_clk_src_t rtc_slow_clk_src)
167167
*/
168168
int retry_32k_xtal = 3;
169169

170+
soc_rtc_slow_clk_src_t old_rtc_slow_clk_src = rtc_clk_slow_src_get();
170171
do {
172+
bool revoke_32k_enable = false;
171173
if (rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_XTAL32K || rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_OSC_SLOW) {
172174
/* 32k XTAL oscillator needs to be enabled and running before it can
173175
* be used. Hardware doesn't have a direct way of checking if the
@@ -194,13 +196,16 @@ static void select_rtc_slow_clk(soc_rtc_slow_clk_src_t rtc_slow_clk_src)
194196
}
195197
ESP_EARLY_LOGW(TAG, "32 kHz clock not found, switching to internal 150 kHz oscillator");
196198
rtc_slow_clk_src = SOC_RTC_SLOW_CLK_SRC_RC_SLOW;
199+
revoke_32k_enable = true;
197200
}
198201
}
199202
}
200203
rtc_clk_slow_src_set(rtc_slow_clk_src);
201204
// Disable unused clock sources after clock source switching is complete.
202205
// Regardless of the clock source selection, the internal 136K clock source will always keep on.
203-
if ((rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_XTAL32K) && (rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_OSC_SLOW)) {
206+
if (revoke_32k_enable || \
207+
(((old_rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_XTAL32K) || (old_rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_OSC_SLOW)) && \
208+
((rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_XTAL32K) && (rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_OSC_SLOW)))) {
204209
rtc_clk_32k_enable(false);
205210
rtc_clk_32k_disable_external();
206211
}

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,9 @@ static void select_rtc_slow_clk(soc_rtc_slow_clk_src_t rtc_slow_clk_src)
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 || rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_OSC_SLOW) {
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
@@ -173,6 +175,7 @@ static void select_rtc_slow_clk(soc_rtc_slow_clk_src_t rtc_slow_clk_src)
173175
}
174176
ESP_EARLY_LOGW(TAG, "32 kHz clock not found, switching to internal 150 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_RC32K) {
@@ -181,7 +184,9 @@ static void select_rtc_slow_clk(soc_rtc_slow_clk_src_t rtc_slow_clk_src)
181184
rtc_clk_slow_src_set(rtc_slow_clk_src);
182185
// Disable unused clock sources after clock source switching is complete.
183186
// Regardless of the clock source selection, the internal 136K clock source will always keep on.
184-
if ((rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_XTAL32K) && (rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_OSC_SLOW)) {
187+
if (revoke_32k_enable || \
188+
(((old_rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_XTAL32K) || (old_rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_OSC_SLOW)) && \
189+
((rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_XTAL32K) && (rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_OSC_SLOW)))) {
185190
rtc_clk_32k_enable(false);
186191
rtc_clk_32k_disable_external();
187192
}

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/esp32h21/clk.c

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

123+
soc_rtc_slow_clk_src_t old_rtc_slow_clk_src = rtc_clk_slow_src_get();
123124
do {
125+
bool revoke_32k_enable = false;
124126
if (rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_XTAL32K || rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_OSC_SLOW) {
125127
/* 32k XTAL oscillator needs to be enabled and running before it can
126128
* be used. Hardware doesn't have a direct way of checking if the
@@ -147,13 +149,16 @@ static void select_rtc_slow_clk(soc_rtc_slow_clk_src_t rtc_slow_clk_src)
147149
}
148150
ESP_EARLY_LOGW(TAG, "32 kHz clock not found, switching to internal 150 kHz oscillator");
149151
rtc_slow_clk_src = SOC_RTC_SLOW_CLK_SRC_RC_SLOW_D4;
152+
revoke_32k_enable = true;
150153
}
151154
}
152155
}
153156
rtc_clk_slow_src_set(rtc_slow_clk_src);
154157
// Disable unused clock sources after clock source switching is complete.
155158
// Regardless of the clock source selection, the internal 600k clock source will always keep on.
156-
if ((rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_XTAL32K) && (rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_OSC_SLOW)) {
159+
if (revoke_32k_enable || \
160+
(((old_rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_XTAL32K) || (old_rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_OSC_SLOW)) && \
161+
((rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_XTAL32K) && (rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_OSC_SLOW)))) {
157162
rtc_clk_32k_enable(false);
158163
rtc_clk_32k_disable_external();
159164
}

components/esp_system/port/soc/esp32h4/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_D4;
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 600k 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/esp32p4/clk.c

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

165+
soc_rtc_slow_clk_src_t old_rtc_slow_clk_src = rtc_clk_slow_src_get();
165166
do {
167+
bool revoke_32k_enable = false;
166168
if (rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_XTAL32K) {
167169
/* 32k XTAL oscillator needs to be enabled and running before it can
168170
* be used. Hardware doesn't have a direct way of checking if the
@@ -186,6 +188,7 @@ static void select_rtc_slow_clk(soc_rtc_slow_clk_src_t rtc_slow_clk_src)
186188
}
187189
ESP_EARLY_LOGW(TAG, "32 kHz clock not found, switching to internal 150 kHz oscillator");
188190
rtc_slow_clk_src = SOC_RTC_SLOW_CLK_SRC_RC_SLOW;
191+
revoke_32k_enable = true;
189192
}
190193
}
191194
} else if (rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_RC32K) {
@@ -195,7 +198,8 @@ static void select_rtc_slow_clk(soc_rtc_slow_clk_src_t rtc_slow_clk_src)
195198

196199
// Disable unused clock sources after clock source switching is complete.
197200
// Regardless of the clock source selection, the internal 136K clock source will always keep on.
198-
if (rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_XTAL32K) {
201+
if (revoke_32k_enable || \
202+
((old_rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_XTAL32K) && rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_XTAL32K)) {
199203
rtc_clk_32k_enable(false);
200204
}
201205
if (rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_RC32K) {

0 commit comments

Comments
 (0)