這里具體DMA CONTROL寄存器(DCON)的配置說明,進而引出DMA的各種工作方式。
Atomic transfer:指的是DMA的單次原子操作,它可以是Unit模式(傳輸1個data size),也可以是burst模式(傳輸4個data size),具體對應DCON[28]。
Data Size:指的是單次原子操作的數據位寬,8、16、32,具體對應DCON[21:20]。
Request Source:DMA請求的來源有兩種,軟件&硬件模塊,由DCON[23]控制;當為前者時,由軟件對DMASKTRIG寄存器的位0置位觸發一次DMA 操作。當為后者時,具體來源由DCON[26:24]控制,不同硬件模塊的某時間觸發一次DMA操作,具體要見不同的硬件模塊。
DMA service mode:DMA的工作模式有兩種,單一服務模式&整體服務模式。前一模式下,一次DMA請求完成一項原子操作,并且transfer count的值減1。后一模式下,一次DMA請求完成一批原子操作,直到transfer count等于0表示完成一次整體服務。具體對應DCON[27]。
RELOAD:在reload模式下,當transfer count的值變為零時,將自動加src、dst、TC的值加載到CURR_DST、CURR_SRC、CURR_TC,并開始一次新的DMA傳輸。該模式一般和整體服務模式一起使用,也就是說當一次整體服務開始后,src、dst、TC的值都已經被加載,因此可以更改為下一次服務的地址,2410說明文檔中建議加入以下語句來判斷當前的服務開始,src、dst、TC的值可以被更改了:while((rDSTATn & 0xfffff) == 0) ;
Req&Ack:DMA請求和應答的協議有兩種,Demard mode 和 Handshake mode。兩者對Request和Ack的時序定義有所不同:在Demard模式下,如果DMA完成一次請求如果Request仍然有效,那么DMA就認為這是下一次DMA請求;在Handshake模式下,DMA完成一次請求后等待Request信號無效,然后把ACK也置無效,再等待下一次Request。這個設計外部DMA請求時可能要用到。
傳輸總長度:DMA一次整體服務傳輸的總長度為:
Data Size × Atomic transfer size × TC(字節)。
S3C2410的DMA支持四類DMA傳輸:
系統總線到系統總線(ASB/AHB to ASB/AHB)
系統總線到外設總線(ASB/AHB to APB)
外設總線到系統總線(APB to ASB/AHB)
外設總線到外設總線(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狀態機:
S3C2410 的DMA使用一個具有三個狀態的有限狀態機進行DMA 傳輸的流程控制,引用2410官方文檔:
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.
每當一次DMA操作結束,不管是使用什么服務模式,DMA狀態機都會自動地從狀態三回到狀態一,開始另一次操作。注意這里信號是DMA REQ 和 DMA ACK,而終引腳信號是nXDREQ 和 nXDACK,所以實際輸出的電平與這里的描述是相反的。
S3C2410 DMA 的服務模式:
共有兩種服務模式,一種是單一服務模式(single service),另外一種是整體服務模式(whole service)。
在單一服務模式下,不使用傳統的DMA計數器,三個DMA狀態被順序執行一次后停止,等待DMA 請求再一次來臨后再重新開始另一次循環。
在整體服務模式下,使用傳統的DMA 計數器,狀態機會停留在狀態三,直到DMA計數器的值減為零,再回到狀態一,等待下一次DMA請求。
S3C2410 DMA 數據傳輸模式:
共有兩種數據傳輸模式:
單位數據傳輸模式:執行一次讀操作和一次寫操作。
并發數據傳輸模式:執行四次讀操作和四次寫操作。
S3C2410 DMA 的基本時序:
nXDREQ請求生效并經過2CLK周期同步后,nXDACK響應并開始生效,但至少還要經過3CLK的周期延遲,DMA控制器才可獲得總線的控制權,并開始數據傳輸。

S3C2410 DMA 的兩種協議模式:

請求模式: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 協議類型:
共有三種協議類型:
單一服務請求:

單一服務握手:

整體服務握手:

根據上面所說的服務模式和協議模式,很容易推知這三種協議的時序分別是什么。