摘要: CEDDK提供了DMA的相关函数,在CEDDK/DDK_DMA/ddk_dma.c中定义。实际上里面最有用的就两个函数,HalAllocateCommonBuffer(..)和HalFreeCommonBuffer(..)分别用于为DMA申请和释放 首先介绍一下会用到的DMA适配器结构,在ceddk.h中定义,如下:typedef struct _DMA_ADAPTER_OBJECT_{ USHORT ObjectSize; //该结构的大小 INTERFACE_TYPE InterfaceType; //接口类型,一般用做DMA时设置为Internal ULONG BusNumber; // 阅读全文
posted @ 2011-08-18 21:16 keeppoised 阅读(525) 评论(0) 推荐(0) 编辑
摘要: 1、 芯片DMA的使用要点:AK3224芯片的DMA使用中,RAM的地址作为DMA传输的目标地址、源地址,必须要4字节对齐。而且DMA的操作长度以内的RAM地址,必须连续。不过在使用中发现:Nandflash驱动中RAM地址作为目标地址时,只需要2字节对齐。RAM地址作为源地址可不需对齐。(其他情况需要逐一验证)2、 wince中的DMA使用:根据DMA一次操作的RAM地址必须连续的特性,在驱动DMA使用时,我们需要确保虚拟地址映射的物理地址是连续的。有3个途径:1:数据区地址是由应用层或者其他进程、线程传入的,驱动并不知道其虚拟地址对应的物理地址是否一直连续。由于wince的内存申请,是以4 阅读全文
posted @ 2011-08-18 21:07 keeppoised 阅读(458) 评论(0) 推荐(0) 编辑
摘要: 1、DMA驱动做成流驱动;附:DMA的好处:使用DMA的好处就是它不需要CPU的干预而直接服务外设,这样CPU就可以去处理别的事务,从而提高系统的效率,对于慢速设备,如UART,其作用只是降低CPU的使用率,但对于高速设备,如硬盘,它不只是降低CPU的使用率,而且能大大提高硬件设备的吞吐量。因为对于这种设备,CPU直接供应数据的速度太低。 因CPU只能一个总线周期最多存取一次总线,而且对于ARM,它不能把内存中A地址的值直接搬到B地址。它只能先把A地址的值搬到一个寄存器,然后再从这个寄存器搬到B地址。也就是说,对于ARM,要花费两个总线周期才能将A地址的值送到B地址。而DMA就不同了,一般系统 阅读全文
posted @ 2011-08-18 21:00 keeppoised 阅读(393) 评论(0) 推荐(0) 编辑