WinCE CEDDK之DMA相关函数
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; //一般設置為0
} DMA_ADAPTER_OBJECT, *PDMA_ADAPTER_OBJECT;
下面介紹一下函數:
1. DMA內存分配函數:
PVOID HalAllocateCommonBuffer(PDMA_ADAPTER_OBJECT DmaAdapter, ULONG Length, PPHYSICAL_ADDRESS LogicalAddress, BOOLEAN CacheEnabled)
DmaAdapter: DMA適配器結構指針
Length: 要分配的內存的大小
LogicalAddress: 分配成功后,內存的物理起始地址
CacheEnabled: 是否使用Cache
實際上該函數通過調用AllocPhysMem函數來分配一段物理地址連續的內存,這段內存默認是64KB字節對齊的,這完全可以理解,DMA操作的物理內存必須是連續的。該函數調用成功以后,返回值是虛擬地址,可以在
2. DMA內存釋放函數:
VOID HalFreeCommonBuffer(PDMA_ADAPTER_OBJECT DmaAdapter, ULONG Length, PHYSICAL_ADDRESS LogicalAddress, PVOID VirtualAddress, BOOLEAN CacheEnabled)
DmaAdapter: DMA適配器結構指針
Length: 內存的大小
LogicalAddress: 內存的物理起始地址
VirtualAddress: 內存的虛擬地址
CacheEnabled: 是否使用Cache
該函數通過調用FreePhysMem函數來完成內存的釋放,所以在使用該函數的時候,只有函數的第四個參數是必須的,也就是內存的虛擬地址,其他的都可以忽略。
下面給個使用上面兩個函數的例子:
DMA_ADAPTER_OBJECTdmaAdapter;
//初始化DMA適配器
dmaAdapter.ObjectSize=sizeof(dmaAdapter);
dmaAdapter.InterfaceType=Internal;
dmaAdapter.BusNumber=0;
//分配DMA內存
m_pDMABuf=(PBYTE)HalAllocateCommonBuffer(&dmaAdapter,256*1024,&m_pDMABufPhys,FALSE);
//將物理地址賦值給DMA控制器
vm_pDMAreg->DST=(int)m_pDMABufPhys.LowPart;
...
//釋放DMA內存
if(m_pDMABuf!=NULL)
{
HalFreeCommonBuffer(NULL,0,0,m_pDMABuffer,FALSE);
m_pDMABuf=NULL;
}
在ddk_dma.c中,還可以看到其他很多DMA相關的
一般來說,DMA驅動會配合其他設備驅動來完成數據傳輸,所以很少會被單獨作為一個設備來使用,大多數情況我們開發設備驅動時需要用到DMA的時候,會用到上面兩個函數來申請和釋放內存。
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/xinchow/archive/2010/04/12/5477723.aspx
轉載于:https://www.cnblogs.com/gmh915/archive/2010/06/12/1945412.html
總結
以上是生活随笔為你收集整理的WinCE CEDDK之DMA相关函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DZ论坛系统 UC_KEY拿webshe
- 下一篇: 办公自动化及工作流技术