summaryrefslogtreecommitdiff
path: root/stmhal/sdcard.c
diff options
context:
space:
mode:
Diffstat (limited to 'stmhal/sdcard.c')
-rw-r--r--stmhal/sdcard.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/stmhal/sdcard.c b/stmhal/sdcard.c
index a2aa4c84d..f7cf15343 100644
--- a/stmhal/sdcard.c
+++ b/stmhal/sdcard.c
@@ -30,6 +30,7 @@
#include "py/runtime.h"
#include "lib/fatfs/ff.h"
#include "extmod/fsusermount.h"
+#include "mphalport.h"
#include "sdcard.h"
#include "pin.h"
@@ -221,6 +222,10 @@ mp_uint_t sdcard_read_blocks(uint8_t *dest, uint32_t block_num, uint32_t num_blo
dma_init(&sd_rx_dma, &dma_SDIO_0_RX, &sd_handle);
sd_handle.hdmarx = &sd_rx_dma;
+ // make sure cache is flushed and invalidated so when DMA updates the RAM
+ // from reading the peripheral the CPU then reads the new data
+ MP_HAL_CLEANINVALIDATE_DCACHE(dest, num_blocks * SDCARD_BLOCK_SIZE);
+
err = HAL_SD_ReadBlocks_BlockNumber_DMA(&sd_handle, (uint32_t*)dest, block_num, SDCARD_BLOCK_SIZE, num_blocks);
if (err == SD_OK) {
// wait for DMA transfer to finish, with a large timeout
@@ -277,6 +282,9 @@ mp_uint_t sdcard_write_blocks(const uint8_t *src, uint32_t block_num, uint32_t n
dma_init(&sd_tx_dma, &dma_SDIO_0_TX, &sd_handle);
sd_handle.hdmatx = &sd_tx_dma;
+ // make sure cache is flushed to RAM so the DMA can read the correct data
+ MP_HAL_CLEAN_DCACHE(src, num_blocks * SDCARD_BLOCK_SIZE);
+
err = HAL_SD_WriteBlocks_BlockNumber_DMA(&sd_handle, (uint32_t*)src, block_num, SDCARD_BLOCK_SIZE, num_blocks);
if (err == SD_OK) {
// wait for DMA transfer to finish, with a large timeout