aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--os/hal/dox/io_block.dox63
-rw-r--r--os/hal/include/io_block.h3
-rw-r--r--os/hal/src/mmc_spi.c15
-rw-r--r--os/hal/src/sdc.c23
-rw-r--r--readme.txt1
5 files changed, 70 insertions, 35 deletions
diff --git a/os/hal/dox/io_block.dox b/os/hal/dox/io_block.dox
index 9324b50cb..bc709f11e 100644
--- a/os/hal/dox/io_block.dox
+++ b/os/hal/dox/io_block.dox
@@ -39,28 +39,28 @@
stop [label="BLK_STOP\nLow Power"];
uninit [label="BLK_UNINIT", style="bold"];
- ready [label="BLK_READY\nClock Enabled"];
+ active [label="BLK_ACTIVE\nClock Enabled"];
connecting [label="BLK_CONN.ING\nConnecting"];
disconnecting [label="BLK_DISC.ING\nDisconnecting"];
- active [label="BLK_ACTIVE\nCard Ready"];
+ ready [label="BLK_READY\nCard Ready"];
reading [label="BLK_READING\nReading"];
writing [label="BLK_WRITING\nWriting"];
uninit -> stop [label=" blkInit()", constraint=false];
stop -> stop [label="\nblkStop()"];
- stop -> ready [label="\nblkStart()"];
- ready -> stop [label="\nblkStop()"];
- ready -> ready [label="\nblkStart()\nblkDisconnect()"];
- ready -> connecting [label="\nblkConnect()"];
- connecting -> active [label="\nconnection\nsuccessful"];
- connecting -> active [label="\nblkConnect()", dir="back"];
- connecting -> ready [label="\nconnection\nfailed"];
- disconnecting -> active [label="\nblkDisconnect()", dir="back"];
- ready -> disconnecting [label="\ndisconnection\nfinished", dir="back"];
- active -> reading [label="\nblkRead()"];
- reading -> active [label="\nread finished\nread error"];
- active -> writing [label="\nblkWrite()"];
- writing -> active [label="\nwrite finished\nwrite error"];
+ stop -> active [label="\nblkStart()"];
+ active -> stop [label="\nblkStop()"];
+ active -> active [label="\nblkStart()\nblkDisconnect()"];
+ active -> connecting [label="\nblkConnect()"];
+ connecting -> ready [label="\nconnection\nsuccessful"];
+ connecting -> ready [label="\nblkConnect()", dir="back"];
+ connecting -> active [label="\nconnection\nfailed"];
+ disconnecting -> ready [label="\nblkDisconnect()", dir="back"];
+ active -> disconnecting [label="\ndisconnection\nfinished", dir="back"];
+ ready -> reading [label="\nblkRead()"];
+ reading -> ready [label="\nread finished\nread error"];
+ ready -> writing [label="\nblkWrite()"];
+ writing -> ready [label="\nwrite finished\nwrite error"];
}
* @enddot
* @else
@@ -73,28 +73,31 @@
stop [label="BLK_STOP\nLow Power"];
uninit [label="BLK_UNINIT", style="bold"];
- ready [label="BLK_READY\nClock Enabled"];
+ active [label="BLK_ACTIVE\nClock Enabled"];
connecting [label="BLK_CONN.ING\nConnecting"];
disconnecting [label="BLK_DISC.ING\nDisconnecting"];
- active [label="BLK_ACTIVE\nCard Ready"];
+ ready [label="BLK_READY\nCard Ready"];
reading [label="BLK_READING\nReading"];
writing [label="BLK_WRITING\nWriting"];
+ syncing [label="BLK_SYNCING\nSynchronizing"];
uninit -> stop [label=" blkInit()", constraint=false];
stop -> stop [label="\nblkStop()"];
- stop -> ready [label="\nblkStart()"];
- ready -> stop [label="\nblkStop()"];
- ready -> ready [label="\nblkStart()\nblkDisconnect()"];
- ready -> connecting [label="\nblkConnect()"];
- connecting -> active [label="\nconnection\nsuccessful"];
- connecting -> active [label="\nblkConnect()", dir="back"];
- connecting -> ready [label="\nconnection\nfailed"];
- disconnecting -> active [label="\nblkDisconnect()", dir="back"];
- ready -> disconnecting [label="\ndisconnection\nfinished", dir="back"];
- active -> reading [label="\nblkRead()"];
- reading -> active [label="\nread finished\nread error"];
- active -> writing [label="\nblkWrite()"];
- writing -> active [label="\nwrite finished\nwrite error"];
+ stop -> active [label="\nblkStart()"];
+ active -> stop [label="\nblkStop()"];
+ active -> active [label="\nblkStart()\nblkDisconnect()"];
+ active -> connecting [label="\nblkConnect()"];
+ connecting -> ready [label="\nconnection\nsuccessful"];
+ connecting -> ready [label="\nblkConnect()", dir="back"];
+ connecting -> active [label="\nconnection\nfailed"];
+ disconnecting -> ready [label="\nblkDisconnect()", dir="back"];
+ active -> disconnecting [label="\ndisconnection\nfinished", dir="back"];
+ ready -> reading [label="\nblkRead()"];
+ reading -> ready [label="\nread finished\nread error"];
+ ready -> writing [label="\nblkWrite()"];
+ writing -> ready [label="\nwrite finished\nwrite error"];
+ ready -> syncing [label="\nblkSync()"];
+ syncing -> ready [label="\nsynchronization finished"];
}
* @enddot
* @endif
diff --git a/os/hal/include/io_block.h b/os/hal/include/io_block.h
index da0e97d8a..39ab6bf76 100644
--- a/os/hal/include/io_block.h
+++ b/os/hal/include/io_block.h
@@ -49,7 +49,8 @@ typedef enum {
BLK_DISCONNECTING = 4, /**< Disconnection in progress. */
BLK_READY = 5, /**< Device ready. */
BLK_READING = 6, /**< Read operation in progress. */
- BLK_WRITING = 7 /**< Write operation in progress. */
+ BLK_WRITING = 7, /**< Write operation in progress. */
+ BLK_SYNCING = 8 /**< Sync. operation in progress. */
} blkstate_t;
/**
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 */
diff --git a/readme.txt b/readme.txt
index 6f7b6ebd8..482945cb4 100644
--- a/readme.txt
+++ b/readme.txt
@@ -85,6 +85,7 @@
*****************************************************************************
*** 2.5.2 ***
+- FIX: Fixed errors in MMC_SPI driver state machine (bug 3605794).
- FIX: Fixed deadlock in Serial_USB driver (bug 3605793).
- FIX: Fixed compile Error OLIMEX_SAM7_EX256/board.c (bug 3605058).
- FIX: Fixed bug prevents calling adcStartConversionI() within ISR (bug