Explorar o código

Merge branch 'feature/support_suspend_on_120m' into 'master'

feat(spi_flash): Enable auto suspend on when flash works under 120M

See merge request espressif/esp-idf!27119
C.S.M %!s(int64=2) %!d(string=hai) anos
pai
achega
9e70bda89e

+ 13 - 0
components/hal/esp32c2/include/hal/spimem_flash_ll.h

@@ -245,6 +245,19 @@ static inline void spimem_flash_ll_auto_wait_idle_init(spi_mem_dev_t *dev, bool
     dev->flash_sus_ctrl.flash_pes_wait_en = auto_waiti;
 }
 
+/**
+ * This function is used to set dummy phase when auto suspend is enabled.
+ *
+ * @note This function is only used when timing tuning is enabled.
+ *
+ * @param dev Beginning address of the peripheral registers.
+ * @param extra_dummy extra dummy length. Get from timing tuning.
+ */
+static inline void spimem_flash_ll_set_wait_idle_dummy_phase(spi_mem_dev_t *dev, uint32_t extra_dummy)
+{
+    // Not supported on this chip.
+}
+
 /**
  * Return the suspend status of erase or program operations.
  *

+ 13 - 0
components/hal/esp32c3/include/hal/spimem_flash_ll.h

@@ -247,6 +247,19 @@ static inline void spimem_flash_ll_auto_wait_idle_init(spi_mem_dev_t *dev, bool
     dev->flash_sus_ctrl.flash_pes_wait_en = auto_waiti;
 }
 
+/**
+ * This function is used to set dummy phase when auto suspend is enabled.
+ *
+ * @note This function is only used when timing tuning is enabled.
+ *
+ * @param dev Beginning address of the peripheral registers.
+ * @param extra_dummy extra dummy length. Get from timing tuning.
+ */
+static inline void spimem_flash_ll_set_wait_idle_dummy_phase(spi_mem_dev_t *dev, uint32_t extra_dummy)
+{
+    // Not supported on this chip.
+}
+
 /**
  * Return the suspend status of erase or program operations.
  *

+ 13 - 0
components/hal/esp32c6/include/hal/spimem_flash_ll.h

@@ -248,6 +248,19 @@ static inline void spimem_flash_ll_auto_wait_idle_init(spi_mem_dev_t *dev, bool
     dev->flash_sus_ctrl.flash_pes_wait_en = auto_waiti;
 }
 
+/**
+ * This function is used to set dummy phase when auto suspend is enabled.
+ *
+ * @note This function is only used when timing tuning is enabled.
+ *
+ * @param dev Beginning address of the peripheral registers.
+ * @param extra_dummy extra dummy length. Get from timing tuning.
+ */
+static inline void spimem_flash_ll_set_wait_idle_dummy_phase(spi_mem_dev_t *dev, uint32_t extra_dummy)
+{
+    // Not supported on this chip.
+}
+
 /**
  * Return the suspend status of erase or program operations.
  *

+ 13 - 0
components/hal/esp32h2/include/hal/spimem_flash_ll.h

@@ -249,6 +249,19 @@ static inline void spimem_flash_ll_auto_wait_idle_init(spi_mem_dev_t *dev, bool
     dev->flash_sus_ctrl.flash_pes_wait_en = auto_waiti;
 }
 
+/**
+ * This function is used to set dummy phase when auto suspend is enabled.
+ *
+ * @note This function is only used when timing tuning is enabled.
+ *
+ * @param dev Beginning address of the peripheral registers.
+ * @param extra_dummy extra dummy length. Get from timing tuning.
+ */
+static inline void spimem_flash_ll_set_wait_idle_dummy_phase(spi_mem_dev_t *dev, uint32_t extra_dummy)
+{
+    // Not supported on this chip.
+}
+
 /**
  * Return the suspend status of erase or program operations.
  *

+ 18 - 0
components/hal/esp32p4/include/hal/spimem_flash_ll.h

@@ -251,6 +251,24 @@ static inline void spimem_flash_ll_auto_wait_idle_init(spi_mem_dev_t *dev, bool
     dev->flash_sus_ctrl.flash_pes_wait_en = auto_waiti;
 }
 
+/**
+ * This function is used to set dummy phase when auto suspend is enabled.
+ *
+ * @note This function is only used when timing tuning is enabled. This function is only used in quad flash
+ *
+ * @param dev Beginning address of the peripheral registers.
+ * @param extra_dummy extra dummy length. Get from timing tuning.
+ */
+static inline void spimem_flash_ll_set_wait_idle_dummy_phase(spi_mem_dev_t *dev, uint32_t extra_dummy)
+{
+    if (extra_dummy > 0) {
+        dev->flash_waiti_ctrl.waiti_dummy_cyclelen = extra_dummy - 1;
+        dev->flash_waiti_ctrl.waiti_dummy = 1;
+    } else {
+        dev->flash_waiti_ctrl.waiti_dummy = 0;
+    }
+}
+
 /**
  * Return the suspend status of erase or program operations.
  *

+ 13 - 0
components/hal/esp32s2/include/hal/spimem_flash_ll.h

@@ -217,6 +217,19 @@ static inline void spimem_flash_ll_auto_wait_idle_init(spi_mem_dev_t *dev, bool
     dev->flash_waiti_ctrl.waiti_en = auto_waiti;  // enable auto wait-idle function.
 }
 
+/**
+ * This function is used to set dummy phase when auto suspend is enabled.
+ *
+ * @note This function is only used when timing tuning is enabled.
+ *
+ * @param dev Beginning address of the peripheral registers.
+ * @param extra_dummy extra dummy length. Get from timing tuning.
+ */
+static inline void spimem_flash_ll_set_wait_idle_dummy_phase(spi_mem_dev_t *dev, uint32_t extra_dummy)
+{
+    // Not supported on this chip.
+}
+
 /**
  * Return the suspend status of erase or program operations.
  *

+ 18 - 0
components/hal/esp32s3/include/hal/spimem_flash_ll.h

@@ -274,6 +274,24 @@ static inline void spimem_flash_ll_auto_wait_idle_init(spi_mem_dev_t *dev, bool
     dev->flash_sus_cmd.flash_pes_wait_en = 1;
 }
 
+/**
+ * This function is used to set dummy phase when auto suspend is enabled.
+ *
+ * @note This function is only used when timing tuning is enabled. This function is only used in quad flash
+ *
+ * @param dev Beginning address of the peripheral registers.
+ * @param extra_dummy extra dummy length. Get from timing tuning.
+ */
+static inline void spimem_flash_ll_set_wait_idle_dummy_phase(spi_mem_dev_t *dev, uint32_t extra_dummy)
+{
+    if (extra_dummy > 0) {
+        dev->flash_waiti_ctrl.waiti_dummy_cyclelen = extra_dummy - 1;
+        dev->flash_waiti_ctrl.waiti_dummy = 1;
+    } else {
+        dev->flash_waiti_ctrl.waiti_dummy = 0;
+    }
+}
+
 /**
  * Return the suspend status of erase or program operations.
  *

+ 3 - 0
components/hal/spi_flash_hal_iram.c

@@ -146,6 +146,9 @@ void spi_flash_hal_setup_auto_suspend_mode(spi_flash_host_inst_t *host)
     spi_mem_dev_t *dev = (spi_mem_dev_t*)spi_flash_ll_get_hw(SPI1_HOST);
     spi_flash_hal_context_t* ctx = (spi_flash_hal_context_t*)host;
     spimem_flash_ll_auto_wait_idle_init(dev, true);
+    if (ctx->freq_mhz == 120) {
+        spimem_flash_ll_set_wait_idle_dummy_phase(dev, ctx->extra_dummy);
+    }
     spimem_flash_ll_auto_suspend_init(dev, true);
     // tsus = ceil(ctx->tsus_val * ctx->freq_mhz / spimem_flash_ll_get_tsus_unit_in_cycles);
     uint32_t tsus = (ctx->tsus_val * ctx->freq_mhz / spimem_flash_ll_get_tsus_unit_in_cycles(dev)) + ((ctx->tsus_val * ctx->freq_mhz) % spimem_flash_ll_get_tsus_unit_in_cycles(dev) != 0);