I would like to apply this patch to master (ticket #4173) and to the 5
branch (ticket #4172). It would be great if someone could have a look
and acknowledge it.
On 09/11/2020 09:16, Christian Mauderer wrote:
In "bsp/atsam: Simplify XDMAD_Handler()" (5f813694f68cee) the interrupt
callback has been made unconditional. That allowed to avoid some special
deadlock situations in error cases. But it removed part of the XDMAD
status handling.
This patch adds the ability to update the XDMAD status from the
callback if that is necessary for the driver.
Fixes #4172
---
.../contrib/libraries/libchip/source/xdmad.c | 60 ++++++++++++++++++-
.../arm/atsam/include/libchip/include/xdmad.h | 4 ++
2 files changed, 63 insertions(+), 1 deletion(-)
diff --git a/bsps/arm/atsam/contrib/libraries/libchip/source/xdmad.c
b/bsps/arm/atsam/contrib/libraries/libchip/source/xdmad.c
index 13b227036e..161cf0bee4 100644
--- a/bsps/arm/atsam/contrib/libraries/libchip/source/xdmad.c
+++ b/bsps/arm/atsam/contrib/libraries/libchip/source/xdmad.c
@@ -132,9 +132,66 @@ static uint32_t XDMAD_AllocateXdmacChannel(sXdmad *pXdmad,
return XDMAD_ALLOC_FAILED;
}
+/*
+ * Update the internal xdmad state. Returns true if further processing in the
+ * callback is recommended.
+ *
+ * In an earlier version of the API this has been done by the interrupt handler
+ * directly. But in some cases the application might want to process some of
the
+ * other interrupts too. Therefore the user callback should now decide itself
+ * whether this is necessary or not.
+ */
+bool XDMAD_UpdateStatusFromCallback(sXdmad *pXdmad,
+ uint32_t Channel,
+ uint32_t status)
+{
+ Xdmac *pXdmac;
+ uint32_t xdmaGlobalChStatus;
+ bool bExec;
+
+ bExec = false;
+ pXdmac = pXdmad->pXdmacs;
+ xdmaGlobalChStatus = XDMAC_GetGlobalChStatus(pXdmac);
+
+ if ((xdmaGlobalChStatus & (XDMAC_GS_ST0 << Channel)) == 0) {
+ uint32_t xdmaChannelIntMask;
+ sXdmadChannel *pCh;
+
+ pCh = &pXdmad->XdmaChannels[Channel];
+
+ xdmaChannelIntMask = XDMAC_GetChannelItMask(pXdmac, Channel);
+ status &= xdmaChannelIntMask;
+
+ if (status & XDMAC_CIS_BIS) {
+ if ((xdmaChannelIntMask & XDMAC_CIM_LIM) == 0) {
+ pCh->state = XDMAD_STATE_DONE;
+ bExec = true;
+ }
+ }
+
+ if (status & XDMAC_CIS_LIS) {
+ pCh->state = XDMAD_STATE_DONE;
+ bExec = true;
+ }
+
+ if (status & XDMAC_CIS_DIS) {
+ pCh->state = XDMAD_STATE_DONE;
+ bExec = true;
+ }
+ } else {
+ /* Block end interrupt for LLI dma mode */
+ if (XDMAC_GetChannelIsr(pXdmac, Channel) & XDMAC_CIS_BIS) {
+ bExec = true;
+ }
+ }
+
+ return bExec;
+}
+
void XDMAD_DoNothingCallback(uint32_t Channel, void *pArg, uint32_t status)
{
- /* Do nothing */
+ /* Do nothing except status update */
+ XDMAD_UpdateStatusFromCallback((sXdmad *)pArg, Channel, status);
}
/*----------------------------------------------------------------------------
@@ -157,6 +214,7 @@ static void XDMAD_SysInitialize(void)
for (j = 0; j < pXdmad->numChannels; j ++) {
pXdmad->XdmaChannels[j].fCallback = XDMAD_DoNothingCallback;
+ pXdmad->XdmaChannels[j].pArg = (void *)pXdmad;
}
sc = rtems_interrupt_handler_install(
diff --git a/bsps/arm/atsam/include/libchip/include/xdmad.h
b/bsps/arm/atsam/include/libchip/include/xdmad.h
index 97e24c880b..cba3d052ab 100644
--- a/bsps/arm/atsam/include/libchip/include/xdmad.h
+++ b/bsps/arm/atsam/include/libchip/include/xdmad.h
@@ -241,6 +241,10 @@ extern eXdmadRC XDMAD_StartTransfer(sXdmad *pXdmad,
uint32_t dwChannel);
extern void XDMAD_DoNothingCallback(uint32_t Channel, void *pArg, uint32_t status);
+extern bool XDMAD_UpdateStatusFromCallback(sXdmad *pXdmad,
+ uint32_t Channel,
+ uint32_t status);
+
extern eXdmadRC XDMAD_SetCallback(sXdmad *pXdmad,
uint32_t
dwChannel,
XdmadTransferCallback fCallback,
--
--------------------------------------------
embedded brains GmbH
Christian MAUDERER
Dornierstr. 4
82178 Puchheim
Germany
email: christian.maude...@embedded-brains.de
Phone: +49-89-18 94 741 - 18
Fax: +49-89-18 94 741 - 08
PGP: Public key available on request.
embedded brains GmbH
Registergericht: Amtsgericht München
Registernummer: HRB 157899
Vertretungsberechtigte Geschäftsführer: Peter Rasmussen, Thomas Dörfler
Unsere Datenschutzerklärung finden Sie hier:
https://embedded-brains.de/datenschutzerklaerung/
_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel