You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by ac...@apache.org on 2023/10/26 11:23:40 UTC
[nuttx] branch master updated: xtensa/esp32s3: Support to read data from flash to PSRAM
This is an automated email from the ASF dual-hosted git repository.
acassis pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new d4cebae155 xtensa/esp32s3: Support to read data from flash to PSRAM
d4cebae155 is described below
commit d4cebae1558fcdfe3db01bda4c83ec3f61e28346
Author: Dong Heng <do...@espressif.com>
AuthorDate: Thu Oct 12 16:14:44 2023 +0800
xtensa/esp32s3: Support to read data from flash to PSRAM
---
arch/xtensa/src/esp32s3/esp32s3_spiflash.c | 98 +++++++++++++++++++++++---
arch/xtensa/src/esp32s3/hardware/esp32s3_soc.h | 2 +-
2 files changed, 91 insertions(+), 9 deletions(-)
diff --git a/arch/xtensa/src/esp32s3/esp32s3_spiflash.c b/arch/xtensa/src/esp32s3/esp32s3_spiflash.c
index 837acedb9c..624677a54b 100644
--- a/arch/xtensa/src/esp32s3/esp32s3_spiflash.c
+++ b/arch/xtensa/src/esp32s3/esp32s3_spiflash.c
@@ -250,6 +250,48 @@ static sem_t g_disable_non_iram_isr_on_core[CONFIG_SMP_NCPUS];
* Private Functions
****************************************************************************/
+/****************************************************************************
+ * Name: spiflash_suspend_cache
+ *
+ * Description:
+ * Suspend CPU cache.
+ *
+ ****************************************************************************/
+
+static void spiflash_suspend_cache(void)
+{
+ int cpu = up_cpu_index();
+#ifdef CONFIG_SMP
+ int other_cpu = cpu ? 0 : 1;
+#endif
+
+ spi_flash_disable_cache(cpu);
+#ifdef CONFIG_SMP
+ spi_flash_disable_cache(other_cpu);
+#endif
+}
+
+/****************************************************************************
+ * Name: spiflash_resume_cache
+ *
+ * Description:
+ * Resume CPU cache.
+ *
+ ****************************************************************************/
+
+static void spiflash_resume_cache(void)
+{
+ int cpu = up_cpu_index();
+#ifdef CONFIG_SMP
+ int other_cpu = cpu ? 0 : 1;
+#endif
+
+ spi_flash_restore_cache(cpu);
+#ifdef CONFIG_SMP
+ spi_flash_restore_cache(other_cpu);
+#endif
+}
+
/****************************************************************************
* Name: spiflash_start
*
@@ -305,10 +347,7 @@ static void spiflash_start(void)
esp32s3_irq_noniram_disable();
- spi_flash_disable_cache(cpu);
-#ifdef CONFIG_SMP
- spi_flash_disable_cache(other_cpu);
-#endif
+ spiflash_suspend_cache();
}
/****************************************************************************
@@ -334,10 +373,7 @@ static void spiflash_end(void)
DEBUGASSERT(other_cpu != cpu);
#endif
- spi_flash_restore_cache(cpu);
-#ifdef CONFIG_SMP
- spi_flash_restore_cache(other_cpu);
-#endif
+ spiflash_resume_cache();
/* Signal to spi_flash_op_block_task that flash operation is complete */
@@ -852,6 +888,9 @@ int spi_flash_write(uint32_t dest_addr, const void *buffer, uint32_t size)
const uint8_t *tx_buf = (const uint8_t *)buffer;
uint32_t tx_bytes = size;
uint32_t tx_addr = dest_addr;
+#ifdef CONFIG_ESP32S3_SPIRAM
+ bool buffer_in_psram = esp32s3_ptr_extram(buffer);
+#endif
spiflash_start();
@@ -860,8 +899,28 @@ int spi_flash_write(uint32_t dest_addr, const void *buffer, uint32_t size)
uint32_t spi_buffer[SPI_BUFFER_WORDS];
uint32_t n = MIN(tx_bytes, SPI_BUFFER_BYTES);
+#ifdef CONFIG_ESP32S3_SPIRAM
+
+ /* Re-enable cache, and then copy data from PSRAM to SRAM */
+
+ if (buffer_in_psram)
+ {
+ spiflash_resume_cache();
+ }
+#endif
+
memcpy(spi_buffer, tx_buf, n);
+#ifdef CONFIG_ESP32S3_SPIRAM
+
+ /* Disable cache, and then write data from SRAM to flash */
+
+ if (buffer_in_psram)
+ {
+ spiflash_suspend_cache();
+ }
+#endif
+
wait_flash_idle();
enable_flash_write();
@@ -902,6 +961,9 @@ int spi_flash_read(uint32_t src_addr, void *dest, uint32_t size)
uint8_t *rx_buf = (uint8_t *)dest;
uint32_t rx_bytes = size;
uint32_t rx_addr = src_addr;
+#ifdef CONFIG_ESP32S3_SPIRAM
+ bool buffer_in_psram = esp32s3_ptr_extram(dest);
+#endif
spiflash_start();
@@ -912,10 +974,30 @@ int spi_flash_read(uint32_t src_addr, void *dest, uint32_t size)
READ_DATA_FROM_FLASH(rx_addr, spi_buffer, n);
+#ifdef CONFIG_ESP32S3_SPIRAM
+
+ /* Re-enable cache, and then copy data from SRAM to PSRAM */
+
+ if (buffer_in_psram)
+ {
+ spiflash_resume_cache();
+ }
+#endif
+
memcpy(rx_buf, spi_buffer, n);
rx_bytes -= n;
rx_buf += n;
rx_addr += n;
+
+#ifdef CONFIG_ESP32S3_SPIRAM
+
+ /* Disable cache, and then read data from flash to SRAM */
+
+ if (buffer_in_psram)
+ {
+ spiflash_suspend_cache();
+ }
+#endif
}
spiflash_end();
diff --git a/arch/xtensa/src/esp32s3/hardware/esp32s3_soc.h b/arch/xtensa/src/esp32s3/hardware/esp32s3_soc.h
index 57dd0ce9fa..d38ee869c6 100644
--- a/arch/xtensa/src/esp32s3/hardware/esp32s3_soc.h
+++ b/arch/xtensa/src/esp32s3/hardware/esp32s3_soc.h
@@ -339,7 +339,7 @@
#define SOC_RTC_DATA_LOW 0x50000000
#define SOC_RTC_DATA_HIGH 0x50002000
-#define SOC_EXTRAM_DATA_LOW 0x3D000000
+#define SOC_EXTRAM_DATA_LOW 0x3C000000
#define SOC_EXTRAM_DATA_HIGH 0x3E000000
#define SOC_IROM_MASK_LOW 0x40000000
#define SOC_IROM_MASK_HIGH 0x4001A100