⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dma.c

📁 smdk40100 40mhz test code
💻 C
📖 第 1 页 / 共 2 页
字号:
	*(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 + -