《ARM Cortex-A9多核嵌入式系統(tǒng)開發(fā)教程》課件第八章_第1頁
《ARM Cortex-A9多核嵌入式系統(tǒng)開發(fā)教程》課件第八章_第2頁
《ARM Cortex-A9多核嵌入式系統(tǒng)開發(fā)教程》課件第八章_第3頁
《ARM Cortex-A9多核嵌入式系統(tǒng)開發(fā)教程》課件第八章_第4頁
《ARM Cortex-A9多核嵌入式系統(tǒng)開發(fā)教程》課件第八章_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

DMA控制器8DMAC簡介DMAC工作原理PL330指令集其他相關寄存器DMA編程實例第8章DMA控制器8.1DMAC簡介

當需要在系統(tǒng)內(nèi)存與高速外設或者內(nèi)存的不同區(qū)域之間進行批量數(shù)據(jù)的快速傳送時,采用查詢或中斷的方式并不能滿足要求。DMA(DirectMemoryAccess,存儲器直接訪問)正是為解決這一問題提出來的,無需占用CPU,在DMA控制器的控制下,可以高速地完成外設和存儲器之間數(shù)據(jù)的交換。CPU除了在數(shù)據(jù)傳輸開始和結束時做一些處理外,在傳輸過程中,CPU可以進行其他工作。這樣,在大部分時間里,CPU和DMA都處于并行操作狀態(tài)。DMAC(DirectMemoryAccessController)是一個自適應、先進的微控制器總線體系的控制器,它由ARM公司設計并基于PrimeCell技術標準。DMAC提供了一個AXI接口用來執(zhí)行DMA傳輸,以及兩個APB接口用來控制這個操作。DMAC在安全模式下用一個APB接口執(zhí)行TrustZone技術,其他操作則在非安全模式下執(zhí)行。圖8.1是DMAC外部接口框圖。第8章DMA控制器圖8.1DMAC外部接口框圖第8章DMA控制器圖8.2DMAC原理框圖第8章DMA控制器由圖8.2可以看出,Exynos4412的DMA模塊又分為兩個子模塊,DMA_mem和DMA_peri。其中,DMA_mem用于內(nèi)存之間的數(shù)據(jù)傳輸;DMA_peri用于內(nèi)存與外設之間進行數(shù)據(jù)傳輸。DMA_mem包括一個PL330模塊,而DMA_peri包括兩個PL330模塊(分別為DMA0和DMA1)。每個PL330模塊有32個中斷源,但是每一次只能發(fā)送一個中斷請求到中斷控制器第8章DMA控制器8.2DMAC工作原理DMAC內(nèi)部包括了指令處理模塊,使得DMAC本身能夠處理代碼以控制DMA傳送。這些指令代碼存儲在系統(tǒng)存儲器中,DMAC通過AXI接口獲取這些代碼。DMAC的8個通道都是可配置的,且每個都支持單個并發(fā)線程的操作。除此之外,還有一個管理線程、專門用來初始化DMA通道的線程。DMAC使用了變長指令集,范圍為1~6字節(jié),并為每個通道提供了單獨的PC寄存器。第8章DMA控制器1、工作過程當外設準備就緒,向DMA控制器(DMAC)發(fā)出DMA請求信號(DREQ)。DMAC收到此信號后,向CPU發(fā)出總線請求信號(HOLD)。CPU在完成當前總線操作后立即對DMA請求信號做出響應。DMAC獲得總線的控制權。

DMAC獲得總線的控制權后,向地址總線發(fā)出地址信號,指出傳送過程需使用的內(nèi)存地址。向外設發(fā)出DMA應答信號(DACK),實現(xiàn)該外設與內(nèi)存之間的DMA傳送。第8章DMA控制器(4)在DMA傳送期間,DMAC發(fā)出內(nèi)存和外設的讀/寫信號。(5)為了決定數(shù)據(jù)塊傳輸?shù)淖止?jié)數(shù),在DMAC內(nèi)部必須有一個“字節(jié)計數(shù)器”。在開始時,由軟件設置數(shù)據(jù)塊的長度,在DMA傳送過程中,每傳送一個字節(jié),字節(jié)計數(shù)器減1,減為0時,該次DMA傳輸結束。(6)

DMA過程結束時,DMAC向CPU發(fā)出結束信號(撤消HOLD請求),將總線控制權交還CPU。第8章DMA控制器2、傳送的方式?I/O接口到存儲器方式:I/O接口的數(shù)據(jù)利用DMAC送出控制信號,將數(shù)據(jù)輸送到數(shù)據(jù)總線D0~D7上,同時DMAC送出存儲器單元地址及控制信號,將存于D0~D7上的數(shù)據(jù)寫入選中的存儲單元中。這樣就完成了I/O接口到存儲器的一個字節(jié)的傳送。第8章DMA控制器(2)?存儲器到I/O接口方式:

在進行傳送時,DMAC送出存儲器地址和控制信號,將選中的存儲器單元的內(nèi)容讀入數(shù)據(jù)總線的D0~D7,然后DMAC送出控制信號,將數(shù)據(jù)寫到指定的端口中。DMAC再修改“地址寄存器”和“字節(jié)計數(shù)器”的內(nèi)容。第8章DMA控制器(3)?存儲器到存儲器方式:

這種方式的DMA數(shù)據(jù)傳送是用“數(shù)據(jù)塊”方式傳送。首先,送出存儲器源的地址和控制信號,將選中內(nèi)存單元的數(shù)據(jù)暫存,然后修改“地址寄存器”和“字節(jié)計數(shù)器”的值,接著,送出存儲器目標的地址和控制信號,將暫存的數(shù)據(jù)通過數(shù)據(jù)總線寫入存儲器的目標區(qū)域中,最后修改“地址寄存器”和“字節(jié)計數(shù)器”的內(nèi)容,當“字節(jié)計數(shù)器”的值減少到零時便結束一次DMA傳送。第8章DMA控制器8.3PL330指令集1.?DMAMOV

該指令是一條數(shù)據(jù)轉(zhuǎn)移指令,它可以將一個32位的立即數(shù)移動到源地址寄存器、目標地址寄存器、通道控制寄存器3種類型的寄存器中。(1)源地址寄存器:該寄存器提供了DMA通道的數(shù)據(jù)源的地址。DMAC從該地址取得數(shù)據(jù),每個通道都有自己的數(shù)據(jù)源地址寄存器。第8章DMA控制器表8.1通道源地址寄存器注:SA_n表示DMA通道n的源地址(SourceAddress)。第8章DMA控制器(2)目標地址寄存器:該寄存器提供了DMA的目標數(shù)據(jù)存放地址,和數(shù)據(jù)源地址寄存器是相互對應的。表8.2是每個通道的目標地址寄存器列表。表8.2通道目標地址寄存器第8章DMA控制器(3)通道控制寄存器:該寄存器可以控制DMA在AXI中的傳輸,并且該寄存器記錄了一些關于目標與源寄存器的基本配置,如表8.3所示。圖8.3是該寄存器的位分配順序。表8.3通道控制寄存器第8章DMA控制器2.?DMALD

該指令是一條DMAC裝載指令,它可以從源數(shù)據(jù)地址中讀取數(shù)據(jù)序列到MFIFO中,如果src_inc位被設置,則DMAC會自動增加源地址的值。

其指令格式為:DMALD[S|B]其中:[S]——如果S位被指定,則bs位被置0,且x轉(zhuǎn)換為0。[B]——如果B位被指定,則bs位被置0,且x轉(zhuǎn)換為1。第8章DMA控制器3.?DMAST

該指令與DMALD相互對應,是一條DMA存儲指令,是將MFIFO中的數(shù)據(jù)轉(zhuǎn)移到目的地址中。目的地址是由目的地址寄存器所指定的,如果dst_inc被置位,則DMAC會自動增加目的地址的值。

其指令格式為:DMAST[S|B]其中:[S]——如果S位被指定,則bs位被置0,且x轉(zhuǎn)換為1。[B]——如果B位被指定,則bs位被置1,且x轉(zhuǎn)換為1。第8章DMA控制器4.?DMARMB

該指令是讀內(nèi)存柵欄指令。5.?DMAWMB

該指令是寫內(nèi)存柵欄指令。6.?DMALP/DMALPEND

該指令用來指定某個指令段的開始位置,需要DMALPEND指定該指令段的結束位置,一旦指定,DMAC會循環(huán)執(zhí)行介于DMALP與DMALPEND之間的指令,直到循環(huán)次數(shù)為0結束。第8章DMA控制器8.?DMASEV

使用該指令可以產(chǎn)生一個事件信號,可以有以下兩種模式:(1)產(chǎn)生一個事件<event_num>。(2)產(chǎn)生一個中斷信號,irq<event_num>。其指令格式為:DMASEV <event_num> 9.?DMAEND

該指令用來通知DMAC結束一次操作集合第8章DMA控制器其中,[10:8]用來確定通道號。對應關系為:b000?=?DMA通道0;b001?=?DMA通道1;b010?=?DMA通道2;b011?=?DMA通道3;b100?=?DMA通道4;b101?=?DMA通道5;b110?=?DMA通道6;8.4其他相關寄存器?DBGINST0

該寄存器可控制調(diào)試指令、通道、DMAC線程信息。圖8.10DBGINST0位控制第8章DMA控制器2.?DBGINST1

該寄存器控制內(nèi)存中設置的指令段首地址,也就是DMAC第一次取指令的地址。DBGCMD

該寄存器控制調(diào)試命令的執(zhí)行,通過配置它,可以控制DMAC執(zhí)行一些指定的工作。第8章DMA控制器8.5DMA編程實例8.5.1DMA驅(qū)動程序編寫步驟1.申請DMA通道

在申請DMA通道之前至少需要確定外設ID(filter_param)和通道類型(mask)。外設ID可以通過數(shù)據(jù)手冊或者PL330獲得,通道類型一般設置為DMA_SLAVE或DMA_CYCLIC。

在Linux3.8的內(nèi)核中,通過三星公司提供的以下API完成這一操作:sdd->dma->ch=sdd->ops->request(dma->dmach,&req);第8章DMA控制器2.設置DMA通道傳輸參數(shù)

設置DMA通道方向、通道設備端的物理地址(如果使用DMA向SPI收發(fā)數(shù)據(jù),則為SPI數(shù)據(jù)寄存器的物理地址)、通道字節(jié)寬度等信息。

在Linux3.8內(nèi)核中,通過三星公司提供的以下API完成這一操作:sdd->ops->config(dma->ch,&config);第8章DMA控制器3.獲取desc添加回調(diào)函數(shù)

在驅(qū)動函數(shù)中,將發(fā)送數(shù)據(jù)個數(shù)、通道方向、數(shù)據(jù)緩存的總線地址等參數(shù)賦值給scatterlist結構體,通過調(diào)用dmaengine_prep_slave_sg或dmaengine_prep_dma_cyclic獲取desc,再將回調(diào)函數(shù)指針傳給desc->callback。

在Linux3.8內(nèi)核中,通過三星公司提供的以下API完成這一操作:

sdd->ops->prepare(dma->ch,&sdd->rx_info);第8章DMA控制器4.遞交配置好的通道

調(diào)用dmaengine_submit((structdma_async_tx_descriptor*)desc),將desc提交到DMA驅(qū)動等待隊列,通常第3和第4步都是在DMA驅(qū)動的prepare函數(shù)中實現(xiàn)的。

在Linux3.8內(nèi)核中,通過三星公司提供的以下API完成這一操作:

sdd->ops->prepare(dma->ch,&sdd->rx_info);第8章DMA控制器5.開啟通道,等待回調(diào)函數(shù)

用dma_async_issue_pending(

)函數(shù)激活掛起的等待隊列,如果此時通道空閑,則開始傳輸隊列中的數(shù)據(jù),傳輸結束后調(diào)用回調(diào)函數(shù)。

在Linux3.8內(nèi)核中,通過三星公司提供的以下API完成這一操作:sdd->ops->trigger(dma->ch);第8

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論