WinCE 5.0邊做邊學(7)

來源:互聯網
上載者:User
 

    上次寫過關於CE的中斷處理機制以後,一直有人要求能以實際的程式體現出來,但是出於各種因素,一直未能成文。在此表示歉意,此次我們就一起來分析驅動程式中的一種,然後順便看一下中斷在驅動程式中的體現,對WIN32底層的核心對象不熟的話,可要先補一補這方面的知識哦。
    還是先從驅動程式說起。CE的驅動程式架構與案頭WINDOWS有很大的不同,因此,案頭WINDOWS下的裝置驅動程式無法在CE中使用。通常案頭WINDOWS驅動程式的體現形式是VXD,SYS等,在CE中,則統一體現為DLL,也就是說,只要符合要求的DLL都可以成為CE下的裝置驅動程式,前提是只要在註冊表中註冊過。
    從驅動程式的結構上來看,CE下的驅動程式結構有兩種,單體結構和分層結構。單體結構即將通用的驅動程式介面和特定的硬體介面在同一層面上實現,以減少兩層之間的調用和協調,從而可以提高效率,通常用於非常關鍵的系統特性上。分層結構則被廣泛應用,將同一裝置的驅動程式分成兩層:平台相關驅動PDD和模型裝置驅動MDD。前者和具體的裝置綁定在一起,是針對特定裝置特定型號的,後者是同一類裝置驅動中公用的部分,主要由CE的系統支援提供,通常不需要修改。
    在類別上來看,主要的類別有兩種,一種是內建的驅動程式,一種是流介面的驅動程式。我平此次先來看內建的驅動程式。
    內建的驅動程式是由CE系統定義了介面函數,開發人員只要實現這些函數即可,當然這個實現必然要對應你自己用到的硬體裝置。常見的比如鍵盤驅動,滑鼠驅動,顯示卡驅動,電池驅動等都屬於這一類,拿鍵盤驅動來說,我們可以通過DEF檔案來得到系統規定的介面函數如下:
KeybdDriverInitializeEx
KeybdDriverPowerHandler
KeybdDriverGetInfo
KeybdDriverSetMode
KeybdDriverInitStates
KeybdDriverVKeyToUnicode
KeybdDriverMapVirtualKey

LayoutMgrGetKeyboardType
LayoutMgrGetKeyboardLayout
LayoutMgrGetKeyboardLayoutName
LayoutMgrGetKeyboardLayoutList
LayoutMgrLoadKeyboardLayout
LayoutMgrActivateKeyboardLayout

IL_00000409
PS2_AT_00000409

    對於我們開發人員而言,如果你要寫鍵盤驅動,那你的DLL中必須按上述函數的原型匯出,系統在使用鍵盤驅動的時候就是在適當的時機調用這些你提供的函數,從而按你的實現來驅動特定的鍵盤裝置。
    我們一起來看一下鍵盤的驅動,它位於PUBLIC/COMMON/OAK/DRIVERS/KEYBD檔案夾下。在這裡有很多個來源程式檔案,它們所包含的標頭檔位於PUBLIC/COMMON/OAK/INC檔案夾下,如果你需要自己實現鍵盤驅動程式,那就要仔細分析微軟提供的這個範例。
    在LAYMGR檔案夾下的laymgr.cpp程式中我們可以找到上述介面函數中的大部分,這就是系統需要的,因為鍵盤驅動很複雜,所以這裡採用了分層機制,即在laymgr.cpp中並未直接實現這些函數的操作,而是調用了其他來源程式檔案中的函數功能。在IST檔案夾中的keybdist.cpp檔案則是上次我們說的IST的實現,裡面典型的等待和迴圈是很值得學會的。真正和硬體密切相關的來源程式是在PS@_8042檔案夾下的ps2keybd.cpp來源程式中,在這裡可以找到直接操作硬體的語句,也可以發現IST的安裝方法。這裡面涉及到了很多event,thread等WIN32的核心對象,有需要瞭解的請看《Windows進階編程》那本非常厚的經典書籍吧。
    其他的驅動程式也是如些,每個檔案夾下都有很多來源程式檔案,只要慢慢分析就會明白其中的流程。有人問說你是怎麼知道如何操作硬體的呢?這當然需要硬體手冊,對於每一類裝置都有它自己的硬體標準,其中會定義描述出不同的地址的功能,不同的指令需要處理的資料結構,有的還會包含中斷和時間序列等,對於專用的裝置來說,這可是必不可少的,否則你是無法操作硬體的。
    除了實現出驅動程式的DLL以外,還需要在註冊表中對其進行註冊,以方便CE的裝置管理機制通過枚舉註冊表來載入裝置驅動程式。對於鍵盤的註冊典型的如下:
[HKEY_LOCAL_MACHINE/HARDWARE/DEVICEMAP/KEYBD]
"DriverName"="kbdmouse.dll"
"SysIntr"=dword:11
"IoBase"=dword:60
"IoLen"=dword:5
"BusNumber"=dword:0
"BusType"=dword:5
"EnableWake"=dword:1
    對於其中各項的含義,協助文檔中說得非常詳細,請參考。
    由於各種內建的驅動程式都有各自的介面定義,所以需要開發人員按需來用。實現上也是比較複雜。下次我們一起來看一下流式驅動,它的介面就相對比較簡單了,我們也可以自己安裝一個流式驅動來看一下這種驅動程式是如何開發的,下次見吧。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.