DAT模块简介
轉自:http://blog.sina.com.cn/s/blog_48fc29af0100ncdu.html
DAT模塊函數在DM642的EDMA操作中用于搬運數據。DAT_busy()函數用于檢測EDMA數據傳輸過程是否已經結束,定義如下:Uint32 DAT_busy(Uint32 ID);
DAT_busy()函數如果返回一個非零值,則表明數據傳輸過程(DAT_copy()操作或DAT_fill()操作)正在進行,其他操作需要等待,如果該函數返回零,則表明數據傳輸過程已經完成,可以執行其他操作了。DAT_busy()函數的使用方法如下:
DAT_open(DAT_CHAANY,DAT_PRI_LOW,0);//打開數據傳輸通道
…
Transferid=DAT_copy(src,dst,len);//數據copy,返回通道值
…
while(DAT_busy(transferid));//等待數據copy過程完成
?
DAT_copy()函數把源數據區中的數據轉移到目標數據區中,它的定義如下:
Uint32 DAT_copy(void *src , void *dst , Uint16 byteCnt);
src表示源數據區起始地址指針,
dst表示目標數據區起始指針,
byteCnt為被搬運數據的長度,單位為字節,
該函數返回數據搬運通道的ID值,供DAT_busy()等函數調用。
DM642的L2的EDMA數據總線為64位,要求數據以8字節為單位進行對其,所以bateCnt應為8的倍數,byteCnt為0時,數據搬運的結果是隨機的。函數的使用方法是:
?
?
DAT_open()函數用于打開一個DAT通道,該函數具有如下的定義:
Uint32 DAT_open(int chaNum, int priority, Uint32 flags);
chaNum是為EDMA操作分配的數據通道,取DAT_CHAANY、DAT_CHA0、DAT_CHA1、DAT_CHA2、DAT_CHA3中的一個,priority變量規定了該通道的優先級,priority取DAT_PRI_LOW(低優先級)、DAT_PRI_HIGH(高優先級)中的一個,
flags為標志位,明確數據操作的方式,如一維數據操作、二維數據操作等,對于二維數據操作flags應為DAT_OPEN_2D。
與DAT_open()函數想對應的是DAT_close()函數,DAT_close()函數用于關閉已打開的DAT通道。
?
?
?
?
CSLAPI int DAT_open(int chaNum, int priority, Uint32 flags);
CSLAPI void DAT_close();
CSLAPI Uint32 DAT_copy(void *src , void *dst , Uint16 byteCnt);
CSLAPI Uint32 DAT_fill(void *dst , Uint16 byteCnt, Uint32 *value);
CSLAPI void?? DAT_wait(Uint32 id);
CSLAPI int??? DAT_busy(Uint32 id);
CSLAPI Uint32 DAT_copy2d(Uint32 type, void *src, void *dst, Uint16 lineLen, Uint16 lineCnt, Uint16 linePitch);
IDECL void DAT_setPriority(int priority);
DAT_open???????? Opens the DAT module
●函數??? Uint32?? DAT_open(
??????????????????????????? int chaNum,
?????????????????????????? int priority, 優先級
?????????????????????????????????? Uint32 flags
??????????????????????? );
●參數??????? chaNum? 指定分配那個DMA通道,必須是下面其中之一:
DAT_CHAANY
DAT_CHA0
DAT_CHA1
DAT_CHA2
DAT_CHA3
priority 指定DMA通道的優先級必須是下面其中之一
DAT_PRI_LOW
DAT_PRI_HIGH
flags?? 各種各樣的打開標志
DAT_OPEN_2D
●返回值????? success?? 如果失敗返回0,如果成功返回非零值,失敗的原因如下:
?DAT模塊已經打開,
需要的資源沒有被分派。
●描述?????????????
這個函數打開DAT模塊,而且必須在調用其它DAT API 函數之前被調用,
ChaNum 參數指定了哪個DMA通道被DAT模塊單獨的打開,對于帶有EDMA的設備,ChaNum 參數被忽略,原因是快速使用的DMA并不具有一個和它匹配的通道,對具有DMA的設備,ChaNum指定了將要使用哪個DMA通道,
?DAT_PRI_LOW設置DMA通道的CPU優先級 DAT_PRI_HIGH 設置DMA通道的DMA優先級,DAT_PRI_LOW設置 LOW priority ,DAT_PRI_HIGH 設置HIGH priority,一旦 DAT 模塊被打開,任何被分配的資源,例如一個DMA通道,仍然被分配,你可以調用 DAT_close() 來釋放這些資源,如果,準備通過DAT_copy2d 來進行2Dde傳輸, DAT_OPEN_2D 標志必須被指定,對具有DMA接口的設備指定這個標志, 將要導致一個全局重載計數寄存器和一個全局索引寄存器的分配這些全局寄存器在調用DAT_close()時將被釋放,
注意:對具有EDMA的設備,DAT模塊使用EDMA寄存器來提交傳輸請求,而且將使用通道中斷掛起寄存器(CIPR),中斷并不被使能 ,但是CIPR中的中斷標志要用到, DAT模塊使用完成碼的1到4來計算一個在CIPR 寄存器中的掩碼0x00000001E ,在具有EDMA的設備上使用DAT模塊的用戶必須避免使用完成碼1到4。
使用任何有效的DMA通道來打開DAT模塊的例子,
DAT_open(DAT_CHAANY,DAT_PRI_LOW,0);
用高優先級模式使用DMA通道2打開DAT模塊,使用:
DAT_open(DAT_CHA2,DAT_PRI_HIGH,0);
使用2D拷貝打開DAT模塊,使用:
DAT_open (DAT_CHAANY, DAT_PRI_HIGH, DAT_OPEN_2D);
DAT_copy?????????????????? Copies a linear block of data from Src to Dst using DMA or
??????????????????????????????????? EDMA hardware
????????????????????????? Uint32 DAT_copy(
??????????????????????????????????????????????????????????????? void *src,
???????????????????????????????????????????????????????????????? void *dst,
??????????????????????????????????????????????????????????????? Uint16 byteCnt
?????????????????????????????????????????????????????????????????????????????? );
Arguments
???????????????????? void *src???????????????? 是一個源地址指針,
???????????????????? void *dst????????????????? 是目的地址指針,
???????????????????? Uint16 byteCnt???? 是一個無符號16位數,用來計算你要copy的byte數,這個值是以字節計算的。Return Value?????? xfrId??? Transfer ID?
?函數的返回值是一個傳輸通道的標號(xfrId??? Transfer ID),一般用作句柄
? 描述:
用CSL的DAT之前好像也得先設置好DMA或EDMA的參數,DAT可以自動選擇DMA或EDMA的方式和通道,但是具體傳輸時還是要用到DMA和EDMA的參數,所以即使是用DAT來傳輸數據,也不能回避掉DMA/EDMA的設置。
總結
- 上一篇: 开源框架:CocoaPods 安装学习教
- 下一篇: 硬链接与符号链接的比较?