随着以计算机技术、通信技术和软件技术为核心的信息技术的发展,嵌入式系统在各个行业中得到了广泛的应用。嵌入式系统已成为现今IT行业的焦点之一。而在嵌入式系统中,鼠标是重要的人机交互设备之一。嵌入式Linux是一种开放源码、软实时、多任务的操作系统,是开发嵌入式产品的优秀操作系统平台,是在标准Linux基础上针对嵌入式系统进行优化和剪裁后产生的,因而具有Linux的基本性质。在此提出的矩阵按键驱动程序的设计方案是以嵌入式Linux和TIOMAP5912处理器为软硬件平台的,在设计的嵌入式语音辨识应用平台中,通过测试,表明其具有良好的稳定性和实时性。
l硬件原理
OMAP5912处理器是由TI应用最为广泛的TMS320320CC555555XDSP内核与低帧率、增强型ARM926EJ—S微处理器组成的四核应用处理器。用这样一种组合形式将2个处理器整合在1个芯片后,开发人员可以依据实际情况,借助DSP运行复杂度较高的数字讯号处理任务,借助ARM运行通讯、控制和人机插口方面的任务,因而使便携式设备在保持良好人机交互环境的基础上,有效地减少帧率。在外设方面,OMAP5912微处理器支持常用的各类插口,其中通过MPUIO插口最多可支持8×8的矩阵按键,系统中采用这个插口扩充了一个4×5的矩阵按键。其硬件联接示意图如图1所示,其中键盘行阵列必须提供上拉讯号,列阵列加三极管,避免顿时电压过大对MPUIO口导致冲击。
根据鼠标的构造方法人们把鼠标界定为线性按键和矩阵按键。其中,线性按键是指每位键盘都占用嵌入式处理器的1个I/O端口,并通过这个I/O端口实现人机交互,各个按钮之间互不影响。使用这些方案的优点是简单、可靠,而且线性鼠标对I/O端口的占用量很大。为此,嵌入式系统中极少采用这些技巧。
另外一种矩阵按键是指当按钮数目过多时,采用矩阵的排列方式,将键盘设计成n行m列的矩阵方式。其中,每位键盘占用行和列的1个交叉点,而且以行和列为单位引出讯号线。这样只须要占用n+m个I/O端口,却可以驱动n×m个按钮,大大节约了对嵌入式处理器I/O端口的占用,节约了宝贵的资源。矩阵鼠标在降低嵌入式处理器I/O端口占用的问题上作出了很大的贡献,但骤然而至的问题是怎样确定矩阵中键盘的位置,这儿采用列扫描法,其思路如下:
在鼠标初始化阶段,所有的列讯号(KBC)都被设置输出为低电平。假如矩阵鼠标中的1个按钮按下,则相应的行讯号和列讯号线漏电,行讯号线(KBR)输入由高电平变为低电平,形成1个中断,之后在驱动的中断服务程序中根据表1中的序列逐列扫描列讯号,读取行讯号的状态,按照读回去的行讯号状态就可以判定有这些按钮按下。[nextpage]
另外,鼠标驱动必须解决的一个问题是鼠标的晃动。在键盘按下和举起的过程中,电流讯号会出现好多毛刺,这主要是因为机械键盘的弹性作用导致的。虽然触点看上去十分稳定,并且快速地闭合,但相对于嵌入式处理器的运行速率来说,这些动作是比较慢的。这些脉冲在个别按钮功能设计时,若果处理不当可能会带来灾难性的后果。所以必须对按钮讯号进行对焦监测。键盘对焦测量的核心思想是在嵌入式处理器的几个时钟周期内,通过对键盘讯号进行多次访问,查看电平状态是否保存一致。假如保持一致,则说明按钮状态早已稳定;否则,说明之前检查到的按钮讯号是晃动讯号或外界讯号干扰,系统将不会对其进行任何处理。
2嵌入式Linux设备驱动程序
在Linux内核源代码中,各类驱动程序的代码量抢占了整个Linux代码的85%。可见,Linux设备驱动在整个操作系统中起着举足轻重的作用。设备驱动是操作系统内核和机器硬件之间的插口,它们控制着设备的操作动作,而且提供了一组API插口给应用程序,促使应用程序才能与这个设备互动。并且,设备驱动为应用程序屏蔽了硬件的细节,在应用程序看来,硬件设备只是1个设备文件,应用程序就可以像操作普通文件一样对硬件设备进行操作。在Linux操作系统中,一般将外围设备分为3种类型:字符设备、块设备和网路设备。
而在Linux操作系统中,还有一类设备被定义为“平台设备”,一般So(SystemonChip)系统中集成的独立的外设单元都被当做平台设备来处理,这儿把4×5的矩阵按键也定义为平台设备。所谓的“平台设备”并不是与字符设备、块设备和网路设备并列的概念,而是Linux系统提供的一种附加手段,比如,鼠标驱动,它本身是字符设备,但也将其归纳为平台设备。
另外,鼠标又属于输入设备linux设备驱动开发详解 源码,Linux内核提供了输入子系统,如鼠标、触摸屏、鼠标等输入设备都可以借助输入子系统的插口函数来实现设备驱动。输入子系统由核心层(InputCore)、驱动层和风波处理层(EventHandler)三部份组成。在Linux内核中,使用输入子系统实现输入设备驱动的时侯linux设备驱动开发详解 源码,驱动的核心工作是向系统报告键盘、触摸屏、鼠标等输入风波。而不再须要关心文件操作插口,由于输入子系统早已完成了文件操作插口。通过输入子系统,实现输入设备驱动时只须要完成以下工作:
(1)在模块加载函数中告知输入子系统输入设备可以报告的风波。诸如,可通过_set_bit(EV_KEY,input_dex,一>evbit)来告知输入子系统该设备可报告键盘风波。
(2)在模块加载函数中注册输入设备。注册函数为:intinput_register_device(structinput_dev*dev);
(3)当有输入风波发生时,如键盘按下/举起、触摸屏被触摸/举起/联通时,通过input_report_xxx()报告发生的风波及对应的通配符、坐标等状态。主要的风波类型包括EV_KEY(键盘风波)、EV_REL(相对值,如键盘联通,报告相对于最后一次位置的偏斜)和EV_ABS(绝对值,如触摸屏)。用于报告EV_KEY风波的函数为:voidinput_report_key(structinput_dev*dev,un—signedintcode,intvalue);
(4)在模块卸载函数中注销输入设备。注销输入设备的函数为:voidinput_unregister_device(structin—put_dev*dev).[nextpage]
3矩阵按键驱动中的数据结构
定义一个整型字段osk_keymap[]拿来定义键盘映射表,把20个按钮返回的码值映射成内核中标准的键码,这样有利于与下层应用程序的交互。通过KEY(col,row,code)宏定义来实现映射关系,如要把第2行第4列的键盘映射为回车键,则通过KEY(3,1,KEY_ENTER)便可实现。其中KEY_ENTER是内核中定义的标准的键码。
4矩阵按键驱动程序设计及测试
首先,实现矩阵按键驱动的加载和卸载函数,分别通过调用platform_drivet_register()和platform_driV—er_unregister()实现矩阵按键作为一个平台设备的注册和注销。
其次,实现矩阵按键驱动的侦测和移除函数。在侦测函数中,初始化行数、列数、中断号以及键盘映射表。之后分配显存空间和输入设备,初始化omap_kp这个设备结构体和输入设备结构体input_devlinux运维面试题,初始化定时器,设置输入设备可以报告的风波类型,并注册输入设备。最后申请中断,申请中断成功后,使能中断。移除函数则完成相反的工作。
最后,实现矩阵按键驱动的核心部份,也就是中断部份。众所周知,在Linux的中断处理短发为2部份,分别是顶半部(tophalf)和底半部(bottomhalf)。顶半部完成尽可能少的比较紧急的功能,它只是简单地读取寄存器中的中断状态并消除中断标志后就进行“登记中断”的工作。“登记中断”意味着将底半部处理程序挂到该设备的底半部执行队列中去。这样。顶半部执行的速率都会很快,可以服务更多的中断恳求。底半部,是实现中断处理的真正部份,它来完成一些减缓的历时任务,首先通过列扫描法测量各个按钮状态有没有变化,若有变化再判定是哪一列哪一行发生变化linux视频,键盘的行和列确定之后,通过通配符映射表来查找其有没有对应的通配符;若有则通过input_report_key()向内核报告键盘的通配符;否则,对应的键盘没有定义通配符,向内核报告为假键盘(SpuriousKey)。之后,延时(1/20)Hz再判定键盘是否举起。
驱动开发完成后,以模块形式加入到内核,并在MiniGui和Qtopia下进行了测试,在Qtopia下测试结果如图2所示,证明矩阵按键驱动工作正常、有效。
5结语
在此介绍了基于0MAPMAP5912和嵌入式Linux的一种矩阵按键驱动的工作原理和开发方案。该驱动以静态方法加入内核后,通过测试证明矩阵按键驱动工作稳定、高效,在MiniGui和Qtopia的记事本中,都能正确显示正确的通配符,基本上实现了其功能,并成功地应用于所开发的嵌入式语音辨识系统中。