summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2014-07-07 07:29:06 +0100
committerDamien George <damien.p.george@gmail.com>2014-07-07 07:29:06 +0100
commit594699bc88f1293496e178c76567d2d608a005d8 (patch)
tree682ad0fcb9aad754f951880493827c438143b8e6
parent90ba80dc363ffc07b9bbd7156ff44c8e01c69869 (diff)
downloadmicropython-594699bc88f1293496e178c76567d2d608a005d8.tar.gz
micropython-594699bc88f1293496e178c76567d2d608a005d8.zip
stmhal: Protect SD_WriteBlocks by IRQ disable/enable pair.
-rw-r--r--stmhal/sdcard.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/stmhal/sdcard.c b/stmhal/sdcard.c
index 104c195b84..2993773fab 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;
}