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是不會改變的。
?
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/luixing67/archive/2010/02/05/5290301.aspx
總結
以上是生活随笔為你收集整理的WinCE CEDDK之Bus操作函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WINCE电源管理
- 下一篇: WINCE6.0+S3C2443下的us