From 5a6b1e42b07402faf42498282cb0bcf931d3b0d1 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Sun, 24 Feb 2013 08:11:13 +0000 Subject: [PATCH] Fixed bug 3605794. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@5306 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/hal/dox/io_block.dox | 63 ++++++++++++++++++++------------------- os/hal/include/io_block.h | 3 +- os/hal/src/mmc_spi.c | 15 ++++++++++ os/hal/src/sdc.c | 23 +++++++++++--- readme.txt | 1 + 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