git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@8242 35acf78f-673a-0410-8e92-d51de3d6d3f4
parent
ccef2d248b
commit
95229524a6
|
@ -85,11 +85,6 @@ static void adc_lld_serve_rx_interrupt(ADCDriver *adcp, uint32_t flags) {
|
||||||
ADC error handler, in this case this interrupt is spurious.*/
|
ADC error handler, in this case this interrupt is spurious.*/
|
||||||
if (adcp->grpp != NULL) {
|
if (adcp->grpp != NULL) {
|
||||||
|
|
||||||
/* DMA buffer invalidation because data cache.*/
|
|
||||||
dmaBufferInvalidate(adcp->samples,
|
|
||||||
adcp->samples +
|
|
||||||
(adcp->depth * adcp->grpp->num_channels));
|
|
||||||
|
|
||||||
if ((flags & STM32_DMA_ISR_TCIF) != 0) {
|
if ((flags & STM32_DMA_ISR_TCIF) != 0) {
|
||||||
/* Transfer complete processing.*/
|
/* Transfer complete processing.*/
|
||||||
_adc_isr_full_code(adcp);
|
_adc_isr_full_code(adcp);
|
||||||
|
|
|
@ -5,6 +5,7 @@ Driver capability:
|
||||||
- The driver supports the STM32 enhanced DMA controller found on F2, F4 and
|
- The driver supports the STM32 enhanced DMA controller found on F2, F4 and
|
||||||
F7 sub-families.
|
F7 sub-families.
|
||||||
- Support for automatic the channel selection.
|
- Support for automatic the channel selection.
|
||||||
|
- Support for cache flushing and invalidation.
|
||||||
|
|
||||||
The file registry must export:
|
The file registry must export:
|
||||||
|
|
||||||
|
|
|
@ -240,6 +240,9 @@ typedef void (*stm32_dmaisr_t)(void *p, uint32_t flags);
|
||||||
#if defined(STM32F7XX) || defined(__DOXYGEN__)
|
#if defined(STM32F7XX) || defined(__DOXYGEN__)
|
||||||
/**
|
/**
|
||||||
* @brief Invalidates the data cache lines overlapping a DMA buffer.
|
* @brief Invalidates the data cache lines overlapping a DMA buffer.
|
||||||
|
* @details This function is meant to make sure that data written in
|
||||||
|
* data cache is invalidated. It is used for DMA buffers that
|
||||||
|
* must have been written by a DMA stream.
|
||||||
* @note On devices without data cache this function does nothing.
|
* @note On devices without data cache this function does nothing.
|
||||||
* @note The function takes care of cache lines alignment.
|
* @note The function takes care of cache lines alignment.
|
||||||
*
|
*
|
||||||
|
@ -249,6 +252,31 @@ typedef void (*stm32_dmaisr_t)(void *p, uint32_t flags);
|
||||||
* @api
|
* @api
|
||||||
*/
|
*/
|
||||||
#define dmaBufferInvalidate(saddr, eaddr) { \
|
#define dmaBufferInvalidate(saddr, eaddr) { \
|
||||||
|
uint8_t *start = (uint8_t *)(((uint32_t)(saddr)) & ~0x1FU); \
|
||||||
|
uint8_t *end = (uint8_t *)(((((uint32_t)(eaddr)) - 1U) | 0x1FU) + 1U); \
|
||||||
|
__DSB(); \
|
||||||
|
while (start < end) { \
|
||||||
|
SCB->DCIMVAC = (uint32_t)start; \
|
||||||
|
start += 32U; \
|
||||||
|
} \
|
||||||
|
__DSB(); \
|
||||||
|
__ISB(); \
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Flushes the data cache lines overlapping a DMA buffer.
|
||||||
|
* @details This function is meant to make sure that data written in
|
||||||
|
* data cache is flushed to RAM. It is used for DMA buffers that
|
||||||
|
* must be read by a DMA stream.
|
||||||
|
* @note On devices without data cache this function does nothing.
|
||||||
|
* @note The function takes care of cache lines alignment.
|
||||||
|
*
|
||||||
|
* @param[in] saddr start address of the DMA buffer, inclusive
|
||||||
|
* @param[in] eaddr end address of the DMA buffer, not inclusive
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
#define dmaBufferFlush(saddr, eaddr) { \
|
||||||
uint8_t *start = (uint8_t *)(((uint32_t)(saddr)) & ~0x1FU); \
|
uint8_t *start = (uint8_t *)(((uint32_t)(saddr)) & ~0x1FU); \
|
||||||
uint8_t *end = (uint8_t *)(((((uint32_t)(eaddr)) - 1U) | 0x1FU) + 1U); \
|
uint8_t *end = (uint8_t *)(((((uint32_t)(eaddr)) - 1U) | 0x1FU) + 1U); \
|
||||||
__DSB(); \
|
__DSB(); \
|
||||||
|
@ -264,6 +292,10 @@ typedef void (*stm32_dmaisr_t)(void *p, uint32_t flags);
|
||||||
(void)(addr); \
|
(void)(addr); \
|
||||||
(void)(size); \
|
(void)(size); \
|
||||||
}
|
}
|
||||||
|
#define dmaBufferFlush(addr, size) { \
|
||||||
|
(void)(addr); \
|
||||||
|
(void)(size); \
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -549,9 +549,6 @@ void spi_lld_ignore(SPIDriver *spip, size_t n) {
|
||||||
void spi_lld_exchange(SPIDriver *spip, size_t n,
|
void spi_lld_exchange(SPIDriver *spip, size_t n,
|
||||||
const void *txbuf, void *rxbuf) {
|
const void *txbuf, void *rxbuf) {
|
||||||
|
|
||||||
/* DMA buffer invalidation because data cache.*/
|
|
||||||
dmaBufferInvalidate(rxbuf, (uint8_t *)rxbuf + (n * spip->fsize));
|
|
||||||
|
|
||||||
dmaStreamSetMemory0(spip->dmarx, rxbuf);
|
dmaStreamSetMemory0(spip->dmarx, rxbuf);
|
||||||
dmaStreamSetTransactionSize(spip->dmarx, n);
|
dmaStreamSetTransactionSize(spip->dmarx, n);
|
||||||
dmaStreamSetMode(spip->dmarx, spip->rxdmamode | STM32_DMA_CR_MINC);
|
dmaStreamSetMode(spip->dmarx, spip->rxdmamode | STM32_DMA_CR_MINC);
|
||||||
|
@ -606,9 +603,6 @@ void spi_lld_send(SPIDriver *spip, size_t n, const void *txbuf) {
|
||||||
*/
|
*/
|
||||||
void spi_lld_receive(SPIDriver *spip, size_t n, void *rxbuf) {
|
void spi_lld_receive(SPIDriver *spip, size_t n, void *rxbuf) {
|
||||||
|
|
||||||
/* DMA buffer invalidation because data cache.*/
|
|
||||||
dmaBufferInvalidate(rxbuf, (uint8_t *)rxbuf + (n * spip->fsize));
|
|
||||||
|
|
||||||
dmaStreamSetMemory0(spip->dmarx, rxbuf);
|
dmaStreamSetMemory0(spip->dmarx, rxbuf);
|
||||||
dmaStreamSetTransactionSize(spip->dmarx, n);
|
dmaStreamSetTransactionSize(spip->dmarx, n);
|
||||||
dmaStreamSetMode(spip->dmarx, spip->rxdmamode | STM32_DMA_CR_MINC);
|
dmaStreamSetMode(spip->dmarx, spip->rxdmamode | STM32_DMA_CR_MINC);
|
||||||
|
|
|
@ -129,7 +129,7 @@ void hal_lld_init(void) {
|
||||||
#if defined(STM32_DMA_REQUIRED)
|
#if defined(STM32_DMA_REQUIRED)
|
||||||
dmaInit();
|
dmaInit();
|
||||||
|
|
||||||
#if defined(STM32F7XX)
|
#if 0 /*defined(STM32F7XX)*/
|
||||||
/* If the DMA is in use then the DMA-accessible RAM must be programmed as
|
/* If the DMA is in use then the DMA-accessible RAM must be programmed as
|
||||||
Write Through using the MPU, region zero is used with a size of 512kB,
|
Write Through using the MPU, region zero is used with a size of 512kB,
|
||||||
the sub-regions are programmed as follow:
|
the sub-regions are programmed as follow:
|
||||||
|
|
Loading…
Reference in New Issue