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设备的句柄。lpActiveRegPathBus设备的注册表路径,返回值为句柄。

 

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为电源的状态级别,可以从D0D4pReserved预留,一般设置为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为内存空间,0x1IO空间

    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为内存空间,0x1IO空间

    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为内存空间,0x1IO空间

    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为内存空间,0x1IO空间

    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,德高望重,写的博客非常有价值。

posted @ 2009-02-15 19:52  张伟——程序员  阅读(250)  评论(0编辑  收藏  举报