aboutsummaryrefslogtreecommitdiff
path: root/ports/stm32/sdcard.c
diff options
context:
space:
mode:
authorDamien George2018-09-11 17:20:34 +1000
committerDamien George2018-09-11 17:21:22 +1000
commite4f7001d9c4880a4f60349aef0b0786ca95584d4 (patch)
tree34d603a4f0e69a36bdfb49391e74e4de07a76302 /ports/stm32/sdcard.c
parentd7e2ac4a6ae8d11f108a526c7ad356154d0d2a43 (diff)
stm32/sdcard: Use only a single DMA stream for both SDIO TX/RX.
No need to be wasteful on DMA resources.
Diffstat (limited to 'ports/stm32/sdcard.c')
-rw-r--r--ports/stm32/sdcard.c23
1 files changed, 7 insertions, 16 deletions
diff --git a/ports/stm32/sdcard.c b/ports/stm32/sdcard.c
index 7d6288718..2282624cf 100644
--- a/ports/stm32/sdcard.c
+++ b/ports/stm32/sdcard.c
@@ -51,15 +51,13 @@
#define SDMMC_CLK_ENABLE() __HAL_RCC_SDMMC2_CLK_ENABLE()
#define SDMMC_CLK_DISABLE() __HAL_RCC_SDMMC2_CLK_DISABLE()
#define SDMMC_IRQn SDMMC2_IRQn
-#define SDMMC_TX_DMA dma_SDMMC_2_TX
-#define SDMMC_RX_DMA dma_SDMMC_2_RX
+#define SDMMC_DMA dma_SDMMC_2
#else
#define SDIO SDMMC1
#define SDMMC_CLK_ENABLE() __HAL_RCC_SDMMC1_CLK_ENABLE()
#define SDMMC_CLK_DISABLE() __HAL_RCC_SDMMC1_CLK_DISABLE()
#define SDMMC_IRQn SDMMC1_IRQn
-#define SDMMC_TX_DMA dma_SDIO_0_TX
-#define SDMMC_RX_DMA dma_SDIO_0_RX
+#define SDMMC_DMA dma_SDIO_0
#define STATIC_AF_SDMMC_CK STATIC_AF_SDMMC1_CK
#define STATIC_AF_SDMMC_CMD STATIC_AF_SDMMC1_CMD
#define STATIC_AF_SDMMC_D0 STATIC_AF_SDMMC1_D0
@@ -104,8 +102,7 @@
#define SDMMC_CLK_ENABLE() __SDIO_CLK_ENABLE()
#define SDMMC_CLK_DISABLE() __SDIO_CLK_DISABLE()
#define SDMMC_IRQn SDIO_IRQn
-#define SDMMC_TX_DMA dma_SDIO_0_TX
-#define SDMMC_RX_DMA dma_SDIO_0_RX
+#define SDMMC_DMA dma_SDIO_0
#define SDIO_USE_GPDMA 1
#define STATIC_AF_SDMMC_CK STATIC_AF_SDIO_CK
#define STATIC_AF_SDMMC_CMD STATIC_AF_SDIO_CMD
@@ -128,12 +125,6 @@
#endif
-// TODO: Since SDIO is fundamentally half-duplex, we really only need to
-// tie up one DMA channel. However, the HAL DMA API doesn't
-// seem to provide a convenient way to change the direction. I believe that
-// its as simple as changing the CR register and the Init.Direction field
-// and make DMA_SetConfig public.
-
// TODO: I think that as an optimization, we can allocate these dynamically
// if an sd card is detected. This will save approx 260 bytes of RAM
// when no sdcard was being used.
@@ -343,7 +334,7 @@ mp_uint_t sdcard_read_blocks(uint8_t *dest, uint32_t block_num, uint32_t num_blo
uint32_t basepri = raise_irq_pri(IRQ_PRI_OTG_FS);
#if SDIO_USE_GPDMA
- dma_init(&sd_rx_dma, &SDMMC_RX_DMA, DMA_PERIPH_TO_MEMORY, &sd_handle);
+ dma_init(&sd_rx_dma, &SDMMC_DMA, DMA_PERIPH_TO_MEMORY, &sd_handle);
sd_handle.hdmarx = &sd_rx_dma;
#endif
@@ -357,7 +348,7 @@ mp_uint_t sdcard_read_blocks(uint8_t *dest, uint32_t block_num, uint32_t num_blo
}
#if SDIO_USE_GPDMA
- dma_deinit(&SDMMC_RX_DMA);
+ dma_deinit(&SDMMC_DMA);
sd_handle.hdmarx = NULL;
#endif
@@ -409,7 +400,7 @@ mp_uint_t sdcard_write_blocks(const uint8_t *src, uint32_t block_num, uint32_t n
uint32_t basepri = raise_irq_pri(IRQ_PRI_OTG_FS);
#if SDIO_USE_GPDMA
- dma_init(&sd_tx_dma, &SDMMC_TX_DMA, DMA_MEMORY_TO_PERIPH, &sd_handle);
+ dma_init(&sd_tx_dma, &SDMMC_DMA, DMA_MEMORY_TO_PERIPH, &sd_handle);
sd_handle.hdmatx = &sd_tx_dma;
#endif
@@ -422,7 +413,7 @@ mp_uint_t sdcard_write_blocks(const uint8_t *src, uint32_t block_num, uint32_t n
}
#if SDIO_USE_GPDMA
- dma_deinit(&SDMMC_TX_DMA);
+ dma_deinit(&SDMMC_DMA);
sd_handle.hdmatx = NULL;
#endif