没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
tyson的博客
WINCE5下矩阵键盘驱动的实现
单层驱动和分层驱动
驱动程序要与操作系统交互,通常会把同类外设的共性提取出来,作为共享的
源代码供不同品牌的外设驱动程序使用。在 Windows CE中,存在两种类型的驱动程
序:分层驱动和单体驱动程序。如图 3所示。
图 3 单体驱动程序与分层驱动程序
单体驱动程序是把所有的驱动程序代码——包括中断处理、IO操作及硬件
控制等都集成在一起。单体驱动程序会直接与硬件交互,因此它包含与特定的硬件
相关联的代码。通常,单体驱动程序会暴露 DDI接口(Device Driver Interface)
给操作系统,DDI函数是操作系统与驱动程序交互的接口协议。
分层驱动程序是把驱动程序的代码分为两层:上面一层叫模型设备驱动
(Model Device Driver,MDD),下面一层叫平台相关驱动(Platform Dependence
Driver,PDD)。
MDD层包含某一类型驱动所通用的代码,而 PDD层包含特定的硬件或平台专
用的代码。当操作系统访问硬件时,MDD层会调用特定的 PDD函数来访问硬件。在
编写分层驱动程序时,通常对于某个类型的驱动程序,PB会自带此类型驱动的 MDD
代码,无需另外修改,只需编写 PDD层的代码。
给驱动程序分层后,MDD和 PDD之间还需要一个接口协议。这样,在分层驱
动程序中就有两类接口函数:在操作系统与 MDD之间的 DDI函数,在 MDD和 PDD之
间的 DDSI(Device Driver Service provider Interface)函数。当操作系统访问
硬件时,首先通过使用 DDI函数与驱动程序交互,然后在驱动程序内部,MDD再通
过 DDSI函数与 PDD进行交互,PDD完成真正的硬件访问操作。
2.2内置驱动的加载
内置驱动非常特殊,不是用驱动管理器 device.exe来管理的。内置驱动程
序通常仅仅被 GEWS(Graphical Windows and Event System)进程使用,由 GWES.EXE
加载它,此类驱动程序一般都是与图形界面相关的 I/O设备驱动。例如:键盘鼠标
驱动、显卡驱动和触摸屏驱动等。由于它“内置”在 GWES和硬件之间,跟图形界面
功能紧密耦合,因此内置驱动的这种加载方式可以提高驱动和图形处理的效率。
2.3键盘分层驱动开发
通常,我们把键盘驱动设计为分层驱动。上层,即 MDD层完成扫描码到虚拟
键值的映射,产生和虚拟键值相关联的字符数据,然后往系统的消息队列发送键盘
消息。底层,即 PDD层完成从硬件平台上接收扫描码的功能。
l
一个简单的过程描述:
图形窗口事件子系统(GWES)在操作系统启动时装载键盘驱动。首先,GWES从
注册表中读取键值[HKEY_LOCAL_MACHINE\Hardware\DeviceMap\KEYBD\Drivername]
获得键盘驱动的 DLL名。如果没有,则用默认的名字:Keybddr.dll。然后,GWES
装载该 DLL 并确定函数的各入口点是否存在。接着,GWES调用函数
KeybdDriverInitializeEx来完成 layout manager和各个 PDD的初始化。在这个函
数里,驱动在本地保存了一份 GWES回调函数的副本,初始化硬件和 IST中断服务线
程来处理中断。当一个中断信号来的时候,键盘驱动负责把硬件扫描码转换为虚拟
键值,然后把虚拟键值发送给 GWES。GWES从队列中取出按键事件,然后返回到驱动
程序的函数 KeybdDriverVKeyToUnicode中。驱动程序分析特定的键事件和虚拟键的
状态产生相应的字符。GWES把虚拟键值和字符发送给特定的应用程序。
图 4 键盘驱动框图
如图 4所示,GWES首先加载 KBDMOUSE.DLL,进入 Layout Manager(布局管
理器)。布局管理器统筹管理键盘 PDD,输入语言以及键盘布局。在布局管理器中,
函数首先初始化每一个 PDD,每个键盘 PDD有一个函数返回关于该 PDD的描述和函
数指针。然后布局管理器从注册表中读取相应的 Input Language和 Device Layout
的值,根据键值加载对应的函数表格,完成从扫描码到字符的转换。其中,布局管
理器处理扫描码的步骤如下:
l
布局管理器处理扫描码的步骤:
1.
PDD接收到一个扫描码;
2.
扫描码被送到布局管理器;
3.
布局管理器依据当前设备的布局和事件将其转换成虚拟键值;
4.
布局管理器依据当前设备的布局和事件将重新映射;
5.
布局管理器设置自动重复功能,所有的键盘都将共享相同的自动重复
设置;
6.
布局管理器调用函数 keybd_event发送一个或多个事件。
下面详细介绍如何开发键盘驱动。
MDD部分是系统提供的共用代码,我们要实现的是键盘 PDD驱动。在平台驱动目
录 C:\WINCE500\PLATFORM\smdk2440\DRIVERS下新建 NK200KB目录,下面分四个子
目录 KBCOMMON、PDDLIST、INPUTLANG、NK200。
各目录的作用是:
Ø
KBCOMMON:提供 NK200键盘驱动接口和 NK200 Layout布局;
Ø
PDDLIST:提供 PDD入口函数;
Ø
INPUTLANG:提供输入语言;
Ø
NK200:链接相关的库生成 DLL文件。
实现键盘驱动需完成以下步骤:
(1)实现键盘 PDD入口函数(Entry Point);
(2)初始化键盘中断;
(3)IST服务线程分析;
(4)实现 KeybdPdd_GetEventEx2函数;
(5)创建键盘 Layout;
(6)创建键盘输入语言;
(7)添加 Makefile文件和 Source文件;
(8)编写导出函数定义文件.DEF;
(9)键盘驱动注册表配置。
2.3.1 实现 PDD 入口点
Layout Manager初始化每个键盘驱动 PDD时,要判断 PDD入口点是否存在。
这个 PDD数组位于
C:\WINCE500\PLATFORM\smdk2440\DRIVERS\NK200KB\PDDLIST\pddlist.cpp:
PFN_KEYBD_PDD_ENTRY g_rgpfnPddEntries[] = {
PS2_NOP_Entry,
NK200KB_Entry,
NULL
};
PS2_NOP_Entry是提供给USB键盘调用的,我们要实现的是NK200KB_Entry函数。
BOOL WINAPI NK200KB_Entry(
UINT uiPddId,
PFN_KEYBD_EVENT pfnKeybdEvent,
PKEYBD_PDD *ppKeybdPdd
);
这个函数功能就是初始化 NK200平台的键盘。形参 pfnKeybdEvent保存为全局
变量,供之后的 PDD其他函数调用。在 NK200KB_Entry中,v_pfnKeybdEvent =
pfnKeybdEvent;
Laymgr.cpp中 KeybdDriverInitializeEx函数是以 KeybdEventCallback函数为参
数调用 NK200KB_Entry的,所以 v_pfnKeybdEvent = KeybdEventCallback。
在 C:\WINCE500\PLATFORM\smdk2440\DRIVERS\NK200KB\NK200KBD\KBD.cpp
中完成 NK200_Entry函数的具体实现。
首先调用 KeybdDriverInitializeAddresses实现相关寄存器虚拟地址的申
请和分配。
然后新建一个 v_pnk200kb:
v_pnk200kb = new NK200Keybd;
if (v_pnk200kb->Initialize()) { //
初始化 GPIO口和 Bank2总线配置
剩余20页未读,继续阅读
资源评论
cs_21cn
- 粉丝: 26
- 资源: 99
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功