<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è) > 嵌入式系統 > 設計應用 > WinCE 5.0下鼠標鍵盤(pán)驅動(dòng)分析(下)

WinCE 5.0下鼠標鍵盤(pán)驅動(dòng)分析(下)

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

硬件之鼠標(PS/2)

鼠標

l The standard PS/2 mouse supports the following inputs:

X (right/left) movement, Y (up/down) movement, left button, middle button, and right button.

l The mouse reads these inputs at a regular frequency and updates various counters and flags to reflect movement and button states.

l Use the same protocol as the PS/2 (AT) keyboard.

l PS/2 鼠標和鍵盤(pán)履行一種雙向同步串行協(xié)議.

l 計算機啟動(dòng)時(shí)檢測和初始化

驅動(dòng)

微軟的代碼的路徑:C:WINCE500PUBLICCOMMONOAKDRIVERSKEYBD

這里先說(shuō)下,OEM商如何根據自己的硬件來(lái)寫(xiě)自己的鼠標鍵盤(pán)驅動(dòng)。在D:WINCE500PUBLICCOMMONOAKDRIVERS目錄下的驅動(dòng)代碼都是微軟提供給OEM商的。以EMULATOR 為例,這個(gè)OEM商也提供了他們自己寫(xiě)的程序在這里:D:WINCE500PLATFORMEMULATORSRCDRIVERSKBDMOUSE。這里,微軟其實(shí)給了OEM商2種選擇:1 符合微軟標準的硬件,ok,你可以選擇使用微軟提供的驅動(dòng)(當然,也可以不用);2 自己做的硬件,當然只能自己寫(xiě)驅動(dòng)(但可以一部分調用微軟提供的庫)。

所以,對于EMULATOR的鼠標鍵盤(pán)驅動(dòng)來(lái)說(shuō),實(shí)際上由下面這些源文件構成:

0409 是United States 101 keyboard 標準

OK.首先,讓我們來(lái)看看D:WINCE500PUBLICCOMMONOAKDRIVERSKEYBD目錄。

這些目錄的各自作用是:

l DEVICELAYOUTS: 鍵盤(pán)布局,有幾種國際標準。0409是美國101鍵標準

l DLL: 產(chǎn)生AT掃描碼和空的驅動(dòng)庫,這些庫在sysgen階段被連接。

l HIDIOCTL: 沒(méi)有布局管理器時(shí),使用該驅動(dòng)

l INPUTLANGS 輸入語(yǔ)言,與上面的DEVICELAYOUTS一致

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

l LAYMGR 布局管理器

l NOP 當硬件平臺沒(méi)有鍵盤(pán)控制器時(shí),Stub keyboard PDD

l PS2_8042 PS2_8042標準的鍵盤(pán)控制器驅動(dòng)

l TEST 一個(gè)簡(jiǎn)單的測試程序

l Keybd 一個(gè)默認的鍵盤(pán)驅動(dòng)注冊表項

l Laymgr 一個(gè)默認的鍵盤(pán)布局注冊表項

一個(gè)簡(jiǎn)單的過(guò)程描述:

輸入系統(GWES)在啟動(dòng)時(shí)裝在鍵盤(pán)驅動(dòng)。首先,從HKEY_LOCAL_MACHINEHardwareDeviceMapKEYBDDrivername 注冊表項獲得dll名,如果沒(méi)有,則用默認的名字:Keybddr.dll。然后就是裝載dll, 并且確定函數進(jìn)入點(diǎn)是否存在。然后輸入系統調用函數KeybdDriverInitialize來(lái)一次性初始化驅動(dòng)。在這個(gè)函數里,驅動(dòng)在本地保存了一份輸入系統回調函數的副本以及初始化硬件和IST來(lái)處理中斷。當一個(gè)中斷信號來(lái)的時(shí)候,鍵盤(pán)驅動(dòng)負責把硬件掃描碼轉換為虛擬鍵值。然后虛擬鍵值會(huì )再發(fā)送給輸入系統。輸入系統從隊列中取出按鍵事件,然后返回到驅動(dòng)程序的函數KeybdDriverVKeyToUnicode中。驅動(dòng)程序根據分析特定的鍵事件和虛擬鍵的狀態(tài)產(chǎn)生相應的字符。輸入系統把虛擬鍵值和字符發(fā)送給合適的程序。

Layout Manager

WinCE下的驅動(dòng)從層次這角度大概可以分2種:monolithic driver 和layered driver。其實(shí)2者的區別正如他們字面意義一樣:monolithic driver單一驅動(dòng),不分層,沒(méi)有MDD和PDD之分;layered driver具有層次架構,一般都有分為MDD和PDD。這里,鼠標鍵盤(pán)驅動(dòng)就是layered driver。

這里有一個(gè)Layout Manager的概念

l 布局管理器處理掃描碼的步驟:

PDD接受到一個(gè)掃描碼;

掃描碼被送到布局管理器;

布局管理器依據當前設備的布局和事件將其轉換成虛擬鍵值;

布局管理器依據當前設備的布局和事件將重新映射;

布局管理器設置自動(dòng)重復功能,所有的鍵盤(pán)都將共享相同的自動(dòng)重復設置;

布局管理器調用函數keybd_event發(fā)送一個(gè)或多個(gè)事件。

PDD ----Platform Dependent Driver

l PDD是下層的,負責從硬件拿到掃描碼(上層的是MDD,負責將掃描碼轉換成字符).鍵盤(pán)PDD是鍵盤(pán)驅動(dòng)中與設備相關(guān)的一部分代碼。鍵盤(pán)PDD包括初始化和電源函數??梢允褂霉驳膇st,也可以包括自己的。當GWES初始化鍵盤(pán)驅動(dòng)時(shí),它初始化每一個(gè)PDD. 每個(gè)鍵盤(pán)PDD有一個(gè)函數返回關(guān)于該PDD的描述和函數指針。當布局管理器初始化這個(gè)PDD,鍵盤(pán)驅動(dòng)傳遞PDD一個(gè)唯一的標示符。有時(shí),多種設備能使用同樣的PDD,比如2個(gè)獨立的PS/2 控制器。

l 每個(gè)PDD和布局管理器在同樣的DLL里。不可以在運行時(shí)加一個(gè)PDD(但可以不同的PDD之間切換!)

源代碼分析

Driver Code----Kbdmouse.cpp

實(shí)現了KEYBD_PDD結構中的2個(gè)函數(函數指針)PS2_EMUL_PowerHandler和PS2_EMUL_ToggleLights

入口函數:

PS2_EMUL_Entry()

{

*ppKeybdPdd = PS28042Pdd; /設定鍵盤(pán)控制器是PS2 8042鍵盤(pán)控制器

v_pp2p = new Ps2Port;

/ We always assume that there is a keyboard.

v_pp2k = new Ps2Keybd; /NEW一個(gè)鍵盤(pán)

v_pp2k -> Initialize(v_pp2p) /初始化鍵盤(pán)

v_pp2k -> IsrThreadStart(); /鍵盤(pán)中斷處理線(xiàn)程啟動(dòng)

if ( v_pp2p -> bMouseFound() ) /如果有鼠標連著(zhù)的話(huà)

{

v_pp2m = new Ps2Mouse; /NEW一個(gè)鼠標

v_pp2m -> Initialize(v_pp2p) /初始化鼠標

v_pp2m -> IsrThreadStart(); /鼠標中斷處理線(xiàn)程啟動(dòng)

}

}

Driver Code----ps2mouse.cpp

實(shí)現了鼠標中斷處理線(xiàn)程,以及獲取鼠標數據(x,y,滾輪)的函數。

獲取鼠標的絕對位置GetHostMousePosition()

中斷服務(wù)線(xiàn)程實(shí)現:

IsrThreadStart ->Ps2MouseIsrThread->IsrThreadProc

IsrThreadProc()

{

/查注冊表,檢查中斷是否能使系統從休眠中醒來(lái). KernelIoControl

。。。。。。

m_pp2p -> MouseInterruptEnable();

for ( ; ; )

{

wait_for_interrupt:

if(WaitForSingleObject(m_hevInterrupt, (cBytes == 0 ? INFINITE : IN_PACKET_TIMEOUT)) == WAIT_TIMEOUT)

{

/確定鼠標事件和位置,READ_PORT_UCHAR

。。。。。。

goto wait_for_interrupt;

}

}

Driver Code---- Ps2keybd.cpp

函數調用方向:IsrThreadStart ->Ps2KeybdIsrThread->IsrThreadProc

IsrThreadProc()

{

/查注冊表,檢查中斷是否能使系統從休眠中醒來(lái)

dwStatus = RegOpenKeyEx();

if (m_pp2p->WillWake()) {

/ Ask the OAL to enable our interrupt to wake the system from suspend.

KernelIoContro();

}

m_pp2p -> KeybdInterruptEnable();

KeybdIstLoop () / KeybdIst.lib

}

Driver Code---- Keybdist.cpp

KeybdIstLoop()

{

wait_for_keybd_interrupt:

if (WaitForSingleObject(pKeybdIst->hevInterrupt, INFINITE) == WAIT_OBJECT_0)

{

....

}

goto wait_for_keybd_interrupt;

ErrorShow……

}

Source file

TARGETNAME=KbdXscXTMsEngUs1

DEFFILE=$(_COMMONOAKROOT)INCkbdmouse.def

TARGETTYPE=DYNLINK

DLLENTRY=DllMain

TARGETLIBS=

$(_COMMONSDKROOT)lib$(_CPUINDPATH)coredll.lib

$(_COMMONOAKROOT)lib$(_CPUINDPATH)ceddk.lib

$(_TARGETPLATROOT)lib$(_CPUINDPATH)drvlib.lib

SOURCELIBS=

$(_TARGETPLATROOT)lib$(_CPUINDPATH)KbdmsCommon.lib

$(_COMMONOAKROOT)lib$(_CPUINDPATH)KeybdIst.lib

$(_COMMONOAKROOT)lib$(_CPUINDPATH)PS2_AT_00000409.lib

$(_COMMONOAKROOT)lib$(_CPUINDPATH)layoutmanager.lib

$(_TARGETPLATROOT)lib$(_CPUINDPATH)kbdpddlist.lib

$(_COMMONOAKROOT)lib$(_CPUINDPATH)InputLang_0409.lib

$(_COMMONOAKROOT)lib$(_CPUINDPATH)numpadrmp.lib


linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)

p2p機相關(guān)文章:p2p原理




評論


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