2410支持4个独立的DMA通道,每个通道可以处理以下4种情况:
1、源和目的都在系统总线上
2、源在系统总线,目的在外设总线上
3、源在外设总线,目的在系统总线上
4、源和目的都在外设总线上
与DMA相关的寄存器:
太多了,下面是数据内存到内存的代码,具体设置看2410的数据手册。
void dma0_mtom(int srcaddr,int dstaddr,int tc,int dsz,int burst)
{
int length;
volatile int memsumsrc=0,memsumdst=0;
int i;
length=tc*(burst?4:1)*((dsz==0)+(dsz==1)*2+(dsz==2)*4);
for(i=0;i<length;i+=4)
{
(*(volatile long *)(srcaddr+i))=i;
memsumsrc+=i;
}
rDISRC0=srcaddr;
rDISRCC0=(0<<1)|(0<<0);
rDIDST0=dstaddr;
rDIDSTC0=(0<<1)|(0<<0);
rDCON0=(1<<31)|(1<<30)|(0<<29)|(burst<<28)|(1<<27)|(0<<23)|(1<<22)|(dsz<<20)|tc;
rDMASKTRIG0=(1<<1)|1;
uart0_print("DAM:begin to transform\n");
while((rDSTAT0&0xfffff)!=0);
for(i=0;i<length;i+=4)
{
memsumdst+=(*(volatile long *)(dstaddr+i));
}
if(memsumsrc==memsumdst)
{
uart0_print("dma test success\n");
}
else
{
uart0_print("dma test failure\n");
}
}