stm32/qspi: Add qspi_memory_map_exit and restart.

Signed-off-by: Damien George <damien@micropython.org>
This commit is contained in:
Damien George 2025-03-19 14:18:04 +11:00
parent c18e925431
commit ac1cbef366
2 changed files with 22 additions and 7 deletions

View file

@ -170,6 +170,25 @@ void qspi_memory_map(void) {
qspi_mpu_enable_mapped(); 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) { static int qspi_ioctl(void *self_in, uint32_t cmd, uintptr_t arg) {
(void)self_in; (void)self_in;
switch (cmd) { switch (cmd) {
@ -178,13 +197,7 @@ static int qspi_ioctl(void *self_in, uint32_t cmd, uintptr_t arg) {
break; break;
case MP_QSPI_IOCTL_BUS_ACQUIRE: case MP_QSPI_IOCTL_BUS_ACQUIRE:
// Disable memory-mapped region during bus access // Disable memory-mapped region during bus access
qspi_mpu_disable_all(); qspi_memory_map_exit();
// 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) {
}
}
break; break;
case MP_QSPI_IOCTL_BUS_RELEASE: case MP_QSPI_IOCTL_BUS_RELEASE:
// Switch to memory-map mode when bus is idle // Switch to memory-map mode when bus is idle

View file

@ -35,6 +35,8 @@ extern const mp_qspi_proto_t qspi_proto;
void qspi_init(void); void qspi_init(void);
void qspi_memory_map(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) { static inline bool qspi_is_valid_addr(uint32_t addr) {
return QSPI_MAP_ADDR <= addr && addr < QSPI_MAP_ADDR_MAX; return QSPI_MAP_ADDR <= addr && addr < QSPI_MAP_ADDR_MAX;