<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設備矩陣鍵盤(pán)開(kāi)發(fā)總結

Windows CE設備矩陣鍵盤(pán)開(kāi)發(fā)總結

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

嵌入式移動(dòng)的應用越來(lái)越廣,以其體積小、重量輕、便于攜帶等特點(diǎn)而備受青睞。是一種最為普遍使用的輸入工具,但嵌入式移動(dòng)因其體積小的特點(diǎn)決定了它的不大可能采用普通PC機上的標準,因而大多數采用鍵數相對較少的鍵盤(pán)。

本文引用地址:http://dyxdggzs.com/article/148556.htm

利用鍵盤(pán)用戶(hù)可以很方便的實(shí)現對嵌入式移動(dòng)進(jìn)行相應的操作,是極方便的人機交互設備。隨著(zhù)微軟的嵌入式操作系統 的普及, 鍵盤(pán)得到了越來(lái)越多者的重視,本文與大家分享我在矩陣鍵盤(pán)的一些。

1. 驅動(dòng)分類(lèi)

Windows CE提供了許多用于開(kāi)發(fā)設備驅動(dòng)的模型,這些驅動(dòng)程序模型使得Windows CE 能適應大部分的內部和外圍設備。因此,在深入探討Windows CE矩陣鍵盤(pán)驅動(dòng)程序之前,先了解在WinCE平臺上使用的兩種設備:內建設備和可安裝設備。因此,從驅動(dòng)加載方式來(lái)看WinCE可分為本機設備驅動(dòng)(Built-In Driver)、可加載驅動(dòng)(LOAdable Driver)。

本機設備驅動(dòng)即NaTIve Device Drivers,WinCE設計成可直接使用內建設備,這些設備由本機驅動(dòng)過(guò)程控制。本機驅動(dòng)程序是與WinCE的核心組件緊密相連,這些驅動(dòng)對應的設備通常在系統啟動(dòng)時(shí),在GWES的進(jìn)程空間內被加載,因此它們不是以獨立的DLL形式存在??杉虞d設備是指可與平臺連接和分離的第三方接口設備,可由用戶(hù)隨時(shí)安裝和卸載這些驅動(dòng),可以在系統啟動(dòng)時(shí)或者和啟動(dòng)后的任何時(shí)候由設備管理器動(dòng)態(tài)加載。通常這類(lèi)驅動(dòng)是以DLL動(dòng)態(tài)鏈接庫的形式存在,系統加載后這些驅動(dòng)程序是以用戶(hù)態(tài)的角色運行,這種外圍設備的驅動(dòng)也被稱(chēng)為流驅動(dòng)。

兩者的差別在于它們提供的編程接口不同:本地設備驅動(dòng)可以根據具體設備的需求提供本機的相應接口;而流接口驅動(dòng)則是提供一組通用接口即流接口函數,應用程序可以通過(guò)流接口提供的接口函數來(lái)訪(fǎng)問(wèn)外圍設備。

2.嵌入式矩陣鍵盤(pán)驅動(dòng)原理

嵌入式設備上的鍵盤(pán)受設備本身體積影響,鍵盤(pán)設計大多數采用矩陣形式。支持Windows CE系統的CPU有很多種,不同CPU之間矩陣鍵盤(pán)硬件設計也不盡相同。因此,鍵盤(pán)可以按照自定義布局,并且可以按照自己的喜好映射按鍵,從而實(shí)現按鍵的不同功能,包括按鍵的個(gè)數、布局及按鍵功能的配置。

(1)矩陣鍵盤(pán)驅動(dòng)核心是中斷處理

矩陣鍵盤(pán)一般是采用中斷方式,因此矩陣鍵盤(pán)驅動(dòng)首先要在OAL層加入中斷源。簡(jiǎn)單的說(shuō),矩陣鍵盤(pán)驅動(dòng)的主要作用就是實(shí)時(shí)監測外部按鍵中斷,一旦發(fā)現外部有鍵按下就向內核發(fā)送鍵盤(pán)消息實(shí)現鍵盤(pán)輸入功能。這時(shí)鍵盤(pán)驅動(dòng)會(huì )創(chuàng )建中斷服務(wù)線(xiàn)程和鍵盤(pán)中斷事件,每個(gè)按鍵對應一個(gè)鍵盤(pán)中斷事件。因此,矩陣鍵盤(pán)驅動(dòng)的設計核心就是鍵盤(pán)中斷處理的設計。

(2)中斷服務(wù)例程(ISR)

