注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

男儿当自强的博客

每天进步一点

 
 
 

日志

 
 
 
 

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

2011-05-15 17:34:28|  分类: windows CE 驱动 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

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

 

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

作者:LoongEmbedded(kandi)

时间:2011.05.015

类别:WINCE驱动开发

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

 

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

 

1.  硬件设计

Keyboard驱动中button中断的处理机制 - 男儿当自强 - 男儿当自强的博客

图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层的入口点

Keyboard驱动中button中断的处理机制 - 男儿当自强 - 男儿当自强的博客

图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内容如下:

Keyboard驱动中button中断的处理机制 - 男儿当自强 - 男儿当自强的博客

图3

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

化。

3.2 smdk6410_keypad.dll的导出函数

Keyboard驱动中button中断的处理机制 - 男儿当自强 - 男儿当自强的博客

图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函数,下面就来看看这个函数的工作流程,如下图所示

 Keyboard驱动中button中断的处理机制 - 男儿当自强 - 男儿当自强的博客

图5

Matrix_Entry函数体如下所示:

Keyboard驱动中button中断的处理机制 - 男儿当自强 - 男儿当自强的博客

图6

3.3.1  KeybdDriverInitializeAddresses

Keyboard驱动中button中断的处理机制 - 男儿当自强 - 男儿当自强的博客

图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函数体如下

Keyboard驱动中button中断的处理机制 - 男儿当自强 - 男儿当自强的博客

图8

下面就继续分析KeyIOInit和GetKeyValue函数

⑴KeyIOInit函数

Keyboard驱动中button中断的处理机制 - 男儿当自强 - 男儿当自强的博客

图9

⑵GetKeyValue函数

先看此函数体的第一部分

Keyboard驱动中button中断的处理机制 - 男儿当自强 - 男儿当自强的博客

图10

接着看GetKeyValue函数的后面部分

Keyboard驱动中button中断的处理机制 - 男儿当自强 - 男儿当自强的博客

图11

 

 

参考链接:

Keyboard驱动介绍

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

 

  评论这张
 
阅读(739)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017