git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@4050 35acf78f-673a-0410-8e92-d51de3d6d3f4

This commit is contained in:
gdisirio 2012-03-18 20:30:06 +00:00
parent 470b447644
commit e5c320a0d1
4 changed files with 76 additions and 3 deletions

View File

@ -85,6 +85,18 @@ typedef struct I2SDriver I2SDriver;
(i2sp)->state = I2S_ACTIVE; \ (i2sp)->state = I2S_ACTIVE; \
} }
/**
* @brief Starts a I2S data exchange in continuous mode.
*
* @param[in] i2sp pointer to the @p I2SDriver object
*
* @iclass
*/
#define i2sStartExchangeContinuousI(i2sp) { \
i2s_lld_start_exchange_continuous(i2sp); \
(i2sp)->state = I2S_ACTIVE; \
}
/** /**
* @brief Stops the ongoing data exchange. * @brief Stops the ongoing data exchange.
* @details The ongoing data exchange, if any, is stopped, if the driver * @details The ongoing data exchange, if any, is stopped, if the driver

View File

@ -62,6 +62,15 @@
*/ */
void i2s_lld_init(void) { void i2s_lld_init(void) {
#if STM32_I2S_USE_I2S2
spiObjectInit(&I2SD2);
I2SD2.spi = SPI2;
#endif
#if STM32_I2S_USE_I2S3
spiObjectInit(&I2SD3);
I2SD3.spi = SPI3;
#endif
} }
/** /**
@ -73,8 +82,30 @@ void i2s_lld_init(void) {
*/ */
void i2s_lld_start(I2SDriver *i2sp) { void i2s_lld_start(I2SDriver *i2sp) {
/* If in stopped state then enables the SPI and DMA clocks.*/
if (i2sp->state == I2S_STOP) { if (i2sp->state == I2S_STOP) {
/* Clock activation.*/ #if STM32_SPI_USE_SPI2
if (&SPID2 == spip) {
bool_t b;
b = dmaStreamAllocate(spip->dma,
STM32_I2S_I2S2_IRQ_PRIORITY,
(stm32_dmaisr_t)i2s_lld_serve_rx_interrupt,
(void *)spip);
chDbgAssert(!b, "spi_lld_start(), #1", "stream already allocated");
rccEnableSPI2(FALSE);
}
#endif
#if STM32_SPI_USE_SPI3
if (&SPID3 == spip) {
bool_t b;
b = dmaStreamAllocate(spip->dma,
STM32_I2S_I2S3_IRQ_PRIORITY,
(stm32_dmaisr_t)i2s_lld_serve_rx_interrupt,
(void *)spip);
chDbgAssert(!b, "spi_lld_start(), #2", "stream already allocated");
rccEnableSPI3(FALSE);
}
#endif
} }
/* Configuration.*/ /* Configuration.*/
} }
@ -94,7 +125,6 @@ void i2s_lld_stop(I2SDriver *i2sp) {
} }
} }
/** /**
* @brief Starts a I2S data exchange. * @brief Starts a I2S data exchange.
* *
@ -106,6 +136,17 @@ void i2s_lld_start_exchange(I2SDriver *i2sp) {
} }
/**
* @brief Starts a I2S data exchange in continuous mode.
*
* @param[in] i2sp pointer to the @p I2SDriver object
*
* @notapi
*/
void i2s_lld_start_exchange_continuous(I2SDriver *i2sp) {
}
/** /**
* @brief Stops the ongoing data exchange. * @brief Stops the ongoing data exchange.
* @details The ongoing data exchange, if any, is stopped, if the driver * @details The ongoing data exchange, if any, is stopped, if the driver

View File

@ -311,6 +311,7 @@ extern "C" {
void i2s_lld_start(I2SDriver *i2sp); void i2s_lld_start(I2SDriver *i2sp);
void i2s_lld_stop(I2SDriver *i2sp); void i2s_lld_stop(I2SDriver *i2sp);
void i2s_lld_start_exchange(I2SDriver *i2sp); void i2s_lld_start_exchange(I2SDriver *i2sp);
void i2s_lld_start_exchange_continuous(I2SDriver *i2sp);
void i2s_lld_stop_exchange(I2SDriver *i2sp); void i2s_lld_stop_exchange(I2SDriver *i2sp);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -128,11 +128,30 @@ void i2sStartExchange(I2SDriver *i2sp) {
chDbgCheck(i2sp != NULL "i2sStartExchange"); chDbgCheck(i2sp != NULL "i2sStartExchange");
chSysLock(); chSysLock();
chDbgAssert(i2sp->state == I2S_READY, "i2sStartExchange(), #1", "not ready"); chDbgAssert(i2sp->state == I2S_READY,
"i2sStartExchange(), #1", "not ready");
i2sStartExchangeI(i2sp); i2sStartExchangeI(i2sp);
chSysUnlock(); chSysUnlock();
} }
/**
* @brief Starts a I2S data exchange in continuous mode.
*
* @param[in] i2sp pointer to the @p I2SDriver object
*
* @api
*/
void i2sStartExchangeContinuous(I2SDriver *i2sp) {
chDbgCheck(i2sp != NULL "i2sStartExchangeContinuous");
chSysLock();
chDbgAssert(i2sp->state == I2S_READY,
"i2sStartExchangeContinuous(), #1", "not ready");
i2sStartExchangeContinuousI(i2sp);
chSysUnlock();
}
/** /**
* @brief Stops the ongoing data exchange. * @brief Stops the ongoing data exchange.
* @details The ongoing data exchange, if any, is stopped, if the driver * @details The ongoing data exchange, if any, is stopped, if the driver