Changeset 5f813694 in rtems


Ignore:
Timestamp:
Mar 19, 2019, 9:45:06 AM (5 weeks ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
master
Children:
a5f84c6a
Parents:
007d4e12
git-author:
Sebastian Huber <sebastian.huber@…> (03/19/19 09:45:06)
git-committer:
Sebastian Huber <sebastian.huber@…> (03/19/19 10:29:24)
Message:

bsp/atsam: Simplify XDMAD_Handler()

Remove the channel status evaluation from XDMAD_Handler() and simply
hand over the status to the callbacks.

Location:
bsps/arm/atsam
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • bsps/arm/atsam/contrib/libraries/libchip/source/xdmad.c

    r007d4e12 r5f813694  
    133133}
    134134
    135 void XDMAD_DoNothingCallback(uint32_t Channel, void *pArg)
     135void XDMAD_DoNothingCallback(uint32_t Channel, void *pArg, uint32_t status)
    136136{
    137137        /* Do nothing */
     
    308308        sXdmad *pDmad;
    309309        Xdmac *pXdmac;
    310         uint32_t xdmaGlobaIntStatus, xdmaGlobalChStatus;
     310        uint32_t xdmaGlobaIntStatus;
    311311
    312312        pDmad = arg;
    313313        pXdmac = pDmad->pXdmacs;
    314314        xdmaGlobaIntStatus = XDMAC_GetGIsr(pXdmac) & 0xFFFFFF;
    315         xdmaGlobalChStatus = XDMAC_GetGlobalChStatus(pXdmac);
    316315
    317316        while (xdmaGlobaIntStatus != 0) {
    318317                uint8_t _iChannel;
     318                uint32_t xdmaChannelIntStatus;
    319319                sXdmadChannel *pCh;
    320                 uint8_t bExec;
    321320
    322321                _iChannel = 31 - __builtin_clz(xdmaGlobaIntStatus);
     322                xdmaChannelIntStatus = XDMAC_GetChannelIsr(pXdmac, _iChannel);
    323323                pCh = &pDmad->XdmaChannels[_iChannel];
    324                 bExec = 0;
    325324
    326325                xdmaGlobaIntStatus &= ~(UINT32_C(1) << _iChannel);
    327326
    328                 if ((xdmaGlobalChStatus & (XDMAC_GS_ST0 << _iChannel)) == 0) {
    329                         uint32_t xdmaChannelIntMask;
    330                         uint32_t xdmaChannelIntStatus;
    331 
    332                         xdmaChannelIntMask = XDMAC_GetChannelItMask(pXdmac, _iChannel);
    333                         xdmaChannelIntStatus = XDMAC_GetChannelIsr(pXdmac, _iChannel);
    334                         xdmaChannelIntStatus &= xdmaChannelIntMask;
    335 
    336                         if (xdmaChannelIntStatus & XDMAC_CIS_BIS) {
    337                                 if ((xdmaChannelIntMask & XDMAC_CIM_LIM) == 0) {
    338                                         pCh->state = XDMAD_STATE_DONE;
    339                                         bExec = 1;
    340                                 }
    341 
    342                                 TRACE_DEBUG("XDMAC_CIS_BIS\n\r");
    343                         }
    344 
    345                         if (xdmaChannelIntStatus & XDMAC_CIS_FIS)
    346                                 TRACE_DEBUG("XDMAC_CIS_FIS\n\r");
    347 
    348                         if (xdmaChannelIntStatus & XDMAC_CIS_RBEIS)
    349                                 TRACE_DEBUG("XDMAC_CIS_RBEIS\n\r");
    350 
    351                         if (xdmaChannelIntStatus & XDMAC_CIS_WBEIS)
    352                                 TRACE_DEBUG("XDMAC_CIS_WBEIS\n\r");
    353 
    354                         if (xdmaChannelIntStatus & XDMAC_CIS_ROIS)
    355                                 TRACE_DEBUG("XDMAC_CIS_ROIS\n\r");
    356 
    357                         if (xdmaChannelIntStatus & XDMAC_CIS_LIS) {
    358                                 TRACE_DEBUG("XDMAC_CIS_LIS\n\r");
    359                                 pCh->state = XDMAD_STATE_DONE;
    360                                 bExec = 1;
    361                         }
    362 
    363                         if (xdmaChannelIntStatus & XDMAC_CIS_DIS) {
    364                                 pCh->state = XDMAD_STATE_DONE;
    365                                 bExec = 1;
    366                         }
    367 
    368                 } else {
    369                         /* Block end interrupt for LLI dma mode */
    370                         if (XDMAC_GetChannelIsr(pXdmac, _iChannel) & XDMAC_CIS_BIS) {
    371                                 bExec = 1;
    372                         }
    373                 }
    374 
    375327                /* Execute callback */
    376                 if (bExec)
    377                         pCh->fCallback(_iChannel, pCh->pArg);
     328                pCh->fCallback(_iChannel, pCh->pArg, xdmaChannelIntStatus);
    378329        }
    379330}
  • bsps/arm/atsam/include/libchip/include/xdmad.h

    r007d4e12 r5f813694  
    108108
    109109/** DMA transfer callback */
    110 typedef void (*XdmadTransferCallback)(uint32_t Channel, void *pArg);
     110typedef void (*XdmadTransferCallback)(uint32_t Channel, void *pArg, uint32_t status);
    111111
    112112/** DMA driver channel */
     
    240240extern eXdmadRC XDMAD_StartTransfer(sXdmad *pXdmad, uint32_t dwChannel);
    241241
    242 extern void XDMAD_DoNothingCallback(uint32_t Channel, void *pArg);
     242extern void XDMAD_DoNothingCallback(uint32_t Channel, void *pArg, uint32_t status);
    243243
    244244extern eXdmadRC XDMAD_SetCallback(sXdmad *pXdmad,
Note: See TracChangeset for help on using the changeset viewer.