📄 extdmam.c
字号:
/*****************************************
NAME: Extdmam.c
DESC: External DMA test(master board)
HISTORY:
2003.04.09 Baik Seung Woo ver 0.0
*****************************************/
#include <stdio.h>
#include <string.h>
#include "2460addr.h"
#include "2460lib.h"
#include "option.h"
#include "extdmam.h"
static void __irq DmaX0Done(void);
static void __irq DmaX1Done(void);
//void extM2M_test(int ch, int s_addr, int d_addr, int extDMAburst, int extDMAdsz, int extDMAtc);
void extM2M_test(unsigned int ch, unsigned int s_addr, unsigned int d_addr);
void Test_extDMA(void);
int extDMAburst, extDMAdsz, extDMAtc;
int ExtdmaDone;
void Intro(void)
{
unsigned char c;
ExtdmaDone=0;
// rGPCON_U=(rGPCON_U&~(0xcc00))|(2<<14)|(2<<10);//ch-0
//rGPCON_U=(rGPCON_U&~(0x33000))|(2<<16)|(2<<12);//ch-1
printf("1.byte single\n2.halfword single\n3.word single\n4.byte extDMAburst\n5.halfword extDMAburst\n6.word extDMAburst\n");
printf("select mode: ");
c = getchar();
switch(c)
{
case '1':
printf("byte single transfer\n");
printf("ack_count=32\n");
extDMAburst=0, extDMAdsz=0, extDMAtc=0x20;
//extDMAburst=0, extDMAdsz=0, extDMAtc=0xfffff;
//extDMAburst=0, extDMAdsz=0, extDMAtc=0x8;
Test_extDMA();
break;
case '2':
printf("halfword single transfer\n");
printf("ack_count=16\n");
extDMAburst=0, extDMAdsz=1, extDMAtc=0x10;
//extDMAburst=0, extDMAdsz=1, extDMAtc=0xfffff;
Test_extDMA();
break;
case '3':
printf("word single transfer\n");
printf("ack_count=8\n");
extDMAburst=0, extDMAdsz=2, extDMAtc=0x8;
//extDMAburst=0, extDMAdsz=2, extDMAtc=0xfffff;
Test_extDMA();
break;
case '4':
printf("byte extDMAburst transfer\n");
printf("ack_count=8\n");
extDMAburst=1, extDMAdsz=0, extDMAtc=0x8;
//extDMAburst=1, extDMAdsz=0, extDMAtc=0xfffff;
Test_extDMA();
break;
case '5':
printf("halfword extDMAburst transfer\n");
printf("ack_count=4\n");
extDMAburst=1, extDMAdsz=1, extDMAtc=0x4;
Test_extDMA();
break;
case '6':
printf("word extDMAburst transfer\n");
printf("ack_count=2\n");
extDMAburst=1, extDMAdsz=2, extDMAtc=0x2;
Test_extDMA();
break;
default:
break;
}
}
void Test_extDMA(void)
{
//ch-0
//extM2M_test(0, _NONCACHE_STARTADDRESS, _NONCACHE_STARTADDRESS + 0x80000);
extM2M_test(0, 0x0, _NONCACHE_STARTADDRESS + 0x80000);
//ch-1
//extM2M_test(1, _NONCACHE_STARTADDRESS, _NONCACHE_STARTADDRESS + 0x80000);
}
void extM2M_test(unsigned int ch, unsigned int s_addr, unsigned int d_addr)
{
unsigned char cxdma=0;
unsigned int i;
int trscount;
volatile unsigned int memSum0=0, memSum1=0;
if(extDMAdsz==0)
trscount=extDMAtc*(extDMAburst ? 4:1)*1;
else if(extDMAdsz==1)
trscount=extDMAtc*(extDMAburst ? 4:1)*2;
else if(extDMAdsz==2)
trscount=extDMAtc*(extDMAburst ? 4:1)*4;
/*
for(i=s_addr;i<s_addr+trscount;i+=4)
{
// *((unsigned int *)i)= i^0x55aa5aa5;
*((unsigned int *)i)= i;
printf("source data = %x\n",*((unsigned int *)i));
//memSum0+=*((unsigned int *)i);
}
*/
/*
for(i=0;i<trscount;i++)
{
*((unsigned char *)(i+s_addr))= ++cxdma;
printf("source data = %x\n",*((unsigned char *)(s_addr+i)));
}
*/
//initializing the destination memory....
for(i=0;i<32;i++)
{
*((unsigned char *)(i+d_addr))= 0xff;
}
/*
for(i=0;i<trscount;i++)
{
*((unsigned char *)(i+s_addr))= i;
}
*/
printf("ch=%x\n",ch);
switch(ch)
{
case 0:
pISR_DMA_SBUS = (unsigned)DmaX0Done;
rINTSUBMSK&=~(BIT_SUB_DMA0);
rINTMSK &= ~(BIT_DMA_SBUS);
break;
case 1:
pISR_DMA_SBUS = (unsigned)DmaX1Done;
rINTSUBMSK&=~(BIT_SUB_DMA1);
rINTMSK &= ~(BIT_DMA_SBUS);
break;
default:
break;
}
ExtdmaDone=0;
printf("DMA%d start\n",ch);
printf("extDMAburst:%x, extDMAdsz:%x, extDMAtc:%x\n", extDMAburst, extDMAdsz, extDMAtc);
switch(ch)
{
case 0:
rDISRC0=s_addr;
rDISRCC0=(0<<1)|(0<<0);
rDIDST0=d_addr;
rDIDSTC0=(0<<1)|(0<<0);
//rDCON0=((unsigned)1<<31)|(0<<30)|(1<<29)|(extDMAburst<<28)|(1<<27)|(0<<24)|(1<<23)|(0<<22)|(extDMAdsz<<20)|(extDMAtc); // Handshake Whole
//rDCON0=((unsigned)1<<31)|(0<<30)|(0<<29)|(extDMAburst<<28)|(0<<27)|(0<<24)|(1<<23)|(0<<22)|(extDMAdsz<<20)|(extDMAtc); // Handshake single, auto-reload
rDCON0=((unsigned)1<<31)|(0<<30)|(1<<29)|(extDMAburst<<28)|(0<<27)|(0<<24)|(1<<23)|(1<<22)|(extDMAdsz<<20)|(extDMAtc); // Handshake single, Whole, auto-reload
//rDCON0=((unsigned)0<<31)|(1<<30)|(0<<29)|(extDMAburst<<28)|(0<<27)|(0<<24)|(1<<23)|(1<<22)|(extDMAdsz<<20)|(extDMAtc); // Demand single
rDMASKTRIG0=(0<<2)|(1<<1)|(0<<0);
break;
case 1:
rDISRC1=s_addr;
rDISRCC1=(0<<1)|(0<<0);
rDIDST1=d_addr;
rDIDSTC1=(0<<1)|(0<<0);
rDCON1=((unsigned)1<<31)|(1<<30)|(1<<29)|(extDMAburst<<28)|(0<<27)|(0<<24)|(1<<23)|(1<<22)|(extDMAdsz<<20)|(extDMAtc);
rDMASKTRIG1=(0<<2)|(1<<1)|(0<<0);
break;
default:
break;
}
//while(ExtdmaDone==0);
//while((rDSTAT0&0xfffff)!=0);
//rDMASKTRIG0|=(1<<2);
//printf("DMA transfer done.\n");
//rINTMSK |= BIT_ALLMSK;
//rINTSUBMSK|=BIT_SUB_ALLMSK;
/*
for(i=d_addr;i<d_addr+trscount;i+=4)
{
printf("destination data = %x\n",*((unsigned int *)i));
if((s_addr+i-d_addr) == *((unsigned int *)i))
printf("DMA test result ............O.K\n");
//memSum1+=*((unsigned int *)i);
}
*/
/* for(i=0;i<trscount;i++)
{
if(*((unsigned char *)(i+d_addr))==*((unsigned char *)(i+s_addr))) printf("ok\n");
printf("destination data = %x\n",*((unsigned char *)(d_addr+i)));
}
*/
//printf("memSum0=%x,memSum1=%x\n",memSum0,memSum1);
/*
if(memSum0==memSum1)
printf("DMA test result ............O.K\n");
else
printf("DMA test result : ERROR.\n");
*/
//rDMASKTRIG0|=(1<<2);
//while(1)
//{
while(ExtdmaDone==0);
//while(rDSTAT0&0x1fffff);
ExtdmaDone =0;
printf("rDSTAT0=0x%x\n", rDSTAT0);
//rDMASKTRIG0|=(1<<2);
//while((rDMASKTRIG0&(1<<1) ));
printf("rDSTAT0=0x%x\n", rDSTAT0);
//rDMASKTRIG0|=(1<<2);
for(i=0;i<32;i++)
{
if(*((unsigned char *)(i+d_addr))!=*((unsigned char *)(i+s_addr))) printf("Error occured at 0x%x\n", i);
}
/*
for(i=0;i<trscount;i++)
{
*((unsigned char *)(i+d_addr)) = 0xff;
}
*/
//rINTSUBMSK&=~(BIT_SUB_DMA0);
//rINTMSK &= ~(BIT_DMA);
//}
rDMASKTRIG0|=(1<<2);
rDMASKTRIG0&=~(1<<1);
printf("rDSTAT0=0x%x\n", rDSTAT0);
rDISRC0=0x0;
rDISRCC0=0x0;
rDIDST0=0x0;
rDIDSTC0=0x0;
////////////////////////////////////////////////////////////////
rDCON0=0x0;
rDSTAT0=0x0;
///////////////////////////////////////////////////////////////
rDMASKTRIG0=0x0;
// rGPCON_U=0x0;
printf("rDSTAT0=0x%x\n", rDSTAT0);
}
static void __irq DmaX0Done(void)
{
rINTMSK|=BIT_DMA_SBUS;
rINTSUBMSK|=BIT_SUB_DMA0;
rSUBSRCPND=BIT_SUB_DMA0;
ClearPending(BIT_DMA_SBUS);
ExtdmaDone=1;
rDMASKTRIG0|=(1<<2);
printf("DMA0 Done!\n");
}
static void __irq DmaX1Done(void)
{
rSUBSRCPND=BIT_SUB_DMA1;
ClearPending(BIT_DMA_SBUS);
ExtdmaDone=1;
printf("DMA1 Done!\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -