嵌入式移动设备的运用越来越广,以其体积小、重量轻、便于带着等特色而备受喜爱。键盘是一种最为遍及运用的输入东西,但嵌入式移动设备因其体积小的特色决议了它的键盘不大可能选用一般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接口。