鍵盤驅(qū)動開發(fā)_第1頁
鍵盤驅(qū)動開發(fā)_第2頁
鍵盤驅(qū)動開發(fā)_第3頁
鍵盤驅(qū)動開發(fā)_第4頁
鍵盤驅(qū)動開發(fā)_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、鍵盤驅(qū)動開發(fā)1鍵盤驅(qū)動開發(fā)概念鍵盤驅(qū)動被分為不同的組成部分,這樣可以給開發(fā)鍵盤驅(qū)動帶來便利。一個鍵盤布局是很關(guān)鍵的,其中包括鍵的個數(shù)和鍵的配置。一些私人擁有的鍵盤使用自定義布局,并且很多鍵盤可以按照自己的喜好映射按鍵。一些鍵盤驅(qū)動需要處理能構(gòu)產(chǎn)生多個虛擬鍵的按鍵。它在小硬件平臺并且不具有所有物理按鍵的情況下是非常有用的。一些按鍵有多個函數(shù),這個驅(qū)動產(chǎn)生虛擬鍵是基于特殊物理按鍵和修改按鍵的,例如 SHIFT 和 ALT。鍵盤驅(qū)動是按照分層結(jié)構(gòu)執(zhí)行的,上層為MDD 層,映射掃描碼到虛擬鍵的編碼上,產(chǎn)生與虛擬鍵編碼相關(guān)的字符,然后打包鍵盤信息,并且將此信息輸入到系統(tǒng)信息隊列中。下層為PDD層,它將從

2、硬件重新獲得掃描碼。鍵盤驅(qū)動不同于其他設(shè)備驅(qū)動,因為他是依靠語言的,這個對虛擬鍵編碼的掃描碼和對于統(tǒng)一編碼字符傳輸?shù)奶摂M鍵編碼是依靠于鍵盤的設(shè)計語言。PFN_KEYBD_DRIVER_VKEY_TO_UNICODE函數(shù)與產(chǎn)生統(tǒng)一編碼字符相關(guān),而這個字符是基于虛擬鍵盤狀態(tài)的。這個函數(shù)只是依賴于鍵盤開發(fā)的語言;這些翻譯都是以翻譯表為基礎(chǔ)的,通常被認(rèn)為是鍵盤映射,由此你能夠定義不同的語言。如果需要,你可以建立自己的鍵盤映射或定制已經(jīng)存在的鍵盤映射。這個輸入系統(tǒng)在啟動時間加載鍵盤驅(qū)動程序。當(dāng)輸入系統(tǒng)開始運(yùn)行時,它將從HKEY_LOCAL_MACHINEHardwareDeviceMapKEYBDDri

3、vername注冊鍵中重新獲取鍵盤驅(qū)動動態(tài)鏈接庫(DLL)的名字。如果沒有找到入口,輸入系統(tǒng)將使用默認(rèn)名字Keybddr.dll。然后加載這個DLL,并且核查所有需要的入口點是否存在, 然后,這個輸入系統(tǒng)調(diào)用PFN_KEYBD_DRIVER_INITIALIZE 函數(shù)去執(zhí)行一次初始化。 在這個函數(shù)中,這個驅(qū)動保存輸入系統(tǒng)回調(diào)函數(shù)和初始化硬件, 還有為處理鍵盤中斷的中斷服務(wù)線程(IST)。當(dāng)一個中斷信號被發(fā)出時,鍵盤驅(qū)動與轉(zhuǎn)變硬件掃描碼為虛擬按鍵碼有關(guān),并且與回調(diào)PFN_KEYBD_DRIVER_INITIALIZE_EX函數(shù)和keybd_event API 有關(guān)。之后,輸入系統(tǒng)從消息隊列和回調(diào)

4、驅(qū)動PFN_KEYBD_DRIVER_VKEY_TO_UNICODE 的例程來獲取鍵盤事件, 這個驅(qū)動分析了特定的鍵盤事件和虛擬按鍵事件和產(chǎn)生相關(guān)的字符。這個輸入系統(tǒng)然后發(fā)送虛擬按鍵碼和字符到合適的應(yīng)用程序中去。這個鍵盤驅(qū)動必須加KEYBD_DEVICE_SILENT 或KEYBD_DEVICE_SILENT_REPEAT 標(biāo)志到虛擬按鍵碼或通過KEYEVENTF_SILENT 到keybd_event ,目的時為了抑制按鍵發(fā)出的嘀噠聲。PFN_KEYBD_DRIVER_GET_INFO 和 PFN_KEYBD_DRIVER_SET_MODE 函數(shù)獲取并設(shè)置關(guān)于鍵盤的信息。當(dāng)主輸入線程處理一個

