//------------------------------------------------------------------------------ // Local functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// This handler function must be called by the DMAC interrupt service routine. /// Identifies which event was activated and calls the associated function. //------------------------------------------------------------------------------ void DMAD_Handler() { unsigned int status; unsigned char channel; DmaTransfer *pTransfer; status = DMA_GetStatus(); // Check if the buffer transfer completed is set. if(status & AT91C_BTC) { // Scan each channel status. for(channel = 0; channel < DMA_CHANNEL_NUM; channel++) { if(!(status & (DMA_BTC << channel))){ continue; } dmad.transfers[channel].transferSize -= dmad.transfers[channel].bufSize; // if next buffer is to be the last buffer in the transfer, then clear the automatic mode bit. if(dmad.transfers[channel].transferSize <= dmad.transfers[channel].bufSize) { DMA_ClearAutoMode(channel); } // Transfer finished if(dmad.transfers[channel].transferSize == 0) { pTransfer = &(dmad.transfers[channel]); pTransfer->callback(); DMA_DisableIt(DMA_BTC << channel); DMA_DisableChannel(channel); } else { // Write the KEEPON field to clear the STALL states. DMA_KeeponChannel(channel); } } } }
//------------------------------------------------------------------------------ // Local functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// This handler function must be called by the DMAC interrupt service routine. /// Identifies which event was activated and calls the associated function. //------------------------------------------------------------------------------ extern void DMAC_IrqHandler( void ) { uint32_t dwStatus ; uint32_t dwChannel ; DmaTransfer *pTransfer ; dwStatus = DMA_GetStatus( DMAC ) ; // Check if the buffer transfer completed is set. if ( dwStatus & (DMAC_EBCISR_BTC0|DMAC_EBCISR_BTC1|DMAC_EBCISR_BTC2|DMAC_EBCISR_BTC3|DMAC_EBCISR_BTC4|DMAC_EBCISR_BTC5) ) { // Scan each dwChannel status. for ( dwChannel = 0 ; dwChannel < DMA_CHANNEL_NUM ; dwChannel++ ) { if ( !(dwStatus & (DMAC_EBCISR_BTC0 << dwChannel)) ) { continue ; } dmad.transfers[dwChannel].transferSize -= dmad.transfers[dwChannel].bufSize ; // if next buffer is to be the last buffer in the transfer, then clear the automatic mode bit. if ( dmad.transfers[dwChannel].transferSize <= dmad.transfers[dwChannel].bufSize ) { DMA_ClearAutoMode( DMAC, dwChannel ) ; } // Transfer finished if ( dmad.transfers[dwChannel].transferSize == 0 ) { pTransfer = &(dmad.transfers[dwChannel]) ; pTransfer->callback() ; DMA_DisableIt( DMAC, DMAC_EBCIDR_BTC0 << dwChannel ) ; DMA_DisableChannel( DMAC, dwChannel ) ; } else { // Write the KEEPON field to clear the STALL states. DMA_KeeponChannel( DMAC, dwChannel ) ; } } } }
//------------------------------------------------------------------------------ /// This handler function must be called by the DMAC interrupt service routine. /// Identifies which event was activated and calls the associated function. //------------------------------------------------------------------------------ void DMAD_Handler() { U32 status; U8 channel; DmaTransfer *pTransfer; status = DMA_GetStatus(); if(status & (0xFF)) // Check if the buffer transfer completed is set. { for(channel = 0; channel < 8; channel++) // Scan each channel status. { if(!(status & (0x1 << channel))) { continue; } dmad.transfers[channel].transferSize -= dmad.transfers[channel].bufSize; if(dmad.transfers[channel].transferSize <= dmad.transfers[channel].bufSize) // if next buffer is to be the last buffer in the transfer, then clear the automatic mode bit. { DMA_ClearAutoMode(channel); } if(dmad.transfers[channel].transferSize == 0) // Transfer finished { pTransfer = &(dmad.transfers[channel]); pTransfer->callback(); DMA_DisableIt(0x1 << channel); DMA_DisableChannel(channel); } else { DMA_KeeponChannel(channel); // Write the KEEPON field to clear the STALL states. } } } }