tq2440 的dma裸机驱动

来源:互联网 发布:阿里云 vps 编辑:程序博客网 时间:2024/05/20 05:56

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"></span><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">DMA是一种提高CPU效率的工具。如果让cpu去负责搬运数据,效率是十分低下的,因为在这个过程中,cpu就只能做这么一件事。因此DMA就应运而生。只要告诉dma,要搬运的数据源地址,以及要搬运到哪里去的地址,何种方式,使能它,DMA就会获取总线控制权,自动地搬运数据,从而解放cpu,提高效率。</span>

tq2440的dma裸机驱动,按以下方式进行初始化:

//初始化原地址

//初始化目的地址

//dma 控制方式初始化

//使能dma


参照2440芯片手册,dma共有4个通道,我们选择将字符串数据传输到串口上(UART0),对应通道ch-0.


each DMA channel has nine control registers.ch-0 有9个寄存器,但在本次裸机驱动中,并不需要全部用上。(用到再来细究)


首先是初始化原地址:

DISRCn 是一个source register ,需要给它传递数据源地址;

DISRCCn 是source control register ,通过对此register进行操作,控制某些方式。

它的[0]位为 select the address increment ,赋值为0,表示DISRCn在传输完一次之后,地址会增加,指向下一个地址单元

第[1]位为选择source的总线结构,我们要传递的数据在内存中,内存是AHB总线,故在这儿select  0.


第二步是初始化目的地址:

DIDSTn 是一个 destination register,传递给它的值,应该是一个地址,此处应为我们的uart0的发送缓冲区地址,UTXH0。

DIDSTC0 ,destination control register ,控制方式用。

第[2]位,但传送剩余个数为0时,发生一次中断,因此select 0

第[1]位,uart0 处在APB总线上,因此选择1

第[0]位,uart0的UTXH0地址应该固定住,因为我们定向输出到串口,所以select 1


第三步,dma控制方式初始化

DCONn control register .

[24-26]位,select DMA request source for each DMA,此处为001,uart0

[23]  位 为,1.

[22] ,DMA传送完毕后就关闭,故选 1.

[20-21],默认传送字节,byte。

[19-0],传送的数据个数


第四步,使能dma,DMASKIRIGn,把该寄存器的第[1]位置 1 。

一下为裸机的一些代码。


 11 char *buf = "hello world!\n"; 12 void dma_init() 13 { 14     //初始化源地址 15     DISRC0 = (unsigned int)buf; 16     DISRCC0 = (0<<0) | (0<<1); 17  18  19  20     //初始化目的地址 21     DIDST0 = UTXH0; 22     DIDSTC0 = (1<<0) | (1<<1) | (0<<2); 23  24     DCON0 = (1<<24) | (1<<23) | (1<<22) | (13<<0); 25  26 } 27  28 void dma_start() 29 { 30     DMASKTRIG0 = (1<<1); 31 }




0 0