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

  • 相关阅读:
    从编程到入侵
    编程实现盗2005 Beta2版QQ
    Justin Frankel:Winamp的反斗奇星
    用安静的热情征服联合国
    我和试用期员工之间的故事
    Sogou输入法之父给我们的启示
    《ATL开发指南》的一个值得商榷的地方
    厦门PX项目迁址:意义有限的进步
    探析项目主导型的IT业的人员需求变化及其应对办法
    今天,影响了一位试用期员工的去留
  • 原文地址:https://www.cnblogs.com/chengxuyuan/p/1391063.html
Copyright © 2020-2023  润新知