#include "lpc43xx.h"
#include "lpc43xx_gpdma.h"
#include "dma.h"
GPDMA_LLI_Type myLLI[31] __attribute__((at(0x10007000)));;
void DMA_SPIFItoFB_Init(const unsigned char * image)
{
GPDMA_Channel_CFG_Type myDMA1;
uint32_t i, *p, *fb;
p = (uint32_t *) image;
fb = (uint32_t *) 0x28000000;
/* Disable DMA */
GPDMA_ChannelCmd(1, DISABLE);
/* Disable GPDMA interrupt */
NVIC_DisableIRQ(DMA_IRQn);
/* preemption = 1, sub-priority = 1 */
NVIC_SetPriority(DMA_IRQn, ((0x01<<3)|0x01));
GPDMA_Init();
myDMA1.ChannelNum = 1; //DMA channel
myDMA1.TransferSize = 4080; //word size transfer 4 bytes = 32bit WORD
myDMA1.TransferType = GPDMA_TRANSFERTYPE_M2M_CONTROLLER_DMA;
myDMA1.TransferWidth = GPDMA_WIDTH_WORD; //used only for M2M operation
myDMA1.SrcMemAddr = (uint32_t) p; //used only for M2M and M2P operation
myDMA1.DstMemAddr = (uint32_t) fb;
myDMA1.DMALLI = (uint32_t) 0x10007000; //linked list
GPDMA_Setup(&myDMA1);
for(i=0; i < 31; i++)
{
p += 4080;
fb += 4080;
myLLI.SrcAddr = (uint32_t) p;
myLLI.DstAddr = (uint32_t) fb;
myLLI.Control = (uint32_t) (GPDMA_DMACCxControl_TransferSize(4080) |
GPDMA_DMACCxControl_SWidth(GPDMA_WIDTH_WORD) |
GPDMA_DMACCxControl_DWidth(GPDMA_WIDTH_WORD) |
GPDMA_DMACCxControl_SBSize(GPDMA_BSIZE_1) |
GPDMA_DMACCxControl_DBSize(GPDMA_BSIZE_1)|
GPDMA_DMACCxControl_SI |
GPDMA_DMACCxControl_DI |
GPDMA_DMACCxControl_I);
if(i == 30) myLLI.NextLLI = (uint32_t) 0;
else myLLI.NextLLI = (uint32_t) &(myLLI[(i+1)]);
}
/* Enable GPDMA interrupt */
NVIC_EnableIRQ(DMA_IRQn);
// Enable GPDMA channel 1
GPDMA_ChannelCmd(1, ENABLE);
}
|