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

 

 

原文地址:https://www.cnblogs.com/liang123/p/6325745.html