快捷搜索:

嵌入式Linux系统的键盘驱动怎样去实现

1小序

因为其具有内核强大年夜且稳定,易于扩展和裁减,富厚的硬件支持等诸多优点,在嵌入式系统中获得了广泛的利用。很多嵌入式系统,分外是一些具有与用户强交互的嵌入式系统,每每必要配备一个特殊键盘,此时开拓者必要根据实际环境,为自己的特殊键盘编写驱动法度榜样。

2键盘驱动简介

Linux中的大年夜多半驱动法度榜样都采纳了层次型的体系布局,键盘驱动法度榜样也不例外。在Linux中,键盘驱动被划分成两层来实现。此中,上层是一个通用的键盘抽象层,完成键盘驱动中不依附于底层详细硬件的一些功能,并且认真为底层供给办事;下层则是硬件处置惩罚层,与详细硬件亲昵相关,主要认真对硬件进行直接操作。键盘驱动法度榜样的上层公共部分都在/。c中。该文件中最紧张的便是内核用EXPORT_SYMBOL这个宏导出的_scancode函数。_scancode完成的功能是:首先将扫描码转换成键码,接着根据shift,alt等扩展键的按下环境将键码转换成目标码,一样平常环境下是码,着末将该码放到终端设备的缓冲区中,并且调整一个tasklet认真将其在显示器上回显出来。可以看出,这个函数完成的是键盘驱动法度榜样中最核心的一些事情,而这些核心的逻辑功能是不依附于底层硬件的,以是可以将其自力出来,并且导出给底层的硬件处置惩罚函数调用。在这个文件中还定义了其它几个回调函数,它们由键盘驱动法度榜样中的上层公共部分调用,并由底层硬件处置惩罚函数实现。比如kbd__hw,kbd_translate,kbd_unexpected_up等等。此中kbd_translate由_scancode调用,认真将扫描码转换成键码;键盘驱动法度榜样的底层硬件处置惩罚部分则根据不合的硬件有不合的实现。例如PC平台上标准键盘的底层硬件处置惩罚函数都集中在/Pc_keyb。c中。这个文件包括了键盘中断处置惩罚函数_,扫描码到键码转换函数pckbd_translate等一些与底层硬件亲昵相关的函数。

在这种体系布局下,要添加一块特殊键盘到系统中就显得非分特别清晰。开拓者只需为其编写驱动法度榜样中的底层硬件处置惩罚函数,就可以将该键盘驱动起来。一样平常说来,底层硬件处置惩罚函数中最紧张的事情便是在键盘中断处置惩罚中获取被按下键的扫描码,并且以它为参数调用handle_scancode,该扫描码可以自己定义,但它必须独一地标识出被按下键在键盘上的位置。此外,开拓者还必要供给对应的从自定义扫描码到键码的转换函数kbd_translate。详细的键码转换,将目标码放到终真个输入缓冲区,以及回显等事情都由handle_scancode认真完成。在此我们也可以看出,内核导出函数handle_scancode在全部键盘驱动法度榜样中,起着将上层通用抽象层和底层硬件处置惩罚层粘和起来的关键感化。

3利用实例

下面我们将以一个详细的利用实例来阐明在嵌入式Linux系统中给一个特殊键盘编写驱动法度榜样的详细历程。

3。1硬件模块描述

本系统的构建选用了三星公司的开拓板作为硬件平台。特殊键盘的硬件模块主要由两个芯片和一个4行16列的矩阵扫描电路构成。是一个8位的串形输入并形输出移位寄存器,它的内部由8个D触发器串联而成。其事情道理简单说来是这样的,芯片在时钟CLK脉冲的上升沿将A,B引脚上的串形输入在8个时钟脉冲今后并行输出到输出引脚QA到QH。其真值表见图1所示。

两个SN74hc164芯片先串联后,将它们的CLK引脚和CLR引脚分手接到开拓板的GPB2和GPB4端口上,并且将第一个SN74hc164芯片的A,B引脚接到开拓板的GPB1端口上,这三个GPIO端口设置设置设备摆设摆设成输出端口。这样我们就借助于两个SN74hc164寄存器,实现了只占用3个GPIO端口,给矩阵扫描电路的16列供给输入,从而既节约了资源,又避免了GPIO资本的挥霍。但这同时也给键盘驱动法度榜样的实现带来了必然的麻烦,驱动法度榜样首先要将SN74hc164驱动起来,然后才能对矩阵电路的16列进行节制。该矩阵电路的4个行引脚分手被接到的GPG6,GPG7,GPG8,GPG9端口上,并且这四个端口被设置设置设备摆设摆设成中断源。无键按下时直接读为高电位,应用时经由过程SN74hc164芯片先将键盘的16列置低电位,任何一个键被按下,响应的行GPG端口就会有从高到低的电压跳变,从而触发一次中断。

3。2软件模块描述

初始化部分。这部分包括硬件层和软件层上的初始化。在本例中,必要先对矩阵电路和SN74hc164芯片所应用到的GPIO端口作设置设置设备摆设摆设,以使CPU可以对它们进行节制和造访。为了要将某个GPIO端口设置设置设备摆设摆设成输入输出或者是中断源,必要在对应的GPIO节制寄存器中设置精确的值,详细的值可以经由过程查阅S3C2410开拓板手册来得到。比如,为了将GPB1设置成SN74hc164的输入端,必要将GPBCON这个节制字中2,3两位设置成二进制的01,为了将GPG6设置成电压低跳变中断源,必要将GPGCON中12,13两位设置成二进制的10。在完成了硬件初始化操作今后,便是软件层上的初始化了。首先将键盘中断处置惩罚函数注册到系统,然后设置好一个器布局,以便在中断发生时将其挂到内核的器行列步队中去,该器将触发对键盘的扫描操作。着末经由过程SN74hc164将矩阵电路的16列置零。

