Procházet zdrojové kódy

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

wuzhenghui před 2 roky
rodič
revize
9f993705a6

+ 0 - 4
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);

+ 5 - 0
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