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

时间:2011-09-04

  鼠标:

  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 鼠标和键盘履行一种双向同步串行协议。

  计算机启动时检测和初始化

  驱动:

  微软的代码的路径:C:\WINCE500\PUBLIC\COMMON\OAK\DRIVERS\KEYBD

  EMULATOR的鼠标键盘驱动由下面这些源文件构成:

  0409 是United States 101 keyboard 标准

  OK.首先,让我们来看看D:\WINCE500\PUBLIC\COMMON\OAK\DRIVERS\KEYBD目录。

  这些目录的各自作用是:

  l DEVICELAYOUTS: 键盘布局,有几种国际标准。0409是美国101键标准

  l DLL: 产生AT扫描码和空的驱动库,这些库在sysgen阶段被连接。

  l HIDIOCTL: 没有布局管理器时,使用该驱动

  l INPUTLANGS 输入语言,与上面的DEVICELAYOUTS一致

  l IST 中断服务线程

  l LAYMGR 布局管理器

  l NOP 当硬件平台没有键盘控制器时,Stub keyboard PDD

  l PS2_8042 PS2_8042标准的键盘控制器驱动

  l TEST 一个简单的测试程序

  l Keybd 一个默认的键盘驱动注册表项

  l Laymgr 一个默认的键盘布局注册表项

  一个简单的过程描述:

  输入系统(GWES)在启动时装在键盘驱动。首先,从HKEY_LOCAL_MACHINE\Hardware\DeviceMap\KEYBD\Drivername 注册表项获得dll名,如果没有,则用默认的名字:Keybddr.dll。然后就是装载dll, 并且确定函数进入点是否存在。然后输入系统调用函数KeybdDriverInitialize来性初始化驱动。在这个函数里,驱动在本地保存了一份输入系统回调函数的副本以及初始化硬件和IST来处理中断。据说FrameWork下面的Cursor.Hide()可以实现隐藏鼠标,由于没有环境也没有测试过。不过在EVC中我无意中发现了一个办法可以真正实现鼠标的隐藏:就是用系统函数SetCursor(NULL);我是在窗体创建之前用上述函数设置了一把,编译好测试。化化,鼠标果然没有出现。

  Layout Manager

  WinCE下的驱动从层次这角度大概可以分2种:monolithic driver 和layered driver。其实2者的区别正如他们字面意义一样:monolithic driver单一驱动,不分层,没有MDD和PDD之分;layered driver具有层次架构,一般都有分为MDD和PDD。这里,鼠标键盘驱动就是layered driver。当一个中断信号来的时候,键盘驱动负责把硬件扫描码转换为虚拟键值。然后虚拟键值会再发送给输入系统。输入系统从队列中取出按键事件,然后返回到驱动程序的函数。

  这里有一个Layout Manager的概念

  l 布局管理器处理扫描码的步骤:

  PDD接受到一个扫描码;扫描码被送到布局管理器;布局管理器依据当前设备的布局和事件将其转换成虚拟键值;布局管理器依据当前设备的布局和事件将重新映射;布局管理器设置自动重复功能,所有的键盘都将共享相同的自动重复设置;布局管理器调用函数keybd_event发送一个或多个事件。

  PDD ----Platform Dependent Driver

  PDD是CDM项目设计文件(英文简称PDD)是为CDM项目开发者提供编制CDM项目设计书的内容指南和格式标准。项目设计文件是申请CDM项目以及项目合格性和减排量核实、核准的必要依据。项目设计文件已经缔约方会议批准,并已在网上颁布。项目设计文件主要内容包括基准线的设定、项目减排额外性的论证、项目边界的合理界定、减排量的估算以及一套监测计划;同时还要求项目需要事先经项目所在地各相关方面的评估,论证该CDM项目符合并支持主办国的可持续发展战略和优先领域,并通过项目的环境和社会影响评估。

  l PDD是下层的,负责从硬件拿到扫描码。键盘PDD是键盘驱动中与设备相关的一部分代码。键盘PDD包括初始化和电源函数。可以使用公共的ist,也可以包括自己的。当GWES初始化键盘驱动时,它初始化每一个PDD. 每个键盘PDD有一个函数返回关于该PDD的描述和函数指针。当布局管理器初始化这个PDD,键盘驱动传递PDD一个的标示符。有时,多种设备能使用同样的PDD,比如2个独立的PS/2 控制器。

  l 每个PDD和布局管理器在同样的DLL里。不可以在运行时加一个PDD

  源代码分析

  Driver Code----Kbdmouse.cpp

  实现了KEYBD_PDD结构中的2个函数PS2_EMUL_PowerHandler和PS2_EMUL_ToggleLights

  入口函数:

  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

  实现了鼠标中断处理线程,以及获取鼠标数据(x,y,滚轮)的函数。

  获取鼠标的位置GetHostMousePosition()

  中断服务线程实现:

  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

  函数调用方向: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


  
上一篇:介绍Windows CE开发初步知识
下一篇:分析Linux init进程

免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

相关技术资料