WinCE CEDDK之DMA相关函数
来源:互联网 发布:ubuntu卸载wine qq 编辑:程序博客网 时间:2024/05/16 04:59
CEDDK提供了DMA的相关函数,在CEDDK/DDK_DMA/ddk_dma.c中定义。实际上里面最有用的就两个函数,HalAllocateCommonBuffer(..)和HalFreeCommonBuffer(..)分别用于为DMA申请和释放内存。
首先介绍一下会用到的DMA适配器结构,在ceddk.h中定义,如下:
1. DMA内存分配函数:
PVOID HalAllocateCommonBuffer(PDMA_ADAPTER_OBJECT DmaAdapter, ULONG Length, PPHYSICAL_ADDRESS LogicalAddress, BOOLEAN CacheEnabled)
DmaAdapter: DMA适配器结构指针
Length: 要分配的内存的大小
LogicalAddress: 分配成功后,内存的物理起始地址
CacheEnabled: 是否使用Cache
实际上该函数通过调用AllocPhysMem函数来分配一段物理地址连续的内存,这段内存默认是64KB字节对齐的,这完全可以理解,DMA操作的物理内存必须是连续的。该函数调用成功以后,返回值是虚拟地址,可以在驱动中访问其中的内容,函数的第三个参数返回内存的物理地址,可以赋值给DMA控制器来完成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函数来完成内存的释放,所以在使用该函数的时候,只有函数的第四个参数是必须的,也就是内存的虚拟地址,其他的都可以忽略。
下面给个使用上面两个函数的例子:在ddk_dma.c中,还可以看到其他很多DMA相关的操作函数。这些DMA函数是用来操作DMA设备的,通过CreateFile来打开DMA设备,然后调用DeviceIoControl函数来访问DMA设备。DMA设备驱动在/WINCE600/PUBLIC/Common/Oak/Drivers/DMA下面,该DMA驱动以流设备驱动的形式实现。
- DMA_ADAPTER_OBJECT dmaAdapter;
- //初始化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;
- }
一般来说,DMA驱动会配合其他设备驱动来完成数据传输,所以很少会被单独作为一个设备来使用,大多数情况我们开发设备驱动时需要用到DMA的时候,会用到上面两个函数来申请和释放内存。
- WinCE CEDDK之DMA相关函数
- WinCE CEDDK之DMA相关函数
- WinCE CEDDK之DMA相关函数
- WinCE CEDDK之DMA相关函数
- WinCE CEDDK之DMA相关函数
- WinCE CEDDK之DMA相关函数
- WinCE CEDDK之DMA相关函数
- WinCE CEDDK之DMA相关函数
- WinCE CEDDK之DMA相关函数
- WinCE CEDDK之IO访问函数
- WinCE CEDDK之Bus操作函数
- WinCE CEDDK之地址映射函数
- WinCE CEDDK之IO访问函数
- WinCE CEDDK之IO访问函数
- WinCE CEDDK之Bus操作函数
- WinCE CEDDK之IO访问函数
- WinCE CEDDK之Bus操作函数
- WinCE CEDDK之Bus操作函数——转载
- JPA 实体Entity
- Location属性划分图
- 在Wince5.0中实现关机功能
- wince 2410 UDC driver 分析
- 工作心态
- WinCE CEDDK之DMA相关函数
- 介绍SQL Server 2005的CROSS Apply
- oracle的内存结构之--查看内存信息+保留池和循环池(摘自文平书)
- zend studio5.5.1 subversion配置
- Invalid file name: must contain only [a-z0-9_.]
- WinCE CEDDK之DMA相关函数
- 如何在SQL Server 2005中用XQuery分解XML数据
- WinCE CEDDK之IO访问函数
- 《工程技术人员职务试行条例》规定的任职基本条件