Keyboard驱动中button中断的处理机制.docx
《Keyboard驱动中button中断的处理机制.docx》由会员分享,可在线阅读,更多相关《Keyboard驱动中button中断的处理机制.docx(13页珍藏版)》请在冰豆网上搜索。
![Keyboard驱动中button中断的处理机制.docx](https://file1.bdocx.com/fileroot1/2023-2/22/dc83d27b-01d3-4fc4-ba09-cc2b7ccead61/dc83d27b-01d3-4fc4-ba09-cc2b7ccead611.gif)
Keyboard驱动中button中断的处理机制
Keyboard驱动中button中断的处理机制
********************************LoongEmbedded************************
作者:
LoongEmbedded(kandi)
时间:
2011.05.015
类别:
WINCE驱动开发
********************************LoongEmbedded************************
备注:
本博文基于Real6410开发板的BSP,这里按键的处理部分是作为keyboard驱动的一部分的。
1.硬件设计
图1
2.文件架构
2.1Keypad的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.1keyboard驱动的加载过程
系统启动过程中,GWES根据注册表HKEY_LOCAL_MACHINE\Hardware\DeviceMap\KEYBD下的”Drivername”下去获取KeyboardDriver的名字,如果没找到,则使用默认的名字Keybddr.dll,此系统中keyboard驱动的PDD层的laymgr.reg内容如下:
图3
然后GWES会去验证KeyboardDriver的导出接口是否存在,见图4,接下来去调用导出函数KeybdDriverInitializeEx(),对KeyboardDriver进行初始
化。
3.2smdk6410_keypad.dll的导出函数
图4
上面这些函数的定义及实现是在MDD层的PUBLIC\COMMON\OAK\DRIVERS\KEYBD中实现的,那为什么Pdd层最终导出的smdk6410_keypad.dll可以编译通过呢?
是因为此dll包含了实现这些函数的lib。
3.3MDD层和pdd层的交互
这里只是介绍本设计中按键驱动的部分,不是键盘驱动部分,系统会调用KeybdDriverInitializeEx函数,此函数主要用于初始化每个PDD的内容,调用图2的g_rgpfnPddEntries数组来调用PDD的入口函数。
从理论上,LayoutManager可以管理多个PDD层,这些PDD层会组成一个链表,而全局变量g_rgpfnPddEntries就是好来表示所有PDD层的入口。
其中按键处理的入口函数Matrix_Entry函数,下面就来看看这个函数的工作流程,如下图所示
图5
Matrix_Entry函数体如下所示:
图6
3.3.1KeybdDriverInitializeAddresses
图7
其中constDWORDKey_IRQ[10]={IRQ_EINT0,IRQ_EINT1,IRQ_EINT2,IRQ_EINT5,IRQ_EINT9,IRQ_EINT10,IRQ_EINT11,IRQ_EINT16,IRQ_EINT17,IRQ_EINT20};
3.3.2IsrThreadStart
这个函数会创建按键处理的IST函数KBDISRThread,而KBDISRThread函数通过调用KeyMatrix:
:
IsrThreadProc()来完成,KeyMatrix:
:
IsrThreadProc函数体如下
图8
下面就继续分析KeyIOInit和GetKeyValue函数
KeyIOInit函数
图9
GetKeyValue函数
先看此函数体的第一部分
图10
接着看GetKeyValue函数的后面部分
图11
参考链接:
Keyboard驱动介绍