中文字幕 另类精品,亚洲欧美一区二区蜜桃,日本在线精品视频免费,孩交精品乱子片免费

<sup id="3hn2b"></sup>

    1. <sub id="3hn2b"><ol id="3hn2b"></ol></sub><legend id="3hn2b"></legend>

      1. <xmp id="3hn2b"></xmp>

      2. 新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > WinCE 5.0下鼠標(biāo)鍵盤驅(qū)動(dòng)分析(下)

        WinCE 5.0下鼠標(biāo)鍵盤驅(qū)動(dòng)分析(下)

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

        硬件之鼠標(biāo)(PS/2)

        鼠標(biāo)

        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 鼠標(biāo)和鍵盤履行一種雙向同步串行協(xié)議.

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

        驅(qū)動(dòng)

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

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

        所以,對于EMULATOR的鼠標(biāo)鍵盤驅(qū)動(dòng)來說,實(shí)際上由下面這些源文件構(gòu)成:

        0409 是United States 101 keyboard 標(biāo)準(zhǔn)

        OK.首先,讓我們來看看D:WINCE500PUBLICCOMMONOAKDRIVERSKEYBD目錄。

        這些目錄的各自作用是:

        l DEVICELAYOUTS: 鍵盤布局,有幾種國際標(biāo)準(zhǔn)。0409是美國101鍵標(biāo)準(zhǔn)

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

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

        l INPUTLANGS 輸入語言,與上面的DEVICELAYOUTS一致

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

        l LAYMGR 布局管理器

        l NOP 當(dāng)硬件平臺沒有鍵盤控制器時(shí),Stub keyboard PDD

        l PS2_8042 PS2_8042標(biāo)準(zhǔn)的鍵盤控制器驅(qū)動(dòng)

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

        l Keybd 一個(gè)默認(rèn)的鍵盤驅(qū)動(dòng)注冊表項(xiàng)

        l Laymgr 一個(gè)默認(rèn)的鍵盤布局注冊表項(xiàng)

        一個(gè)簡單的過程描述:

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

        Layout Manager

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

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

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

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

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

        布局管理器依據(jù)當(dāng)前設(shè)備的布局和事件將其轉(zhuǎn)換成虛擬鍵值;

        布局管理器依據(jù)當(dāng)前設(shè)備的布局和事件將重新映射;

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

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

        PDD ----Platform Dependent Driver

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

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

        源代碼分析

        Driver Code----Kbdmouse.cpp

        實(shí)現(xiàn)了KEYBD_PDD結(jié)構(gòu)中的2個(gè)函數(shù)(函數(shù)指針)PS2_EMUL_PowerHandler和PS2_EMUL_ToggleLights

        入口函數(shù):

        PS2_EMUL_Entry()

        {

        *ppKeybdPdd = PS28042Pdd; /設(shè)定鍵盤控制器是PS2 8042鍵盤控制器

        v_pp2p = new Ps2Port;

        / We always assume that there is a keyboard.

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

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

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

        if ( v_pp2p -> bMouseFound() ) /如果有鼠標(biāo)連著的話

        {

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

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

        v_pp2m -> IsrThreadStart(); /鼠標(biāo)中斷處理線程啟動(dòng)

        }

        }

        Driver Code----ps2mouse.cpp

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

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

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

        IsrThreadStart ->Ps2MouseIsrThread->IsrThreadProc

        IsrThreadProc()

        {

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

        。。。。。。

        m_pp2p -> MouseInterruptEnable();

        for ( ; ; )

        {

        wait_for_interrupt:

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

        {

        /確定鼠標(biāo)事件和位置,READ_PORT_UCHAR

        。。。。。。

        goto wait_for_interrupt;

        }

        }

        Driver Code---- Ps2keybd.cpp

        函數(shù)調(diào)用方向:IsrThreadStart ->Ps2KeybdIsrThread->IsrThreadProc

        IsrThreadProc()

        {

        /查注冊表,檢查中斷是否能使系統(tǒng)從休眠中醒來

        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操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

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




        評論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