<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于Windows CE的7×3手機鍵盤(pán)驅動(dòng)實(shí)現

基于Windows CE的7×3手機鍵盤(pán)驅動(dòng)實(shí)現

作者: 時(shí)間:2012-03-22 來(lái)源:網(wǎng)絡(luò ) 收藏

4. 驅動(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是驅動(dòng)程序分層結構模型[2]、[3]:

圖2驅動(dòng)程序分層結構模型

DDI函數在層實(shí)現,由用戶(hù)應用程序通過(guò)GWES子系統調用,鍵盤(pán)驅動(dòng)的DDI函數有[4]:KeybdDriverGetInfo、 KeybdDriverSetMode、KeybdDriverPowerHandler、KeybdDriverInitializeEx、 KeybdDriverInitStates、KeybdDriverVKeyToUnicode、KeybdDriverMapVirtualKey。

DDSI函數在層實(shí)現,由層調用,鍵盤(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)程序()存儲一個(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函數將掃描碼映射成虛擬碼。把從返回的鍵盤(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)行或運算,所得的數據就是被按下鍵的掃描碼。



關(guān)鍵詞: 矩陣鍵盤(pán) WindowsCE MDD PDD

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>