中断处置惩罚部分。如前所述,这部分软件应该完成的事情便是扫描特殊键盘,确定哪个键被按下,并且拿到稳定的扫描码,然后调用内核导出函数handle_scancode。在这个利用中,该特殊键盘的结构与PC标准键盘的结构对拍照似,以是我们直接将PC键盘上对应键的系统扫描码作为我们特殊键盘上各个键的扫描码,同时我们将PC键盘驱动法度榜样中扫描码到键码的转换函数pckbd_translate作为我们的kbd_translate函数。

确定哪一个键被按下的算法如下。在中断到来时,我们已经可以根据中断号确定被按下的键在哪一行,我们还必要确定被按下的键在哪一列。为此,我们先给串联的两个SN74hc164芯片送一个CLR旌旗灯号,清零,然后送16个1,使得特殊键盘的列均为高电位,此时我们在键盘的行端口读到的都是高电位。在16个时钟脉冲下,给SN74hc164芯片送入1个0和15个1,使得0在每一列上都独一呈现一次,于此同时在键盘行端口进行扫描。当被按下键所在列置0时,其所在行就会读到一个低电位。应用这种“走0法”,我们就可以确定出键盘上哪个键被按下了。然则这种简单的扫描算法还不敷,由于在这种类型的矩阵扫描键盘中,键的每次按下和抬起都邑有10~20ms(这段光阴的是非由硬件特点抉择)的毛刺哆嗦存在,如图2所示,所以为了获取稳定的按键信息,必须要设法主见子去掉落这种哆嗦,才能避免将用户的一次按键误算作几回按键来处置惩罚。去毛刺的一种常见的措施是在有键盘中断到达时,并不急速去扫描键盘,而是先等待一段光阴,等跳过毛刺哆嗦今后再去扫描键盘,其伪代码如下所示:

等待一段光阴,跳过哆嗦;

扫描键盘;

if键盘上没有键被按下

停止返回;

if键盘上有键被按下

再次等待一段光阴然后反省同样的键是否依然处于被按下状态;

if同样的键任然是按下

将读到的扫描码返回;

else

直接返回;

这种固然可行,然则它应用了忙等的措施去毛刺,在忙等时代,系统做不了任何有用的事情。这对付谋略资本本身就很有限的嵌入式Linux系统来说,是一种奢侈的挥霍。本利用中,我们设计了一种得当嵌入式系统的去毛刺,应用效果优越。

因为Linux内核供给了准时器行列步队,以是我们可以应用这种机制来避免忙等,前进系统的机能。当键盘上有键被按下时,键盘中断处置惩罚法度榜样首先关闭中断源,进入轮询模式,将一个timerlist工具挂入准时器行列步队今后就停止了。挂入内核的准时器按时地被触发,它所触发的函数完成以下一些事情:先对全部键盘上所有的键进行一次扫描,并且将扫描获得的结果保存到一个静态2维数组变量_shot_[16][4]中。该变量描述的是在本次键盘扫描的这个时候,键盘上所有键的按下环境。假如某个键没有被按下,即处于松开状态,那么将_shot_中对应的值置为0,假如某个键处于按下状态,那么将_shot_中对应的值作自增1操作,若该值在自增1今后大年夜于某个预先指定的数,我们就可以觉得这是一个稳定值,并且将另一个大年夜小为16*4的2维数组变量_matrix对应坐标中的值置1,否则置0。这个变量描述的便是当前键盘上按键环境的稳定值了。也便是说我们首先把在本次扫描中获得的采样数据作处置惩罚今后保存到snap_shot_matrix中,然后依据该变量中的值,过滤获得_matrix,经由过程这样一个历程来做去毛刺处置惩罚。

在获得了本次扫描的稳定值_matrix今后,我们将其与上次获得的稳定值previous_matrix作对照,从而确定与上次扫描时比拟,此刻键盘上的按键环境是否发生了变更,以及此刻键盘上是否有键按下。假如发明键盘上没有任何键被按下,则打开键盘中断,再次切回到中断模式。假如键盘上有键被按下,并且是不合于上次扫描到的被按下键,我们立即调用按键处置惩罚函数_key,它会调用键盘驱动中的上层函数handle_scancode。假如键盘上按下的键便是上次按下的那个键,我们将递增一个计数器,当这个计数器达到某个指定值今后,我们就启动所谓的Autorepeat功能,即用户不停按着某个键,驱动法度榜样自动重复孕育发生键盘输入。该计数器在被按下键发生变更时置0。然则只要键盘上仍旧有键处于被按下状态,我们就将当前读到的键盘稳定值current_matrix拷贝到previous_matrix中去,并且再次将前面描述的准时器工具挂到内核准时器行列步队中,过一段光阴今后再次扫描全部键盘,直至键盘上没有键被按下。

4停止语

跟着信息社会以及谋略机软硬件技巧的进步,嵌入式信息产品的设计和利用获得了迅速的成长,必要为自己的嵌入式Linux系统添加特殊键盘驱动的需求也越来越普遍。本文在先容了Linux中键盘驱动法度榜样的整体框架今后,以S3C2410开拓板上的一个特殊键盘为例子,重点描述了在嵌入式Linux情况下,为特殊键盘编写驱动法度榜样时必要完成的事情,为类似的开拓供给了一种思路和参考。

责任编辑:ct

您可能还会对下面的文章感兴趣: