首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Windows CE设备 矩阵键盘开发大有乾坤(1)

Windows CE设备 矩阵键盘开发大有乾坤(1)

嵌入式移动设备的应用越来越广,以其体积小、重量轻、便于携带等特点而备受青睐。键盘是一种最为普遍使用的输入工具,但嵌入式移动设备因其体积小的特点决定了它的键盘不大可能采用普通PC机上的标准键盘,因而大多数采用键数相对较少的矩阵键盘。
利用矩阵键盘用户可以很方便的实现对嵌入式移动设备进行相应的操作,是极方便的人机交互设备。随着微软的嵌入式操作系统Windows CE的普及,Windows CE的矩阵键盘开发得到了越来越多开发者的重视,本文与大家分享我在开发矩阵键盘的一些总结。
1.Windows CE驱动分类
Windows CE提供了许多用于开发设备驱动的模型,这些驱动程序模型使得Windows CE 能适应大部分的内部和外围设备。因此,在深入探讨Windows CE矩阵键盘驱动程序之前,先了解在WinCE平台上使用的两种设备:内建设备和可安装设备。因此,从驱动加载方式来看WinCE可分为本机设备驱动(Built-In Driver)、可加载驱动(Loadable Driver)。
本机设备驱动即Native Device Drivers,WinCE设计成可直接使用内建设备,这些设备由本机驱动过程控制。本机驱动程序是与WinCE的核心组件紧密相连,这些驱动对应的设备通常在系统启动时,在GWES的进程空间内被加载,因此它们不是以独立的DLL形式存在。可加载设备是指可与平台连接和分离的第三方接口设备,可由用户随时安装和卸载这些驱动,可以在系统启动时或者和启动后的任何时候由设备管理器动态加载。通常这类驱动是以DLL动态链接库的形式存在,系统加载后这些驱动程序是以用户态的角色运行,这种外围设备的驱动也被称为流驱动。
两者的差别在于它们提供的编程接口不同:本地设备驱动可以根据具体设备的需求提供本机的相应接口;而流接口驱动则是提供一组通用接口即流接口函数,应用程序可以通过流接口提供的接口函数来访问外围设备。
2.嵌入式矩阵键盘驱动原理
嵌入式设备上的键盘受设备本身体积影响,键盘设计大多数采用矩阵形式。支持Windows CE系统的CPU有很多种,不同CPU之间矩阵键盘硬件设计也不尽相同。因此,键盘可以按照自定义布局,并且可以按照自己的喜好映射按键,从而实现按键的不同功能,包括按键的个数、布局及按键功能的配置。
(1)矩阵键盘驱动核心是中断处理
矩阵键盘一般是采用中断方式,因此矩阵键盘驱动首先要在OAL层加入中断源。简单的说,矩阵键盘驱动的主要作用就是实时监测外部按键中断,一旦发现外部有键按下就向内核发送键盘消息实现键盘输入功能。这时键盘驱动会创建中断服务线程和键盘中断事件,每个按键对应一个键盘中断事件。因此,矩阵键盘驱动的设计核心就是键盘中断处理的设计。
(2)中断服务例程(ISR)
矩阵键盘作为输入设备一般以默认的频率扫描键盘,当有按键被按下时,通过扫描键盘并生成相应的扫描码,并通过处理器中的中断产生器产生一个中断信号,这时内核会进入异常中断处理程序,由它屏蔽所有中断,再调用中断服务例程ISR得到该中断的逻辑中断标识。然后,中断服务例程把得到对应的中断标识符报告给系统任务调度进程,同时产生键盘中断事件,键盘中断服务线程响应键盘中断事件,开始扫描矩阵键盘。然后,再通过这个中断信号控制相应的程序获取与之相对应的虚拟码,最后此虚拟码由上层调用,实现按下此键的相应功能。鉴于ISR的任务比较单一,ISR通常都要求越短、越快越好。
(3)中断服务线程(IST)
中断服务例程以键盘中断的逻辑中断标识符形式返回给系统任务调度进程,中断服务线程则在矩阵键盘驱动中负责具体中断处理。因此,矩阵键盘驱动的中断事件 HANDLE hKEYEvents要分别对应矩阵键盘产生的中断。一般来说,中断服务例程较小,并且只做很少的处理工作,中断服务线程就必须完成大多数中断处理工作,包括响应中断、扫描按键位置、发送键盘消息等。
例如,在矩阵键盘驱动IST中会先调用CreateEvent函数创建事件对象,接着调用系统函数InterruptInitialize完成中断。完成这些初始化工作后,接着调用 WaitForMultipleObjects (hKEYEvents)函数进入键盘事件的等待队列中。最后,当有事件被捕获后,根据不同的事件类型进入不同的键盘扫描处理程序。
3.矩阵键盘驱动程序的设计和实现
(1)矩阵键盘驱动程序模型
Windows CE的最大好处是具有可定制性,当它自带的驱动程序不能满足用户的要求时,用户可以自己编写相应的驱动程序。Windows CE一般可以分为独立驱动和层次型驱动两类。独立驱动程序是指将驱动程序编写成同时包含Model Device Driver(MDD)和Platform Dependent Driver(PDD)的独立驱动。层次型驱动是指分为两层,较上层的MDD和比较下层的PDD。其中MDD实现的是和平台无关的功能,它描述了一个通用的驱动程序框架;而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接口。
返回列表