📄 dma.c
字号:
*(src+i)=3;
DMA1POL_Single((int)(src+0xfffff), (int)(dst+0xfffff), 0x100000, 0); // Transfer Width=Byte(8-bit)
// Destination Data Read
memsum=0;
for(i=0; i<0x100000; i++)
memsum+=*(dst+i);
if(memsum==0x300000)
{
Uart_Printf(", Byte transfer OK!!!\n");
isYes+=1;
}
else Uart_Printf(", Byte transfer Fail!!!\n");
free(src-0x8000000);
free(dst-0x8000000);
if(isYes==3) return 1;
else return 0;
}
int DMA0_ISRAM2MEM(void)
{
int isYes=0;
unsigned char *dst, *src;
int i, saveSyscfg;
int memsum;
Uart_Printf(" Internal SRAM to Memory transfer test\n");
dst=(unsigned char *)((int)malloc(0x1000)+0x8000000);
src=(U8 *)_CPU_ASICBASE;
Uart_Printf(" src=0x%x, dst=0x%x\n",src,dst);
saveSyscfg=rSYSCFG;
rSYSCFG=(MEMORY0_SDRAM|SFR_STARTADDRESS|SYSCFG_0KB|CACHE_OFF|WRBUF_OFF); // Cache off, Write buffer on, Stal off
rSYSCON&=~(BIT_GLOBAL);
// Copy by Word
// Source Data Write
for(i=0;i<0x1000;i++)
*(src+i)=1;
DMA0POL_Block((int)(src+0xffc), (int)dst, 0x400, 2);
memsum=0;
for(i=0;i<0x1000;i++)
memsum+=*(dst+i);
if(memsum==0x1000)
{
Uart_Printf(", Word transfer OK!!!\n");
isYes+=1;
}
else Uart_Printf(", Word transfer Fail!!!\n");
// Copy by Half-word
// Source Data Write
for(i=0;i<0x1000;i++)
*(src+i)=2;
DMA0POL_Block((int)(src+0xffe), (int)dst, 0x800, 1);
memsum=0;
/*for(i=0;i<0x1000;i++)
{
if(*(dst+i)!=2)Uart_Printf("\nAddress=0x%x, Data=0x%x\n",(dst+i),*(dst+i));
}*/ //Internal SRAM Test Program
for(i=0;i<0x1000;i++)
memsum+=*(dst+i);
if(memsum==0x2000)
{
Uart_Printf(", Half-word transfer OK!!!\n");
isYes+=1;
}
else Uart_Printf(", Half-word transfer Fail!!!\n");
// Copy by Byte
// Source Data Write
for(i=0;i<0x1000;i++)
*(src+i)=3;
DMA0POL_Block((int)(src+0xfff), (int)dst, 0x1000, 1);
memsum=0;
/*for(i=0;i<0x1000;i++)
{
if(*(dst+i)!=3)Uart_Printf("\nAddress=0x%x, Data=0x%x\n",(dst+i),*(dst+i));
}*/ //Internal SRAM Test Program
for(i=0;i<0x1000;i++)
memsum+=*(dst+i);
if(memsum==0x3000)
{
Uart_Printf(", Byte transfer OK!!!\n");
isYes+=1;
}
else Uart_Printf(", Byte transfer Fail!!!\n");
Flush_Cache();
rSYSCFG=saveSyscfg;
free(dst-0x8000000);
if(isYes==3) return 1;
else return 0;
}
int DMA1_MEM2ISRAM(void)
{
int isYes=0;
unsigned char *dst, *src;
int i, saveSyscfg;
int memsum;
Uart_Printf(" Memory to Internal SRAM transfer test\n");
dst=(U8 *)_CPU_ASICBASE;
src=(unsigned char *)((int)malloc(0x1000)+0x8000000);
Uart_Printf(" src=0x%x, dst=0x%x\n",src,dst);
saveSyscfg=rSYSCFG;
rSYSCFG=(MEMORY0_SDRAM|SFR_STARTADDRESS|SYSCFG_0KB|CACHE_OFF|WRBUF_OFF); // Cache off, Write buffer on, Stal off
rSYSCON&=~(BIT_GLOBAL);
// Copy by Word
// Source Data Write
for(i=0;i<0x1000;i++)
*(src+i)=1;
DMA1POL_Single((int)(src+0xffc), (int)(dst+0xffc), 0x400, 2);
memsum=0;
/*for(i=0;i<0x1000;i++)
{
if(*(dst+i)!=1)Uart_Printf("\nAddress=0x%x, Data=0x%x\n",(dst+i),*(dst+i));
}*/ //Internal SRAM Test Program
for(i=0;i<0x1000;i++)
memsum+=*(dst+i);
if(memsum==0x1000)
{
Uart_Printf(", Word transfer OK!!!\n");
isYes+=1;
}
else Uart_Printf(", Word transfer Fail!!!\n");
// Copy by Half-word
// Source Data Write
for(i=0;i<0x1000;i++)
*(src+i)=2;
DMA1POL_Single((int)(src+0xffe), (int)(dst+0xffe), 0x800, 1);
memsum=0;
/*for(i=0;i<0x1000;i++)
{
if(*(dst+i)!=2)Uart_Printf("\nAddress=0x%x, Data=0x%x\n",(dst+i),*(dst+i));
}*/ //Internal SRAM Test Program
for(i=0;i<0x1000;i++)
memsum+=*(dst+i);
if(memsum==0x2000)
{
Uart_Printf(", Half-word transfer OK!!!\n");
isYes+=1;
}
else Uart_Printf(", Half-word transfer Fail!!!\n");
// Copy by Byte
// Source Data Write
for(i=0;i<0x1000;i++)
*(src+i)=3;
DMA1POL_Single((int)(src+0xfff), (int)(dst+0xfff), 0x1000, 1);
memsum=0;
/*for(i=0;i<0x1000;i++)
{
if(*(dst+i)!=3)Uart_Printf("\nAddress=0x%x, Data=0x%x\n",(dst+i),*(dst+i));
}*/ //Internal SRAM Test Program
for(i=0;i<0x1000;i++)
memsum+=*(dst+i);
if(memsum==0x3000)
{
Uart_Printf(", Byte transfer OK!!!\n");
isYes+=1;
}
else Uart_Printf(", Byte transfer Fail!!!\n");
Flush_Cache();
rSYSCFG=saveSyscfg;
free(src-0x8000000);
if(isYes==3) return 1;
else return 0;
}
void DMA0INT_Single(int srcAddr, int dstAddr, int length, int dw)
{
int time;
dma0stop=0;
rDMASRC0=srcAddr;
rDMADST0=dstAddr;
rDMACNT0=length;
Timer_Start();
rDMACON0=((dw<<12) | DMA_CTRL_SINGLE | DMA_CTRL_INT | DMA_CTRL_SRC_INC | \
DMA_CTRL_DST_INC | DMA_CTRL_MODE_SW | DMA_RUN_ENABLE);
while(dma0stop==0);
time=Timer_Stop();
Uart_Printf(" DMA0 transfer time(Word)=%fs",(float)time/ONESEC);
rSYSCON&=~(BIT_GLOBAL);
}
void DMA1INT_Block(int srcAddr, int dstAddr, int length, int dw)
{
int time;
dma1stop=0;
rDMASRC1=srcAddr;
rDMADST1=dstAddr;
rDMACNT1=length;
Timer_Start();
rDMACON1=((dw<<12) | DMA_CTRL_BLOCK | DMA_CTRL_INT | DMA_CTRL_SRC_INC | \
DMA_CTRL_DST_DEC | DMA_CTRL_MODE_SW | DMA_RUN_ENABLE);
while(dma1stop==0);
time=Timer_Stop();
Uart_Printf(" DMA0 transfer time(Word)=%fs",(float)time/ONESEC);
rSYSCON&=~(BIT_GLOBAL);
}
void DMA0POL_Block(int srcAddr, int dstAddr, int length, int dw)
{
int time;
rDMASRC0=srcAddr;
rDMADST0=dstAddr;
rDMACNT0=length;
Timer_Start();
rDMACON0=((dw<<12) | DMA_CTRL_BLOCK | DMA_CTRL_NO_INT | DMA_CTRL_SRC_DEC | \
DMA_CTRL_DST_INC | DMA_CTRL_MODE_SW | DMA_RUN_ENABLE);
while(rDMACON0 & DMA_STATE_BUSY);
time=Timer_Stop();
Uart_Printf(" DMA0 transfer time(Word)=%fs",(float)time/ONESEC);
}
void DMA1POL_Single(int srcAddr, int dstAddr, int length, int dw)
{
int time;
rDMASRC1=srcAddr;
rDMADST1=dstAddr;
rDMACNT1=length;
Timer_Start();
rDMACON1=((dw<<12) | DMA_CTRL_SINGLE | DMA_CTRL_NO_INT | DMA_CTRL_SRC_DEC | \
DMA_CTRL_DST_DEC | DMA_CTRL_MODE_SW | DMA_RUN_ENABLE);
while(rDMACON1 & DMA_STATE_BUSY);
time=Timer_Stop();
Uart_Printf(" DMA0 transfer time(Word)=%fs",(float)time/ONESEC);
}
void __irq Dma0Done(void)
{
rINTPND=~(BIT_DMA0);
dma0stop=1;
}
void __irq Dma1Done(void)
{
rINTPND=~(BIT_DMA1);
dma1stop=1;
}
void Test_ExtDMA(void)
{
U8 *src, *dst;
int i, memsum, savePCON5, savePUR5;
savePCON5=rPCON5;
savePUR5=rPUR5;
rPCON5|=0xa;
rPUR5=0x3c;
rSYSCON&=~(BIT_GLOBAL);
Uart_Printf(" DMA0 Memory to Memory transfer Test(Stop Interrupt, Single Mode)\n");
dst=(U8 *)((int)malloc(0x100000)+0x8000000);
src=(U8 *)((int)malloc(0x100000)+0x8000000);
Uart_Printf(" Source Address=0x%x, Destination Address=0x%x\n",src,dst);
pISR_DMA0=(unsigned)ExtDma0Done;
// Copy by Word
// Source Data Write
rINTPND=~(BIT_DMA0); //clear pending status bit
rSYSCON|=BIT_GLOBAL;
rINTMSK=BIT_DMA0; //support service program
for(i=0; i<0x100000; i++)
*(src+i)=1;
ExtDMA0INT_Single((int)src, (int)dst, 0x40000, 2); // Transfer Width=Word(32-bit)
// Destination Data Read
memsum=0;
for(i=0; i<0x100000; i++)
memsum+=*(dst+i);
if(memsum==0x100000) Uart_Printf(", Word transfer OK!!!\n");
else Uart_Printf(", Word transfer Fail!!!\n");
// Copy by Half-word
// Source Data Write
rINTPND=~(BIT_DMA0); //clear pending status bit
rSYSCON|=BIT_GLOBAL;
rINTMSK=BIT_DMA0; //support service program
for(i=0; i<0x100000; i++)
*(src+i)=2;
ExtDMA0INT_Single((int)src, (int)dst, 0x80000, 1); // Transfer Width=Half-word(16-bit)
// Destination Data Read
memsum=0;
for(i=0; i<0x100000; i++)
memsum+=*(dst+i);
if(memsum==0x200000) Uart_Printf(", Half-word transfer OK!!!\n");
else Uart_Printf(", Half-word transfer Fail!!!\n");
// Copy by Byte
// Source Data Write
rINTPND=~(BIT_DMA0); //clear pending status bit
rSYSCON|=BIT_GLOBAL;
rINTMSK=BIT_DMA0; //support service program
for(i=0; i<0x100000; i++)
*(src+i)=3;
ExtDMA0INT_Single((int)src, (int)dst, 0x100000, 0); // Transfer Width=Byte(8-bit)
// Destination Data Read
memsum=0;
for(i=0; i<0x100000; i++)
memsum+=*(dst+i);
if(memsum==0x300000) Uart_Printf(", Byte transfer OK!!!\n");
else Uart_Printf(", Byte transfer Fail!!!\n");
free(src-0x8000000);
free(dst-0x8000000);
rPCON5=savePCON5;
rPUR5=savePUR5;
}
void ExtDMA0INT_Single(int srcAddr, int dstAddr, int length, int dw)
{
int time;
dma0stop=0;
rDMASRC0=srcAddr;
rDMADST0=dstAddr;
rDMACNT0=length;
Timer_Start();
rDMACON0=((dw<<12) | DMA_CTRL_SINGLE | DMA_CTRL_INT | DMA_CTRL_SRC_INC | \
DMA_CTRL_DST_INC | DMA_CTRL_MODE_EXT | DMA_RUN_ENABLE);
rDMACON0=(dw<<12)|(1<<8)|(1<<2)|(1<<0); // Enable, src/dst increase, Single mode, Stop_Int.
rPDAT7=0x0;
while(dma0stop==0);
time=Timer_Stop();
Uart_Printf(" DMA0 transfer time(Word)=%fs",(float)time/ONESEC);
rSYSCON&=~(BIT_GLOBAL);
}
void __irq ExtDma0Done(void)
{
rINTPND=~(BIT_DMA0);
rPDAT7=0x1;
dma0stop=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -