之所以要介紹S3C2410 DMA,因為它對性能太重要了!只有活用了DMA,CPU的性能才能上去!S3C2410有四個DMA,每個DMA支持工作方式基本相同,但支持的source Dest可能略有不同,具體見Datasheet。
這里具體DMA CONTROL寄存器(DCON)的配置說明,進而引出DMA的各種工作方式。
Atomic transfer:指的是DMA的單次原子操作,它可以是Unit模式(傳輸1個data size),也可以是burst模式(傳輸4個data size),具體對應(yīng)DCON[28]。
Data Size:指的是單次原子操作的數(shù)據(jù)位寬,8、16、32,具體對應(yīng)DCON[21:20]。
Request Source:DMA請求的來源有兩種,軟件&硬件模塊,由DCON[23]控制;當(dāng)為前者時,由軟件對DMASKTRIG寄存器的位0置位觸發(fā)一次 DMA 操作。當(dāng)為后者時,具體來源由DCON[26:24]控制,不同硬件模塊的某時間觸發(fā)一次DMA操作,具體要見不同的硬件模塊。
DMA service mode:DMA的工作模式有兩種,單一服務(wù)模式&整體服務(wù)模式。前一模式下,一次DMA請求完成一項原子操作,并且transfer count的值減1。后一模式下,一次DMA請求完成一批原子操作,直到transfer count等于0表示完成一次整體服務(wù)。具體對應(yīng)DCON[27]。
RELOAD:在reload模式下,當(dāng)transfer count的值變?yōu)榱銜r,將自動加src、dst、TC的值加載到CURR_DST、CURR_SRC、CURR_TC,并開始一次新的DMA傳輸。該模式一般和整體服務(wù)模式一起使用,也就是說當(dāng)一次整體服務(wù)開始后,src、dst、TC的值都已經(jīng)被加載,因此可以更改為下一次服務(wù)的地址,2410說明文檔中建議加入以下語句來判斷當(dāng)前的服務(wù)開始,src、dst、TC的值可以被更改了:while((rDSTATn & 0xfffff) == 0) ;
Req&Ack:DMA請求和應(yīng)答的協(xié)議有兩種,Demard mode 和 Handshake mode。兩者對Request和Ack的時序定義有所不同:在Demard模式下,如果DMA完成一次請求如果Request仍然有效,那么DMA就認為這是下一次DMA請求;在Handshake模式下,DMA完成一次請求后等待Request信號無效,然后把ACK也置無效,再等待下一次 Request。這個設(shè)計外部DMA請求時可能要用到。
傳輸總長度:DMA一次整體服務(wù)傳輸?shù)目傞L度為:
Data Size × Atomic transfer size × TC(字節(jié))。
S3C2410的DMA支持四類DMA傳輸:
系統(tǒng)總線到系統(tǒng)總線(ASB/AHB to ASB/AHB)
系統(tǒng)總線到外設(shè)總線(ASB/AHB to APB)
外設(shè)總線到系統(tǒng)總線(APB to ASB/AHB)
外設(shè)總線到外設(shè)總線(APB to APB)。
S3C2410共有四條DMA通道,每條通道5個請求源。
Ch0:nXDREQ0,UART0,SDI,Timer,USB EP1
Ch1: nXDREQ1,UART1,I2SSDI,SPI0,USB EP2
Ch2:I2SSDO,I2SSDI,SDI,Timer, USB EP3
Ch3:UART1,SDI,SPI1,Timer, USB EP4
S3C2410 DMA 三個比較重要的信號,引用2410官方文檔:
DMA REQ: In the Single service mode, these three states of main FSM are performed and then stops, and waits for another DMA REQ. And if DMA REQ comes in, all three states are repeated.
DMA ACK: DMA ACK is asserted and then deasserted for each atomic transfer. In contrast, in the Whole service mode, main FSM waits at state-3 until CURR_TC becomes 0. Therefore, DMA ACK is asserted during all the transfers and then deasserted when TC reaches 0.
INT REQ: INT REQ is asserted only if CURR_TC becomes 0 regardless of the service mode (Single service mode or Whole service mode).
S3C2410 DMA狀態(tài)機:
S3C2410 的DMA使用一個具有三個狀態(tài)的有限狀態(tài)機進行DMA 傳輸?shù)牧鞒炭刂?,引?410官方文檔:
State-1. As an initial state, the DMA waits for a DMA request. If it comes, it goes to state-2. At this state, DMA ACK and INT REQ are 0.
State-2. In this state, DMA ACK becomes 1 and the counter (CURR_TC) is loaded from DCON[19:0] register. Note that the DMA ACK remains 1 until it is cleared later.
State-3. In this state, sub-FSM handling the atomic operation of DMA is initiated. The sub-FSM reads the data from the source address and then writes it to destination address. In this operation, data size and transfer size(single or burst) are considered.
每當(dāng)一次DMA操作結(jié)束,不管是使用什么服務(wù)模式,DMA狀態(tài)機都會自動地從狀態(tài)三回到狀態(tài)一,開始另一次操作。注意這里信號是DMA REQ 和 DMA ACK,而最終引腳信號是nXDREQ 和 nXDACK,所以最后實際輸出的電平與這里的描述是相反的。
S3C2410 DMA 的服務(wù)模式:
共有兩種服務(wù)模式,一種是單一服務(wù)模式(single service),另外一種是整體服務(wù)模式(whole service)。
在單一服務(wù)模式下,不使用傳統(tǒng)的DMA計數(shù)器,三個DMA狀態(tài)被順序執(zhí)行一次后停止,等待DMA 請求再一次來臨后再重新開始另一次循環(huán)。
在整體服務(wù)模式下,使用傳統(tǒng)的DMA 計數(shù)器,狀態(tài)機會停留在狀態(tài)三,直到DMA計數(shù)器的值減為零,再回到狀態(tài)一,等待下一次DMA請求。
S3C2410 DMA 數(shù)據(jù)傳輸模式:
共有兩種數(shù)據(jù)傳輸模式:
單位數(shù)據(jù)傳輸模式:執(zhí)行一次讀操作和一次寫操作。
并發(fā)數(shù)據(jù)傳輸模式:執(zhí)行四次讀操作和四次寫操作。
S3C2410 DMA 的基本時序:
nXDREQ請求生效并經(jīng)過2CLK周期同步后,nXDACK響應(yīng)并開始生效,但至少還要經(jīng)過3CLK的周期延遲,DMA控制器才可獲得總線的控制權(quán),并開始數(shù)據(jù)傳輸。
S3C2410 DMA 的兩種協(xié)議模式:
請求模式:If XnXDREQ remains asserted, the next transfer starts immediately. Otherwise it waits for XnXDREQ to be asserted.
握手模式:If XnXDREQ is deasserted, DMA deasserts XnXDACK in 2cycles. Otherwise it waits until XnXDREQ is deasserted.
S3C2410 DMA REQ與ACK 協(xié)議類型:
共有三種協(xié)議類型:
單一服務(wù)請求:
單一服務(wù)握手:
整體服務(wù)握手:
根據(jù)上面所說的服務(wù)模式和協(xié)議模式,很容易推知這三種協(xié)議的時序分別是什么。