Keyboard驱动中button中断的处理机制
********************************LoongEmbedded************************
作者:LoongEmbedded(kandi)
类别:WINCE驱动开发
********************************LoongEmbedded************************
备注:本博文基于Real6410开发板的BSP,这里按键的处理部分是作为keyboard驱动的一部分的。
1. 硬件设计
图1
2. 文件架构
2.1 Keypad的MDD层
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.2Keypad的PDD层
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的内容,调用图2的g_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
下面就继续分析KeyIOInit和GetKeyValue函数
⑴KeyIOInit函数
图9
⑵GetKeyValue函数
先看此函数体的第一部分
图10
接着看GetKeyValue函数的后面部分
图11
参考链接:
Keyboard驱动介绍
http://blog.csdn.net/guopeixin/archive/2009/11/10/4792370.aspx