DMA(Direct Memory Access)控制器是一種在系統(tǒng)內(nèi)部轉(zhuǎn)移數(shù)據(jù)的獨(dú)特外設(shè),可以將其視為一種能夠通過一組專用總線將內(nèi)部和外部存儲器與每個具有DMA能力的外設(shè)連接起來的控制器。它之所以屬于外設(shè),是因?yàn)樗窃?a target="_blank">處理器的編程控制下來 執(zhí)行傳輸?shù)摹?/p>
DMA控制器特點(diǎn):
8個獨(dú)立的通道,4個可用于PL—PS間數(shù)據(jù)管理,每個通道有1024Byte的MFIFO;
使用CPU_2x 時鐘搬運(yùn)數(shù)據(jù),CPU_2x = (CPU frq/6)*2;
執(zhí)行自定義內(nèi)存區(qū)域內(nèi)的DMA指令運(yùn)行DMA;
AHB控制寄存器支持安全和非安全模式;
每個通道內(nèi)置4字Cache;
可以訪問SoC的以下映射物理地址:
DDR、OCM、PL、Linear QSPI Read、SMC和M_AXI_GP設(shè)備,訪問設(shè)備的互聯(lián)結(jié)構(gòu)如圖1所示。
圖一
從圖1可以看出DMA控制器可以訪問連接到Central Interconnect上的所有設(shè)備,并提供了四個通道的外設(shè)管理接口可用于控制PL的數(shù)據(jù)搬運(yùn)。
dma控制器組成:
一個DMA控制器,實(shí)際上是采用DMA方式的外圍設(shè)備與系統(tǒng)總線之間的接口電路,這個接口電路是在中斷接口的基礎(chǔ)上再加DMA機(jī)構(gòu)組成。習(xí)慣上將DMA方式的接口電路稱為DMA控制器。
?。?)內(nèi)存地址計(jì)數(shù)器:用于存放內(nèi)存中要交換的數(shù)據(jù)的地址。在 DMA傳送前,須通過程序?qū)?shù)據(jù)在內(nèi)存中的起始位置(首地址)送到內(nèi)存地址計(jì)數(shù)器。而當(dāng) DMA 傳送時,每交換一次數(shù)據(jù),將地址計(jì)數(shù)器加“1”,從而以增量方式給出內(nèi)存中要交換的一批數(shù)據(jù)的地址。
(2)字計(jì)數(shù)器:用于記錄傳送數(shù)據(jù)塊的長度(多少字?jǐn)?shù))。其內(nèi)容也是在數(shù)據(jù)傳送之前由程序預(yù)置,交換的字?jǐn)?shù)通常以補(bǔ)碼形式表示。在DMA傳送時,每傳送一個字,字計(jì)數(shù)器就加“1”。當(dāng)計(jì)數(shù)器溢出即最高位產(chǎn)生進(jìn)位時,表示這批數(shù)據(jù)傳送完畢,于是引起DMA控制器向CPU發(fā)出中斷信號。
(3)數(shù)據(jù)緩沖寄存器:用于暫存每次傳送的數(shù)據(jù)(一個字)。當(dāng)輸入時,由設(shè)備(如磁盤)送往數(shù)據(jù)緩沖寄存器,再由緩沖寄存器通過數(shù)據(jù)總線送到內(nèi)存。反之,輸出時,由內(nèi)存通過數(shù)據(jù)總線送到數(shù)據(jù)緩沖寄存器,然后再送到設(shè)備。
(4)DMA請求”標(biāo)志:每當(dāng)設(shè)備準(zhǔn)備好一個數(shù)據(jù)字后給出一個控制信號,使“DMA
請求”標(biāo)志置“1”。該標(biāo)志置位后向“控制/狀態(tài)”邏輯發(fā)出DMA請求,后者又向CPU發(fā)出總線使用權(quán)的請求(HOLD),CPU響應(yīng)此請求后發(fā)回響應(yīng)信號HLDA,“控制/狀態(tài)”邏輯接收此信號后發(fā)出DMA響應(yīng)信號,使“DMA 請求”標(biāo)志復(fù)位,為交換下一個字做好準(zhǔn)備。
?。?)控制/狀態(tài)”邏輯:由控制和時序電路以及狀態(tài)標(biāo)志等組成,用于修改內(nèi)存地址計(jì)數(shù)器和字計(jì)數(shù)器,指定傳送類型(輸入或輸出),并對“DMA請求”信號和CPU響應(yīng)信號進(jìn)行協(xié)調(diào)和同步。
?。?)中斷機(jī)構(gòu):當(dāng)字計(jì)數(shù)器溢出時,意味著一組數(shù)據(jù)交換完畢,由溢出信號觸發(fā)中斷機(jī)構(gòu),向CPU提出中斷報(bào)告。
DMA控制器接口函數(shù)
主要作用是配置DMA控制器并啟動相應(yīng)傳輸
s3c2440中關(guān)于公共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)
設(shè)置相應(yīng)的dma通道完成一次dma傳輸后的回調(diào)函數(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設(shè)置通道的控制寄存器DCONx
xferunit為每次傳輸?shù)臄?shù)據(jù)大小:0:byte 1:half word 2:word
5、dma_alloc_coherent
DMA要求使用non-cached, 物理地址連續(xù)的內(nèi)存。
將對應(yīng)的內(nèi)核虛擬地址轉(zhuǎn)化為物理地址,供給后面的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ù)使用實(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中卻只實(shí)現(xiàn)了b和c兩種情況。
s3c2440有4個DMA channel,每個channel都有DISC/DISCC/DIDST/DIDSTC寄存器,DISC和DIST可以填入不同source類型(具體參考S3c2440 Datasheet Table 8-1),除此之外還能填入內(nèi)存的物理地址作為source或destination。
和傳輸相關(guān)的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請求完成一批原子操作,當(dāng)TC=0表示完成一次whole service
評論