diff options
author | Jean-François Milants <jf@codingfield.com> | 2016-11-23 22:16:14 +0100 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2016-12-02 13:51:09 +1100 |
commit | 08bd7d1d31a95331dad403adce8834c2d39ab3e8 (patch) | |
tree | 132141f1b0fed8e706c8a183d9e1e1d0c5d60cb4 /stmhal/sdcard.c | |
parent | a081b49d55ef409d612666d79a97e79259c8adba (diff) | |
download | micropython-08bd7d1d31a95331dad403adce8834c2d39ab3e8.tar.gz micropython-08bd7d1d31a95331dad403adce8834c2d39ab3e8.zip |
stmhal/sdcard: Clean/invalidate cache before DMA transfers with SD card.
Add 2 macros in mphalport.h that clean and invalidate data caches only on
STM32F7 MCUs. They are needed to ensure the cache coherency before/after
DMA transferts.
* MP_HAL_CLEANINVALIDATE_DCACHE cleans and invalidate the data cache. It
must be called before starting a DMA transfer from the peripheral to the
RAM memory.
* MP_HAL_CLEAN_DCACHE cleans the data cache. It must be called before
starting a DMA transfert from the RAM memory to the peripheral.
These macros are called in sdcard.c, before reading from and writing to
the SDCard, when DMA is used.
Diffstat (limited to 'stmhal/sdcard.c')
-rw-r--r-- | stmhal/sdcard.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/stmhal/sdcard.c b/stmhal/sdcard.c index a2aa4c84d8..f7cf153431 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 |