aboutsummaryrefslogtreecommitdiffstats
path: root/os/io/mmc_spi.c
diff options
context:
space:
mode:
authorgdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2009-11-10 16:43:04 +0000
committergdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2009-11-10 16:43:04 +0000
commit3077b40452398a08c7346b042b111832695b1db1 (patch)
tree78fe0b649448bb32658116282dd6d3d80c36cbf3 /os/io/mmc_spi.c
parent727ba84c9b99c7a1e06bf344b58c55f24472e5ba (diff)
downloadChibiOS-3077b40452398a08c7346b042b111832695b1db1.tar.gz
ChibiOS-3077b40452398a08c7346b042b111832695b1db1.tar.bz2
ChibiOS-3077b40452398a08c7346b042b111832695b1db1.zip
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@1279 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'os/io/mmc_spi.c')
-rw-r--r--os/io/mmc_spi.c35
1 files changed, 23 insertions, 12 deletions
diff --git a/os/io/mmc_spi.c b/os/io/mmc_spi.c
index 009085ec8..58911a3cf 100644
--- a/os/io/mmc_spi.c
+++ b/os/io/mmc_spi.c
@@ -155,14 +155,13 @@ static uint8_t send_command(MMCDriver *mmcp, uint8_t cmd, uint32_t arg) {
*/
static bool_t get_data(MMCDriver *mmcp, uint8_t *buf) {
int i;
- uint8_t ignored[2];
for (i = 0; i < MMC_WAIT_DATA; i++) {
spiReceive(mmcp->mmc_spip, 1, buf);
if (buf[0] == 0xFE) {
spiReceive(mmcp->mmc_spip, 512, buf);
/* CRC ignored. */
- spiReceive(mmcp->mmc_spip, 2, ignored);
+ spiIgnore(mmcp->mmc_spip, 2);
return FALSE;
}
}
@@ -228,7 +227,7 @@ void mmcStart(MMCDriver *mmcp, const MMCConfig *config) {
}
/**
- * @brief Deactivates the MMC peripheral.
+ * @brief Disables the MMC peripheral.
*
* @param[in] mmcp pointer to the @p MMCDriver object
*/
@@ -238,7 +237,8 @@ void mmcStop(MMCDriver *mmcp) {
chSysLock();
chDbgAssert((mmcp->mmc_state != MMC_UNINIT) &&
- (mmcp->mmc_state != MMC_RUNNING),
+ (mmcp->mmc_state != MMC_READING) &&
+ (mmcp->mmc_state != MMC_WRITING),
"mmcStop(), #1",
"invalid state");
if (mmcp->mmc_state != MMC_STOP) {
@@ -277,6 +277,7 @@ bool_t mmcConnect(MMCDriver *mmcp) {
if (mmcp->mmc_state == MMC_INSERTED) {
/* Slow clock mode and 128 clock pulses.*/
spiStart(mmcp->mmc_spip, mmcp->mmc_lscfg);
+ spiIgnore(mmcp->mmc_spip, 16);
/* SPI mode selection.*/
i = 0;
@@ -331,7 +332,7 @@ bool_t mmcStartSequentialRead(MMCDriver *mmcp, uint32_t startblk) {
chSysUnlock();
return TRUE;
}
- mmcp->mmc_state = MMC_RUNNING;
+ mmcp->mmc_state = MMC_READING;
chSysUnlock();
spiSelect(mmcp->mmc_spip);
@@ -339,7 +340,7 @@ bool_t mmcStartSequentialRead(MMCDriver *mmcp, uint32_t startblk) {
if (recvr1() != 0x00) {
spiUnselect(mmcp->mmc_spip);
chSysLock();
- if (mmcp->mmc_state == MMC_RUNNING)
+ if (mmcp->mmc_state == MMC_READING)
mmcp->mmc_state = MMC_READY;
chSysUnlock();
return TRUE;
@@ -359,26 +360,29 @@ bool_t mmcStartSequentialRead(MMCDriver *mmcp, uint32_t startblk) {
*/
bool_t mmcSequentialRead(MMCDriver *mmcp, uint8_t *buffer) {
int i;
- uint8_t ignored[2];
chDbgCheck((mmcp != NULL) && (buffer != NULL), "mmcSequentialRead");
- if (mmcp->mmc_state != MMC_RUNNING)
+ chSysLock();
+ if (mmcp->mmc_state != MMC_READING) {
+ chSysUnlock();
return TRUE;
+ }
+ chSysUnlock();
for (i = 0; i < MMC_WAIT_DATA; i++) {
spiReceive(mmcp->mmc_spip, 1, buf);
if (buf[0] == 0xFE) {
spiReceive(mmcp->mmc_spip, 512, buf);
/* CRC ignored. */
- spiReceive(mmcp->mmc_spip, 2, ignored);
+ spiIgnore(mmcp->mmc_spip, 2);
return FALSE;
}
}
/* Timeout.*/
spiUnselect(mmcp->mmc_spip);
chSysLock();
- if (mmcp->mmc_state == MMC_RUNNING)
+ if (mmcp->mmc_state == MMC_READING)
mmcp->mmc_state = MMC_READY;
chSysUnlock();
return TRUE;
@@ -397,10 +401,17 @@ bool_t mmcStopSequentialRead(MMCDriver *mmcp) {
chDbgCheck(mmcp != NULL, "mmcStopSequentialRead");
- if (mmcp->mmc_state != MMC_RUNNING)
+ chSysLock();
+ if (mmcp->mmc_state != MMC_READING) {
+ chSysUnlock();
return TRUE;
+ }
+ chSysUnlock();
- mmcp->mmc_state = MMC_READY;
+ chSysLock();
+ if (mmcp->mmc_state == MMC_READING)
+ mmcp->mmc_state = MMC_READY;
+ chSysUnlock();
return FALSE;
}