WinCE 5.0下鼠标键盘驱动分析 续2

 

Driver Code----Kbdmouse.cpp

实现了KEYBD_PDD结构中的2个函数(函数指针)PS2_EMUL_PowerHandler和PS2_EMUL_ToggleLights

入口函数:

         PS2_EMUL_Entry()

{

*ppKeybdPdd = &PS28042Pdd;                    //设定键盘控制器是PS2 8042键盘控制器

v_pp2p = new Ps2Port;

// We always assume that there is a keyboard.

v_pp2k = new Ps2Keybd;                                //NEW一个键盘

v_pp2k -> Initialize(v_pp2p)                           //初始化键盘

v_pp2k -> IsrThreadStart();                    //键盘中断处理线程启动

if ( v_pp2p -> bMouseFound() )                      //如果有鼠标连着的话

{

  v_pp2m = new Ps2Mouse;                           //NEW一个鼠标

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

  v_pp2m -> IsrThreadStart();                        //鼠标中断处理线程启动

}

}

       

Driver Code----ps2mouse.cpp

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

获取鼠标的绝对位置GetHostMousePosition()

中断服务线程实现:

IsrThreadStart ->Ps2MouseIsrThread->IsrThreadProc

IsrThreadProc()

{

//查注册表,检查中断是否能使系统从休眠中醒来. 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()

{

         //查注册表,检查中断是否能使系统从休眠中醒来

         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)/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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值