git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@16401 27425a3e-05d8-49a3-a47f-9c15f0e5edd8

This commit is contained in:
Giovanni Di Sirio 2023-10-23 15:56:00 +00:00
parent b3ba26f1e0
commit 47af8f98cc
3 changed files with 119 additions and 79 deletions

View File

@ -199,11 +199,11 @@ const stm32_gpdma_channel_t *gpdmaChannelAllocI(uint32_t cmask,
/* Enabling DMA clocks required by the current channels set.*/ /* Enabling DMA clocks required by the current channels set.*/
if ((STM32_GPDMA1_MASK_ANY & mask) != 0U) { if ((STM32_GPDMA1_MASK_ANY & mask) != 0U) {
rccEnableDMA1(true); rccEnableGPDMA1(true);
} }
#if STM32_GPDMA2_NUM_CHANNELS > 0 #if STM32_GPDMA2_NUM_CHANNELS > 0
if ((STM32_GPDMA2_MASK_ANY & mask) != 0U) { if ((STM32_GPDMA2_MASK_ANY & mask) != 0U) {
rccEnableDMA2(true); rccEnableGPDMA2(true);
} }
#endif #endif
@ -260,7 +260,7 @@ const stm32_gpdma_channel_t *gpdmaChannelAlloc(uint32_t cmask,
* Trying to release a unallocated channel is an illegal operation * Trying to release a unallocated channel is an illegal operation
* and is trapped if assertions are enabled. * and is trapped if assertions are enabled.
* *
* @param[in] dmachp pointer to a stm32_dma_channel_t structure * @param[in] dmachp pointer to a @p stm32_dma_channel_t structure
* *
* @iclass * @iclass
*/ */
@ -285,11 +285,11 @@ void gpdmaChannelFreeI(const stm32_gpdma_channel_t *dmachp) {
/* Shutting down clocks that are no more required, if any.*/ /* Shutting down clocks that are no more required, if any.*/
if ((gpdma.allocated_mask & STM32_GPDMA1_MASK_ANY) == 0U) { if ((gpdma.allocated_mask & STM32_GPDMA1_MASK_ANY) == 0U) {
rccDisableDMA1(); rccDisableGPDMA1();
} }
#if STM32_GPDMA2_NUM_CHANNELS > 0 #if STM32_GPDMA2_NUM_CHANNELS > 0
if ((gpdma.allocated_mask & STM32_GPDMA2_MASK_ANY) == 0U) { if ((gpdma.allocated_mask & STM32_GPDMA2_MASK_ANY) == 0U) {
rccDisableDMA2(); rccDisableGPDMA2();
} }
#endif #endif
} }
@ -300,33 +300,33 @@ void gpdmaChannelFreeI(const stm32_gpdma_channel_t *dmachp) {
* Trying to release a unallocated channel is an illegal operation * Trying to release a unallocated channel is an illegal operation
* and is trapped if assertions are enabled. * and is trapped if assertions are enabled.
* *
* @param[in] dmachp pointer to a stm32_dma_channel_t structure * @param[in] dmachp pointer to a @p stm32_dma_channel_t structure
* *
* @api * @api
*/ */
void gpdmaChannelFree(const stm32_gpdma_channel_t *dmachp) { void gpdmaChannelFree(const stm32_gpdma_channel_t *dmachp) {
osalSysLock(); osalSysLock();
dmaStreamFreeI(dmachp); gpdmaStreamFreeI(dmachp);
osalSysUnlock(); osalSysUnlock();
} }
/** /**
* @brief Serves a DMA IRQ. * @brief Serves a DMA IRQ.
* *
* @param[in] dmachp pointer to a stm32_dma_channel_t structure * @param[in] dmachp pointer to a @p stm32_gpdma_channel_t structure
* *
* @special * @special
*/ */
void dmaServeInterrupt(const stm32_dma_channel_t *dmachp) { void gpdmaServeInterrupt(const stm32_gpdma_channel_t *dmachp) {
uint32_t flags; uint32_t csr;
uint32_t selfindex = (uint32_t)dmachp->selfindex; uint32_t selfindex = (uint32_t)(dmachp - __stm32_gpdma_channels);
flags = (dmachp->dma->ISR >> dmachp->shift) & STM32_GPDMA_ISR_MASK; csr = dmachp->channel->CSR;
if (flags & dmachp->channel->CCR) { dmachp->channel->CFCR = csr;
dmachp->dma->IFCR = flags << dmachp->shift; if (csr & dmachp->channel->CCR) {
if (dma.channels[selfindex].func) { if (gpdma.channels[selfindex].func) {
dma.channels[selfindex].func(dma.channels[selfindex].param, flags); gpdma.channels[selfindex].func(gpdma.channels[selfindex].param, csr);
} }
} }
} }

View File

@ -31,10 +31,47 @@
/* Driver constants. */ /* Driver constants. */
/*===========================================================================*/ /*===========================================================================*/
/**
* @name GPDMA registers helpers
* @{
*/
#define STM32_GPDMA_CLBAR_CLA_POS DMA_CLBAR_LBA_Pos
#define STM32_GPDMA_CLBAR_CLA_MASK (1U << STM32_GPDMA_CLBAR_CLA_POS)
#define STM32_GPDMA_CLBAR_CLA(n) ((n) << STM32_GPDMA_CLBAR_CLA_POS)
#define STM32_GPDMA_CFCR_TOF DMA_CFCR_TOF
#define STM32_GPDMA_CFCR_SUSPF DMA_CFCR_SUSPF
#define STM32_GPDMA_CFCR_USEF DMA_CFCR_USEF
#define STM32_GPDMA_CFCR_ULEF DMA_CFCR_ULEF
#define STM32_GPDMA_CFCR_DTEF DMA_CFCR_DTEF
#define STM32_GPDMA_CFCR_HTF DMA_CFCR_HTF
#define STM32_GPDMA_CFCR_TCF DMA_CFCR_TCF
#define STM32_GPDMA_CSR_FIFOL_POS DMA_CSR_FIFOL_Pos
#define STM32_GPDMA_CSR_FIFOL_MASK (1U << STM32_GPDMA_CSR_FIFOL_POS)
#define STM32_GPDMA_CSR_FIFOL(n) ((n) << STM32_GPDMA_CSR_FIFOL_POS)
#define STM32_GPDMA_CSR_TOF DMA_CSR_TOF
#define STM32_GPDMA_CSR_SUSPF DMA_CSR_SUSPF
#define STM32_GPDMA_CSR_USEF DMA_CSR_USEF
#define STM32_GPDMA_CSR_ULEF DMA_CSR_ULEF
#define STM32_GPDMA_CSR_DTEF DMA_CSR_DTEF
#define STM32_GPDMA_CSR_HTF DMA_CSR_HTF
#define STM32_GPDMA_CSR_TCF DMA_CSR_TCF
#define STM32_GPDMA_CSR_IDLEF DMA_CSR_IDLEF
#define STM32_GPDMA_CSR_ALL (DMA_CSR_TOF | DMA_CSR_SUSPF | \
DMA_CSR_USEF | DMA_CSR_ULEF | \
DMA_CSR_DTEF | DMA_CSR_HTF | \
DMA_CSR_TCF)
/** @< */
/**
* @brief Mask of interrupt flags.
*/
/** /**
* @brief Maximum number of transfers in a single operation. * @brief Maximum number of transfers in a single operation.
*/ */
#define STM32_GPDMA_MAX_TRANSFER 65535 #define STM32_GPDMA_MAX_TRANSFER 65535
/** /**
* @brief Checks if a GPDMA priority is within the valid range. * @brief Checks if a GPDMA priority is within the valid range.
@ -68,6 +105,37 @@
#define STM32_GPDMA_CHANNEL_ID_MSK(dma, ch) \ #define STM32_GPDMA_CHANNEL_ID_MSK(dma, ch) \
(1U << STM32_GPDMA_CHANNEL_ID(dma, ch)) (1U << STM32_GPDMA_CHANNEL_ID(dma, ch))
/**
* @name GPDMA channels identifiers
* @{
*/
/**
* @brief Returns a pointer to a @p stm32_gpdma_channel_t structure.
*
* @param[in] id the channel numeric identifier
* @return A pointer to the @p stm32_gpdma_channel_t constant
* structure associated to the GPDMA channel.
*/
#define STM32_GPDMA_CHANNEL(id) (&__stm32_gpdma_channels[id])
#define STM32_GPDMA1_CHANNEL0 STM32_GPDMA_CHANNEL(0)
#define STM32_GPDMA1_CHANNEL1 STM32_GPDMA_CHANNEL(1)
#define STM32_GPDMA1_CHANNEL2 STM32_GPDMA_CHANNEL(2)
#define STM32_GPDMA1_CHANNEL3 STM32_GPDMA_CHANNEL(3)
#define STM32_GPDMA1_CHANNEL4 STM32_GPDMA_CHANNEL(4)
#define STM32_GPDMA1_CHANNEL5 STM32_GPDMA_CHANNEL(5)
#define STM32_GPDMA1_CHANNEL6 STM32_GPDMA_CHANNEL(6)
#define STM32_GPDMA1_CHANNEL7 STM32_GPDMA_CHANNEL(7)
#define STM32_GPDMA2_CHANNEL0 STM32_GPDMA_CHANNEL(8)
#define STM32_GPDMA2_CHANNEL1 STM32_GPDMA_CHANNEL(9)
#define STM32_GPDMA2_CHANNEL2 STM32_GPDMA_CHANNEL(10)
#define STM32_GPDMA2_CHANNEL3 STM32_GPDMA_CHANNEL(11)
#define STM32_GPDMA2_CHANNEL4 STM32_GPDMA_CHANNEL(12)
#define STM32_GPDMA2_CHANNEL5 STM32_GPDMA_CHANNEL(13)
#define STM32_GPDMA2_CHANNEL6 STM32_GPDMA_CHANNEL(14)
#define STM32_GPDMA2_CHANNEL7 STM32_GPDMA_CHANNEL(15)
/** @} */
/*===========================================================================*/ /*===========================================================================*/
/* Driver pre-compile time settings. */ /* Driver pre-compile time settings. */
/*===========================================================================*/ /*===========================================================================*/
@ -192,12 +260,12 @@ typedef struct {
* @pre The channel must have been allocated using @p dmaStreamAlloc(). * @pre The channel must have been allocated using @p dmaStreamAlloc().
* @post After use the channel can be released using @p dmaStreamRelease(). * @post After use the channel can be released using @p dmaStreamRelease().
* *
* @param[in] dmastp pointer to a stm32_gpdma_channel_t structure * @param[in] dmastp pointer to a @p stm32_gpdma_channel_t structure
* @param[in] addr value to be written in the CPAR register * @param[in] addr value to be written in the CPAR register
* *
* @special * @special
*/ */
#define dmaStreamSetPeripheral(dmastp, addr) { \ #define gpdmaStreamSetPeripheral(dmastp, addr) { \
(dmastp)->channel->CPAR = (uint32_t)(addr); \ (dmastp)->channel->CPAR = (uint32_t)(addr); \
} }
@ -207,12 +275,12 @@ typedef struct {
* @pre The channel must have been allocated using @p dmaStreamAlloc(). * @pre The channel must have been allocated using @p dmaStreamAlloc().
* @post After use the channel can be released using @p dmaStreamRelease(). * @post After use the channel can be released using @p dmaStreamRelease().
* *
* @param[in] dmastp pointer to a stm32_gpdma_channel_t structure * @param[in] dmastp pointer to a @p stm32_gpdma_channel_t structure
* @param[in] addr value to be written in the CMAR register * @param[in] addr value to be written in the CMAR register
* *
* @special * @special
*/ */
#define dmaStreamSetMemory0(dmastp, addr) { \ #define gpdmaStreamSetMemory0(dmastp, addr) { \
(dmastp)->channel->CMAR = (uint32_t)(addr); \ (dmastp)->channel->CMAR = (uint32_t)(addr); \
} }
@ -222,12 +290,12 @@ typedef struct {
* @pre The channel must have been allocated using @p dmaStreamAlloc(). * @pre The channel must have been allocated using @p dmaStreamAlloc().
* @post After use the channel can be released using @p dmaStreamRelease(). * @post After use the channel can be released using @p dmaStreamRelease().
* *
* @param[in] dmastp pointer to a stm32_gpdma_channel_t structure * @param[in] dmastp pointer to a @p stm32_gpdma_channel_t structure
* @param[in] size value to be written in the CNDTR register * @param[in] size value to be written in the CNDTR register
* *
* @special * @special
*/ */
#define dmaStreamSetTransactionSize(dmastp, size) { \ #define gpdmaStreamSetTransactionSize(dmastp, size) { \
(dmastp)->channel->CNDTR = (uint32_t)(size); \ (dmastp)->channel->CNDTR = (uint32_t)(size); \
} }
@ -237,12 +305,12 @@ typedef struct {
* @pre The channel must have been allocated using @p dmaStreamAlloc(). * @pre The channel must have been allocated using @p dmaStreamAlloc().
* @post After use the channel can be released using @p dmaStreamRelease(). * @post After use the channel can be released using @p dmaStreamRelease().
* *
* @param[in] dmastp pointer to a stm32_gpdma_channel_t structure * @param[in] dmastp pointer to a @p stm32_gpdma_channel_t structure
* @return The number of transfers to be performed. * @return The number of transfers to be performed.
* *
* @special * @special
*/ */
#define dmaStreamGetTransactionSize(dmastp) ((size_t)((dmastp)->channel->CNDTR)) #define gpdmaStreamGetTransactionSize(dmastp) ((size_t)((dmastp)->channel->CNDTR))
/** /**
* @brief Programs the channel mode settings. * @brief Programs the channel mode settings.
@ -250,12 +318,12 @@ typedef struct {
* @pre The channel must have been allocated using @p dmaStreamAlloc(). * @pre The channel must have been allocated using @p dmaStreamAlloc().
* @post After use the channel can be released using @p dmaStreamRelease(). * @post After use the channel can be released using @p dmaStreamRelease().
* *
* @param[in] dmastp pointer to a stm32_gpdma_channel_t structure * @param[in] dmastp pointer to a @p stm32_gpdma_channel_t structure
* @param[in] mode value to be written in the CCR register * @param[in] mode value to be written in the CCR register
* *
* @special * @special
*/ */
#define dmaStreamSetMode(dmastp, mode) { \ #define gpdmaStreamSetMode(dmastp, mode) { \
(dmastp)->channel->CCR = (uint32_t)(mode); \ (dmastp)->channel->CCR = (uint32_t)(mode); \
} }
@ -265,11 +333,11 @@ typedef struct {
* @pre The channel must have been allocated using @p dmaStreamAlloc(). * @pre The channel must have been allocated using @p dmaStreamAlloc().
* @post After use the channel can be released using @p dmaStreamRelease(). * @post After use the channel can be released using @p dmaStreamRelease().
* *
* @param[in] dmastp pointer to a stm32_gpdma_channel_t structure * @param[in] dmastp pointer to a @p stm32_gpdma_channel_t structure
* *
* @special * @special
*/ */
#define dmaStreamEnable(dmastp) { \ #define gpdmaStreamEnable(dmastp) { \
(dmastp)->channel->CCR |= STM32_GPDMA_CR_EN; \ (dmastp)->channel->CCR |= STM32_GPDMA_CR_EN; \
} }
@ -283,11 +351,11 @@ typedef struct {
* @pre The channel must have been allocated using @p dmaStreamAlloc(). * @pre The channel must have been allocated using @p dmaStreamAlloc().
* @post After use the channel can be released using @p dmaStreamRelease(). * @post After use the channel can be released using @p dmaStreamRelease().
* *
* @param[in] dmastp pointer to a stm32_gpdma_channel_t structure * @param[in] dmastp pointer to a @p stm32_gpdma_channel_t structure
* *
* @special * @special
*/ */
#define dmaStreamDisable(dmastp) { \ #define gpdmaStreamDisable(dmastp) { \
(dmastp)->channel->CCR &= ~(STM32_GPDMA_CR_TCIE | STM32_GPDMA_CR_HTIE | \ (dmastp)->channel->CCR &= ~(STM32_GPDMA_CR_TCIE | STM32_GPDMA_CR_HTIE | \
STM32_GPDMA_CR_TEIE | STM32_GPDMA_CR_EN); \ STM32_GPDMA_CR_TEIE | STM32_GPDMA_CR_EN); \
dmaStreamClearInterrupt(dmastp); \ dmaStreamClearInterrupt(dmastp); \
@ -299,11 +367,11 @@ typedef struct {
* @pre The channel must have been allocated using @p dmaStreamAlloc(). * @pre The channel must have been allocated using @p dmaStreamAlloc().
* @post After use the channel can be released using @p dmaStreamRelease(). * @post After use the channel can be released using @p dmaStreamRelease().
* *
* @param[in] dmastp pointer to a stm32_gpdma_channel_t structure * @param[in] dmastp pointer to a @p stm32_gpdma_channel_t structure
* *
* @special * @special
*/ */
#define dmaStreamClearInterrupt(dmastp) { \ #define gpdmaStreamClearInterrupt(dmastp) { \
(dmastp)->dma->IFCR = STM32_GPDMA_ISR_MASK << (dmastp)->shift; \ (dmastp)->dma->IFCR = STM32_GPDMA_ISR_MASK << (dmastp)->shift; \
} }
@ -314,7 +382,7 @@ typedef struct {
* @pre The channel must have been allocated using @p dmaStreamAlloc(). * @pre The channel must have been allocated using @p dmaStreamAlloc().
* @post After use the channel can be released using @p dmaStreamRelease(). * @post After use the channel can be released using @p dmaStreamRelease().
* *
* @param[in] dmastp pointer to a stm32_gpdma_channel_t structure * @param[in] dmastp pointer to a @p stm32_gpdma_channel_t structure
* @param[in] mode value to be written in the CCR register, this value * @param[in] mode value to be written in the CCR register, this value
* is implicitly ORed with: * is implicitly ORed with:
* - @p STM32_GPDMA_CR_MINC * - @p STM32_GPDMA_CR_MINC
@ -326,7 +394,7 @@ typedef struct {
* @param[in] dst destination address * @param[in] dst destination address
* @param[in] n number of data units to copy * @param[in] n number of data units to copy
*/ */
#define dmaStartMemCopy(dmastp, mode, src, dst, n) { \ #define gpdmaStartMemCopy(dmastp, mode, src, dst, n) { \
dmaStreamSetPeripheral(dmastp, src); \ dmaStreamSetPeripheral(dmastp, src); \
dmaStreamSetMemory0(dmastp, dst); \ dmaStreamSetMemory0(dmastp, dst); \
dmaStreamSetTransactionSize(dmastp, n); \ dmaStreamSetTransactionSize(dmastp, n); \
@ -340,9 +408,9 @@ typedef struct {
* @pre The channel must have been allocated using @p dmaStreamAlloc(). * @pre The channel must have been allocated using @p dmaStreamAlloc().
* @post After use the channel can be released using @p dmaStreamRelease(). * @post After use the channel can be released using @p dmaStreamRelease().
* *
* @param[in] dmastp pointer to a stm32_gpdma_channel_t structure * @param[in] dmastp pointer to a @p stm32_gpdma_channel_t structure
*/ */
#define dmaWaitCompletion(dmastp) { \ #define gpdmaWaitCompletion(dmastp) { \
while ((dmastp)->channel->CNDTR > 0U) \ while ((dmastp)->channel->CNDTR > 0U) \
; \ ; \
dmaStreamDisable(dmastp); \ dmaStreamDisable(dmastp); \
@ -354,7 +422,7 @@ typedef struct {
/*===========================================================================*/ /*===========================================================================*/
#if !defined(__DOXYGEN__) #if !defined(__DOXYGEN__)
extern const stm32_gpdma_channel_t _stm32_gpdma_channels[STM32_GPDMA_CHANNELS]; extern const stm32_gpdma_channel_t __stm32_gpdma_channels[STM32_GPDMA_CHANNELS];
#endif #endif
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -501,82 +501,54 @@
/** @} */ /** @} */
/** /**
* @name DMA peripheral specific RCC operations * @name GPDMA peripheral specific RCC operations
* @{ * @{
*/ */
/** /**
* @brief Enables the DMA1 peripheral clock. * @brief Enables the GPDMA1 peripheral clock.
* *
* @param[in] lp low power enable flag * @param[in] lp low power enable flag
* *
* @api * @api
*/ */
#define rccEnableDMA1(lp) rccEnableAHB1(RCC_AHB1ENR_DMA1EN, lp) #define rccEnableGPDMA1(lp) rccEnableAHB1(RCC_AHB1ENR_GPDMA1EN, lp)
/** /**
* @brief Disables the DMA1 peripheral clock. * @brief Disables the GPDMA1 peripheral clock.
* *
* @api * @api
*/ */
#define rccDisableDMA1() rccDisableAHB1(RCC_AHB1ENR_DMA1EN) #define rccDisableGPDMA1() rccDisableGPAHB1(RCC_AHB1ENR_GPDMA1EN)
/** /**
* @brief Resets the DMA1 peripheral. * @brief Resets the GPDMA1 peripheral.
* *
* @api * @api
*/ */
#define rccResetDMA1() rccResetAHB1(RCC_AHB1RSTR_DMA1RST) #define rccResetGPDMA1() rccResetAHB1(RCC_AHB1RSTR_GPDMA1RST)
/** /**
* @brief Enables the DMA2 peripheral clock. * @brief Enables the GPDMA2 peripheral clock.
* *
* @param[in] lp low power enable flag * @param[in] lp low power enable flag
* *
* @api * @api
*/ */
#define rccEnableDMA2(lp) rccEnableAHB1(RCC_AHB1ENR_DMA2EN, lp) #define rccEnableGPDMA2(lp) rccEnableAHB1(RCC_AHB1ENR_GPDMA2EN, lp)
/** /**
* @brief Disables the DMA2 peripheral clock. * @brief Disables the GPDMA2 peripheral clock.
* *
* @api * @api
*/ */
#define rccDisableDMA2() rccDisableAHB1(RCC_AHB1ENR_DMA2EN) #define rccDisableGPDMA2() rccDisableAHB1(RCC_AHB1ENR_GPDMA2EN)
/** /**
* @brief Resets the DMA2 peripheral. * @brief Resets the GPDMA2 peripheral.
* *
* @api * @api
*/ */
#define rccResetDMA2() rccResetAHB1(RCC_AHB1RSTR_DMA2RST) #define rccResetGPDMA2() rccResetAHB1(RCC_AHB1RSTR_GPDMA2RST)
/** @} */
/**
* @name DMAMUX peripheral specific RCC operations
* @{
*/
/**
* @brief Enables the DMAMUX peripheral clock.
*
* @param[in] lp low power enable flag
*
* @api
*/
#define rccEnableDMAMUX(lp) rccEnableAHB1(RCC_AHB1ENR_DMAMUX1EN, lp)
/**
* @brief Disables the DMAMUX peripheral clock.
*
* @api
*/
#define rccDisableDMAMUX() rccDisableAHB1(RCC_AHB1ENR_DMAMUX1EN)
/**
* @brief Resets the DMAMUX peripheral.
*
* @api
*/
#define rccResetDMAMUX() rccResetAHB1(RCC_AHB1RSTR_DMAMUX1RST)
/** @} */ /** @} */
/** /**