summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien George <damien@micropython.org>2025-03-19 14:18:04 +1100
committerDamien George <damien@micropython.org>2025-04-03 16:15:35 +1100
commitac1cbef36661625dabc47bc4aa0aa7a0d076dec1 (patch)
treeb3e7397160961fd23c321343132d5a09537dda48
parentc18e925431c57384a8f28c8699fe46c8b22aaa3a (diff)
stm32/qspi: Add qspi_memory_map_exit and restart.
Signed-off-by: Damien George <damien@micropython.org>
-rw-r--r--ports/stm32/qspi.c27
-rw-r--r--ports/stm32/qspi.h2
2 files changed, 22 insertions, 7 deletions
diff --git a/ports/stm32/qspi.c b/ports/stm32/qspi.c
index 1311c27d1..7334ece4f 100644
--- a/ports/stm32/qspi.c
+++ b/ports/stm32/qspi.c
@@ -170,6 +170,25 @@ void qspi_memory_map(void) {
qspi_mpu_enable_mapped();
}
+void qspi_memory_map_exit(void) {
+ // Prevent access to QSPI memory-mapped region.
+ qspi_mpu_disable_all();
+
+ // Abort any ongoing transfer if peripheral is busy
+ if (QUADSPI->SR & QUADSPI_SR_BUSY) {
+ QUADSPI->CR |= QUADSPI_CR_ABORT;
+ while (QUADSPI->CR & QUADSPI_CR_ABORT) {
+ }
+ }
+}
+
+// Needed on F7 due to errata 2.4.3: "Memory-mapped read operations may fail when timeout counter is enabled".
+// Call this function to disable then re-enable memory-mapped mode, which resets the CS pin to inactive.
+void qspi_memory_map_restart(void) {
+ qspi_memory_map_exit();
+ qspi_memory_map();
+}
+
static int qspi_ioctl(void *self_in, uint32_t cmd, uintptr_t arg) {
(void)self_in;
switch (cmd) {
@@ -178,13 +197,7 @@ static int qspi_ioctl(void *self_in, uint32_t cmd, uintptr_t arg) {
break;
case MP_QSPI_IOCTL_BUS_ACQUIRE:
// Disable memory-mapped region during bus access
- qspi_mpu_disable_all();
- // Abort any ongoing transfer if peripheral is busy
- if (QUADSPI->SR & QUADSPI_SR_BUSY) {
- QUADSPI->CR |= QUADSPI_CR_ABORT;
- while (QUADSPI->CR & QUADSPI_CR_ABORT) {
- }
- }
+ qspi_memory_map_exit();
break;
case MP_QSPI_IOCTL_BUS_RELEASE:
// Switch to memory-map mode when bus is idle
diff --git a/ports/stm32/qspi.h b/ports/stm32/qspi.h
index 6fe91168c..a2d6b9f32 100644
--- a/ports/stm32/qspi.h
+++ b/ports/stm32/qspi.h
@@ -35,6 +35,8 @@ extern const mp_qspi_proto_t qspi_proto;
void qspi_init(void);
void qspi_memory_map(void);
+void qspi_memory_map_exit(void);
+void qspi_memory_map_restart(void);
static inline bool qspi_is_valid_addr(uint32_t addr) {
return QSPI_MAP_ADDR <= addr && addr < QSPI_MAP_ADDR_MAX;