From 594699bc88f1293496e178c76567d2d608a005d8 Mon Sep 17 00:00:00 2001 From: Damien George Date: Mon, 7 Jul 2014 07:29:06 +0100 Subject: [PATCH] stmhal: Protect SD_WriteBlocks by IRQ disable/enable pair. --- stmhal/sdcard.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/stmhal/sdcard.c b/stmhal/sdcard.c index 104c195b8..2993773fa 100644 --- a/stmhal/sdcard.c +++ b/stmhal/sdcard.c @@ -144,10 +144,11 @@ bool sdcard_read_blocks(uint8_t *dest, uint32_t block_num, uint32_t num_blocks) return false; } - HAL_SD_ErrorTypedef err; - + // We must disable IRQs because the SDIO peripheral has a small FIFO + // buffer and we can't let it fill up in the middle of a read. + // This will not be needed when SD uses DMA for transfer. __disable_irq(); - err = HAL_SD_ReadBlocks(&sd_handle, (uint32_t*)dest, block_num * SDCARD_BLOCK_SIZE, SDCARD_BLOCK_SIZE, num_blocks); + HAL_SD_ErrorTypedef err = HAL_SD_ReadBlocks(&sd_handle, (uint32_t*)dest, block_num * SDCARD_BLOCK_SIZE, SDCARD_BLOCK_SIZE, num_blocks); __enable_irq(); if (err != SD_OK) { @@ -168,7 +169,14 @@ bool sdcard_write_blocks(const uint8_t *src, uint32_t block_num, uint32_t num_bl return false; } - if (HAL_SD_WriteBlocks(&sd_handle, (uint32_t*)src, block_num * SDCARD_BLOCK_SIZE, SDCARD_BLOCK_SIZE, num_blocks) != SD_OK) { + // We must disable IRQs because the SDIO peripheral has a small FIFO + // buffer and we can't let it drain to empty in the middle of a write. + // This will not be needed when SD uses DMA for transfer. + __disable_irq(); + HAL_SD_ErrorTypedef err = HAL_SD_WriteBlocks(&sd_handle, (uint32_t*)src, block_num * SDCARD_BLOCK_SIZE, SDCARD_BLOCK_SIZE, num_blocks); + __enable_irq(); + + if (err != SD_OK) { return false; }