DMA(Direct Memory Access)控制器是一種在系統(tǒng)內部轉移數(shù)據(jù)的獨特外設,可以將其視為一種能夠通過一組專用總線將內部和外部存儲器與每個具有DMA能力的外設連接起來的控制器。它之所以屬于外設,是因為它是在處理器的編程控制下來 執(zhí)行傳輸?shù)摹?/p>
DMA控制器特點:
8個獨立的通道,4個可用于PL—PS間數(shù)據(jù)管理,每個通道有1024Byte的MFIFO;
使用CPU_2x 時鐘搬運數(shù)據(jù),CPU_2x = (CPU frq/6)*2;
執(zhí)行自定義內存區(qū)域內的DMA指令運行DMA;
AHB控制寄存器支持安全和非安全模式;
每個通道內置4字Cache;
可以訪問SoC的以下映射物理地址:
DDR、OCM、PL、Linear QSPI Read、SMC和M_AXI_GP設備,訪問設備的互聯(lián)結構如圖1所示。
圖一
從圖1可以看出DMA控制器可以訪問連接到Central Interconnect上的所有設備,并提供了四個通道的外設管理接口可用于控制PL的數(shù)據(jù)搬運。
dma控制器組成:
一個DMA控制器,實際上是采用DMA方式的外圍設備與系統(tǒng)總線之間的接口電路,這個接口電路是在中斷接口的基礎上再加DMA機構組成。習慣上將DMA方式的接口電路稱為DMA控制器。
?。?)內存地址計數(shù)器:用于存放內存中要交換的數(shù)據(jù)的地址。在 DMA傳送前,須通過程序將數(shù)據(jù)在內存中的起始位置(首地址)送到內存地址計數(shù)器。而當 DMA 傳送時,每交換一次數(shù)據(jù),將地址計數(shù)器加“1”,從而以增量方式給出內存中要交換的一批數(shù)據(jù)的地址。
?。?)字計數(shù)器:用于記錄傳送數(shù)據(jù)塊的長度(多少字數(shù))。其內容也是在數(shù)據(jù)傳送之前由程序預置,交換的字數(shù)通常以補碼形式表示。在DMA傳送時,每傳送一個字,字計數(shù)器就加“1”。當計數(shù)器溢出即最高位產生進位時,表示這批數(shù)據(jù)傳送完畢,于是引起DMA控制器向CPU發(fā)出中斷信號。
?。?)數(shù)據(jù)緩沖寄存器:用于暫存每次傳送的數(shù)據(jù)(一個字)。當輸入時,由設備(如磁盤)送往數(shù)據(jù)緩沖寄存器,再由緩沖寄存器通過數(shù)據(jù)總線送到內存。反之,輸出時,由內存通過數(shù)據(jù)總線送到數(shù)據(jù)緩沖寄存器,然后再送到設備。
?。?)DMA請求”標志:每當設備準備好一個數(shù)據(jù)字后給出一個控制信號,使“DMA
請求”標志置“1”。該標志置位后向“控制/狀態(tài)”邏輯發(fā)出DMA請求,后者又向CPU發(fā)出總線使用權的請求(HOLD),CPU響應此請求后發(fā)回響應信號HLDA,“控制/狀態(tài)”邏輯接收此信號后發(fā)出DMA響應信號,使“DMA 請求”標志復位,為交換下一個字做好準備。
?。?)控制/狀態(tài)”邏輯:由控制和時序電路以及狀態(tài)標志等組成,用于修改內存地址計數(shù)器和字計數(shù)器,指定傳送類型(輸入或輸出),并對“DMA請求”信號和CPU響應信號進行協(xié)調和同步。
?。?)中斷機構:當字計數(shù)器溢出時,意味著一組數(shù)據(jù)交換完畢,由溢出信號觸發(fā)中斷機構,向CPU提出中斷報告。
DMA控制器接口函數(shù)
主要作用是配置DMA控制器并啟動相應傳輸
s3c2440中關于公共DMA控制器的函數(shù)提供有:
s3c2410_dma_config()
s3c2410_dma_ctrl()
s3c2410_dma_enqueue()
s3c2410_dma_devconfig()
s3c2410_dma_set_buffdone_fn()
s3c2410_dma_request()
s3c2410_dma_free()
一般使用的順序如下:
request =》set_buffdone_fn=》 devconfig =》 config =》 enqueue =》 ctrl =》 free
1、int s3c2410_dma_request(unsigned int channel, struct s3c2410_dma_client *client, void *dev)
2、static inline void s3c2410_dma_buffdone(struct s3c2410_dma_chan *chan, struct s3c2410_dma_buf *buf, enum s3c2410_dma_buffresult result)
設置相應的dma通道完成一次dma傳輸后的回調函數(shù)
3、int s3c2410_dma_devconfig(int channel, enum s3c2410_dmasrc source, unsigned long devaddr)
source: S3C2410_DMASRC_HW: source is hardware
S3C2410_DMASRC_MEM: source is memory
devaddr: physical addr of source
4、int s3c2410_dma_config(unsigned int channel, int xferunit)
根據(jù)xferunit設置通道的控制寄存器DCONx
xferunit為每次傳輸?shù)臄?shù)據(jù)大?。?:byte 1:half word 2:word
5、dma_alloc_coherent
DMA要求使用non-cached, 物理地址連續(xù)的內存。
將對應的內核虛擬地址轉化為物理地址,供給后面的s3c2410_dma_enqueue函數(shù)使用。
6、int s3c2410_dma_enqueue(unsigned int channel, void *id, dma_addr_t data, int size)
7、int s3c2410_dma_ctrl(unsigned int channel, enum s3c2410_chan_op op)
8、int s3c2410_dma_free(unsigned int channel, struct s3c2410_dma_client *client)
DMA控制器接口函數(shù)使用實例
s3c2440 DMA datasheet
s3c2440 DMA控制器支持4種情況的DMA傳輸:
a. source and destination are in the system bus
b. source in the system bus while destination in the peripheral bus
c. source in the peripheral bus while destination in the system bus
d. source and destination are in the peripheral bus
但是在arch/arm/plat-s3c24xx/dma.c的函數(shù)s3c2410_dma_devconfig中卻只實現(xiàn)了b和c兩種情況。
s3c2440有4個DMA channel,每個channel都有DISC/DISCC/DIDST/DIDSTC寄存器,DISC和DIST可以填入不同source類型(具體參考S3c2440 Datasheet Table 8-1),除此之外還能填入內存的物理地址作為source或destination。
和傳輸相關的3個參數(shù):
TSZ:DCON[28],0:unit模式:一次transfer1個data size,burst模式:一次transfer4個data size
DSZ:DCON[21:20],0:data size is BYTE,1:data size is Half WORLD,0:data size is WORLD
TC:DCON[19:0],transfer count
傳輸?shù)臄?shù)據(jù)量=TC * (DSZ * 8) * TSZ
request source: DCON[23]
0:S/W request mode, DMA is triggered by setting SW_TRIG bit of DMASKTRIG control register
1:DMA source selected by bit[26:24] triggers the DMA operation
service mode:DCON[27]
0:single service mode,一次DMA請求完成一次原子操作,等待下一次請求
1:whole service mode,一次DMA請求完成一批原子操作,當TC=0表示完成一次whole service
評論
查看更多