aboutsummaryrefslogtreecommitdiffstats
path: root/os/hal/src/mmc_spi.c
diff options
context:
space:
mode:
Diffstat (limited to 'os/hal/src/mmc_spi.c')
-rw-r--r--os/hal/src/mmc_spi.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/os/hal/src/mmc_spi.c b/os/hal/src/mmc_spi.c
index b2fd5b724..0d5af82d7 100644
--- a/os/hal/src/mmc_spi.c
+++ b/os/hal/src/mmc_spi.c
@@ -600,6 +600,7 @@ bool_t mmcStartSequentialRead(MMCDriver *mmcp, uint32_t startblk) {
if (recvr1(mmcp) != 0x00) {
spiStop(mmcp->config->spip);
+ mmcp->state = BLK_READY;
return CH_FAILED;
}
return CH_SUCCESS;
@@ -637,6 +638,7 @@ bool_t mmcSequentialRead(MMCDriver *mmcp, uint8_t *buffer) {
/* Timeout.*/
spiUnselect(mmcp->config->spip);
spiStop(mmcp->config->spip);
+ mmcp->state = BLK_READY;
return CH_FAILED;
}
@@ -702,6 +704,7 @@ bool_t mmcStartSequentialWrite(MMCDriver *mmcp, uint32_t startblk) {
if (recvr1(mmcp) != 0x00) {
spiStop(mmcp->config->spip);
+ mmcp->state = BLK_READY;
return CH_FAILED;
}
return CH_SUCCESS;
@@ -740,6 +743,7 @@ bool_t mmcSequentialWrite(MMCDriver *mmcp, const uint8_t *buffer) {
/* Error.*/
spiUnselect(mmcp->config->spip);
spiStop(mmcp->config->spip);
+ mmcp->state = BLK_READY;
return CH_FAILED;
}
@@ -788,8 +792,14 @@ bool_t mmcSync(MMCDriver *mmcp) {
if (mmcp->state != BLK_READY)
return CH_FAILED;
+ /* Synchronization operation in progress.*/
+ mmcp->state = BLK_SYNCING;
+
spiStart(mmcp->config->spip, mmcp->config->hscfg);
sync(mmcp);
+
+ /* Synchronization operation finished.*/
+ mmcp->state = BLK_READY;
return CH_SUCCESS;
}
@@ -835,6 +845,9 @@ bool_t mmcErase(MMCDriver *mmcp, uint32_t startblk, uint32_t endblk) {
chDbgCheck((mmcp != NULL), "mmcErase");
+ /* Erase operation in progress.*/
+ mmcp->state = BLK_WRITING;
+
/* Handling command differences between HC and normal cards.*/
if (!mmcp->block_addresses) {
startblk *= MMCSD_BLOCK_SIZE;
@@ -850,11 +863,13 @@ bool_t mmcErase(MMCDriver *mmcp, uint32_t startblk, uint32_t endblk) {
if (send_command_R1(mmcp, MMCSD_CMD_ERASE, 0))
goto failed;
+ mmcp->state = BLK_READY;
return CH_SUCCESS;
/* Command failed, state reset to BLK_ACTIVE.*/
failed:
spiStop(mmcp->config->spip);
+ mmcp->state = BLK_READY;
return CH_FAILED;
}