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

📄 dmatest.c

📁 三星2440开发板的BIOS和测试例程源码
💻 C
字号:
#include "def.h"
#include "2410addr.h"
#include "2410lib.h"
#include "DMAAdmin.h"

#define	DMA_TEST	0x23
#define	DMA_ATTR	((DMA_TEST<<16)|SRC_LOC_AHB|SRC_ADDR_INC|DST_LOC_AHB|DST_ADDR_INC)
#define	DMA_MODE	(HANDSHAKE_MODE|SYNC_AHB|DONE_GEN_INT|TSZ_UNIT|WHOLE_SVC|SW_TRIG|RELOAD_OFF|DSZ_16b)

static volatile U8 dmaDone[4];

static void __irq Dma0Done(void)
{
    ClearPending(BIT_DMA0);
    dmaDone[0]=1;
    WrUTXH0('A');
}

static void __irq Dma1Done(void)
{
    ClearPending(BIT_DMA1);
    dmaDone[1]=1;
    WrUTXH0('B');
}

static void __irq Dma2Done(void)
{
    ClearPending(BIT_DMA2);
    dmaDone[2]=1;
    WrUTXH0('C');
}

static void __irq Dma3Done(void)
{
    ClearPending(BIT_DMA3);
    dmaDone[3]=1;
    WrUTXH0('D');
}

void DmaTest(void)
{
	int ch;	
//	U32 DmaAttr[4];
	U32 DmaTestReq[4];		
	
	puts("DMA test\n");		
	
	pISR_DMA0 = (U32)Dma0Done;	 
	ClearPending(BIT_DMA0);	
	EnableIrq(BIT_DMA0);
	
	pISR_DMA1 = (U32)Dma1Done;	 
	ClearPending(BIT_DMA1);	
	EnableIrq(BIT_DMA1);

	pISR_DMA2 = (U32)Dma2Done;	 
	ClearPending(BIT_DMA2);	
	EnableIrq(BIT_DMA2);

	pISR_DMA3 = (U32)Dma3Done;	 
	ClearPending(BIT_DMA3);	
	EnableIrq(BIT_DMA3);
	
	for(ch=0; ch<4; ch++)
		dmaDone[ch] = 1;
	for(ch=0; ch<4; ch++)
	{			
		DmaTestReq[ch] = RequestDMASW(DMA_ATTR, DMA_MODE);
//		printf("Request sw dma channel = %x\n", DmaTestReq[ch]);
		if(DmaTestReq[ch]==REQUEST_DMA_FAIL)
		{
			printf("request dma%x fail!\n", ch);
		}
		else
		{
			dmaDone[(DmaTestReq[ch]>>4)&0xf] = 0;			
			SetDMARun(DmaTestReq[ch]|DMA_START, 0x32000000+ch*SIZE_1M, 0x32800000+ch*SIZE_1M, SIZE_512K);			
		}
	}	
	
	
	
	while(!(dmaDone[0]&dmaDone[1]&dmaDone[2]&dmaDone[3]));
	
	DisableIrq(BIT_DMA0);
	DisableIrq(BIT_DMA1);
	DisableIrq(BIT_DMA2);
	DisableIrq(BIT_DMA3);
	for(ch=0; ch<4; ch++)	
		ReleaseDMA(DmaTestReq[ch]);	
	
	printf("\nDMA Transfer finished.\n");	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -