Windows CE設(shè)備小巧玲瓏 矩陣鍵盤開發(fā)大有乾坤
但因?yàn)榫仃囨I盤作為一種輸入設(shè)備與其他外圍設(shè)備有很大的區(qū)別,應(yīng)用層不能對(duì)其發(fā)布命令來(lái)操作它。所以,一般流驅(qū)動(dòng)接口函數(shù)中對(duì)設(shè)備進(jìn)行操作的接口函數(shù)在矩陣鍵盤驅(qū)動(dòng)中只是作了保留,并未有實(shí)質(zhì)性的功能。其中,矩陣鍵盤接口函數(shù)中比較重要的有PWR_Init、PWR_DllEntry、KeypdPdd_GetEventEx、KeypdPdd_GetEventEx、ScanCodeToVKeyEx等。
(3)矩陣鍵盤驅(qū)動(dòng)加載過(guò)程
Windows CE系統(tǒng)運(yùn)行時(shí)會(huì)默認(rèn)啟動(dòng)DEVICE.EXE進(jìn)程。DEVICE.EXE負(fù)責(zé)加載所有流驅(qū)動(dòng),進(jìn)程對(duì)流驅(qū)動(dòng)的加載是通過(guò)注冊(cè)表列舉器(RegEnum.dll)來(lái)實(shí)現(xiàn)。矩陣鍵盤的資源信息由OEM適配層(OAL)記錄在注冊(cè)表中,RegEnum.dll是通過(guò)掃描注冊(cè)表項(xiàng) HKEYLOCALMACHINEDriversBuiltInPWRBUTTON下的鍵值對(duì)矩陣鍵盤進(jìn)行初始化的。
因此,WinCE輸入系統(tǒng)(GWES)會(huì)在啟動(dòng)時(shí)裝載鍵盤驅(qū)動(dòng),輸入系統(tǒng)將從HKEY_LOCAL_MACHINEHardwareDeviceMapKEYBDDrivername注冊(cè)鍵中獲取矩陣鍵盤驅(qū)動(dòng)動(dòng)態(tài)鏈接庫(kù)(DLL)的名字。如果沒(méi)有找到入口函數(shù),系統(tǒng)將使用默認(rèn)名字Keybddr.dll,然后加載這個(gè)DLL文件,并且確認(rèn)所需要的條目指針是否都存在。然后,系統(tǒng)調(diào)用PFN_KEYBD_DRIVER_INITIALIZE 函數(shù)執(zhí)行初始化工作。這時(shí),模型設(shè)備驅(qū)動(dòng)程序(MDD)會(huì)在本地保存復(fù)制的一份輸入系統(tǒng)回調(diào)函數(shù)的副本以及初始化硬件和IST來(lái)處理中斷。
當(dāng)一個(gè)中斷信號(hào)來(lái)的時(shí)候,鍵盤驅(qū)動(dòng)負(fù)責(zé)把硬件掃描碼轉(zhuǎn)換為虛擬鍵值,然后虛擬鍵值會(huì)再發(fā)送給輸入系統(tǒng)。輸入系統(tǒng)從隊(duì)列中取出按鍵事件,然后返回到驅(qū)動(dòng)程序的函數(shù)KeybdDriverVKeyToUnicode中。驅(qū)動(dòng)程序根據(jù)分析特定的鍵事件和虛擬鍵的狀態(tài)產(chǎn)生相應(yīng)的字符。最后,輸入系統(tǒng)把虛擬鍵值和字符發(fā)送給合適的程序。
例如,在我所用的CAYMAN開發(fā)板中,鍵盤驅(qū)動(dòng)的動(dòng)態(tài)鏈接庫(kù)名字為KeyPad.dll,入口點(diǎn)為DllMain,中斷服務(wù)線程(IST)的名字是m_hevInterrupt。這個(gè)線程調(diào)用函數(shù)InterruptInitialize注冊(cè)SYSINTR_KEYBOARD中斷,然后等待系統(tǒng)發(fā)出SYSINTR_KEYBOARD信號(hào)。系統(tǒng)在收到中斷信號(hào)后,中斷處理程序調(diào)用KeypdPdd_GetEventEx函數(shù)來(lái)獲取按鍵的掃描碼,然后再調(diào)用ScanCodeToVKeyEx函數(shù)將掃描碼映射成虛擬碼,把從PDD返回的鍵盤事件發(fā)送到輸入系統(tǒng),輸入系統(tǒng)進(jìn)行排隊(duì)并分發(fā)給相應(yīng)的應(yīng)用程序。
一般來(lái)說(shuō),對(duì)于Windows CE特殊布局的按鍵式矩陣鍵盤來(lái)說(shuō),使用流接口驅(qū)動(dòng)模式能快速有效的進(jìn)行開發(fā)。因?yàn)榭梢员M量使用微軟提供的樣板程序,只需修改相應(yīng)的硬件相關(guān)代碼就能大大縮短開發(fā)流程,而且可以提高鍵盤驅(qū)動(dòng)程序的可靠性。
評(píng)論