aboutsummaryrefslogtreecommitdiffstats
path: root/os/hal/src
diff options
context:
space:
mode:
Diffstat (limited to 'os/hal/src')
-rw-r--r--os/hal/src/mmc_spi.c15
-rw-r--r--os/hal/src/sdc.c23
2 files changed, 34 insertions, 4 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;
}
diff --git a/os/hal/src/sdc.c b/os/hal/src/sdc.c
index 5a84f7fb7..30f24af5b 100644
--- a/os/hal/src/sdc.c
+++ b/os/hal/src/sdc.c
@@ -468,13 +468,21 @@ sdcflags_t sdcGetAndClearErrors(SDCDriver *sdcp) {
* @api
*/
bool_t sdcSync(SDCDriver *sdcp) {
+ bool_t result;
chDbgCheck(sdcp != NULL, "sdcSync");
if (sdcp->state != BLK_READY)
return CH_FAILED;
- return sdc_lld_sync(sdcp);
+ /* Synchronization operation in progress.*/
+ sdcp->state = BLK_SYNCING;
+
+ result = sdc_lld_sync(sdcp);
+
+ /* Synchronization operation finished.*/
+ sdcp->state = BLK_READY;
+ return result;
}
/**
@@ -522,6 +530,9 @@ bool_t sdcErase(SDCDriver *sdcp, uint32_t startblk, uint32_t endblk) {
chDbgCheck((sdcp != NULL), "sdcErase");
chDbgAssert(sdcp->state == BLK_READY, "sdcErase(), #1", "invalid state");
+ /* Erase operation in progress.*/
+ sdcp->state = BLK_WRITING;
+
/* Handling command differences between HC and normal cards.*/
if (!(sdcp->cardmode & SDC_MODE_HIGH_CAPACITY)) {
startblk *= MMCSD_BLOCK_SIZE;
@@ -533,17 +544,17 @@ bool_t sdcErase(SDCDriver *sdcp, uint32_t startblk, uint32_t endblk) {
if ((sdc_lld_send_cmd_short_crc(sdcp, MMCSD_CMD_ERASE_RW_BLK_START,
startblk, resp) != CH_SUCCESS) ||
MMCSD_R1_ERROR(resp[0]))
- return CH_FAILED;
+ goto failed;
if ((sdc_lld_send_cmd_short_crc(sdcp, MMCSD_CMD_ERASE_RW_BLK_END,
endblk, resp) != CH_SUCCESS) ||
MMCSD_R1_ERROR(resp[0]))
- return CH_FAILED;
+ goto failed;
if ((sdc_lld_send_cmd_short_crc(sdcp, MMCSD_CMD_ERASE,
0, resp) != CH_SUCCESS) ||
MMCSD_R1_ERROR(resp[0]))
- return CH_FAILED;
+ goto failed;
/* Quick sleep to allow it to transition to programming or receiving state */
/* TODO: ??????????????????????????? */
@@ -552,6 +563,10 @@ bool_t sdcErase(SDCDriver *sdcp, uint32_t startblk, uint32_t endblk) {
_sdc_wait_for_transfer_state(sdcp);
return CH_SUCCESS;
+
+failed:
+ sdcp->state = BLK_READY;
+ return CH_FAILED;
}
#endif /* HAL_USE_SDC */