none
请教,按键驱动 RRS feed

  • 问题

  • 这是我在PB帮助keyboard driver里看到的一段话。

    When an interrupt is signaled
    {
      the keyboard driver is responsible for
     converting the hardware scan code into a virtual-key code
     passing both to GWES through either the callback passed to PFN_KEYBD_DRIVER_INITIALIZE_EX
             or the keybd_event API
    }

    这里的both指的是什么? the callback passed to PFN_KEYBD_DRIVER_INITIALIZE_EX 怎么翻译呢?

    我的开发板带的BSP里的按键驱动是5个GPIO(映射成上下左右确定键),它用了流式驱动的方式,用了keybd_event 这个函数实现。我想知道keybd_event 这个函数是属于谁的?我这个驱动是属于单体,还是分层的PDD?

    我也尝试着看了

    1,C:\WINCE500\PUBLIC\COMMON\OAK\DRIVERS\KEYBD

    2,C:\WINCE500\PLATFORM\SMDK2410\SRC\DRIVERS\KEYBD

    下的代码。有点犯晕。

    我的总结:1下面是一个完整的分层驱动的参考(PS2_8042),包括了mdd,pdd;

                    2下面是pdd,编译时需要结合1的mdd部分。证据:KeybdIstLoop(&keybdIst),这个函数是在1的IST\keybdist.cpp实现的。

    KeybdIstLoop函数里的代码,不是很明了。它的方式属于the callback passed to PFN_KEYBD_DRIVER_INITIALIZE_EX ,还是 the keybd_event API呢?

                   

                    

     

     

    2008年10月20日 10:01

答案

  • 呵呵,只有几个GPIO按钮,是不需要写键盘驱动的,的确流式驱动是最好的解决方法。流式当然也就是单体的了。

     

    所以你看的文档,跟你的代码对不上,不应该看文档里keyboard那一块,因为你的代码只是个简单的流式。呵呵。

     

    keybd_event 是Windows CE提供的函数,用来发送一个键盘事件,你可以到msdn里查查它的详细用途。

     

     

    2008年10月20日 17:09
    版主

全部回复

  • 呵呵,只有几个GPIO按钮,是不需要写键盘驱动的,的确流式驱动是最好的解决方法。流式当然也就是单体的了。

     

    所以你看的文档,跟你的代码对不上,不应该看文档里keyboard那一块,因为你的代码只是个简单的流式。呵呵。

     

    keybd_event 是Windows CE提供的函数,用来发送一个键盘事件,你可以到msdn里查查它的详细用途。

     

     

    2008年10月20日 17:09
    版主
  • 谢谢何老师的解答。

    通过看BSP里的代码,仿照它写程序问题不大。它的逻辑比较简单,思路也清晰。

    我看文档里的代码是因为我想理解键盘驱动,日后也要写这样复杂一些的驱动,看的过程中自然会和我的BSP的代码比较,产生了一些疑惑。主要是刚开始接触驱动,尽管反复看了何老师的书,总是要在实践中体会、印证才比较深刻。

    书上讲的DDI MDD DDSI PDD,如果不看代码,在具体的驱动中什么是 DDI ,什么是 MDD 呢?

    我BSP里的流式驱动和文档里的分层驱动,按书上讲应该都要和DDI扯上关系吧。但到底如何呢?

    MDD的特性之一:对于操作系统实现DDI函数,供操作系统与驱动程序交互。

    那么在文档里的键盘驱动哪几个函数是DDI呢?

     

    2008年10月21日 0:59
  • 代码最到KeybdIstLoop,

    for (UINT iEvent = 0; iEvent < cEvents; ++iEvent) {
                (*pKeybdIst->pfnKeybdEvent)(pKeybdIst->uiPddId,
                    rguiScanCode[iEvent], rgfKeyUp[iEvent]);

    pKeybdIst->pfnKeybdEvent可以最到typedef void (*PFN_KEYBD_EVENT)(UINT uiPddId, UINT32 uiScanCode,
        BOOL fKeyDown);

    它是调用了下面这个函数。

    void
    KeybdEventCallback(
        UINT    uiPddId,
        UINT32  uiScanCode,
        BOOL    fKeyUp
        )

    但是如何扯上关系的,我还不太明白

    还会发现和KeybdEventThreadProc这个函数有关系,

    这个函数里执行了ScanCodeToVKey

    接着执行了SendRemappedEvent这个函数。

    跳到SendRemappedEvent里发现了

    keybd_event((BYTE) uiCurrVk, (BYTE) uiCurrSc, dwFlags, 0);

    由此至少知道了,这个分层驱动也用到了keybd_event。

    我的简单流式接口的按键驱动也用到它,同时注册表也加入了C:\WINCE500\PUBLIC\COMMON\OAK\DRIVERS\KEYBD下的两个*.reg文件。

    这是怎么回事,我还要继续看。

    2008年10月21日 4:10
  • KeybdDriverInitializeEx这个函数里有下面的语句。

    BOOL fNoErr = (*g_rgpfnPddEntries[uiCurrPdd])(uiCurrPdd, KeybdEventCallback, &pKeybdPddInfo->pKeybdPdd);

    第二个参数KeybdEventCallback就和PFN_KEYBD_EVENT联系起来了。

    2008年10月21日 5:12