From 5f813694f68cee79e975b61be3cda4202e1ab1aa Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Tue, 19 Mar 2019 10:45:06 +0100 Subject: bsp/atsam: Simplify XDMAD_Handler() Remove the channel status evaluation from XDMAD_Handler() and simply hand over the status to the callbacks. --- .../atsam/contrib/libraries/libchip/source/xdmad.c | 59 ++-------------------- bsps/arm/atsam/include/libchip/include/xdmad.h | 4 +- 2 files changed, 7 insertions(+), 56 deletions(-) diff --git a/bsps/arm/atsam/contrib/libraries/libchip/source/xdmad.c b/bsps/arm/atsam/contrib/libraries/libchip/source/xdmad.c index 444e2cf92e..1734be1b62 100644 --- a/bsps/arm/atsam/contrib/libraries/libchip/source/xdmad.c +++ b/bsps/arm/atsam/contrib/libraries/libchip/source/xdmad.c @@ -132,7 +132,7 @@ static uint32_t XDMAD_AllocateXdmacChannel(sXdmad *pXdmad, return XDMAD_ALLOC_FAILED; } -void XDMAD_DoNothingCallback(uint32_t Channel, void *pArg) +void XDMAD_DoNothingCallback(uint32_t Channel, void *pArg, uint32_t status) { /* Do nothing */ } @@ -307,74 +307,25 @@ static void XDMAD_Handler(void *arg) { sXdmad *pDmad; Xdmac *pXdmac; - uint32_t xdmaGlobaIntStatus, xdmaGlobalChStatus; + uint32_t xdmaGlobaIntStatus; pDmad = arg; pXdmac = pDmad->pXdmacs; xdmaGlobaIntStatus = XDMAC_GetGIsr(pXdmac) & 0xFFFFFF; - xdmaGlobalChStatus = XDMAC_GetGlobalChStatus(pXdmac); while (xdmaGlobaIntStatus != 0) { uint8_t _iChannel; + uint32_t xdmaChannelIntStatus; sXdmadChannel *pCh; - uint8_t bExec; _iChannel = 31 - __builtin_clz(xdmaGlobaIntStatus); + xdmaChannelIntStatus = XDMAC_GetChannelIsr(pXdmac, _iChannel); pCh = &pDmad->XdmaChannels[_iChannel]; - bExec = 0; xdmaGlobaIntStatus &= ~(UINT32_C(1) << _iChannel); - if ((xdmaGlobalChStatus & (XDMAC_GS_ST0 << _iChannel)) == 0) { - uint32_t xdmaChannelIntMask; - uint32_t xdmaChannelIntStatus; - - xdmaChannelIntMask = XDMAC_GetChannelItMask(pXdmac, _iChannel); - xdmaChannelIntStatus = XDMAC_GetChannelIsr(pXdmac, _iChannel); - xdmaChannelIntStatus &= xdmaChannelIntMask; - - if (xdmaChannelIntStatus & XDMAC_CIS_BIS) { - if ((xdmaChannelIntMask & XDMAC_CIM_LIM) == 0) { - pCh->state = XDMAD_STATE_DONE; - bExec = 1; - } - - TRACE_DEBUG("XDMAC_CIS_BIS\n\r"); - } - - if (xdmaChannelIntStatus & XDMAC_CIS_FIS) - TRACE_DEBUG("XDMAC_CIS_FIS\n\r"); - - if (xdmaChannelIntStatus & XDMAC_CIS_RBEIS) - TRACE_DEBUG("XDMAC_CIS_RBEIS\n\r"); - - if (xdmaChannelIntStatus & XDMAC_CIS_WBEIS) - TRACE_DEBUG("XDMAC_CIS_WBEIS\n\r"); - - if (xdmaChannelIntStatus & XDMAC_CIS_ROIS) - TRACE_DEBUG("XDMAC_CIS_ROIS\n\r"); - - if (xdmaChannelIntStatus & XDMAC_CIS_LIS) { - TRACE_DEBUG("XDMAC_CIS_LIS\n\r"); - pCh->state = XDMAD_STATE_DONE; - bExec = 1; - } - - if (xdmaChannelIntStatus & XDMAC_CIS_DIS) { - pCh->state = XDMAD_STATE_DONE; - bExec = 1; - } - - } else { - /* Block end interrupt for LLI dma mode */ - if (XDMAC_GetChannelIsr(pXdmac, _iChannel) & XDMAC_CIS_BIS) { - bExec = 1; - } - } - /* Execute callback */ - if (bExec) - pCh->fCallback(_iChannel, pCh->pArg); + pCh->fCallback(_iChannel, pCh->pArg, xdmaChannelIntStatus); } } diff --git a/bsps/arm/atsam/include/libchip/include/xdmad.h b/bsps/arm/atsam/include/libchip/include/xdmad.h index 3b5e0838c2..97e24c880b 100644 --- a/bsps/arm/atsam/include/libchip/include/xdmad.h +++ b/bsps/arm/atsam/include/libchip/include/xdmad.h @@ -107,7 +107,7 @@ typedef enum _XdmadProgState { } eXdmadProgState; /** DMA transfer callback */ -typedef void (*XdmadTransferCallback)(uint32_t Channel, void *pArg); +typedef void (*XdmadTransferCallback)(uint32_t Channel, void *pArg, uint32_t status); /** DMA driver channel */ typedef struct _XdmadChannel { @@ -239,7 +239,7 @@ extern eXdmadRC XDMAD_IsTransferDone(sXdmad *pXdmad, uint32_t dwChannel); extern eXdmadRC XDMAD_StartTransfer(sXdmad *pXdmad, uint32_t dwChannel); -extern void XDMAD_DoNothingCallback(uint32_t Channel, void *pArg); +extern void XDMAD_DoNothingCallback(uint32_t Channel, void *pArg, uint32_t status); extern eXdmadRC XDMAD_SetCallback(sXdmad *pXdmad, uint32_t dwChannel, -- cgit v1.2.3