WinCE CEDDK之Bus操作函数——转载收藏
CEDDK提供了访问总线驱动(Bus Driver)的函数,在/CEDDK/DDK_BUS目录下面可以看到源代码。通过这些函数,可以获得操作总线设备的句柄,然后使用该句柄来对总线设备进行访问。
简单说一下总线驱动(Bus Driver),就是指控制或配置某一特定总线的驱动设备,该驱动不但可以对指定总线进行操作,还可以加载和卸载更上层的硬件驱动,通常被称为客户端驱动(Client Driver)。所以一般上层的客户端驱动(Client Driver)会使用CEDDK中的Bus函数来访问总线驱动设备。
下面来介绍一下函数:
1. HANDLE CreateBusAccessHandle(LPCTSTR lpActiveRegPath)
该函数用于创建一个可以访问Bus设备驱动的句柄,一个客户端驱动(Client Driver)会在它的XXX_Init函数中调用该函数来获得Bus设备的句柄。lpActiveRegPath为Bus设备的注册表路径,返回值为句柄。
2. VOID CloseBusAccessHandle(HANDLE hBusAccess)
该函数用于关闭所访问的总线设备,客户端驱动(Client Driver)会在它的XXX_Deinit函数中调用该函数,hBusAccess是由CreateBusAccessHandle创建的句柄。
3. BOOL SetDevicePowerState(HANDLE hBusAccess, CEDEVICE_POWER_STATE PowerState,PVOID pReserved)
该函数由客户端驱动(Client Driver)使用,向它的总线驱动(Bus Driver)发出请求,要求将该客户端至于某一个电源状态。hBusAccess为总线设备的句柄,PowerState为电源的状态级别,可以从D0到D4,pReserved预留,一般设置为NULL。虽然作为客户端驱动(Client Driver),也有能力直接去改变自己的电源状态,但从原理上来说,还是应该由它的总线驱动(Bus Driver)负责。一般总线驱动(Bus Driver)加载一个客户端驱动之前,会将其电源状态设置为D0,而在卸载一个客户端驱动之后,会将其电源状态设置为D4。
4. BOOL GetDevicePowerState(HANDLE hBusAccess, PCEDEVICE_POWER_STATE pPowerState,PVOID pReserved)
该函数用于客户端驱动(Client Driver)向它的总线驱动(Bus Driver)发出请求,获得当前该客户端的电源状态,hBusAccess为总线设备的句柄,PowerState为电源的状态级别,pReserved预留,一般设置为NULL。
5. BOOL TranslateBusAddr(HANDLE hBusAccess, INTERFACE_TYPE InterfaceType, ULONG BusNumber, PHYSICAL_ADDRESS BusAddress, PULONG AddressSpace, PPHYSICAL_ADDRESS TranslatedAddress)
hBusAccess: 总线设备的句柄
interface_Type: 接口类型或总线类型
BusNumber: 总线号
BusAddress: 总线上的物理地址
AddressSpace: 作为输入,0x0为内存空间,0x1为IO空间
TranslatedAddress: 转换后的系统物理地址
该函数将一个总线设备上的设备物理地址转换为总线的系统物理地址,会根据Interface_type的类型进行相应的转换,一般用于PCI或者ISA总线。
6. BOOL TranslateSystemAddr(HANDLE hBusAccess, INTERFACE_TYPE InterfaceType, ULONG BusNumber, PHYSICAL_ADDRESS SystemAddress, PPHYSICAL_ADDRESS TranslatedAddress)
hBusAccess: 总线设备的句柄
interface_Type: 接口类型或总线类型
BusNumber: 总线号
BusAddress: 总线的系统物理地址
AddressSpace: 作为输入,0x0为内存空间,0x1为IO空间
TranslatedAddress: 转换后的设备物理地址
该函数将一个总线的系统物理地址转换为总线上的设备物理地址。
7. BOOL BusTransBusAddrToVirtual(IN HANDLE hBusAccess, IN INTERFACE_TYPE InterfaceType, IN ULONG BusNumber, IN PHYSICAL_ADDRESS BusAddress, IN ULONG Length, IN OUT PULONG AddressSpace, OUT PPVOID MappedAddress)
hBusAccess: 总线设备的句柄
interface_Type: 接口类型或总线类型
BusNumber: 总线号
BusAddress: 总线上的物理地址
Length: 被映射的地址空间的大小
AddressSpace: 0x0为内存空间,0x1为IO空间
TranslatedAddress: 映射后的总线的系统虚拟地址
该函数将一个总线上的设备物理地址转换为总线的系统虚拟地址,实际上是先调用了TranslateBusAddr函数获得总线的系统物理地址,再调用MmMapIoSpace函数进行虚拟地址映射。
8. BOOL BusTransBusAddrToStatic(IN HANDLE hBusAccess, IN INTERFACE_TYPE InterfaceType, IN ULONG BusNumber, IN PHYSICAL_ADDRESS BusAddress, IN ULONG Length, IN OUT PULONG AddressSpace, OUT PPVOID MappedAddress)
hBusAccess: 总线设备的句柄
interface_Type: 接口类型或总线类型
BusNumber: 总线号
BusAddress: 总线上的物理地址
Length: 被映射的地址空间的大小
AddressSpace: 0x0为内存空间,0x1为IO空间
TranslatedAddress: 静态映射后的总线的系统虚拟地址
该函数用于将一个总线上的设备物理地址转换为总线的系统虚拟地址,这个虚拟地址属于静态映射,该函数先调用TranslateBusAddr函数获得总线的系统物理地址,再调用CreateStaticMapping函数来完成静态映射。
9. ULONG GetDeviceConfigurationData(HANDLE hBusAccess, DWORD dwSpace, DWORD BusNumber, DWORD SlotNumber, DWORD dwOffset, DWORD dwLength, PVOID pBuffer)
hBusAccess: 总线设备的句柄
dwSpace: 设备的某一个地址空间,在cebuscfg.h中有定义
BusNumber: 总线号
SlotNumber: 逻辑槽号
dwOffset: 要获得的配置信息在PCI_COMMON_CONFIG结构中的偏移量
dwLength: Buffer的长度
pBuffer: 获得配置信息的Buffer
该函数用于获得相应的总线配置信息。
10. ULONG SetDeviceConfigurationData(HANDLE hBusAccess, DWORD dwSpace, DWORD BusNumber, DWORD SlotNumber, DWORD dwOffset, DWORD dwLength, PVOID pBuffer)
hBusAccess: 总线设备的句柄
dwSpace: 设备的某一个地址空间,在cebuscfg.h中有定义
BusNumber: 总线号
SlotNumber: 逻辑槽号
dwOffset: 要设置的配置信息在PCI_COMMON_CONFIG结构中的偏移量
dwLength: Buffer的长度
pBuffer: 要设置的配置信息的Buffer
该函数用于设置相应的总线配置信息。
还有一些函数,比较容易理解就不介绍了。上述函数主要为BUS驱动服务,CEDDK封装这些函数使之更容易使用,其中的一些函数也可以通过调用BusIoControl函数,传入不同的Ioctl码来实现。微软强烈推荐使用封装后的函数,而不建议使用BusIoControl函数,因为在以后的更新中,一些Ioctl码可能会被改动,而CEDDK中的这些封装过的API是不会改变的。
原文地址http://blog.csdn.net/nanjianhui/archive/2009/01/03/3690640.aspx
作者是一位MVP,德高望重,写的博客非常有价值。