转自: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的设置。