(详细的实验代码,请参看https://github.com/elvinsys/arm_tq2440/tree/master/1_uboot/1-15.dma)
一、 DMA原理分析
1. DMA(Direct Memory Access)直接内存存储,用于内存到内存,或者内存到外设(接口、芯片寄存器等)
2. DMA控制器:2440为4通道;6410为四控制器,每个控制器8通道;210分为DMA_mem、DMA0以及DMA1
二、 基于S3C2440的DMA程序设计(touch dma.c 丢到dev目录下,修改dev/Makefile)
1. DMA初始化函数:void dma_init( )
1.1 初始化源地址:
先设定要传输的字符串:char *buf = "Hello World!";
DISRC0 R/W 0x4b00 0000
DISRC0 = buf;
DISRCC0 R/W 0x4b00 0004
LOC | [1] | 0 | AHB |
INC | [0] | 0 | Increment 指针变化 |
Increment
1.2 初始化目的地址
DIDST0 R/W 0x4b00 0008
DIDST0 = UTXH0; /* UTXH0地址为: 0x5000 0020 */
DIDSTC0 R/W 0x4b00 0000
LOC | [1] | 1 | APB |
INC | [0] | 1 | Fixed 指针不变化 |
1.3 初始化控制寄存器
PCON0 R/W 0x4b00 0010
HWSRCSEL | [26:24] | 001 | UART0 |
SWHW-SEL | [23] | 1 | by[26:24]operation |
RELOAD | [22] | 1 | turn off when becomes |
TC | [19:0] | 12 | 数据位数 |
2. 打开DMA开始传送——void dma_start()
DMASKTRIG0 R/W 0x4b00 0020
ON_OFF | [1] | 1 | ON |
3. dma.c的代码如下:
#define DISRC0 (*(volatile unsigned long *)0x4B000000)
#define DISRCC0 (*(volatile unsigned long *)0x4B000004)
#define DIDST0 (*(volatile unsigned long *)0x4B000008)
#define DIDSTC0 (*(volatile unsigned long *)0x4B00000C)
#define DCON0 (*(volatile unsigned long *)0x4B000010)
#define DMASKTRIG0 (*(volatile unsigned long *)0x4B000020)
#define UTXH0 (volatile unsigned long *)0x50000020
void dma_init(void)
{
DISRC0 = (unsigned int)buf;
DISRCC0 &= ~((1<<0)|(1<<1));
DIDST0 = UTXH0;
DIDSTC0 |= ((1<<0)|(1<<1));
DCON0 |= ((1<<24)|(1<<23)|(1<<22)|(12<<0));
}
void dma_start(void)
{
DMASKTRIG0 |= (1<<1);
}
LOC | [1] | 0:AHB | |
INC | [0] | 0:Increment | 指针变化 |
LOC | [1] | 1:APB | |
INC | [0] | 1:Fixed | 指针不变化 |