zoukankan      html  css  js  c++  java
  • Keyboard驱动中button中断的处理机制

    Keyboard驱动中button中断的处理机制

     

    ********************************LoongEmbedded************************

    作者:LoongEmbedded(kandi)

    时间:2011.05.015

    类别:WINCE驱动开发

    ********************************LoongEmbedded************************

     

    备注:本博文基于Real6410开发板的BSP,这里按键的处理部分是作为keyboard驱动的一部分的。

     

    1.  硬件设计

    1

     

    2.  文件架构

    2.1 KeypadMDD

     

    MDD层的入口函数DllMain()

     

    PUBLIC/COMMON/OAK/DRIVERS/KEYBD/LAYMGR

    生成:Layout_Manager.lib

    源文件:

    LayMgr.cpp /

        Zones.cpp  /

        profiler.cpp  /

     

    PUBLIC/COMMON/OAK/DRIVERS/KEYBD/NOP/PDD

    生成:Nop_KbdCommon.lib

    源文件:NopKbd.cpp

     

    PUBLIC/COMMON/OAK/DRIVERS/KEYBD/DEVICELAYOUTS/REMAP/NUMPADRMP

    生成:NumPadRmp.lib

    源文件:NumPadRmp.cpp

     

    2.2KeypadPDD

    PDD层的入口点

    2

     

    KEYBD/KeyUserDef

    生成KeyPadCommon.lib

    源文件:keymatrix.cpp /

        KBD.cpp /

    Power.s /

     

    KEYBD/Matrix_0409

    生成S3C6410_Layout.lib

    源文件s3c6410_layout.cpp

     

    KEYBD/PddList

    生成PddList.lib

    源文件:PddList.cpp

     

    KEYBD/kbds3c6410

    生成smdk6410_keypad.dll,此dll的入口函数是DllMain(),此dll需要连接一些lib,如下:

    SOURCELIBS=/

        $(_TARGETPLATROOT)/lib/$(_CPUINDPATH)/S3C6410_Layout.lib /

        $(_TARGETPLATROOT)/lib/$(_CPUINDPATH)/KeyPadcommon.lib /

        $(_TARGETPLATROOT)/lib/$(_CPUINDPATH)/PddList.lib /

        $(_COMMONOAKROOT)/lib/$(_CPUINDPATH)/LayoutManager.lib /

        $(_COMMONOAKROOT)/lib/$(_CPUINDPATH)/Nop_KbdCommon.lib /

        $(_COMMONOAKROOT)/lib/$(_CPUINDPATH)/NumPadRmp.lib

     

     

    3.  驱动工作流程

    3.1 keyboard驱动的加载过程

    系统启动过程中,GWES根据注册表HKEY_LOCAL_MACHINE/Hardware/DeviceMap/KEYBD 下的”Drivername”下去获取Keyboard Driver的名字,如果没找到,则使用默认的名字Keybddr.dll,此系统中keyboard驱动的PDD层的laymgr.reg内容如下:

    3

    然后GWES会去验证Keyboard Driver的导出接口是否存在,见图4,接下来去调用导出函数KeybdDriverInitializeEx(),对Keyboard Driver进行初始

    化。

    3.2 smdk6410_keypad.dll的导出函数

    4

    上面这些函数的定义及实现是在MDD层的PUBLIC/COMMON/OAK/DRIVERS/KEYBD中实现的,那为什么Pdd层最终导出的smdk6410_keypad.dll可以编译通过呢?是因为此dll包含了实现这些函数的lib

     

    3.3MDD层和pdd层的交互

    这里只是介绍本设计中按键驱动的部分,不是键盘驱动部分,系统会调用KeybdDriverInitializeEx函数,此函数主要用于初始化每个PDD的内容,调用图2g_rgpfnPddEntries数组来调用PDD的入口函数。从理论上,Layout Manager可以管理多个PDD层,这些PDD层会组成一个链表,而全局变量g_rgpfnPddEntries就是好来表示所有PDD层的入口。其中按键处理的入口函数Matrix_Entry函数,下面就来看看这个函数的工作流程,如下图所示

     

    5

    Matrix_Entry函数体如下所示:

    6

    3.3.1  KeybdDriverInitializeAddresses

    7

    其中const DWORD Key_IRQ[10] = { IRQ_EINT0,IRQ_EINT1,IRQ_EINT2,IRQ_EINT5,IRQ_EINT9,IRQ_EINT10,IRQ_EINT11,IRQ_EINT16,IRQ_EINT17,IRQ_EINT20};

     

    3.3.2  IsrThreadStart

    这个函数会创建按键处理的IST函数KBDISRThread,而KBDISRThread函数通过调用KeyMatrix::IsrThreadProc()来完成,KeyMatrix::IsrThreadProc函数体如下

    8

    下面就继续分析KeyIOInitGetKeyValue函数

    KeyIOInit函数

    9

    GetKeyValue函数

    先看此函数体的第一部分

    10

    接着看GetKeyValue函数的后面部分

    11

     

    参考链接:

    Keyboard驱动介绍

    http://blog.csdn.net/guopeixin/archive/2009/11/10/4792370.aspx

     

     

  • 相关阅读:
    AVR开发 Arduino方法(六) 内存子系统
    AVR开发 Arduino方法(五) 模数转换子系统
    AVR开发 Arduino方法(四) 串行通信子系统
    AVR开发 Arduino方法(三) 定时/计数器子系统
    AVR开发 Arduino方法(二) 中断子系统
    2014.5.17—所谓生活,就是让自己变得更好
    2014.5.10—做事分清时间地点
    2014.5.7—社交网络用户心理分析
    2014.5.7—20岁这几年
    2014.5.5—反向绑定域名,无需工信部备案
  • 原文地址:https://www.cnblogs.com/LoongEmbedded/p/5298789.html
Copyright © 2011-2022 走看看