5、鍵盤連接事件并通過回調(diào)函數(shù)傳到PFN_KEYBD_DRIVER_INITIALIZE_EX, 這個線程將調(diào)用 PFN_KEYBD_DRIVER_GET_INFO函數(shù),這個函數(shù)被驅(qū)動程序用于統(tǒng)一編碼并取得虛擬按鍵碼。這個線程通常為虛擬鍵狀態(tài)數(shù)據(jù)分配所需要的內(nèi)存和任何額外的所需數(shù)據(jù)。 2鍵盤接口模塊框圖本接口最多支持88的矩陣鍵盤,最多8個直接鍵和2個旋轉(zhuǎn)編碼器,這個鍵盤接口連接PXA27x處理器到矩陣鍵盤和一個帶有旋轉(zhuǎn)編碼器的直接按鍵。矩陣鍵盤和直接鍵盤能夠獨立或同時被使能處于工作狀態(tài)。鍵盤接口同時提供兩種風(fēng)格的接口,其中包括:矩陣鍵盤接口,直接鍵盤接口。矩陣鍵盤接口:支持自動和手動掃描鍵盤陣列

6、方式。并支持8針輸入和8針輸出。矩陣鍵盤掃描方式為:l 手動矩陣掃描;l 事件觸發(fā)的自動矩陣掃描;l 軟件觸發(fā)的自動矩陣掃描;直接鍵盤接口:從直接鍵和旋轉(zhuǎn)編碼器接收8個輸入信號(KP_DKIN),并將此信號存儲在鍵盤接口的直接鍵盤寄存器(KPDK)中。支持8針輸入。3鍵盤接口I/O信號描述KP_DKIN信號為來自直接鍵盤和旋轉(zhuǎn)編碼傳感器的輸入信號,其中KP_DKIN四位是說明是為直接鍵74的輸入引腳。KP_DKIN是既可以作為32的直接鍵輸入引腳信號,又可以作為旋轉(zhuǎn)編碼器1的信號。KP_DKIN是既可以作為10的直接鍵輸入引腳信號,又可以作為旋轉(zhuǎn)編碼器0的信號。KP_MKIN信號為來自矩陣鍵盤

7、的輸入信號和矩陣行所讀取的信號。KP_MKOUT為矩陣鍵盤的輸出信號。這個鍵盤接口發(fā)射掃描信號到矩陣鍵盤的每一列,并檢查是否有鍵被按下。這個輸出信號被自動掃描邏輯給驅(qū)動。4鍵盤相關(guān)寄存器描述4.1鍵盤接口控制寄存器(KPC)鍵盤接口控制寄存器指定了鍵盤的設(shè)定,它可以獨立地使能矩陣鍵盤接口(ME)和直接鍵盤接口(DE)。設(shè)置或清除DIE和MIE比特,將每個鍵盤使能或不使能中斷產(chǎn)生設(shè)置和清除旋轉(zhuǎn)編碼器的使能比特REE1和RFEE0就可以完成對直接鍵盤旋轉(zhuǎn)編碼器的使能控制;這個MKRN和MKCN比特指定了矩陣鍵盤的行和列的數(shù)目。DKN指定了直接鍵的個數(shù)。4.2鍵盤接口直接鍵寄存器(KPDK)如果直接

8、鍵被使能(KPCDE),直接鍵寄存器包含了上一個直接鍵輸入信號的讀取細(xì)節(jié);所有直接鍵的狀況被存儲在KPDK中,此寄存器只是在加電的情況下被重新設(shè)置。4.3鍵盤接口旋轉(zhuǎn)編碼器計數(shù)寄存器(KPREC)旋轉(zhuǎn)編碼器計數(shù)寄存器包含了于旋轉(zhuǎn)編碼器相關(guān)的計數(shù)器的值,設(shè)置旋轉(zhuǎn)編碼器1和旋轉(zhuǎn)編碼器0的上溢和下溢狀態(tài)及其相關(guān)的計數(shù)值。4.4鍵盤接口矩陣鍵盤寄存器(KPMK)當(dāng)最后一個手動掃描被完成后,矩陣鍵盤寄存器包含了被按在矩陣鍵盤上的鍵的行信息;當(dāng)寄存器被最后一次讀取的時候,MKP比特表明一個矩陣按鍵被按下。4.5鍵盤接口自動掃描寄存器(KPAS)自動掃描寄存器包含被單個鍵被按下時的行和列的細(xì)節(jié)信息,并且包括

