From 176444320c3c32bd35180ffcdbbda7be0cfd23bc Mon Sep 17 00:00:00 2001 From: gdisirio Date: Tue, 10 Nov 2009 22:13:59 +0000 Subject: [PATCH] git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@1281 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/io/mmc_spi.c | 8 +++++++- os/io/platforms/STM32/spi_lld.c | 15 ++++++++------- os/io/platforms/STM32/spi_lld.h | 5 +++-- os/io/spi.c | 4 ++-- os/io/spi.h | 4 ++-- os/io/templates/spi_lld.c | 5 +++-- os/io/templates/spi_lld.h | 5 +++-- 7 files changed, 28 insertions(+), 18 deletions(-) diff --git a/os/io/mmc_spi.c b/os/io/mmc_spi.c index 6a2407a6a..42100bb61 100644 --- a/os/io/mmc_spi.c +++ b/os/io/mmc_spi.c @@ -372,6 +372,8 @@ bool_t mmcSequentialRead(MMCDriver *mmcp, uint8_t *buffer) { * @retval TRUE the operation failed. */ bool_t mmcStopSequentialRead(MMCDriver *mmcp) { + static const uint8_t stopcmd[] = {0x40 | MMC_CMDSTOP, 0, 0, 0, 0, 1, 0xFF}; + bool_t result; chDbgCheck(mmcp != NULL, "mmcStopSequentialRead"); @@ -382,11 +384,15 @@ bool_t mmcStopSequentialRead(MMCDriver *mmcp) { } chSysUnlock(); + spiSend(mmcp->mmc_spip, sizeof(stopcmd), stopcmd); + result = recvr1(mmcp) != 0x00; + spiUnselect(mmcp->mmc_spip); + chSysLock(); if (mmcp->mmc_state == MMC_READING) mmcp->mmc_state = MMC_READY; chSysUnlock(); - return FALSE; + return result; } /** @} */ diff --git a/os/io/platforms/STM32/spi_lld.c b/os/io/platforms/STM32/spi_lld.c index b92dafe6e..087319c5d 100644 --- a/os/io/platforms/STM32/spi_lld.c +++ b/os/io/platforms/STM32/spi_lld.c @@ -61,7 +61,7 @@ static void spi_stop(SPIDriver *spip) { } static void spi_start_wait(SPIDriver *spip, size_t n, - void *rxbuf, void *txbuf) { + const void *txbuf, void *rxbuf) { uint32_t ccr; /* Common DMA setup.*/ @@ -294,7 +294,7 @@ void spi_lld_ignore(SPIDriver *spip, size_t n) { spip->spd_dmarx->CCR = DMA_CCR1_TCIE | DMA_CCR1_TEIE; spip->spd_dmatx->CCR = DMA_CCR1_DIR | DMA_CCR1_TEIE; - spi_start_wait(spip, n, &dummyrx, &dummytx); + spi_start_wait(spip, n, &dummytx, &dummyrx); } /** @@ -309,11 +309,12 @@ void spi_lld_ignore(SPIDriver *spip, size_t n) { * @note The buffers are organized as uint8_t arrays for data sizes below or * equal to 8 bits else it is organized as uint16_t arrays. */ -void spi_lld_exchange(SPIDriver *spip, size_t n, void *txbuf, void *rxbuf) { +void spi_lld_exchange(SPIDriver *spip, size_t n, + const void *txbuf, void *rxbuf) { spip->spd_dmarx->CCR = DMA_CCR1_TCIE | DMA_CCR1_MINC | DMA_CCR1_TEIE; spip->spd_dmatx->CCR = DMA_CCR1_DIR | DMA_CCR1_MINC | DMA_CCR1_TEIE; - spi_start_wait(spip, n, rxbuf, txbuf); + spi_start_wait(spip, n, txbuf, rxbuf); } /** @@ -326,11 +327,11 @@ void spi_lld_exchange(SPIDriver *spip, size_t n, void *txbuf, void *rxbuf) { * @note The buffers are organized as uint8_t arrays for data sizes below or * equal to 8 bits else it is organized as uint16_t arrays. */ -void spi_lld_send(SPIDriver *spip, size_t n, void *txbuf) { +void spi_lld_send(SPIDriver *spip, size_t n, const void *txbuf) { spip->spd_dmarx->CCR = DMA_CCR1_TCIE | DMA_CCR1_TEIE; spip->spd_dmatx->CCR = DMA_CCR1_DIR | DMA_CCR1_MINC | DMA_CCR1_TEIE; - spi_start_wait(spip, n, &dummyrx, txbuf); + spi_start_wait(spip, n, txbuf, &dummyrx); } /** @@ -347,7 +348,7 @@ void spi_lld_receive(SPIDriver *spip, size_t n, void *rxbuf) { spip->spd_dmarx->CCR = DMA_CCR1_TCIE | DMA_CCR1_MINC | DMA_CCR1_TEIE; spip->spd_dmatx->CCR = DMA_CCR1_DIR | DMA_CCR1_TEIE; - spi_start_wait(spip, n, rxbuf, &dummytx); + spi_start_wait(spip, n, &dummytx, rxbuf); } /** @} */ diff --git a/os/io/platforms/STM32/spi_lld.h b/os/io/platforms/STM32/spi_lld.h index 54dcbfff3..a6041f060 100644 --- a/os/io/platforms/STM32/spi_lld.h +++ b/os/io/platforms/STM32/spi_lld.h @@ -186,8 +186,9 @@ extern "C" { void spi_lld_select(SPIDriver *spip); void spi_lld_unselect(SPIDriver *spip); void spi_lld_ignore(SPIDriver *spip, size_t n); - void spi_lld_exchange(SPIDriver *spip, size_t n, void *txbuf, void *rxbuf); - void spi_lld_send(SPIDriver *spip, size_t n, void *txbuf); + void spi_lld_exchange(SPIDriver *spip, size_t n, + const void *txbuf, void *rxbuf); + void spi_lld_send(SPIDriver *spip, size_t n, const void *txbuf); void spi_lld_receive(SPIDriver *spip, size_t n, void *rxbuf); #ifdef __cplusplus } diff --git a/os/io/spi.c b/os/io/spi.c index 226751ddb..4d45d217d 100644 --- a/os/io/spi.c +++ b/os/io/spi.c @@ -159,7 +159,7 @@ void spiIgnore(SPIDriver *spip, size_t n) { * @note The buffers are organized as uint8_t arrays for data sizes below or * equal to 8 bits else it is organized as uint16_t arrays. */ -void spiExchange(SPIDriver *spip, size_t n, void *txbuf, void *rxbuf) { +void spiExchange(SPIDriver *spip, size_t n, const void *txbuf, void *rxbuf) { chDbgCheck((spip != NULL) && (n > 0) && (rxbuf != NULL) && (txbuf != NULL), "spiExchange"); @@ -180,7 +180,7 @@ void spiExchange(SPIDriver *spip, size_t n, void *txbuf, void *rxbuf) { * @note The buffers are organized as uint8_t arrays for data sizes below or * equal to 8 bits else it is organized as uint16_t arrays. */ -void spiSend(SPIDriver *spip, size_t n, void *txbuf) { +void spiSend(SPIDriver *spip, size_t n, const void *txbuf) { chDbgCheck((spip != NULL) && (n > 0) && (txbuf != NULL), "spiSend"); diff --git a/os/io/spi.h b/os/io/spi.h index 3bd21e71b..cebde453f 100644 --- a/os/io/spi.h +++ b/os/io/spi.h @@ -60,8 +60,8 @@ extern "C" { void spiSelect(SPIDriver *spip); void spiUnselect(SPIDriver *spip); void spiIgnore(SPIDriver *spip, size_t n); - void spiExchange(SPIDriver *spip, size_t n, void *txbuf, void *rxbuf); - void spiSend(SPIDriver *spip, size_t n, void *txbuf); + void spiExchange(SPIDriver *spip, size_t n, const void *txbuf, void *rxbuf); + void spiSend(SPIDriver *spip, size_t n, const void *txbuf); void spiReceive(SPIDriver *spip, size_t n, void *rxbuf); #if SPI_USE_MUTUAL_EXCLUSION void spiAcquireBus(SPIDriver *spip); diff --git a/os/io/templates/spi_lld.c b/os/io/templates/spi_lld.c index 61f23ddbe..501352037 100644 --- a/os/io/templates/spi_lld.c +++ b/os/io/templates/spi_lld.c @@ -112,7 +112,8 @@ void spi_lld_ignore(SPIDriver *spip, size_t n) { * @note The buffers are organized as uint8_t arrays for data sizes below or * equal to 8 bits else it is organized as uint16_t arrays. */ -void spi_lld_exchange(SPIDriver *spip, size_t n, void *rxbuf, void *txbuf) { +void spi_lld_exchange(SPIDriver *spip, size_t n, + const void *txbuf, void *rxbuf) { } @@ -126,7 +127,7 @@ void spi_lld_exchange(SPIDriver *spip, size_t n, void *rxbuf, void *txbuf) { * @note The buffers are organized as uint8_t arrays for data sizes below or * equal to 8 bits else it is organized as uint16_t arrays. */ -void spi_lld_send(SPIDriver *spip, size_t n, void *txbuf) { +void spi_lld_send(SPIDriver *spip, size_t n, const void *txbuf) { } diff --git a/os/io/templates/spi_lld.h b/os/io/templates/spi_lld.h index a84dce1fd..5246225d7 100644 --- a/os/io/templates/spi_lld.h +++ b/os/io/templates/spi_lld.h @@ -91,8 +91,9 @@ extern "C" { void spi_lld_select(SPIDriver *spip); void spi_lld_unselect(SPIDriver *spip); void spi_lld_ignore(SPIDriver *spip, size_t n); - void spi_lld_exchange(SPIDriver *spip, size_t n, void *txbuf, void *rxbuf); - void spi_lld_send(SPIDriver *spip, size_t n, void *txbuf); + void spi_lld_exchange(SPIDriver *spip, size_t n, + const void *txbuf, void *rxbuf); + void spi_lld_send(SPIDriver *spip, size_t n, const void *txbuf); void spi_lld_receive(SPIDriver *spip, size_t n, void *rxbuf); #ifdef __cplusplus }