EDMA - DMA QDMA
--------------------------------
做個參考,和6487/8 的EDMA3的user guide有點區別.
------------------------------------
EDMA概要
①EDMA數據傳輸有兩種發起方式:
ü CPU發起的EMDA數據傳輸(非同步方式):需要傳輸時,CPU設置ESR寄存器的相應位為1,從而觸發一個EDMA事件的產生,事件對應的通道參數被送往地址硬件並且完成相應的處理,這種非同步方式的實時數據傳輸無需設定EER寄存器;
ü 事件觸發方式EDMA數據傳輸(同步方式):ER寄存器保存外設發送過來的事件,一旦CPU設置EER寄存器的相應位為1后,ER中的事件才會提交給事件編碼器(Event Encoder),並且進一步引起相關的傳輸參數的發送給地址產生硬件;如果EER中對應於某事件的位沒有置1,則ER寄存器中的事件將保留,一旦置1則觸發EDMA的傳輸,這種特性可以應用到EDMA Chain傳輸,需要EER和CCER結合使用;
②EDMA每個通道是和特定的系統事件綁定的,如下表所示:
③EDMA Chain Transfer:一個通道傳完繼續傳另一個通道;
④EDMA Link Tansfer:設定參數后,通道的數據傳輸傳完,再載入這個通道的其他參數設定,再進行數據傳輸;
(2)EDMA數據傳輸類型:
EDMA有兩種類型的數據傳輸:1D和2D的(OPT.2DS和OPT.DDS標示源地址和目的地址的數據傳輸類型,即有4種組合方式);數據的維數表明了數據的組成方式:
①1D數據
數據組成是“塊->幀->元素”;一個塊中的每幀數據是獨立處理(即可以理解亦為2D數據,但是第二維永遠是1),每次處理是一個元素,因此一幀中的數據元素可以是在同一個內存地址、連續的地址或者是與同一幀中的前面的數據元素地址具有一定偏移(Offset,由ELEIDX通道參數指定)的某地址;不同幀之間的內存地址偏移由FRMIDX通道參數指定(兩幀的第一個元素之間的偏移或者后一幀的第一個元素的地址與前一幀的最后一個元素地址的偏移,具體依賴於通道參數FS的設定);每幀的數據元素個數可以不同,由通道參數ELECNT指定,傳完一幀數據后由ELERLD重新載入塊中的下一幀的數據元素個數ELECNT;塊中的幀的個數由通道參數FRMCNT指定;
1D數據傳輸有兩種同步方式:OPT.FS=,元素同步方式;OPT.FS=1,幀同步方式;
元素同步時,一次同步事件引起一幀中的一個元素的傳輸,每傳輸一次ELECNT遞減1;當同步事件觸發時,ELECNT=1表明是一幀的最后一個數據元素,此時EDMA控制器除了完成最后這個元素的傳輸外,還需要重新載入ELECNT(通過ELERLD)並且FRMCNT遞減1;ELEIDX表示元素之間的偏移,FRMIDX表示一幀的最后一個元素和下一幀的第一個元素之間的偏移;如果OPT.LINK=1時,傳輸完成中斷產生(FRMCNT=)就重新從PRAM中載入當前通道的其他參數;
幀同步時,一次同步事件引起一幀數據的傳輸,FRMIDX表示兩幀的第一個元素之間的偏移;
② 2D數據
數據組成為“塊->數組->元素”,同一數組中的元素是連續存放的,因此ELEIDX無意義;數組中的元素素引表示2D的第一維,塊中的數組索引表示2D的第二維;FRMIDX的值依賴於OPT.FS的設定;
OPT.FS=0:表示一次同步事件傳輸一個數組,此時FRMIDX是數組首地址之間的偏移;每傳完一個數組,FRMCNT遞減1;當OPT.LINK=1並且FRMCNT遞減至時,從PRAM的中重新載入當前通道的其他參數;
OPT.FS=1:表示一次同步事件傳輸一個塊;FRMIDX表示前一個數組的最后一個元素的地址與后一個數組的第一個元素的地址之間的偏移;如果OPT.LINK等於1,則當整塊數據傳完時,重新從PRAM中為當前通道載入新的參數;
(3)EDMA傳輸過程的源/目的地址的修改
在每次同步事件觸發EDMA數據傳輸,並且傳輸完成后,需要對源/目的地址進行更新;地址的更新方式由SUM/DUM進行設定,並且和2DS、2DD以及FS是密切相關的;
(4)數據元素大小和對齊方式
源/目的地址是在元素大小的邊界對齊的,因此要注意指向源/目的地址的指針的類型需要和OPT.ESIZE匹配;
(5)FRMCNT和ELEMCNT的更新
QUESTION:每次進行計數更新時,ELERLD的值哪里來的??
(6)EDMA Linking Transfer
當傳輸完成時(根據當前通道參數設定已經傳完所有數據了,具體條件如下表所示),並且OPT.LINK=1,EDMA控制器會根據通道參數LINK(非OPT.LINK,16bits)從PaRAM中的其他位置(以24個字節對齊,因為通道參數為6WORD)重新載入當前傳輸通道的參數;可以鏈接到一個空的通道參數集(NULL Parameter)來停止EDMA傳輸,也可以自鏈接(用於循環緩沖處理或者重復的數據傳輸);Linking過程中不對相關寄存器作判定;
C64X DSP的EDMA控制器的所有64個通道只產生一種中斷:EDMA_INT。如果需要讓第n個EDMA通道(或者QDMA請求)可以在傳輸完成時可以產生中斷通知CPU的話,應該如下設定:
u OPT.TCINT=1:表示啟用傳輸完成中斷
u OPT.TCC=n:在傳輸完成時,CIPR[TCC]=1,用於標記對應通道的傳輸完成,即便對應的CIER位沒有啟動,傳輸完成事件還是會在CIPR記錄,即掛起的含義所在;
u OPT.CIER[n]=1:表示立即允許掛起的第n個通道傳輸完成事件觸發EDMA_INT中斷發送給CPU;
其中,TCC用於表示的通道的位數不夠時,可以擴展使用TCCM(即TCCM:TCC),CIPR和CIER均由兩個寄存器組成:CIPRL+CIPRH以及CIERL+CIERH。
中斷服務例程ISR讀取CIPR,確定哪一個通道完成了數據傳輸,進行相應的處理。ISR在進行處理之前需要清除CIPR中確定了通道的位(寫入1到相關位清除,寫入不起作用),目的是記錄以后的傳輸完成事件的發生。在中斷服務例程對某通道的傳輸完成中斷進行服務后,因為期間有可能有其他通道傳輸完成了,也已經設置了CIPR中的相應位,或者也有可能本來有好幾個中斷掛起了並且現在觸發了,因此中斷服務例程必須檢查所有的CIPR並全部完成中斷服務才行。當CIPR[n]&CIER[n]=1時,則設置對應的IFR為1,防止在退出ISR時丟失中斷並且使得可以多次調用ISR。中斷服務例程的一個任務是清除CIPR和CIER中的與通道對應的位。
C64X DSP除了傳輸完成中斷外,還有交替性傳輸完成中斷,即在傳輸過程中完成一個傳輸子過程(如傳完一個數據元素、傳完一個幀/數組數據;2D幀同步傳輸沒有交替性傳輸完成中斷)給CPU發送一個中斷,相應的設定由OPT.ATINT、OPT.ATCC設定,處理過程和傳輸完成中斷雷同,區別只是在傳輸還沒全部完成的過程中進行中斷處理而已。
(8)QDMA
QDMA數據傳輸總是幀同步的,即對於1D數據傳輸而言每次同步事件傳輸一幀數據,對於2D數據傳輸而言每次同步事件傳輸一塊數據。因此,QOPT.FS對於QDMA是無意義的。另外,QDMA是一次性快速傳輸的,因此也沒有中間傳輸過程這個概念,即沒有交替性傳輸完成中斷。
QDMA沒有Linking方式的傳輸,但是有Chaining方式的傳輸。QDMA有兩組內存映射寄存器用於設定通道參數,如下圖所示:
其中,QDMA寄存器集只用於配置,QDMA psedudo寄存器集可以用於提交QDMA請求。
(9)EDMA控制器的請求提交
請求包括L2控制器(Cache服務、訪問未Cache的內存以及QDMA傳輸)、EDMA通道、HPI/PCI。Transfer Crossbar為請求排定優先級。
(10) Event Encoder 事件編碼器
事件寄存器ER(包括ERL和ERH)用於捕獲對應於64個EDMA通道的事件。在事件編碼器中只是負責提交請求,事件的優先局依賴於EDMA通道參數的設定,並且在Transfer Crossbar中才正式排定。
(11)Parameter RAM
Parameter RAM位於EDMA控制器內部,只有設備總線可以對之進行訪問。PRAM表大小為2KB,其組成為:
① 64個24字節(即每項6個32bits的字WORD)的表項,用於保存64個通道的參數,也可作為保存Linking時候需要進行重載的通道參數;
② 21個24字節(即每項6個32bits的字WORD)的表項,用於保存Linking時候需要進行重載的通道參數;
③ 剩余的8個字節;
每個通道參數(6WORDS)如下:
(12)EDMA Chaining 傳輸
Chaining傳輸的含義是當一個EDMA通道傳輸完成時,觸發另一個EDMA通道的傳輸。
TCINT需要設為1,根據當前通道的(TCCM:)TCC值,設定CCER(CCERL+CCERH)的)(TCCM:)TCC位的值,表示當前通道傳輸完成后觸發(TCCM:)TCC通道的數據傳輸。
Chaining傳輸也可以交替性傳輸完成,使用ATTC指定要觸發的通道。