9、多鍵被按下和非法數(shù)據(jù)的信息。當(dāng)鍵盤事件的時間長度長于設(shè)定的鍵的彈起時間間隔,鍵盤的自動掃描被初始化。4.6鍵盤接口自動掃描多鍵按下寄存器03(KPASMKPx)此寄存器KPASMKP0設(shè)置掃描打開,并且矩陣鍵盤的第1列和第0列所對應(yīng)的個行位置的信息。此寄存器KPASMKP1設(shè)置掃描打開,并且矩陣鍵盤的第3列和第2列所對應(yīng)的個行位置的信息。此寄存器KPASMKP2設(shè)置掃描打開,并且矩陣鍵盤的第5列和第4列所對應(yīng)的個行位置的信息。此寄存器KPASMKP3設(shè)置掃描打開,并且矩陣鍵盤的第7列和第2列所對應(yīng)行位置的信息。4.7鍵盤接口彈起間隔寄存器(KPKDI)彈起間隔寄存器存儲了直接鍵盤和矩陣鍵盤的彈

10、起間隔時間設(shè)置,此時間是以ms為單位的。5 鍵盤驅(qū)動程序結(jié)構(gòu)和相關(guān)函數(shù)介紹本部分驅(qū)動結(jié)構(gòu)是按照Platform Builder幫助文檔中所提供的驅(qū)動開發(fā)模型總結(jié)出來的文檔,是屬于一種分層開發(fā)驅(qū)動模型,但在實際開發(fā)中,有可能不使用這種以分層模式為開發(fā)結(jié)構(gòu)的開發(fā)模式,而是使用以一個主函數(shù)的形式,調(diào)用其他函數(shù),將其他具體的函數(shù)的實現(xiàn)作為主函數(shù)的庫函數(shù)加以調(diào)用。在這里首先介紹這種分層結(jié)構(gòu)驅(qū)動開發(fā)模型,然后介紹另外一種開發(fā)鍵盤驅(qū)動程序的程序結(jié)構(gòu)單片驅(qū)動程序開發(fā)模型。鍵盤驅(qū)動MDD層函數(shù):函數(shù)名描述PFN_KEYBD_DRIVER_GET_INFO這個函數(shù)重新獲取關(guān)于鍵盤和驅(qū)動的信息PFN_KEYBD_D

11、RIVER_INITIALIZE這個函數(shù)初始化鍵盤驅(qū)動(只一次)PFN_KEYBD_DRIVER_INITIALIZE_EX這個函數(shù)初始化鍵盤驅(qū)動PFN_KEYBD_DRIVER_INIT_STATES這個函數(shù)初始化虛擬鍵編碼狀態(tài)和驅(qū)動特定的狀態(tài)PFN_KEYBD_DRIVER_MAP_VIRTUAL_KEY這個函數(shù)執(zhí) MapVirtualKey的功能.它被 MapVirtualKey函數(shù)調(diào)用. PFN_KEYBD_DRIVER_POWER_HANDLER這個函數(shù)處理系統(tǒng)電源狀態(tài)改變說明PFN_KEYBD_DRIVER_SET_MODE這個函數(shù)為鍵盤驅(qū)動設(shè)置自動重復(fù)信息PFN_KEYBD_DR

12、IVER_VKEY_TO_UNICODE這個函數(shù)產(chǎn)生合適的統(tǒng)一字符和SHIFT狀態(tài)標(biāo)志為信息,目的是為了指定虛擬鍵盤編碼,鍵盤狀態(tài)陣列,和驅(qū)動狀態(tài)PFN_KEYBD_EVENT_CALLBACK這個函數(shù)是一個回調(diào)函數(shù)模型,這個模型被傳遞到 PFN_KEYBD_DRIVER_INITIALIZE 函數(shù).PFN_KEYBD_EVENT_CALLBACK_EX這個函數(shù)是一個回調(diào)函數(shù)模型,這個函數(shù)模型被傳遞到thePFN_KEYBD_DRIVER_INITIALIZE_EX 函數(shù).PFN_LAYOUT_MGR_ACTIVATE_KEYBOARD_LAYOUT這個函數(shù)使一個輸入?yún)^(qū)處于工作狀態(tài)PFN_LA

