dma是一種提高cpu效率的工具。如果讓cpu去負責搬運資料,效率是十分低下的,因為在這個過程中,cpu就只能做這麼一件事。因此dma就應運而生。只要告訴dma,要搬運的資料源位址,以及要搬運到**去的位址,何種方式,使能它,dma就會獲取匯流排控制權,自動地搬運資料,從而解放cpu,提高效率。
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 27
28 void dma_start()
29
《TQ2440載入Hello world驅動模組》
經過將近乙個月都時間終於按照手冊把linux核心移植完了,接下來要開始驅動模組的移植了,在網上查了一些資料,總結如下 目標平台 tq2440 arm9 核心版本 linux 2.6.25 前提 宿主機上已安裝交叉編譯工具,因為這個在linux核心移植的時候就使用過了,這裡就不說了。進入正題 1 首先...
TQ2440裸機實驗(鍵盤和LED結合)
import main area init,code,readonly 程式入口的地方 entry start ldr r0,0x56000010 watchdog暫存器位址 mov r1,0x0 str r1,r0 寫入0,禁止watchdog,否則cpu會不斷重啟 ldr sp,1024 4 設...
TQ2440背光控制
控制lcd背光就是控制s3c2440的lcd控制的lcd pwren腳lcdcon5暫存器pwren位控制lcd是否輸出。對linux 2.6.30.4核心進行移植。新建乙個backlight.c檔案放到 drivers video 目錄下。內容如下 include include include ...