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

📄 dmatest.cpp

📁 基于ADI blackfin 的DMA 描述符方式的程序。便于你理解这种独特的dma搬送方式
💻 CPP
字号:
#include <stdio.h>
#include <stdlib.h>


extern "C"
{
//	void dma_config(int (*src)[10], int (*dest)[10]);
	
	void config(void);
	
	void EnterResult(void);
}


int buffer1[10][40];

int dest1[10][40] = { };

int buffer2[10][40];

int dest2[10][40] = { };


int counter = 0;


void EnterResult(void)
{
	int i, j;
	
	puts("The final answer is:");
	
	for(j=0; j<10; j++)
		for(i=0; i<40; i++)
		{
			if(buffer2[j][i] != dest2[j][i])
				goto OUT;
		}
	
OUT:

	if(j == 10)
		puts("Contents equal!");
		
	else
	{
		puts("Falied!");
		
		printf("i = %d\n", i);
	}
	
	printf("The counter is: %u", counter);
		
	exit(0);
}


// DMA Descriptor List Mode
struct dma_desc
{	
	unsigned long ndp;      // next descriptor
	
	unsigned long sa;       // start address
	
	unsigned short dma_cfg;
	
	unsigned short xcnt;
	
	unsigned short xmod;
	
	unsigned short ycnt;
	
	unsigned short ymod;
	
	unsigned short dummy;
};


#define MDMA_D0_PERIPHERAL_MAP	*(unsigned short*)0xffc00f2c

#define MDMA_S0_PERIPHERAL_MAP	*(unsigned short*)0xffc00f6c

#define MDMAS0_CONFIG			*(unsigned short*)0xffc00f48

#define MDMAD0_CONFIG			*(unsigned short*)0xffc00f08

#define MDMA_D0_CURR_DESC_PTR	*(struct dma_desc**)0xffc00f20

#define MDMA_S0_CURR_DESC_PTR	*(struct dma_desc**)0xffc00f60

#define MDMA_D0_NEXT_DESC_PTR	*(struct dma_desc**)0xffc00f00

#define MDMA_S0_NEXT_DESC_PTR	*(struct dma_desc**)0xffc00f40



static struct dma_desc src_desc2 = {   (unsigned long)NULL,
	                            (unsigned long)buffer2,
								0x00b9,
								40,
								4,
								10,
								4,
								0
	                    };
	
static struct dma_desc dest_desc2 = {      (unsigned long)NULL,
	                                (unsigned long)dest2,
									0x00bb,		// Stop Mode
									40,
									4,
									10,
									4,
									0
	                    };

	
static struct dma_desc src_desc1 = {    (unsigned long)&src_desc2,
		                        (unsigned long)buffer1,
								0x79b9,			// List Descriptor Mode
								40,
								4,
								10,
								4,
								0
							};
							
static struct dma_desc dest_desc1 = {      (unsigned long)&dest_desc2,
	                                (unsigned long)dest1,
									0x79bb,		// LIst Descriptor Mode
									40,
									4,
									10,
									4,
									0
							};
	



static void dma_config(void)
{

	
//	MDMA_D0_PERIPHERAL_MAP = MDMA_S0_PERIPHERAL_MAP = 0x40;
	
	MDMA_S0_CURR_DESC_PTR = 0;
	
	MDMA_D0_CURR_DESC_PTR = 0;
	
	// DMA List Mode
	
	MDMA_S0_NEXT_DESC_PTR = &src_desc1;
	
	MDMA_D0_NEXT_DESC_PTR = &dest_desc1;
	
	MDMAS0_CONFIG = src_desc1.dma_cfg;		// Start source MDMA0
	
	MDMAD0_CONFIG = dest_desc1.dma_cfg;		// Start destination MDMA0
}


int main(void)
{
	for(int j=0, k=0; j<10; j++)
		for(int i=0; i<40; i++)
		{	
			buffer1[j][i] = k++;
			buffer2[j][i] = buffer1[j][i];
		}
			
	printf("The dest address is: %x\n", dest1);
		
	config();
	
	dma_config();
	
	while(1)
	{
		
	}
}

⌨️ 快捷键说明

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