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

📄 dma2.c

📁 三星2413芯片的测试代码,对进行驱动开发很有帮助.
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -