<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 }