From 9f993705a6d3c44c3bd2c8aa451076f84fcd1636 Mon Sep 17 00:00:00 2001 From: wuzhenghui Date: Sun, 25 Jun 2023 17:50:17 +0800 Subject: [PATCH] fix: wait spi bus idle before hold CS pin - Wait for spi bus idle before holding CS pin to prevent hold selected state during sleep --- components/esp_hw_support/sleep_cpu.c | 4 ---- components/esp_hw_support/sleep_modes.c | 5 +++++ 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/components/esp_hw_support/sleep_cpu.c b/components/esp_hw_support/sleep_cpu.c index eb4cbbdfb1..8ed524e74a 100644 --- a/components/esp_hw_support/sleep_cpu.c +++ b/components/esp_hw_support/sleep_cpu.c @@ -706,10 +706,6 @@ esp_err_t IRAM_ATTR esp_sleep_cpu_retention(uint32_t (*goto_sleep)(uint32_t, uin { uint32_t mstatus = save_mstatus_and_disable_global_int(); - /* wait cache idle */ - Cache_Freeze_ICache_Enable(CACHE_FREEZE_ACK_BUSY); - Cache_Freeze_ICache_Disable(); - cpu_domain_dev_regs_save(s_cpu_retention.retent.plic_frame); cpu_domain_dev_regs_save(s_cpu_retention.retent.clint_frame); cpu_domain_dev_regs_save(s_cpu_retention.retent.intpri_frame); diff --git a/components/esp_hw_support/sleep_modes.c b/components/esp_hw_support/sleep_modes.c index 1fa427ae63..fb6b0da1da 100644 --- a/components/esp_hw_support/sleep_modes.c +++ b/components/esp_hw_support/sleep_modes.c @@ -44,6 +44,7 @@ #include "soc/soc_caps.h" #include "regi2c_ctrl.h" //For `REGI2C_ANA_CALI_PD_WORKAROUND`, temp +#include "hal/cache_hal.h" #include "hal/wdt_hal.h" #include "hal/uart_hal.h" #if SOC_TOUCH_SENSOR_SUPPORTED @@ -746,6 +747,8 @@ static esp_err_t IRAM_ATTR esp_sleep_start(uint32_t pd_flags, esp_sleep_mode_t m #if (CONFIG_PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP && CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND) #if !CONFIG_IDF_TARGET_ESP32H2 // ESP32H2 TODO IDF-7359: related rtcio ll func not supported yet if(!(pd_flags & PMU_SLEEP_PD_VDDSDIO)) { + /* Cache Suspend 1: will wait cache idle in cache suspend, also means SPI bus IDLE, then we can hold SPI CS pin safely*/ + suspend_cache(); gpio_ll_hold_en(&GPIO, SPI_CS0_GPIO_NUM); } #endif @@ -768,6 +771,8 @@ static esp_err_t IRAM_ATTR esp_sleep_start(uint32_t pd_flags, esp_sleep_mode_t m #if !CONFIG_IDF_TARGET_ESP32H2 // ESP32H2 TODO IDF-7359: related rtcio ll func not supported yet if(!(pd_flags & PMU_SLEEP_PD_VDDSDIO)) { gpio_ll_hold_dis(&GPIO, SPI_CS0_GPIO_NUM); + /* Cache Resume 1: Resume cache for continue running*/ + resume_cache(); } #endif #endif