46#if (! STM32_DMA_ADVANCED) && STM32_DMA_USE_DOUBLE_BUFFER
47#error "STM32_DMA_USE_DOUBLE_BUFFER only available on DMAv2"
50#if (STM32_DMA_USE_ASYNC_TIMOUT) && STM32_DMA_USE_DOUBLE_BUFFER
51#error "STM32_DMA_USE_DOUBLE_BUFFER only not yet compatible with STM32_DMA_USE_ASYNC_TIMOUT"
76#if STM32_DMA_USE_WAIT == TRUE
79#if STM32_DMA_USE_MUTUAL_EXCLUSION == TRUE
82#if defined( STM32_DMA_DRIVER_EXT_INIT_HOOK)
85#if CH_DBG_SYSTEM_STATE_CHECK == TRUE
86 dmap->nbTransferError = dmap->nbDirectModeError = dmap->nbFifoError = 0
U;
89#if STM32_DMA_USE_ASYNC_TIMOUT
108 #if STM32_DMA_USE_DOUBLE_BUFFER
110 "STM32_DMA_USE_ASYNC_TIMOUT not yet implemented in DMA_CONTINUOUS_DOUBLE_BUFFER mode");
113 "DMA_CONTINUOUS_DOUBLE_BUFFER mode implies next_cb not NULL");
121 #if STM32_DMA_USE_DOUBLE_BUFFER
122 dmap->next_cb_errors = 0
U;
141#if STM32_DMA_USE_DOUBLE_BUFFER
143 "STM32_DMA_USE_ASYNC_TIMOUT not yet implemented in DMA_CONTINUOUS_DOUBLE_BUFFER mode");
146 "DMA_CONTINUOUS_DOUBLE_BUFFER mode implies next_cb not NULL");
152#if STM32_DMA_USE_DOUBLE_BUFFER
153 dmap->next_cb_errors = 0
U;
230 #if STM32_DMA_USE_DOUBLE_BUFFER
233 "in double buffer mode memory pointer is dynamically completed by next_cb callback");
234 mem0p = dmap->
config->next_cb(dmap, size);
238#if (CH_DBG_ENABLE_ASSERTS != FALSE)
239 if (size != dmap->
size) {
241 (size > 0
U) && ((size == 1U) ||
243 (((size & 1U) == 0
U)))));
274# if STM32_DMA_ADVANCED
277 "mburst alignment rule not respected");
279 "mburst alignment rule not respected");
281 "memory address alignment rule not respected");
285 "pburst alignment rule not respected");
287 "peripheral address alignment rule not respected");
289 if (cfg->periph_inc_size_4) {
291 "periph_inc_size_4 implies enabling inc_peripheral_addr");
293 "periph_inc_size_4 implies enabling fifo");
301#if STM32_DMA_USE_ASYNC_TIMOUT
302 dmap->currPtr = mem0p;
327#ifndef DMA_request_TypeDef
332#if STM32_DMA_USE_DOUBLE_BUFFER
335 "in double buffer mode memory pointer is dynamically completed by next_cb callback");
336 mem0p = dmap->
config->next_cb(dmap, size);
340#if (CH_DBG_ENABLE_ASSERTS != FALSE)
342 (size > 0
U) && ((size == 1U) ||
344 (((size & 1U) == 0
U)))));
349 "peripheral address not aligned");
352 "memory address not aligned");
354# if STM32_DMA_ADVANCED
357 "mburst alignment rule not respected");
359 "mburst alignment rule not respected");
361 "memory address alignment rule not respected");
365 "pburst alignment rule not respected");
367 "peripheral address alignment rule not respected");
369 if (cfg->periph_inc_size_4) {
371 "periph_inc_size_4 implies enabling inc_peripheral_addr");
373 "periph_inc_size_4 implies enabling fifo");
440 for(
uint8_t i = 0; i < 16; i++) {
447#if (STM32_DMA_USE_WAIT == TRUE) || defined(__DOXYGEN__)
490#if (STM32_DMA_USE_MUTUAL_EXCLUSION == TRUE) || defined(__DOXYGEN__)
558 "illegal IRQ priority");
559 switch (cfg->
psize) {
563 default:
osalSysHalt(
"psize should be 1 or 2 or 4");
566 switch (cfg->
msize) {
570 default:
osalDbgAssert(
false,
"msize should be 1 or 2 or 4");
579 default:
osalDbgAssert(
false,
"direction not set or incorrect");
598#if CH_KERNEL_MAJOR < 6
603#if STM32_DMA_SUPPORTS_DMAMUX == 0
604#if STM32_DMA_ADVANCED
622#elif STM32_DMA_ADVANCED
623#if STM32_DMA_SUPPORTS_DMAMUX == 0
632#if STM32_DMA_ADVANCED
634 switch (cfg->pburst) {
639 default:
osalDbgAssert(
false,
"pburst size should be 0 or 4 or 8 or 16");
642 switch (cfg->mburst) {
647 default:
osalDbgAssert(
false,
"mburst size should be 0 or 4 or 8 or 16");
656 default:
osalDbgAssert(
false,
"fifo threshold should be 1(/4) or 2(/4) or 3(/4) or 4(/4)");
661# if (CH_DBG_ENABLE_ASSERTS != FALSE)
662# if STM32_DMA_USE_ASYNC_TIMOUT
664 "timeout cannot be 0 if STM32_DMA_USE_ASYNC_TIMOUT is enabled");
666 "timeout should be dynamically disabled (dmap->config->timeout = TIME_INFINITE) "
667 "if STM32_DMA_USE_ASYNC_TIMOUT is enabled and fifo is enabled (fifo != 0)");
673 if (!cfg->mburst != !cfg->pburst) {
674 osalDbgAssert(
false,
"pburst and mburst should be enabled or disabled together");
679 if (cfg->fifo && cfg->mburst) {
772# if (CH_DBG_ENABLE_ASSERTS != FALSE)
789#if STM32_DMA_SUPPORTS_DMAMUX == 0
798#if STM32_DMA_ADVANCED
803 "msize == psize is mandatory when fifo is disabled");
809#if CH_KERNEL_MAJOR < 6
819 const bool error = dmap->dmastream ==
NULL;
828#if (CH_DBG_ENABLE_ASSERTS != FALSE)
829#if STM32_DMA_ADVANCED
831 chSysHalt(
"forbidden combination of msize, mburst, fifo, see FIFO threshold "
832 "configuration in reference manuel");
846#if defined CACHE_LINE_SIZE && CACHE_LINE_SIZE != 0
864#ifndef DMA_request_TypeDef
866 void *mem0p,
const size_t size,
870#if STM32_DMA_SUPPORTS_DMAMUX
875#if STM32_DMA_USE_DOUBLE_BUFFER
882#if STM32_DMA_ADVANCED
900 if (dmap->
config->activate_dcache_sync &&
913#if STM32_DMA_SUPPORTS_DMAMUX
918#if STM32_DMA_USE_DOUBLE_BUFFER
925#if STM32_DMA_ADVANCED
954#if CH_KERNEL_MAJOR < 6
976#if CH_DBG_SYSTEM_STATE_CHECK && STM32_DMA_ADVANCED
989 if (dmap->
config->fifo != 0
U) {
990#if STM32_DMA_ADVANCED
1006 if (dmap->
config->activate_dcache_sync)
1017 case DMA_DIR_M2M :
if (dmap->periphp >= (
void *) 0x20000000) {
1038#if STM32_DMA_USE_ASYNC_TIMOUT
1057#if STM32_DMA_USE_DOUBLE_BUFFER
void dmaObjectInit(DMADriver *dmap)
bool dmaStartTransfert(DMADriver *dmap, volatile void *periphp, void *mem0p, const size_t size)
Starts a DMA transaction.
bool dma_lld_start(DMADriver *dmap, bool allocate_stream)
Configures and activates the DMA peripheral.
void dmaStop(DMADriver *dmap)
Deactivates the DMA peripheral.
msg_t dmaTransfertTimeout(DMADriver *dmap, volatile void *periphp, void *mem0p, const size_t size, sysinterval_t timeout)
Performs a DMA transaction.
void dmaGetRegisters(DMADriver *dmap, volatile void *periphp, void *mem0p, const size_t size, DMA_Stream_TypeDef *registers)
copy the dma register to memory.
bool dmaStartTransfertI(DMADriver *dmap, volatile void *periphp, void *mem0p, const size_t size)
Starts a DMA transaction.
void dma_lld_stop(DMADriver *dmap)
Deactivates the DMA peripheral.
void dma_lld_get_registers(DMADriver *dmap, volatile void *periphp, void *mem0p, const size_t size, DMA_Stream_TypeDef *registers)
Copy the register of a ready stream.
static size_t getCrossCacheBoundaryAwareSize(const void *memp, const size_t dsize)
void dmaStopTransfert(DMADriver *dmap)
Stops an ongoing transaction.
void dmaAcquireBus(DMADriver *dmap)
Gains exclusive access to the DMA peripheral.
void dmaReleaseBus(DMADriver *dmap)
Releases exclusive access to the DMA peripheral.
void dma_lld_stop_transfert(DMADriver *dmap)
Stops an ongoing transaction.
void dmaStopTransfertI(DMADriver *dmap)
Stops an ongoing transaction.
bool dma_lld_start_transfert(DMADriver *dmap, volatile void *periphp, void *mem0p, const size_t size)
Starts a DMA transaction.
bool dmaStart(DMADriver *dmap, const DMAConfig *cfg)
Configures and activates the DMA peripheral.
bool dmaReloadConf(DMADriver *dmap, const DMAConfig *cfg)
Configures and activates the DMA peripheral.
static void dma_lld_serve_interrupt(DMADriver *dmap, uint32_t flags)
DMA ISR service routine.
uint8_t dmaGetStreamIndex(DMADriver *dmap)
STM32 DMA subsystem driver header.
uint8_t msize
DMA memory data granurality in bytes (1,2,4)
@ DMA_CONTINUOUS_HALF_BUFFER
Continuous mode to/from the same buffer.
@ DMA_ONESHOT
One transert then stop
@ DMA_DIR_M2P
MEMORY to PERIPHERAL
@ DMA_DIR_M2M
MEMORY to MEMORY
@ DMA_DIR_P2M
PERIPHERAL to MEMORY
size_t size
hold size of current transaction
void * dma_lld_set_next_double_buffer(DMADriver *dmap, void *nextBuffer)
bool inc_peripheral_addr
Enable increment of peripheral address after each transfert.
#define _dma_reset_i(dmap)
Resumes a thread waiting for a dma transfert completion.
#define _dma_reset_s(dmap)
Resumes a thread waiting for a dma transfert completion.
uint8_t irq_priority
DMA IRQ priority (2 .
uint8_t dma_priority
DMA priority (1 .
const DMAConfig * config
Current configuration data.
static void _dma_isr_error_code(DMADriver *dmap, dmaerrormask_t err)
Common ISR code, error event.
dmaerrormask_t
Possible DMA failure causes.
@ DMA_ERR_FIFO_EMPTY
DMA FIFO underrun.
@ DMA_ERR_FIFO_FULL
DMA FIFO overrun.
@ DMA_ERR_TRANSFER_ERROR
DMA transfer failure.
@ DMA_ERR_DIRECTMODE_ERROR
DMA Direct Mode failure.
@ DMA_ERR_FIFO_ERROR
DMA FIFO error.
void * mem0p
memory address
dmaerrorcallback_t error_cb
Error callback or NULL.
uint32_t stream
stream associated with transaction
dmaopmode_t op_mode
one shot, or circular half buffer, or circular double buffers
#define STM32_DMA_SUPPORTS_CSELR
uint8_t controller
controller associated with stream
static void _dma_isr_full_code(DMADriver *dmap)
Common ISR code, full buffer event.
uint32_t dmamode
hold DMA CR register for the stream
@ DMA_ERROR
Transfert error.
@ DMA_COMPLETE
Transfert complete.
dmacallback_t end_cb
Callback function associated to the stream or NULL.
static void _dma_isr_half_code(DMADriver *dmap)
Common ISR code, half buffer event.
dmadirection_t direction
DMA transaction direction.
const stm32_dma_stream_t * dmastream
DMA stream associated with peripheral or memory.
volatile dmastate_t state
Driver state.
uint8_t psize
DMA peripheral data granurality in bytes (1,2,4)
bool inc_memory_addr
Enable increment of memory address after each transfert.
DMA stream configuration structure.
Structure representing a DMA driver.
uint8_t msg[10]
Buffer used for general comunication over SPI (out buffer)
unsigned int uint32_t
Typedef defining 32 bit unsigned int type.
unsigned char uint8_t
Typedef defining 8 bit unsigned char type.