矩陣鍵盤(pán)作為輸入設備一般以默認的頻率掃描鍵盤(pán),當有按鍵被按下時(shí),通過(guò)掃描鍵盤(pán)并生成相應的掃描碼,并通過(guò)處理器中的中斷產(chǎn)生器產(chǎn)生一個(gè)中斷信號,這時(shí)內核會(huì )進(jìn)入異常中斷處理程序,由它屏蔽所有中斷,再調用中斷服務(wù)例程ISR得到該中斷的邏輯中斷標識。然后,中斷服務(wù)例程把得到對應的中斷標識符報告給系統任務(wù)調度進(jìn)程,同時(shí)產(chǎn)生鍵盤(pán)中斷事件,鍵盤(pán)中斷服務(wù)線(xiàn)程響應鍵盤(pán)中斷事件,開(kāi)始掃描矩陣鍵盤(pán)。然后,再通過(guò)這個(gè)中斷信號控制相應的程序獲取與之相對應的虛擬碼,最后此虛擬碼由上層調用,實(shí)現按下此鍵的相應功能。鑒于ISR的任務(wù)比較單一,ISR通常都要求越短、越快越好。

(3)中斷服務(wù)線(xiàn)程(IST)

中斷服務(wù)例程以鍵盤(pán)中斷的邏輯中斷標識符形式返回給系統任務(wù)調度進(jìn)程,中斷服務(wù)線(xiàn)程則在矩陣鍵盤(pán)驅動(dòng)中負責具體中斷處理。因此,矩陣鍵盤(pán)驅動(dòng)的中斷事件HANDLE hKEYEvents要分別對應矩陣鍵盤(pán)產(chǎn)生的中斷。一般來(lái)說(shuō),中斷服務(wù)例程較小,并且只做很少的處理工作,中斷服務(wù)線(xiàn)程就必須完成大多數中斷處理工作,包括響應中斷、掃描按鍵位置、發(fā)送鍵盤(pán)消息等。

例如,在矩陣鍵盤(pán)驅動(dòng)IST中會(huì )先調用CreateEvent函數創(chuàng )建事件對象,接著(zhù)調用系統函數InterruptInitiALIze完成中斷。完成這些初始化工作后,接著(zhù)調用 WaitForMultipleObjects (hKEYEvents)函數進(jìn)入鍵盤(pán)事件的等待隊列中。最后,當有事件被捕獲后,根據不同的事件類(lèi)型進(jìn)入不同的鍵盤(pán)掃描處理程序。

3.矩陣鍵盤(pán)驅動(dòng)程序的設計和實(shí)現

(1)矩陣鍵盤(pán)驅動(dòng)程序模型

Windows CE的最大好處是具有可定制性,當它自帶的驅動(dòng)程序不能滿(mǎn)足用戶(hù)的要求時(shí),用戶(hù)可以自己編寫(xiě)相應的驅動(dòng)程序。Windows CE一般可以分為獨立驅動(dòng)和層次型驅動(dòng)兩類(lèi)。獨立驅動(dòng)程序是指將驅動(dòng)程序編寫(xiě)成同時(shí)包含Model Device Driver(MDD)和Platform. Dependent Driver(PDD)的獨立驅動(dòng)。層次型驅動(dòng)是指分為兩層,較上層的MDD和比較下層的PDD。其中MDD實(shí)現的是和平臺無(wú)關(guān)的功能,它描述了一個(gè)通用的驅動(dòng)程序框架;而PDD是和硬件以及平臺相關(guān)的代碼組成,MDD調用PDD中特定的接口來(lái)獲取硬件相關(guān)的信息。

矩陣鍵盤(pán)驅動(dòng)一般是層次型的,故驅動(dòng)程序由兩個(gè)獨立的層組成:上層是模型設備驅動(dòng)程序(MDD),映射矩陣鍵盤(pán)掃描碼到虛擬鍵的編碼上,產(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è)公用庫即可。

矩陣鍵盤(pán)驅動(dòng)DDI函數是在MDD層實(shí)現,由用戶(hù)應用程序通過(guò)GWES子系統調用。其中DDI函數有:KeybdDriverGetInfo、KeybdDriverSetMode、KeybdDriverPowerHandler、KeybdDriverInitializeEx、KeybdDriverInitStates、KeybdDriverVKeyToUnicode、KeybdDriverMapVirtualKey。而DDSI函數是在PDD層實(shí)現,由MDD層調用。DDSI函數有:KeybdPdd_PowerHandler、KeybdPdd_InitializeDriverEx、KeybdPdd_GetEventEx、DllMain。

(2)矩陣鍵盤(pán)驅動(dòng)的接口函數

流接口驅動(dòng)程序的主要任務(wù)就是把外設的使用傳遞給應用程序,是通過(guò)把設備表示為文件系統的一個(gè)特殊文件來(lái)實(shí)現的,每個(gè)流接口的驅動(dòng)程序都必須實(shí)現一組標準的接口函數。由于矩陣鍵盤(pán)驅動(dòng)采用了流驅動(dòng)模式設計,故矩陣鍵盤(pán)驅動(dòng)使用標準的流驅動(dòng)接口函數,也稱(chēng)為矩陣鍵盤(pán)驅動(dòng)的DLL接口。

但因為矩陣鍵盤(pán)作為一種輸入設備與其他外圍設備有很大的區別,應用層不能對其發(fā)布命令來(lái)操作它。所以,一般流驅動(dòng)接口函數中對設備進(jìn)行操作的接口函數在矩陣鍵盤(pán)驅動(dòng)中只是作了保留,并未有實(shí)質(zhì)性的功能。其中,矩陣鍵盤(pán)接口函數中比較重要的有PWR_Init、PWR_DllEntry、KeypdPdd_GetEventEx、KeypdPdd_GetEventEx、ScanCodeToVKeyEx等。

(3)矩陣鍵盤(pán)驅動(dòng)加載過(guò)程

Windows CE系統運行時(shí)會(huì )默認啟動(dòng)DEVICE.EXE進(jìn)程。DEVICE.EXE負責加載所有流驅動(dòng),進(jìn)程對流驅動(dòng)的加載是通過(guò)注冊表列舉器(RegEnum.dll)來(lái)實(shí)現。矩陣鍵盤(pán)的資源信息由OEM適配層(OAL)記錄在注冊表中,RegEnum.dll是通過(guò)掃描注冊表項 HKEYLOCALMACHINEDriversBuiltInPWRBUTTON下的鍵值對矩陣鍵盤(pán)進(jìn)行初始化的。

因此,WinCE輸入系統(GWES)會(huì )在啟動(dòng)時(shí)裝載鍵盤(pán)驅動(dòng),輸入系統將從HKEY_LOCAL_MACHINEHardwareDeviceMapKEYBDDrivername注冊鍵中獲取矩陣鍵盤(pán)驅動(dòng)動(dòng)態(tài)鏈接庫(DLL)的名字。如果沒(méi)有找到入口函數,系統將使用默認名字Keybddr.dll,然后加載這個(gè)DLL文件,并且確認所需要的條目指針是否都存在。然后,系統調用PFN_KEYBD_DRIVER_INITIALIZE 函數執行初始化工作。這時(shí),模型設備驅動(dòng)程序(MDD)會(huì )在本地保存復制的一份輸入系統回調函數的副本以及初始化硬件和IST來(lái)處理中斷。

當一個(gè)中斷信號來(lái)的時(shí)候,鍵盤(pán)驅動(dòng)負責把硬件掃描碼轉換為虛擬鍵值,然后虛擬鍵值會(huì )再發(fā)送給輸入系統。輸入系統從隊列中取出按鍵事件,然后返回到驅動(dòng)程序的函數KeybdDriverVKeyToUnicode中。驅動(dòng)程序根據分析特定的鍵事件和虛擬鍵的狀態(tài)產(chǎn)生相應的字符。最后,輸入系統把虛擬鍵值和字符發(fā)送給合適的程序。

例如,在我所用的CAYMAN開(kāi)發(fā)板中,鍵盤(pán)驅動(dòng)的動(dòng)態(tài)鏈接庫名字為KeyPad.dll,入口點(diǎn)為DllMain,中斷服務(wù)線(xiàn)程(IST)的名字是m_hevInterrupt。這個(gè)線(xiàn)程調用函數InterruptInitialize注冊SYSINTR_KEYBOARD中斷,然后等待系統發(fā)出SYSINTR_KEYBOARD信號。系統在收到中斷信號后,中斷處理程序調用KeypdPdd_GetEventEx函數來(lái)獲取按鍵的掃描碼,然后再調用ScanCodeToVKeyEx函數將掃描碼映射成虛擬碼,把從PDD返回的鍵盤(pán)事件發(fā)送到輸入系統,輸入系統進(jìn)行排隊并分發(fā)給相應的應用程序。

一般來(lái)說(shuō),對于Windows CE特殊布局的按鍵式矩陣鍵盤(pán)來(lái)說(shuō),使用流接口驅動(dòng)模式能快速有效的進(jìn)行開(kāi)發(fā)。因為可以盡量使用微軟提供的樣板程序,只需修改相應的硬件相關(guān)代碼就能大大縮短開(kāi)發(fā)流程,而且可以提高鍵盤(pán)驅動(dòng)程序的可靠性。

DIY機械鍵盤(pán)相關(guān)社區:機械鍵盤(pán)DIY




評論


相關(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>