以文本方式查看主題 - 曙海教育集團論壇 (http://www.hufushizhe.com/bbs/index.asp) -- WinCE系統定制與驅動開發 (http://www.hufushizhe.com/bbs/list.asp?boardid=36) ---- wince6.0驅動開發 (http://www.hufushizhe.com/bbs/dispbbs.asp?boardid=36&id=1826) |
-- 作者:wangxinxin -- 發布時間:2010-11-26 11:14:16 -- wince6.0驅動開發 1、基礎知識: 1)系統調用是操作系統內核和應用程序之間的接口,設備驅動程序是操作系統內核和機器硬件之間的接 口。設備驅動程序為應用程序屏蔽了硬件細節,在應用程序看來硬件只是一個設備文件,應用程序可以 像操作普通文件一樣對硬件設備進行操作。設備驅動是內核的一部分。 2)驅動程序完成以下功能: 3)上層應用程序運行在用戶模式(非特權模式,Ring 3),代碼被嚴格約束執行。如不能執行硬件IO指 令。所有的這些被阻止的操作如果想運行必須通過陷阱門來請求操作系統內核。 4)操作系統內核運行在內核模式(特權模式,Ring 0),可以執行所有有效的CPU指令。包括IO操作, 可訪問任何內存區。 5)整個硬件系統資源在驅動程序面前是赤裸裸的,驅動可以使用所有系統資源,編寫驅動程序時我們必 須格外小心驅動代碼的邊界條件,確保它們不會損壞整個操作系統。 2、Windows支持的驅動: 限。 3、WinCE系統驅動簡介: 1)WinCE畢竟是一個嵌入式系統,有其自身的特殊性,為了提高運行效率,所有驅動皆為動態鏈接庫, 驅動實現中可以調用所有標準的API。而在其他Windows系統中可能的驅動文件還有.vxd, .sys和動態鏈 接庫。 ——本地驅動主要用于低級、內置的設備。實現它們的接口并不統一,而是針對不同類型的設備相應設 計。因此開發過程相對復雜,沒有固定的模式,一般做法是通過移植、定制現有的驅動樣例來實現。 WinCE的所有驅動程序都可以通過這種方式來實現。流接口驅動程序通過文件系統調用從設備管理器和應 用程序接收命令。該驅動程序封裝了將這些命令轉換為它所控制的設備上的適當操作所需的全部信息。 流接口驅動是動態鏈接庫,由一個叫做設備管理程序的特殊應用程序加載、管理和卸載。與本地 驅動程序相比,所有流接口驅動程序使用同一組接口函數集,包括實現函數:XXX_Init、XXX_Deinit、 XXX_Open、XXX_Close、XXX_Read、XXX_Write、XXX_PowerUp、XXX_PowerDown、XXX_Seek、 XXX_IOControl,這些函數與硬件打交道。用戶函數:CreateFile、DeviceIoControl、 ReadFile、 WriteFile,這些函數方便用戶使用驅動程序。 3)WinCE下驅動的加載方式: ——通過GWES(Graphics, Windowing, and Events Subsystem):主要加載與顯示和輸入有關的驅動, 如鼠標、鍵盤驅動等。這些驅動一般為本地驅動。 Host Controller driver,主要是總線類的驅動;流接口驅動主要有音頻驅動,串并口驅動。 要有外接板卡驅動,USB設備驅動等。 4、流接口驅動函數介紹: ActiveDeviceEx通過設備管理器調用。其返回值一般是一個數據結構指針,作為函數參數傳遞給其他流 接口函數。 2)BOOL XXX_Deinit(DWORD hDeviceContext); 。 打開設備,為后面的操作初始化數據就夠,準備相應的資源。應用程序通過CreateFile函數間接調用之 。返回一個結構指針,用于區分哪個應用程序調用了驅動,這個值還作為參數傳遞給其他接口函數 XXX_Read、XXX_Write、XXX_Seek、XXX_IOControl。 4)BOOL XXX_Close(DWORD hOpenContext);
7)BOOL XXX_IOControl(DWORD hOpenContext, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut); 用于向設備發送命令,應用程序通過DeviceIoControl調用來實現該功能。要調用這個接口還需要在應用 層和驅動之間建立一套相同的命令,通過宏定義CTL_CODE(DeviceType, Function, Method, Access來實 現。如: #define IOCTL_INIT_PORTS \\ CTL_CODE (FILE_DEVICE_UNKNOWN,0X801,METHOD_BUFFERED,FILE_ANY_ACCESS) 8)void XXX_PowerDown(DWORD hDeviceContext); hDeviceContext:XXX_Init的返回值。 |