13、YOUT_MGR_GET_KEYBOARD_LAYOUT這個函數(shù)返回目前輸入?yún)^(qū)ID號PFN_LAYOUT_MGR_GET_KEYBOARD_LAYOUT_LIST這個函數(shù)用一個可用目錄的輸入?yún)^(qū)ID句柄填充一個緩存器PFN_LAYOUT_MGR_GET_KEYBOARD_LAYOUT_NAME這個函數(shù)重新得到現(xiàn)在的輸入?yún)^(qū)ID號名字PFN_LAYOUT_MGR_GET_KEYBOARD_TYPE這個函數(shù)重新得到關(guān)于目前鍵盤的信息PFN_LAYOUT_MGR_LOAD_KEYBOARD_LAYOUT這個函數(shù)在可用的設(shè)計清單中存放特定的設(shè)計鍵盤驅(qū)動PDD層函數(shù):函數(shù)名描述PFN_KEYBD_PDD_E

14、NTRY這個函數(shù)初始化鍵盤驅(qū)動的PDD層PFN_KEYBD_EVENT這個函數(shù)在鍵盤系統(tǒng)中斷信號被發(fā)送后,重新獲得鍵盤事件,它被上層調(diào)用PFN_KEYBD_PDD_TOGGLE_LIGHTS這個函數(shù)鎖定在鍵盤上的燈。PFN_KEYBD_PDD_POWER_HANDLER這個函數(shù)處理系統(tǒng)電源狀態(tài)變化,它被上層所調(diào)用6鍵盤狀態(tài)標(biāo)志信息(KEY_STATE_FLAGS)值描述KeyStateToggledFlag鍵被鎖定KeyStateGetAsyncDownFlag在最后一個GetAsyncKeyState 呼叫前,鍵被按下KeyStateReserved4保留KeyStateReserved8保

15、留KeyStateReserved10保留KeyStateReserved20保留KeyStatePrevDownFlag這個鍵先前已經(jīng)被按下KeyStateDownFlag這個鍵目前被按下,這個值是驅(qū)動的內(nèi)部值,它確定key-up 和 key-down事件.KeyStateKeyEventFlag這個值是驅(qū)動的內(nèi)部值KeyShiftAnyCtrlFlag左 CTRL 鍵 或右 CTRL 鍵被按下.KeyShiftAnyShiftFlag左 SHIFT 鍵或右 SHIFT鍵被按下.KeyShiftAnyAltFlag左 ALT 鍵或右 ALT鍵被按下. KeyShiftCapitalFlagC

16、APS LOCK 鍵被鎖定KeyShiftLeftCtrlFlag左 CTRL鍵被按下KeyShiftLeftShiftFlag左SHIFT鍵被按下KeyShiftLeftAltFlag左ALT鍵被按下KeyShiftLeftWinFlag左Windows logo 鍵被按下KeyShiftRightCtrlFlag右 CTRL鍵被按下KeyShiftRightShiftFlag右SHIFT鍵被按下KeyShiftRightAltFlag右ALT鍵被按下KeyShiftRightWinFlag右Windows logo 鍵被按下KeyShiftReserved40000保留KeyShiftDe

17、adFlag一個死特征被產(chǎn)生,他的值被KeybdDriverVKeyToUnicode函數(shù)設(shè)定KeyShiftNoCharacterFlag這里沒有為特定的虛擬鍵盤編碼事件的合法的字符產(chǎn)生,它的值被KeybdDriverVKeyToUnicode 函數(shù)設(shè)定,這個值能構(gòu)在key-up事件時被設(shè)定,或者在SHIFT狀態(tài)時,一個鍵改變KeyShiftLanguageFlag1特殊語言 SHIFT 鍵.KeyShiftKeybdEventFlag驅(qū)動的內(nèi)部值KeyShiftUseVKNullFlag驅(qū)動的內(nèi)部值KeyShiftNumLockFlag這個 NUM LOCK 鍵在鎖定狀態(tài)KeyShiftS

