WinCE CEDDK之Bus操作函数
CEDDK提供了訪問總線驅(qū)動(dòng)(Bus Driver)的函數(shù),在/CEDDK/DDK_BUS目錄下面可以看到源代碼。通過這些函數(shù),可以獲得操作總線設(shè)備的句柄,然后使用該句柄來對(duì)總線設(shè)備進(jìn)行訪問。
簡(jiǎn)單說一下總線驅(qū)動(dòng)(Bus Driver),就是指控制或配置某一特定總線的驅(qū)動(dòng)設(shè)備,該驅(qū)動(dòng)不但可以對(duì)指定總線進(jìn)行操作,還可以加載和卸載更上層的硬件驅(qū)動(dòng),通常被稱為客戶端驅(qū)動(dòng)(Client Driver)。所以一般上層的客戶端驅(qū)動(dòng)(Client Driver)會(huì)使用CEDDK中的Bus函數(shù)來訪問總線驅(qū)動(dòng)設(shè)備。
?
下面來介紹一下函數(shù):
1. HANDLE CreateBusAccessHandle(LPCTSTR lpActiveRegPath)
該函數(shù)用于創(chuàng)建一個(gè)可以訪問Bus設(shè)備驅(qū)動(dòng)的句柄,一個(gè)客戶端驅(qū)動(dòng)(Client Driver)會(huì)在它的XXX_Init函數(shù)中調(diào)用該函數(shù)來獲得Bus設(shè)備的句柄。lpActiveRegPath為Bus設(shè)備的注冊(cè)表路徑,返回值為句柄。
?
2. VOID CloseBusAccessHandle(HANDLE hBusAccess)
該函數(shù)用于關(guān)閉所訪問的總線設(shè)備,客戶端驅(qū)動(dòng)(Client Driver)會(huì)在它的XXX_Deinit函數(shù)中調(diào)用該函數(shù),hBusAccess是由CreateBusAccessHandle創(chuàng)建的句柄。
?
3. BOOL SetDevicePowerState(HANDLE hBusAccess, CEDEVICE_POWER_STATE PowerState,PVOID pReserved)
該函數(shù)由客戶端驅(qū)動(dòng)(Client Driver)使用,向它的總線驅(qū)動(dòng)(Bus Driver)發(fā)出請(qǐng)求,要求將該客戶端至于某一個(gè)電源狀態(tài)。hBusAccess為總線設(shè)備的句柄,PowerState為電源的狀態(tài)級(jí)別,可以從D0到D4,pReserved預(yù)留,一般設(shè)置為NULL。雖然作為客戶端驅(qū)動(dòng)(Client Driver),也有能力直接去改變自己的電源狀態(tài),但從原理上來說,還是應(yīng)該由它的總線驅(qū)動(dòng)(Bus Driver)負(fù)責(zé)。一般總線驅(qū)動(dòng)(Bus Driver)加載一個(gè)客戶端驅(qū)動(dòng)之前,會(huì)將其電源狀態(tài)設(shè)置為D0,而在卸載一個(gè)客戶端驅(qū)動(dòng)之后,會(huì)將其電源狀態(tài)設(shè)置為D4。
?
4. BOOL GetDevicePowerState(HANDLE hBusAccess, PCEDEVICE_POWER_STATE pPowerState,PVOID pReserved)
該函數(shù)用于客戶端驅(qū)動(dòng)(Client Driver)向它的總線驅(qū)動(dòng)(Bus Driver)發(fā)出請(qǐng)求,獲得當(dāng)前該客戶端的電源狀態(tài),hBusAccess為總線設(shè)備的句柄,PowerState為電源的狀態(tài)級(jí)別,pReserved預(yù)留,一般設(shè)置為NULL。
?
5. BOOL TranslateBusAddr(HANDLE hBusAccess, INTERFACE_TYPE InterfaceType, ULONG BusNumber, PHYSICAL_ADDRESS BusAddress, PULONG AddressSpace, PPHYSICAL_ADDRESS TranslatedAddress)
??? hBusAccess:??????????? 總線設(shè)備的句柄
??? interface_Type:??????? 接口類型或總線類型
??? BusNumber:??????????? 總線號(hào)
??? BusAddress:??????????? 總線上的物理地址
??? AddressSpace:???????? 作為輸入,0x0為內(nèi)存空間,0x1為IO空間
??? TranslatedAddress:??? 轉(zhuǎn)換后的系統(tǒng)物理地址
該函數(shù)將一個(gè)總線設(shè)備上的設(shè)備物理地址轉(zhuǎn)換為總線的系統(tǒng)物理地址,會(huì)根據(jù)Interface_type的類型進(jìn)行相應(yīng)的轉(zhuǎn)換,一般用于PCI或者ISA總線。
?
6. BOOL TranslateSystemAddr(HANDLE hBusAccess, INTERFACE_TYPE InterfaceType, ULONG BusNumber, PHYSICAL_ADDRESS SystemAddress, PPHYSICAL_ADDRESS TranslatedAddress)
??? hBusAccess:??????????? 總線設(shè)備的句柄
??? interface_Type:??????? 接口類型或總線類型
??? BusNumber:??????????? 總線號(hào)
??? BusAddress:??????????? 總線的系統(tǒng)物理地址
??? AddressSpace:???????? 作為輸入,0x0為內(nèi)存空間,0x1為IO空間
??? TranslatedAddress:??? 轉(zhuǎn)換后的設(shè)備物理地址
該函數(shù)將一個(gè)總線的系統(tǒng)物理地址轉(zhuǎn)換為總線上的設(shè)備物理地址。
?
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:??????????? 總線設(shè)備的句柄
??? interface_Type:???????? 接口類型或總線類型
??? BusNumber:??????????? 總線號(hào)
??? BusAddress:??????????? 總線上的物理地址
??? Length:??????????????????? 被映射的地址空間的大小
??? AddressSpace:???????? 0x0為內(nèi)存空間,0x1為IO空間
??? TranslatedAddress:??? 映射后的總線的系統(tǒng)虛擬地址
該函數(shù)將一個(gè)總線上的設(shè)備物理地址轉(zhuǎn)換為總線的系統(tǒng)虛擬地址,實(shí)際上是先調(diào)用了TranslateBusAddr函數(shù)獲得總線的系統(tǒng)物理地址,再調(diào)用MmMapIoSpace函數(shù)進(jìn)行虛擬地址映射。
?
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:??????????? 總線設(shè)備的句柄
??? interface_Type:??????? 接口類型或總線類型
??? BusNumber:??????????? 總線號(hào)
??? BusAddress:??????????? 總線上的物理地址
??? Length:??????????????????? 被映射的地址空間的大小
??? AddressSpace:??????? 0x0為內(nèi)存空間,0x1為IO空間
??? TranslatedAddress:?? 靜態(tài)映射后的總線的系統(tǒng)虛擬地址
該函數(shù)用于將一個(gè)總線上的設(shè)備物理地址轉(zhuǎn)換為總線的系統(tǒng)虛擬地址,這個(gè)虛擬地址屬于靜態(tài)映射,該函數(shù)先調(diào)用TranslateBusAddr函數(shù)獲得總線的系統(tǒng)物理地址,再調(diào)用CreateStaticMapping函數(shù)來完成靜態(tài)映射。
?
9. ULONG GetDeviceConfigurationData(HANDLE hBusAccess, DWORD dwSpace, DWORD BusNumber, DWORD SlotNumber, DWORD dwOffset, DWORD dwLength, PVOID pBuffer)
??? hBusAccess:??????????? 總線設(shè)備的句柄
??? dwSpace:??????????????? 設(shè)備的某一個(gè)地址空間,在cebuscfg.h中有定義
??? BusNumber:??????????? 總線號(hào)
??? SlotNumber:??????????? 邏輯槽號(hào)
??? dwOffset:??????????????? 要獲得的配置信息在PCI_COMMON_CONFIG結(jié)構(gòu)中的偏移量
??? dwLength:?????????????? Buffer的長度
??? pBuffer:???????????????? 獲得配置信息的Buffer
該函數(shù)用于獲得相應(yīng)的總線配置信息。
?
10. ULONG SetDeviceConfigurationData(HANDLE hBusAccess, DWORD dwSpace, DWORD BusNumber, DWORD SlotNumber, DWORD dwOffset, DWORD dwLength, PVOID pBuffer)
??? hBusAccess:?????????? 總線設(shè)備的句柄
??? dwSpace:??????????????? 設(shè)備的某一個(gè)地址空間,在cebuscfg.h中有定義
??? BusNumber:??????????? 總線號(hào)
??? SlotNumber:??????????? 邏輯槽號(hào)
??? dwOffset:??????????????? 要設(shè)置的配置信息在PCI_COMMON_CONFIG結(jié)構(gòu)中的偏移量
??? dwLength:?????????????? Buffer的長度
??? pBuffer:????????????????? 要設(shè)置的配置信息的Buffer
該函數(shù)用于設(shè)置相應(yīng)的總線配置信息。
?
還有一些函數(shù),比較容易理解就不介紹了。上述函數(shù)主要為BUS驅(qū)動(dòng)服務(wù),CEDDK封裝這些函數(shù)使之更容易使用,其中的一些函數(shù)也可以通過調(diào)用BusIoControl函數(shù),傳入不同的Ioctl碼來實(shí)現(xiàn)。微軟強(qiáng)烈推薦使用封裝后的函數(shù),而不建議使用BusIoControl函數(shù),因?yàn)樵谝院蟮母轮?#xff0c;一些Ioctl碼可能會(huì)被改動(dòng),而CEDDK中的這些封裝過的API是不會(huì)改變的。
?
本文來自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/luixing67/archive/2010/02/05/5290301.aspx
總結(jié)
以上是生活随笔為你收集整理的WinCE CEDDK之Bus操作函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WINCE电源管理
- 下一篇: WINCE6.0+S3C2443下的us