当前位置:首页 > 嵌入式 > 嵌入式硬件
[导读]嵌入式移动设备的应用越来越广,以其体积小、重量轻、便于携带等特点而备受青睐。键盘是一种最为普遍使用的输入工具,但嵌入式移动设备因其体积小的特点决定了它的键盘不大

嵌入式移动设备的应用越来越广,以其体积小、重量轻、便于携带等特点而备受青睐。键盘是一种最为普遍使用的输入工具,但嵌入式移动设备因其体积小的特点决定了它的键盘不大可能采用普通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接口。[!--empirenews.page--]

但因为矩阵键盘作为一种输入设备与其他外围设备有很大的区别,应用层不能对其发布命令来操作它。所以,一般流驱动接口函数中对设备进行操作的接口函数在矩阵键盘驱动中只是作了保留,并未有实质性的功能。其中,矩阵键盘接口函数中比较重要的有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特殊布局的按键式矩阵键盘来说,使用流接口驱动模式能快速有效的进行开发。因为可以尽量使用微软提供的样板程序,只需修改相应的硬件相关代码就能大大缩短开发流程,而且可以提高键盘驱动程序的可靠性。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