18、crollLockFlag這個 SCROLL LOCK鍵在鎖定狀態(tài)KeyShiftReserved400保留KeyShiftReserved200保留KeyShiftReserved100保留KeyShiftKanaFlag日本鍵盤, KANA LOCK被鎖定7單片驅(qū)動程序開發(fā)模型在CAYMAN開發(fā)板中,開發(fā)驅(qū)動是采用單片驅(qū)動程序開發(fā)模型開發(fā)的。該鍵盤驅(qū)動的文件如下圖所示:此開發(fā)模型中KeypadMain.cpp函數(shù):該函數(shù)為鍵盤驅(qū)動主函數(shù),是整個驅(qū)動開發(fā)的入口程序。KBDIST.CPP函數(shù):該函數(shù)主要實現(xiàn)KeybdDriverGetInfo:鍵盤驅(qū)動獲取信息;KeybdDriverSetMo

19、de:鍵盤驅(qū)動設(shè)置模式。KeypdIstLoop:判斷鍵盤處于循環(huán)模式KeybdDriverPowerHandler:此函數(shù)完成電源的控制KeybdDriverInitializeEx:此函數(shù)完成鍵盤的驅(qū)動初始化工作。KEYPADPHY.H函數(shù):此函數(shù)完成與鍵盤相關(guān)的寄存器定義。KEYPADPHY.C函數(shù):ReadScanCodeAutomatically:該函數(shù)完成自動讀取掃描碼功能。ReadDirectKeys:該函數(shù)完成讀取直接按鍵信息功能。XllpReadScanCode:該函數(shù)完成讀取掃描碼的功能。XllpSetUpKeyPadInterrupts:該函數(shù)設(shè)置鍵盤中斷。KeyPadG

20、pioConfigure:該函數(shù)完成鍵盤GPIO的配置。KEYPD.HPP函數(shù):該函數(shù)定義了鍵盤類,并定義了ScanCodeToVKeyEx函數(shù),AdjustVolumnTune函數(shù),VKeyToUnicodeInfo函數(shù),KeybdDriverRemapVKeyDownEx函數(shù),VKeyToScanCode函數(shù),KeybdDriverRemapVKeyUpEx函數(shù)。KEYPD.CPP函數(shù):KeypdPdd_PowerHandler:該函數(shù)主要完成鍵盤的電源操作。KeypdPdd_InitializeDriverEx:該函數(shù)完成鍵盤驅(qū)動的初始化工作。PostShellWindowMessage

21、:該函數(shù)完成獲取WINDOWS信息。KeypdPdd_GetEventEx:該函數(shù)完成鍵盤獲取事件的操作。KeypdPdd_ToggleKeyNotification:完成鍵盤鎖定鍵說明。KeypdPdd_KeyStateToggled:完成鍵盤開始鎖定。Keypd:IsrThreadProc:完成中斷服務(wù)線程處理。KeypdIsrThread:鍵盤中斷服務(wù)線程。Keypd:IsrThreadStart:中斷服務(wù)線程開始工作。Keypd:Initialize:完成鍵盤初始化.KPControl.hpp函數(shù):該函數(shù)定義了KPControl和KEYPAD_REGS的類定義。KPControl.Cp

22、p函數(shù):KPControl:KeybdDataRead: 該函數(shù)實現(xiàn)讀取鍵盤數(shù)據(jù)。FreeKeyPadRegs:該函數(shù)釋放鍵盤寄存器空間AllocKeyPadRegs:該函數(shù)完成分配寄存器空間。KPControl:Initialize:該函數(shù)完成鍵盤的初始化工作。KPControl:KeyboardInterfaceTest:該函數(shù)完成鍵盤接口測試功能。KPControl:KeyboardLights:該函數(shù)完成鍵盤燈控制。KPControl:KeypdPowerOff:該函數(shù)完成鍵盤電源關(guān)閉功能。KPControl:KeypdPowerOn:該函數(shù)完成鍵盤加電功能。SCVKENGUS1.CP

23、P函數(shù):ScanCodeToVKeyTable: 該函數(shù)完成掃描碼到虛擬鍵盤的對應(yīng)表格。MapVkeyFromSCode:該函數(shù)完成從掃描碼到虛擬按鍵的映射。AdjustVolumnTune:該函數(shù)完成音量調(diào)節(jié)功能。ScanCodeToVKeyEx:VKeyToScanCodeTable:該函數(shù)完成從虛擬按鍵到掃描碼表格的映射。VKeyToScanCode:從虛擬按鍵到掃描碼。VKRMPSIMPLE.CPP函數(shù):v_NumPadVKeyNumLockOff: 在數(shù)字鎖鍵打開后,數(shù)字鍵盤重新映射.AnyNumPadKeyDown: 檢測是否有任何數(shù)字鍵被按下KeybdDriverRemapVKeyDownEx:當(dāng)虛擬按鍵被

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論