首页
|
新闻
|
新品
|
文库
|
方案
|
视频
|
下载
|
商城
|
开发板
|
数据中心
|
座谈新版
|
培训
|
工具
|
博客
|
论坛
|
百科
|
GEC
|
活动
|
主题月
|
电子展
注册
登录
论坛
博客
搜索
帮助
导航
默认风格
uchome
discuz6
GreenM
»
嵌入式技术
» Windows CE矩阵键盘开发大有乾坤 02
返回列表
回复
发帖
发新话题
发布投票
发布悬赏
发布辩论
发布活动
发布视频
发布商品
Windows CE矩阵键盘开发大有乾坤 02
发短消息
加为好友
samwalton
当前离线
UID
872238
帖子
6518
精华
0
积分
3259
阅读权限
90
在线时间
309 小时
注册时间
2012-3-1
最后登录
2014-7-5
论坛元老
UID
872238
1
#
打印
字体大小:
t
T
samwalton
发表于 2013-12-28 19:50
|
只看该作者
Windows CE矩阵键盘开发大有乾坤 02
它描述了一个通用的驱动程序框架;而PDD是和硬件以及平台相关的代码组成,MDD调用PDD中特定的接口来获取硬件相关的信息。
矩阵键盘驱动一般是层次型的,故驱动程序由两个独立的层组成:上层是模型设备驱动程序(MDD),映射矩阵键盘扫描码到虚拟键的编码上,产生与虚拟键编码相关的字符。然后打包键盘信息,并将此信息输入到系统信息队列中。下层是依赖平台的驱动程序(PDD),它将从硬件重新获得扫描码。设备驱动程序
服务器
提供的接口(DDSI)是在PDD中的函数集实现,并由MDD调用。由于微软提供了所有与MDD模块相关的源代码,所以对这部分不用做任何改动,只需将自己的PDD模块与MDD模块链结成一个公用库即可。
矩阵键盘驱动DDI函数是在MDD层实现,由用户应用程序通过GWES子系统调用。其中DDI函数有:KeybdDriverGetInfo、KeybdDriverSetMode、KeybdDriverPowerHandler、KeybdDriverInitializeEx、KeybdDriverInitStates、KeybdDriverVKeyToUnicode、KeybdDriverMapVirtualKey。而DDSI函数是在PDD层实现,由MDD层调用。DDSI函数有:KeybdPdd_PowerHandler、KeybdPdd_InitializeDriverEx、KeybdPdd_GetEventEx、DllMain。
(2)矩阵键盘驱动的接口函数
流接口驱动程序的主要任务就是把外设的使用传递给应用程序,是通过把设备表示为文件系统的一个特殊文件来实现的,每个流接口的驱动程序都必须实现一组标准的接口函数。由于矩阵键盘驱动采用了流驱动模式设计,故矩阵键盘驱动使用标准的流驱动接口函数,也称为矩阵键盘驱动的DLL接口。
但因为矩阵键盘作为一种输入设备与其他外围设备有很大的区别,应用层不能对其发布命令来操作它。所以,一般流驱动接口函数中对设备进行操作的接口函数在矩阵键盘驱动中只是作了保留,并未有实质性的功能。其中,矩阵键盘接口函数中比较重要的有PWR_Init、PWR_DllEntry、KeypdPdd_GetEventEx、KeypdPdd_GetEventEx、ScanCodeToVKeyEx等。
(3)矩阵键盘驱动加载过程
Windows CE系统运行时会默认启动DEVICE.EXE进程。DEVICE.EXE负责加载所有流驱动,进程对流驱动的加载是通过注册表列举器(RegEnum.dll)来实现。矩阵键盘的资源信息由OEM适配层(OAL)记录在注册表中,RegEnum.dll是通过扫描注册表项 HKEYLOCALMACHINE\Drivers\BuiltIn\PWRBUTTON下的键值对矩阵键盘进行初始化的。
因此,WinCE输入系统(GWES)会在启动时装载键盘驱动,输入系统将从HKEY_LOCAL_MACHINE\Hardware\DeviceMap\KEYBD\Drivername注册键中获取矩阵键盘驱动动态链接库(DLL)的名字。如果没有找到入口函数,系统将使用默认名字Keybddr.dll,然后加载这个DLL文件,并且确认所需要的条目指针是否都存在。然后,系统调用PFN_KEYBD_DRIVER_INITIALIZE 函数执行初始化工作。这时,模型设备驱动程序(MDD)会在本地保存复制的一份输入系统回调函数的副本以及初始化硬件和IST来处理中断。
当一个中断信号来的时候,键盘驱动负责把硬件扫描码转换为虚拟键值,然后虚拟键值会再发送给输入系统。输入系统从队列中取出按键事件,然后返回到驱动程序的函数KeybdDriverVKeyToUnicode中。驱动程序根据分析特定的键事件和虚拟键的状态产生相应的字符。最后,输入系统把虚拟键值和字符发送给合适的程序。
例如,在我所用的CAYMAN开发板中,键盘驱动的动态链接库名字为KeyPad.dll,入口点为DllMain,中断服务线程(IST)的名字是m_hevInterrupt。这个线程调用函数InterruptInitialize注册SYSINTR_KEYBOARD中断,然后等待系统发出SYSINTR_KEYBOARD信号。系统在收到中断信号后,中断处理程序调用KeypdPdd_GetEventEx函数来获取按键的扫描码,然后再调用ScanCodeToVKeyEx函数将扫描码映射成虚拟码,把从PDD返回的键盘事件发送到输入系统,输入系统进行排队并分发给相应的应用程序。
一般来说,对于Windows CE特殊布局的按键式矩阵键盘来说,使用流接口驱动模式能快速有效的进行开发。因为可以尽量使用微软提供的样板程序,只需修改相应的硬件相关代码就能大大缩短开发流程,而且可以提高键盘驱动程序的可靠性。
收藏
分享
评分
回复
引用
订阅
TOP
返回列表
电商论坛
Pine A64
资料下载
方案分享
FAQ
行业应用
消费电子
便携式设备
医疗电子
汽车电子
工业控制
热门技术
智能可穿戴
3D打印
智能家居
综合设计
示波器技术
存储器
电子制造
计算机和外设
软件开发
分立器件
传感器技术
无源元件
资料共享
PCB综合技术
综合技术交流
EDA
MCU 单片机技术
ST MCU
Freescale MCU
NXP MCU
新唐 MCU
MIPS
X86
ARM
PowerPC
DSP技术
嵌入式技术
FPGA/CPLD可编程逻辑
模拟电路
数字电路
富士通半导体FRAM 铁电存储器“免费样片”使用心得
电源与功率管理
LED技术
测试测量
通信技术
3G
无线技术
微波在线
综合交流区
职场驿站
活动专区
在线座谈交流区
紧缺人才培训课程交流区
意见和建议