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

📄 drv_dma.c

📁 基于Freescale的MX21处理器的bootloader程序
💻 C
字号:
/*-------------------------------------------------------------------
FILE NAME:
	drv_dma.c
DESCRIPTION:
	this file includes DMA driver. 
AUTHOR:
	WYF
VERSION:
	2005.1122.00
COMPANY:
	DATANG MICROELECTRONICS TECHNOLOGY CO,.LTD
HISTORY:
	2005.1122 Creat this file
	...
--------------------------------------------------------------------*/
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include "nucleus.h"
#include "ADSmx21_defs.h"
#include "drv_defs.h"
#include "drv_extr.h"

TDRV_DMA dma;

void DMA_init(void)
{
	int i = 10;

	PCCR0 |= (1<<30)|(1<<13);  /* Enable DMA Clock */
	DCR |= 2;  /* Soft Reset DMA Module */
	while(i>0){i--;}
	DCR |= 1;  /* Enable DMA */
}

#if 0
static void dma_LISR(INT vector)
{
	STATUS s;

	DISR = 0x0001;
	CCR0 = 0;
//	dma0_over = 1;
}

void DMA_request(int src, int des)
{
	CCR0 = 0;

	WSRA = 640;
	XSRA = 640;
	YSRA = 480;

	SAR0 = src;
	DAR0 = des;
//	CNTR0 = 160*120*2;
//	CNTR0 = 240*120*2;

	BLR0 = 0; /* burst length=64  */

	DIMR &= ~1;  /* Enable channel0 int */

	CCR0 = (0x1<<12);
	CCR0 |= 1;

	{
		STATUS s;
		void (*old)(int);
		s = NU_Register_LISR(VECTOR_DMA0, dma_LISR, &old);
		assert(s == NU_SUCCESS);
//		s = NU_Create_HISR(&(drv_prp.hisr), "Sen-Hisr", PrP_HISR, 2, drv_prp.statck, 1024);
//		assert(s == NU_SUCCESS);
		INTENNUM = VECTOR_DMA0;
	}
}

int DMA_GetChannel(void)
{
	STATUS s;
	int ch;

	s = NU_Obtain_Semaphore(&(dma.sem),NU_NO_SUSPEND);
	if (s != NU_SUCCESS){return -1;}

	for(ch=0;ch<16;ch++){
		if (dma.channel & (1<<ch)){break;}
	}
	if (ch >= 16){return -1;}
	dma.channel |= (1<<ch);

	dma.reg_sar  = &SAR0 + 0x10*ch;
	dma.reg_dar  = &DAR0 + 0x10*ch; 
	dma.reg_cntr = &CNTR0 + 0x10*ch;
	dma.reg_ccr  = &CCR0 + 0x10*ch; 
	dma.reg_rssr = &RSSR0 + 0x10*ch;
	dma.reg_blr  = &BLR0 + 0x10*ch; 
	dma.reg_rtor = &RTOR0 + 0x10*ch;
	dma.reg_bucr = &BUCR0 + 0x10*ch;
	dma.reg_ccnr = &CCNR0 + 0x10*ch;

	return ch;
}

int DMA_Request(TCON_DMA *cfg)
{
	int ch;

	ch = DMA_GetChannel();
	if (ch < 0) return -1;

	*(dma.reg_ccr) = 0;
	*(dma.reg_sar) = cfg->sar;
	*(dma.reg_dar) = cfg->dar;
	*(dma.reg_cntr) = cfg->cntr;
	*(dma.reg_rssr) = cfg->rssr;
	*(dma.reg_blr) = cfg->blr;
	*(dma.reg_rtor) = cfg->rtor;
	*(dma.reg_bucr) = cfg->bucr;
	*(dma.reg_ccnr) = cfg->ccnr;
	*(dma.reg_ccr) = cfg->ccr;

}
#endif

⌨️ 快捷键说明

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