diff options
Diffstat (limited to 'os/hal/src/mmc_spi.c')
-rw-r--r-- | os/hal/src/mmc_spi.c | 15 |
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;
}
|