基于Windows CE的7×3手機鍵盤(pán)驅動(dòng)實(shí)現
4. 矩陣鍵盤(pán)驅動(dòng)程序模型
分層驅動(dòng)程序由兩個(gè)獨立的層組成:上層是模型設備驅動(dòng)程序(MDD),映射掃描碼到虛擬鍵的編碼上,產(chǎn)生與虛擬鍵編碼相關(guān)的字符,然后打包鍵盤(pán)信息,并且將此信息輸入到系統信息隊列中;下層是依賴(lài)平臺的驅動(dòng)程序(PDD),它將從硬件重新獲得掃描碼。設備驅動(dòng)程序服務(wù)器提供的接口(DDSI)是在PDD中實(shí)現的函數集,并由MDD調用。由于微軟提供了所有與MDD模塊相關(guān)的源代碼,所以對這部分不用做任何改動(dòng),只需將自己的PDD模塊與MDD模塊鏈結成一個(gè)公用庫即可。下圖2是矩陣鍵盤(pán)驅動(dòng)程序分層結構模型[2]、[3]:
圖2矩陣鍵盤(pán)驅動(dòng)程序分層結構模型
DDI函數在MDD層實(shí)現,由用戶(hù)應用程序通過(guò)GWES子系統調用,鍵盤(pán)驅動(dòng)的DDI函數有[4]:KeybdDriverGetInfo、 KeybdDriverSetMode、KeybdDriverPowerHandler、KeybdDriverInitializeEx、 KeybdDriverInitStates、KeybdDriverVKeyToUnicode、KeybdDriverMapVirtualKey。
DDSI函數在PDD層實(shí)現,由MDD層調用,鍵盤(pán)驅動(dòng)的DDSI函數有:KeybdPdd_PowerHandler、KeybdPdd_InitializeDriverEx、KeybdPdd_GetEventEx、DllMain。
5. 矩陣鍵盤(pán)驅動(dòng)程序運行過(guò)程
Windows CE的輸入系統在啟動(dòng)時(shí)加載矩陣鍵盤(pán)驅動(dòng)程序,其加載流程如下:當輸入系統開(kāi)始運行時(shí),輸入系統將從 HKEY_LOCAL_MACHINEHardwareDeviceMapKEYBDDrivername注冊鍵中獲取矩陣鍵盤(pán)驅動(dòng)動(dòng)態(tài)鏈接庫(DLL)的名字。如果沒(méi)有找到入口函數,系統將使用默認名字Keybddr.dll,然后加載這個(gè)DLL文件,并且確認所需要的條目指針是否都存在;然后,系統調用PFN_KEYBD_DRIVER_INITIALIZE 函數去執行一次初始化工作。在這個(gè)函數中,模型設備驅動(dòng)程序(MDD)存儲一個(gè)輸入系統回調函數的拷貝,并且處理鍵盤(pán)中斷的中斷服務(wù)線(xiàn)程(IST)。當一個(gè)中斷信號發(fā)出時(shí),鍵盤(pán)驅動(dòng)將與轉變硬件掃描碼為虛擬按鍵碼有關(guān),并且與回調PFN_KEYBD_DRIVER_INITIALIZE_EX函數和 keybd_event API 有關(guān)[3]。
在CAYMAN開(kāi)發(fā)板中,鍵盤(pán)驅動(dòng)的動(dòng)態(tài)鏈接庫名字為KeyPad.dll,入口點(diǎn)為DllMain。通過(guò)入口函數,調用 KPControl::Initialize函數完成鍵盤(pán)時(shí)鐘、相關(guān)GPIO口和鍵盤(pán)中斷的一次性初始化。MDD還調用 KeyPdd_InitializeDriverEx函數,該函數啟動(dòng)一個(gè)線(xiàn)程處理鍵盤(pán)中斷,然后返回到輸入系統。
在CAYMAN開(kāi)發(fā)板中,鍵盤(pán)驅動(dòng)程序的中斷服務(wù)線(xiàn)程(IST)的名字是m_hevInterrupt。這個(gè)線(xiàn)程調用函數 InterruptInitialize注冊SYSINTR_KEYBOARD中斷,然后等待系統發(fā)出SYSINTR_KEYBOARD信號。系統在收到中斷信號后,中斷處理程序調用KeypdPdd_GetEventEx函數來(lái)獲取按鍵的掃描碼,然后調用ScanCodeToVKeyEx函數將掃描碼映射成虛擬碼。把從PDD返回的鍵盤(pán)事件發(fā)送到輸入系統,輸入系統對它們進(jìn)行排隊并分發(fā)給相應的應用程序。
6. KeypdPdd_GetEventEx函數
當輸入系統載入矩陣鍵盤(pán)驅動(dòng)后,由矩陣鍵盤(pán)驅動(dòng)執行一系列初始化工作,然后開(kāi)啟一個(gè)線(xiàn)程進(jìn)入鍵盤(pán)中斷主循環(huán),等待鍵盤(pán)事件的發(fā)生。一旦發(fā)生鍵盤(pán)事件,即檢測到有按鍵被按下,立即調用KeypdPdd_GetEventEx函數來(lái)獲取按鍵的掃描碼。
其中,列為矩陣掃描輸入端,行為矩陣鍵盤(pán)輸出端,當有按鍵被按下時(shí),矩陣鍵盤(pán)的相應行和列所對應的輸入輸出電平將相應地發(fā)生變化,通過(guò)矩陣鍵盤(pán)的掃描,將此值存儲于鍵盤(pán)接口自動(dòng)掃描寄存器的相應位中,然后將此數據進(jìn)行如下操作:
1) 屏蔽鍵盤(pán)自動(dòng)掃描寄存器的列數據的值,將此值存儲于C中。
1) 屏蔽鍵盤(pán)自動(dòng)掃描寄存器的行數據的值,將此值存儲于R中。
2) 將上面兩步產(chǎn)生的數據進(jìn)行或運算,所得的數據就是被按下鍵的掃描碼。
評論