diff options
author | Damien George <damien@micropython.org> | 2025-03-19 14:18:04 +1100 |
---|---|---|
committer | Damien George <damien@micropython.org> | 2025-04-03 16:15:35 +1100 |
commit | ac1cbef36661625dabc47bc4aa0aa7a0d076dec1 (patch) | |
tree | b3e7397160961fd23c321343132d5a09537dda48 | |
parent | c18e925431c57384a8f28c8699fe46c8b22aaa3a (diff) |
stm32/qspi: Add qspi_memory_map_exit and restart.
Signed-off-by: Damien George <damien@micropython.org>
-rw-r--r-- | ports/stm32/qspi.c | 27 | ||||
-rw-r--r-- | ports/stm32/qspi.h | 2 |
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; |