📄 dma2.c
字号:
if(mSum0[0]==mSum1[0])
printf("[Ch: 0, Size: %d KB] DMA test (Demand, Whole service) O.K.\n",tot_sz/1024);
else
printf("[Ch: 0, Size: %d KB] DMA test (Demand, Whole service) ERROR!!!\n",tot_sz/1024);
}
void DMA_M2M_ExtREQ3(void)
{
U32 i;
U32 s_addr;
U32 d_addr;
U32 tot_sz;
U32 tc,tsz;
rGPBDN |= (3<<9);
rGPBDAT |= (3<<9);
rGPBCON = (rGPBCON & ~(0xf<<18))|(0xa<<18);
pISR_DMA0=(int)Dma0End;
rINTMSK&=~(BIT_DMA0);
tot_sz=0x10;
s_addr=_NONCACHE_STARTADDRESS;
d_addr=_NONCACHE_STARTADDRESS+tot_sz;
tsz=0; // Unit Transfer
tc=tot_sz/((tsz?4:1)*2); // case DBYTE :
dmaEnd[0]=1;
mSum0[0]=0;
mSum1[0]=0;
// Destination Memory Clear
for(i=d_addr;i<(d_addr+tot_sz);i+=4)
*((U32 *)i)=0;
for(i=s_addr;i<(s_addr+tot_sz);i+=4)
{
*((U32 *)i)=i^0x55aa5aa5;
mSum0[0]+=*((U32 *)i);
}
rDISRC0=s_addr;
rDISRCC0=(0<<1)|(0<<0); // AHB, INC
rDIDST0=d_addr;
rDIDSTC0=(0<<1)|(0<<0); // AHB, INC
rDCON0=(1<<31)|(0<<30)|(1<<29)|(tsz<<28)|(0<<27)|(1<<22)|(1<<20)|(tc);
//HS|APB|InterruptEn|TransferSize|SingleServ|RelaodOff|DByte|TransferCount
rDMAREQSEL0=(17<<1)|(1<<0); //nXDREQ0
rDMASKTRIG0=(1<<1); //DMA on
printf("Waiting for nXDREQ\n");
///////////////////////////////////////////////////////////////////////////////
printf("Current TC : ");
printf("%08x",(rDSTAT0&0xfffff));
while(dmaEnd[0]) {
if(Uart_GetKey()) break;
//printf("\b\b\b\b\b\b\b\b%08x",(rDSTAT0&0xfffff));
}
printf("\nM2M Done\n");
rINTMSK=BIT_ALLMSK;
for(i=d_addr;i<(d_addr+tot_sz);i+=4)
{
mSum1[0]+=*((U32 *)i);
}
if(mSum0[0]==mSum1[0])
printf("[Ch: 0, Size: %d Byte] DMA test (Handshake, Single service) O.K.\n",tot_sz);
else
printf("[Ch: 0, Size: %d Byte] DMA test (Handshake, Single service) ERROR!!!\n",tot_sz);
}
void DMA_M2M_ExtREQ4(void)
{
U32 i;
U32 s_addr;
U32 d_addr;
U32 tot_sz;
U32 tc,tsz;
rGPBDN |= (3<<9);
rGPBDAT |= (3<<9);
rGPBCON = (rGPBCON & ~(0xf<<18))|(0xa<<18);
pISR_DMA0=(int)Dma0End;
rINTMSK&=~(BIT_DMA0);
tot_sz=0x10;
s_addr=_NONCACHE_STARTADDRESS;
d_addr=_NONCACHE_STARTADDRESS+tot_sz;
tsz=0; // Unit Transfer
tc=tot_sz/((tsz?4:1)*2); // case DBYTE :
dmaEnd[0]=1;
mSum0[0]=0;
mSum1[0]=0;
// Destination Memory Clear
for(i=d_addr;i<(d_addr+tot_sz);i+=4)
*((U32 *)i)=0;
for(i=s_addr;i<(s_addr+tot_sz);i+=4)
{
*((U32 *)i)=i^0x55aa5aa5;
mSum0[0]+=*((U32 *)i);
}
rDISRC0=s_addr;
rDISRCC0=(0<<1)|(0<<0); // AHB, INC
rDIDST0=d_addr;
rDIDSTC0=(0<<1)|(0<<0); // AHB, INC
rDCON0=(0<<31)|(0<<30)|(1<<29)|(tsz<<28)|(1<<27)|(0<<22)|(1<<20)|(tc);
//Demand|APB|InterruptEn|TransferSize|SingleServ|RelaodOn|DByte|TransferCount
rDMAREQSEL0=(17<<1)|(1<<0); //nXDREQ0
rDMASKTRIG0=(1<<1); //DMA on
printf("Waiting for nXDREQ\n");
///////////////////////////////////////////////////////////////////////////////
printf("Current TC : ");
printf("%08x",(rDSTAT0&0xfffff));
while(dmaEnd[0]) {
if(Uart_GetKey()) break;
//printf("\b\b\b\b\b\b\b\b%08x",(rDSTAT0&0xfffff));
}
printf("\nM2M Done\n");
rINTMSK=BIT_ALLMSK;
for(i=d_addr;i<(d_addr+tot_sz);i+=4)
{
mSum1[0]+=*((U32 *)i);
}
if(mSum0[0]==mSum1[0])
printf("[Ch: 0, Size: %d KB] DMA test (Demand, Single service) O.K.\n",0,tot_sz/1024);
else
printf("[Ch: 0, Size: %d KB] DMA test (Demand, Single service) ERROR!!!\n",0,tot_sz/1024);
}
void M2M0123_Worst(void)
{
U32 i;
U32 s_addr;
U32 d_addr;
U32 tot_sz;
tot_sz=0x100000;
s_addr=_NONCACHE_STARTADDRESS;
d_addr=_NONCACHE_STARTADDRESS+tot_sz;
DMA_M2M_Worst(0, s_addr, d_addr, SINGLE,DBYTE, tot_sz); //Single, Byte, 512KB
DMA_M2M_Worst(1, s_addr, d_addr, SINGLE,DBYTE, tot_sz); //Single, Byte, 512KB
DMA_M2M_Worst(2, s_addr, d_addr, SINGLE,DBYTE, tot_sz); //Single, Byte, 512KB
DMA_M2M_Worst(3, s_addr, d_addr, SINGLE,DBYTE, tot_sz); //Single, Byte, 512KB
rDMASKTRIG0 |= 1;
rDMASKTRIG1 |= 1;
rDMASKTRIG2 |= 1;
rDMASKTRIG3 |= 1;
while(dmaEnd[0]|dmaEnd[1]|dmaEnd[2]|dmaEnd[3]);
rINTMSK=BIT_ALLMSK;
for(i=d_addr;i<(d_addr+tot_sz);i+=4)
{
mSum1[0]+=*((U32 *)i);
mSum1[1]+=*((U32 *)i);
mSum1[2]+=*((U32 *)i);
mSum1[3]+=*((U32 *)i);
}
if(mSum0[0]==mSum1[0])
printf("[Ch: 0, Size: %d KB] DMA test O.K.\n",tot_sz/1024);
else
printf("[Ch: 0, Size: %d KB] DMA test ERROR!!!\n",tot_sz/1024);
if(mSum0[1]==mSum1[1])
printf("[Ch: 1, Size: %d KB] DMA test O.K.\n",tot_sz/1024);
else
printf("[Ch: 1, Size: %d KB] DMA test ERROR!!!\n",tot_sz/1024);
if(mSum0[2]==mSum1[2])
printf("[Ch: 2, Size: %d KB] DMA test O.K.\n",tot_sz/1024);
else
printf("[Ch: 2, Size: %d KB] DMA test ERROR!!!\n",tot_sz/1024);
if(mSum0[3]==mSum1[3])
printf("[Ch: 3, Size: %d KB] DMA test O.K.\n",tot_sz/1024);
else
printf("[Ch: 3, Size: %d KB] DMA test ERROR!!!\n",tot_sz/1024);
}
void DMA_M2M_Worst(U32 ch,U32 s_addr, U32 d_addr, U32 tsz, U32 dsz, U32 tot_sz)
{
U32 i;
U32 tc;
DMA2 *pDMA;
switch(ch)
{
case 0:
pISR_DMA0=(int)Dma0End;
rINTMSK&=~(BIT_DMA0);
pDMA=(void *)0x4b000000;
break;
case 1:
pISR_DMA1=(int)Dma1End;
rINTMSK&=~(BIT_DMA1);
pDMA=(void *)0x4b000040;
break;
case 2:
pISR_DMA2=(int)Dma2End;
rINTMSK&=~(BIT_DMA2);
pDMA=(void *)0x4b000080;
break;
case 3:
pISR_DMA3=(int)Dma3End;
rINTMSK&=~(BIT_DMA3);
pDMA=(void *)0x4b0000c0;
break;
}
switch(dsz)
{
case BYTE :
tc=tot_sz/((tsz?4:1)*1);
break;
case DBYTE :
tc=tot_sz/((tsz?4:1)*2);
break;
case FBYTE :
tc=tot_sz/((tsz?4:1)*4);
break;
default :
printf("DMA setting err, check code\n");
break;
}
if(tc>1048575) {
printf("\n[ERROR] Total Count is too big !%d\n",tc);
printf("[ERROR] This function is abort !\n\n");
return;
}
for(i=s_addr;i<(s_addr+tot_sz);i+=4)
{
*((U32 *)i)=i^0x55aa5aa5;
mSum0[ch]+=*((U32 *)i);
}
dmaEnd[ch]=1;
pDMA->DISRC=s_addr;
pDMA->DISRCC=(0<<1)|(0<<0); // AHB, INC
pDMA->DIDST=d_addr;
pDMA->DIDSTC=(0<<1)|(0<<0); // AHB, INC
pDMA->DCON=(1<<31)|(1<<30)|(1<<29)|(tsz<<28)|(1<<27)|(0<<22)|(dsz<<20)|(tc);
//HS|AHB|InterruptEn|TransferSize|WholeServ|RelaodOff|DataSize|TransferCount
// pDMA->DCON=(0<<31)|(1<<30)|(1<<29)|(tsz<<28)|(1<<27)|(0<<22)|(dsz<<20)|(tc);
// //DM|AHB|InterruptEn|TransferSize|WholeServ|RelaodOff|DataSize|TransferCount
pDMA->DMAREQSEL=0; //S/W request mode
pDMA->DMASKTRIG=(1<<1); //DMA on, SW_TRIG
#if 0
// printf("autoReload %d tc %d c_tc %d\n",((pDMA->DCON)>>22)&0x1,tc,pDMA->DSTAT&0xfffff);
while(dmaDone==0);
rINTMSK=BIT_ALLMSK;
for(i=d_addr;i<(d_addr+tot_sz);i+=4)
{
memSum1+=*((U32 *)i);
}
if(memSum0==memSum1)
printf("[Ch: %d, Size: %d KB] DMA test (Handshake, Whole service) O.K.\n",ch,tot_sz/1024);
else
printf("[Ch: %d, Size: %d KB] DMA test (Handshake, Whole service) ERROR!!!\n",ch,tot_sz/1024);
// printf("DMASKTRIG 0x%03x\n",pDMA->DMASKTRIG&0x7);
// printf("autoReload %d tc %d c_tc %d\n\n",((pDMA->DCON)>>22)&0x1,pDMA->DCON&0xfffff,pDMA->DSTAT&0xfffff);
#endif
}
static void __irq Dma0AutoReload(void)
{
printf("In the IRQ routine.");
printf("\nrSRCPND=0x%x",rSRCPND);
printf("\nrrINTPND=0x%x",rINTPND);
ClearPending(BIT_DMA0);
dCnt++;
if(dCnt>1) dmaEnd[0]=0;
else
{
rDMASKTRIG0 |= 1;
DSTAT0_mon1 = rDSTAT0;
DCSRC0_mon1 = rDCSRC0;
DCDST0_mon1 = rDCDST0;
}
}
static void __irq Dma0End(void)
{
ClearPending(BIT_DMA0);
dmaEnd[0]=0;
}
static void __irq Dma1End(void)
{
ClearPending(BIT_DMA1);
dmaEnd[1]=0;
}
static void __irq Dma2End(void)
{
ClearPending(BIT_DMA2);
dmaEnd[2]=0;
}
static void __irq Dma3End(void)
{
ClearPending(BIT_DMA3);
dmaEnd[3]=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -