日韩欧美自拍在线观看-欧美精品在线看片一区二区-高清性视频一区二区播放-欧美日韩女优制服另类-国产精品久久久久久av蜜臀-成人在线黄色av网站-肥臀熟妇一区二区三区-亚洲视频在线播放老色-在线成人激情自拍视频

WinCE 5.0硬件之鼠標(PS/2)

出處:互聯(lián)網(wǎng)    發(fā)布于:2011-09-04 12:36:49

  鼠標:

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

  計算機啟動時檢測和初始化

  驅(qū)動:

  微軟的代碼的路徑:C:\WINCE500\PUBLIC\COMMON\OAK\DRIVERS\KEYBD

  EMULATOR的鼠標鍵盤驅(qū)動由下面這些源文件構成:

  0409 是United States 101 keyboard 標準

  OK.首先,讓我們來看看D:\WINCE500\PUBLIC\COMMON\OAK\DRIVERS\KEYBD目錄。

  這些目錄的各自作用是:

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

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

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

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

  l IST 中斷服務線程

  l LAYMGR 布局管理器

  l NOP 當硬件平臺沒有鍵盤控制器時,Stub keyboard PDD

  l PS2_8042 PS2_8042標準的鍵盤控制器驅(qū)動

  l TEST 一個簡單的測試程序

  l Keybd 一個默認的鍵盤驅(qū)動注冊表項

  l Laymgr 一個默認的鍵盤布局注冊表項

  一個簡單的過程描述:

  輸入系統(tǒng)(GWES)在啟動時裝在鍵盤驅(qū)動。首先,從HKEY_LOCAL_MACHINE\Hardware\DeviceMap\KEYBD\Drivername 注冊表項獲得dll名,如果沒有,則用默認的名字:Keybddr.dll。然后就是裝載dll, 并且確定函數(shù)進入點是否存在。然后輸入系統(tǒng)調(diào)用函數(shù)KeybdDriverInitialize來性初始化驅(qū)動。在這個函數(shù)里,驅(qū)動在本地保存了一份輸入系統(tǒng)回調(diào)函數(shù)的副本以及初始化硬件和IST來處理中斷。據(jù)說FrameWork下面的Cursor.Hide()可以實現(xiàn)隱藏鼠標,由于沒有環(huán)境也沒有測試過。不過在EVC中我無意中發(fā)現(xiàn)了一個辦法可以真正實現(xiàn)鼠標的隱藏:就是用系統(tǒng)函數(shù)SetCursor(NULL);我是在窗體創(chuàng)建之前用上述函數(shù)設置了一把,編譯好測試。化化,鼠標果然沒有出現(xiàn)。

  Layout Manager

  WinCE下的驅(qū)動從層次這角度大概可以分2種:monolithic driver 和layered driver。其實2者的區(qū)別正如他們字面意義一樣:monolithic driver單一驅(qū)動,不分層,沒有MDD和PDD之分;layered driver具有層次架構,一般都有分為MDD和PDD。這里,鼠標鍵盤驅(qū)動就是layered driver。當一個中斷信號來的時候,鍵盤驅(qū)動負責把硬件掃描碼轉(zhuǎn)換為虛擬鍵值。然后虛擬鍵值會再發(fā)送給輸入系統(tǒng)。輸入系統(tǒng)從隊列中取出按鍵事件,然后返回到驅(qū)動程序的函數(shù)。

  這里有一個Layout Manager的概念

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

  PDD接受到一個掃描碼;掃描碼被送到布局管理器;布局管理器依據(jù)當前設備的布局和事件將其轉(zhuǎn)換成虛擬鍵值;布局管理器依據(jù)當前設備的布局和事件將重新映射;布局管理器設置自動重復功能,所有的鍵盤都將共享相同的自動重復設置;布局管理器調(diào)用函數(shù)keybd_event發(fā)送一個或多個事件。

  PDD ----Platform Dependent Driver

  PDD是CDM項目設計文件(英文簡稱PDD)是為CDM項目開發(fā)者提供編制CDM項目設計書的內(nèi)容指南和格式標準。項目設計文件是申請CDM項目以及項目合格性和減排量核實、核準的必要依據(jù)。項目設計文件已經(jīng)締約方會議批準,并已在網(wǎng)上頒布。項目設計文件主要內(nèi)容包括基準線的設定、項目減排額外性的論證、項目邊界的合理界定、減排量的估算以及一套監(jiān)測計劃;同時還要求項目需要事先經(jīng)項目所在地各相關方面的評估,論證該CDM項目符合并支持主辦國的可持續(xù)發(fā)展戰(zhàn)略和優(yōu)先領域,并通過項目的環(huán)境和社會影響評估。

  l PDD是下層的,負責從硬件拿到掃描碼。鍵盤PDD是鍵盤驅(qū)動中與設備相關的一部分代碼。鍵盤PDD包括初始化和電源函數(shù)。可以使用公共的ist,也可以包括自己的。當GWES初始化鍵盤驅(qū)動時,它初始化每一個PDD. 每個鍵盤PDD有一個函數(shù)返回關于該PDD的描述和函數(shù)指針。當布局管理器初始化這個PDD,鍵盤驅(qū)動傳遞PDD一個的標示符。有時,多種設備能使用同樣的PDD,比如2個獨立的PS/2 控制器。

  l 每個PDD和布局管理器在同樣的DLL里。不可以在運行時加一個PDD

  源代碼分析

  Driver Code----Kbdmouse.cpp

  實現(xiàn)了KEYBD_PDD結構中的2個函數(shù)PS2_EMUL_PowerHandler和PS2_EMUL_ToggleLights

  入口函數(shù):

  PS2_EMUL_Entry()

  {

  *ppKeybdPdd = &PS28042Pdd;

  v_pp2p = new Ps2Port;

  v_pp2k = new Ps2Keybd;

  v_pp2k -> Initialize(v_pp2p)

  v_pp2k -> IsrThreadStart();

  if ( v_pp2p -> bMouseFound() )

  {

  v_pp2m = new Ps2Mouse;

  v_pp2m -> Initialize(v_pp2p)

  v_pp2m -> IsrThreadStart();}

  }

  Driver Code----ps2mouse.cpp

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

  獲取鼠標的位置GetHostMousePosition()

  中斷服務線程實現(xiàn):

  IsrThreadStart ->Ps2MouseIsrThread->IsrThreadProc

  IsrThreadProc()

  {

  m_pp2p -> MouseInterruptEnable();

  for ( ; ; )

  {

  wait_for_interrupt:

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

  {

  goto wait_for_interrupt;

  }

  }

  Driver Code---- Ps2keybd.cpp

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

  IsrThreadProc()

  {

  dwStatus = RegOpenKeyEx();

  if (m_pp2p->WillWake()) {

  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)\INC\kbdmouse.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


  

版權與免責聲明

凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://hbjingang.com,違反者本網(wǎng)將追究相關法律責任。

本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內(nèi)容的真實性,不承擔此類作品侵權行為的直接責任及連帶責任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉(zhuǎn)載時,必須保留本網(wǎng)注明的作品出處,并自負版權等法律責任。

如涉及作品內(nèi)容、版權等問題,請在作品發(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關權利。

廣告
OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機號碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線人工客服

買家服務:
賣家服務:
技術客服:

0571-85317607

網(wǎng)站技術支持

13606545031

客服在線時間周一至周五
9:00-17:30

關注官方微信號,
第一時間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫提出的寶貴意見,您的參與是維庫提升服務的動力!意見一經(jīng)采納,將有感恩紅包奉上哦!