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