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

📄 extdmam.c

📁 三星s3c2460开发板完整功能测试代码
💻 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 + -