新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于Windows CE的7×3手機鍵盤驅動實現

        基于Windows CE的7×3手機鍵盤驅動實現

        作者: 時間:2012-03-22 來源:網絡 收藏

        4. 驅動程序模型

        分層驅動程序由兩個獨立的層組成:上層是模型設備驅動程序(MDD),映射掃描碼到虛擬鍵的編碼上,產生與虛擬鍵編碼相關的字符,然后打包鍵盤信息,并且將此信息輸入到系統信息隊列中;下層是依賴平臺的驅動程序(PDD),它將從硬件重新獲得掃描碼。設備驅動程序服務器提供的接口(DDSI)是在PDD中實現的函數集,并由MDD調用。由于微軟提供了所有與MDD模塊相關的源代碼,所以對這部分不用做任何改動,只需將自己的PDD模塊與MDD模塊鏈結成一個公用庫即可。下圖2是驅動程序分層結構模型[2]、[3]:

        圖2驅動程序分層結構模型

        DDI函數在層實現,由用戶應用程序通過GWES子系統調用,鍵盤驅動的DDI函數有[4]:KeybdDriverGetInfo、 KeybdDriverSetMode、KeybdDriverPowerHandler、KeybdDriverInitializeEx、 KeybdDriverInitStates、KeybdDriverVKeyToUnicode、KeybdDriverMapVirtualKey。

        DDSI函數在層實現,由層調用,鍵盤驅動的DDSI函數有:KeybdPdd_PowerHandler、KeybdPdd_InitializeDriverEx、KeybdPdd_GetEventEx、DllMain。

        5. 矩陣鍵盤驅動程序運行過程

        Windows CE的輸入系統在啟動時加載矩陣鍵盤驅動程序,其加載流程如下:當輸入系統開始運行時,輸入系統將從 HKEY_LOCAL_MACHINEHardwareDeviceMapKEYBDDrivername注冊鍵中獲取矩陣鍵盤驅動動態鏈接庫(DLL)的名字。如果沒有找到入口函數,系統將使用默認名字Keybddr.dll,然后加載這個DLL文件,并且確認所需要的條目指針是否都存在;然后,系統調用PFN_KEYBD_DRIVER_INITIALIZE 函數去執行一次初始化工作。在這個函數中,模型設備驅動程序()存儲一個輸入系統回調函數的拷貝,并且處理鍵盤中斷的中斷服務線程(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函數將掃描碼映射成虛擬碼。把從返回的鍵盤事件發送到輸入系統,輸入系統對它們進行排隊并分發給相應的應用程序。

        6. KeypdPdd_GetEventEx函數

        當輸入系統載入矩陣鍵盤驅動后,由矩陣鍵盤驅動執行一系列初始化工作,然后開啟一個線程進入鍵盤中斷主循環,等待鍵盤事件的發生。一旦發生鍵盤事件,即檢測到有按鍵被按下,立即調用KeypdPdd_GetEventEx函數來獲取按鍵的掃描碼。

        其中,列為矩陣掃描輸入端,行為矩陣鍵盤輸出端,當有按鍵被按下時,矩陣鍵盤的相應行和列所對應的輸入輸出電平將相應地發生變化,通過矩陣鍵盤的掃描,將此值存儲于鍵盤接口自動掃描寄存器的相應位中,然后將此數據進行如下操作:

        1) 屏蔽鍵盤自動掃描寄存器的列數據的值,將此值存儲于C中。

        1) 屏蔽鍵盤自動掃描寄存器的行數據的值,將此值存儲于R中。

        2) 將上面兩步產生的數據進行或運算,所得的數據就是被按下鍵的掃描碼。



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 新巴尔虎左旗| 洛隆县| 上饶县| 宜宾市| 文水县| 丰县| 光泽县| 万州区| 陆河县| 高州市| 峡江县| 泰来县| 鸡泽县| 惠水县| 卢湾区| 寿阳县| 山阳县| 顺昌县| 江城| 灵璧县| 贡觉县| 永康市| 从江县| 晋州市| 泰兴市| 咸阳市| 肃宁县| 公主岭市| 洪雅县| 广州市| 理塘县| 凌云县| 台江县| 南宁市| 峨眉山市| 济源市| 遂平县| 太康县| 长春市| 库车县| 许昌县|