[rtems commit] bsp/atsam: Simplify XDMAD_Handler()

Sebastian Huber sebh at rtems.org
Tue Mar 19 10:31:03 UTC 2019


Module:    rtems
Branch:    master
Commit:    5f813694f68cee79e975b61be3cda4202e1ab1aa
Changeset: http://git.rtems.org/rtems/commit/?id=5f813694f68cee79e975b61be3cda4202e1ab1aa

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Tue Mar 19 10:45:06 2019 +0100

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 444e2cf..1734be1 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 3b5e083..97e24c8 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,




More information about the vc mailing list