Merge branch 'bugfix/esp32c3_light_sleep_gpio_reset_issue' into 'master'

light sleep: add software workaround for esp32c3 gpio reset issue

See merge request espressif/esp-idf!12715
This commit is contained in:
Jiang Jiang Jian
2021-03-29 04:55:55 +00:00
6 changed files with 44 additions and 18 deletions
+7 -8
View File
@@ -435,24 +435,23 @@ esp_deep_sleep_wake_stub_fn_t esp_get_deep_sleep_wake_stub(void);
void esp_default_wake_deep_sleep(void);
/**
* @brief Disable logging from the ROM code after deep sleep.
* @brief Disable logging from the ROM code after deep sleep.
*
* Using LSB of RTC_STORE4.
* Using LSB of RTC_STORE4.
*/
void esp_deep_sleep_disable_rom_logging(void);
#if SOC_GPIO_SUPPORT_SLP_SWITCH
/**
* @brief Disable all GPIO pins at slept status.
*
* @brief Configure to isolate all GPIO pins in sleep state
*/
void esp_sleep_gpio_status_init(void);
void esp_sleep_config_gpio_isolate(void);
/**
* @brief Configure GPIO pins status switching between slept status and waked status.
* @param enable decide whether to switch status or not
* @brief Enable or disable GPIO pins status switching between slept status and waked status.
* @param enable decide whether to switch status or not
*/
void esp_sleep_gpio_status_switch_configure(bool enable);
void esp_sleep_enable_gpio_switch(bool enable);
#endif
#if CONFIG_MAC_BB_PD
+4 -8
View File
@@ -410,9 +410,9 @@ static inline void gpio_sleep_mode_config_unapply(void)
}
#endif
void esp_sleep_gpio_status_init(void)
void esp_sleep_config_gpio_isolate(void)
{
ESP_LOGI(TAG, "Init to disable all pins at light sleep");
ESP_LOGI(TAG, "Configure to isolate all GPIO pins in sleep state");
for (gpio_num_t gpio_num = GPIO_NUM_0; gpio_num < GPIO_NUM_MAX; gpio_num++) {
if (GPIO_IS_VALID_GPIO(gpio_num)) {
gpio_sleep_set_direction(gpio_num, GPIO_MODE_DISABLE);
@@ -421,13 +421,9 @@ void esp_sleep_gpio_status_init(void)
}
}
void esp_sleep_gpio_status_switch_configure(bool enable)
void esp_sleep_enable_gpio_switch(bool enable)
{
if (enable) {
ESP_LOGI(TAG, "Light sleep enabled, start GPIO status switching");
} else {
ESP_LOGI(TAG, "Light sleep disabled, stop GPIO status switching");
}
ESP_LOGI(TAG, "%s automatic switching of GPIO sleep configuration", enable ? "Enable" : "Disable");
for (gpio_num_t gpio_num = GPIO_NUM_0; gpio_num < GPIO_NUM_MAX; gpio_num++) {
if (GPIO_IS_VALID_GPIO(gpio_num)) {
if (enable) {
+9
View File
@@ -40,6 +40,7 @@
#include "esp_efuse.h"
#include "esp_flash_encrypt.h"
#include "esp_secure_boot.h"
#include "esp_sleep.h"
/***********************************************/
// Headers for other components init functions
@@ -413,6 +414,14 @@ IRAM_ATTR ESP_SYSTEM_INIT_FN(init_components0, BIT(0))
{
esp_timer_init();
#if CONFIG_ESP32C3_LIGHTSLEEP_GPIO_RESET_WORKAROUND && !CONFIG_PM_SLP_DISABLE_GPIO
// Configure to isolate (disable the Input/Output/Pullup/Pulldown
// function of the pin) all GPIO pins in sleep state
esp_sleep_config_gpio_isolate();
// Enable automatic switching of GPIO configuration
esp_sleep_enable_gpio_switch(true);
#endif
#if defined(CONFIG_PM_ENABLE)
esp_pm_impl_init();
#endif