历史上的今天
返回首页

历史上的今天

今天是:2025年02月04日(星期二)

2018年02月04日 | 基于嵌入式Linux的矩阵键盘驱动程序研究

2018-02-04 来源:eefocus

  前 言

  随着以计算机技术、通信技术和软件技术为核心的信息技术的发展, 嵌入式 系统在各个行业中得到了广泛的应用。嵌入式系统已成为当今IT行业的焦点之一。而在嵌入式系统中,键盘是重要的人机交互设备之一。嵌入式 Linux 是一种开放源码、软实时、多任务的操作系统,是开发嵌入式产品的优秀操作系统平台,是在标准Linux基础上针对嵌入式系统进行优化和裁剪后形成的,因此具有Linux的基本性质。在此提出的 矩阵键盘 驱动程序的设计方案是以嵌入式Linux和TI OMAP5912 处理器为软硬件平台的,在设计的嵌入式语音识别应用平台中,通过测试,表明其具有良好的稳定性和实时性。

 

  l 硬件原理

  OMAP5912处理器是由TI应用最为广泛的TMS320C55X DSP 内核与低功耗、增强型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中的序列逐列扫描列信号,读取行信号的状态,根据读回来的行信号状态就可以判断有那些按键按下。

键盘扫描序列

  另外,键盘驱动必须解决的一个问题是键盘的抖动。在按键按下和抬起的过程中,电压信号会出现很多毛刺,这主要是由于机械按键的弹性作用引起的。尽管触点看起来非常稳定,而且快速地闭合,但相对于嵌入式处理器的运行速度来说,这种动作是比较慢的。这种脉冲在某些按键功能设计时,如果处理不当可能会带来灾难性的后果。所以必须对按键信号进行防抖检测。按键防抖检测的核心思想是在嵌入式处理器的几个时钟周期内,通过对按键信号进行多次访问,查看电平状态是否保存一致。如果保持一致,则说明按键状态已经稳定;否则,说明之前检测到的按键信号是抖动信号或外界信号干扰,系统将不会对其进行任何处理。

  2 嵌入式Linux设备驱动程序

  在Linux内核源代码中,各种驱动程序的代码量占据了整个Linux代码的85%。可见,Linux设备驱动在整个操作系统中起着举足轻重的作用。设备驱动是操作系统内核和机器硬件之间的接口,它们控制着设备的操作动作,并且提供了一组API接口给应用程序,使得应用程序能够与这个设备互动。而且,设备驱动为应用程序屏蔽了硬件的细节,在应用程序看来,硬件设备只是1个设备文件,应用程序就可以像操作普通文件一样对硬件设备进行操作。在Linux操作系统中,通常将外围设备分为3种类型:字符设备、块设备和网络设备。

  而在Linux操作系统中,还有一类设备被定义为“平台设备”,通常So(System on Chip)系统中集成的独立的外设单元都被当作平台设备来处理,这里把4×5的矩阵键盘也定义为平台设备。所谓的“平台设备”并不是与字符设备、块设备和网络设备并列的概念,而是Linux系统提供的一种附加手段,例如,键盘驱动,它本身是字符设备,但也将其归纳为平台设备。


  另外,键盘又属于输入设备, Linux 内核提供了输入子系统,如键盘、触摸屏、鼠标等输入设备都可以利用输入子系统的接口函数来实现设备驱动。输入子系统由核心层(Input Core)、驱动层和事件处理层(EventHandler)三部分组成。在Linux内核中,使用输入子系统实现输入设备驱动的时候,驱动的核心工作是向系统报告按键、触摸屏、鼠标等输入事件。而不再需要关心文件操作接口,因为输入子系统已经完成了文件操作接口。通过输入子系统,实现输入设备驱动时只需要完成以下工作:

  (1)在模块加载函数中告知输入子系统输入设备可以报告的事件。例如,可通过_set_bit(EV_KEY,input_dex,一>evbit)来告知输入子系统该设备可报告按键事件。

  (2)在模块加载函数中注册输入设备。注册函数为:int input_register_devICe(struct input_dev*dev);

  (3)当有输入事件发生时,如按键按下/抬起、触摸屏被触摸/抬起/移动时,通过input_report_xxx()报告发生的事件及对应的键值、坐标等状态。主要的事件类型包括EV_KEY(按键事件)、EV_REL(相对值,如鼠标移动,报告相对于最后一次位置的偏移)和EV_ABS(绝对值,如触摸屏)。用于报告EV_KEY事件的函数为:void input_report_key(struct input_dev*dev,un—signed int code,int value);

  (4)在模块卸载函数中注销输入设备。注销输入设备的函数为:void input_unregister_device(struct in—put_dev*dev);

  3 矩阵键盘 驱动中的数据结构

  首先,定义一个整型数组osk_keymap[]用来定义按键映射表,把20个按键返回的码值映射成内核中标准的键码,这样有利于与上层应用程序的交互。通过KEY(col,row,code)宏定义来实现映射关系,如要把第2行第4列的按键映射为回车键,则通过KEY(3,1,KEY_ENTER)便可实现。其中KEY_ENTER是内核中定义的标准的键码。

  其次,定义矩阵键盘的设备结构体omap_kp,其定义如下:

程序

  4 矩阵键盘驱动程序设计及测试

  首先,实现矩阵键盘驱动的加载和卸载函数,分别通过调用platform_drivet_register()和platform_driV—er_unregister()实现矩阵键盘作为一个平台设备的注册和注销。

  其次,实现矩阵键盘驱动的探测和移除函数。在探测函数中,初始化行数、列数、中断号以及按键映射表。然后分配内存空间和输入设备,初始化omap_kp这个设备结构体和输入设备结构体input_dev,初始化定时器,设置输入设备可以报告的事件类型,并注册输入设备。最后申请中断,申请中断成功后,使能中断。移除函数则完成相反的工作。

  最后,实现矩阵键盘驱动的核心部分,也就是中断部分。众所周知,在Linux的中断处理中分为2部分,分别是顶半部(top half)和底半部(bottom half)。顶半部完成尽可能少的比较紧急的功能,它只是简单地读取寄存器中的中断状态并清除中断标志后就进行“登记中断”的工作。“登记中断”意味着将底半部处理程序挂到该设备的底半部执行队列中去。这样。顶半部执行的速度就会很快,可以服务更多的中断请求。底半部,是实现中断处理的真正部分,它来完成一些延缓的耗时任务,首先通过列扫描法检测各个按键状态有没有变化,若有变化再判断是哪一列哪一行发生变化,按键的行和列确定以后,通过键值映射表来查找其有没有对应的键值;若有则通过input_report_key()向内核报告按键的键值;否则,对应的按键没有定义键值,向内核报告为假按键(Spurious Key)。然后,延时(1/20)Hz再判断按键是否抬起。

  驱动开发完成后,以模块方式加入到内核,并在MiniGui和Qtopia下进行了测试,在Qtopia下测试结果如图2所示,证明矩阵键盘驱动工作正常、有效。

在Qtopia下测试结果

  5 结 语

  在此介绍了基于0MAP5912和 嵌入式 Linux的一种矩阵键盘驱动的工作原理和开发方案。该驱动以静态方式加入内核后,通过测试证明矩阵键盘驱动工作稳定、高效,在MiniGui和Qtopia的记事本中,都能正确显示正确的键值,基本上实现了其功能,并成功地应用于所开发的嵌入式语音识别系统中。


推荐阅读

史海拾趣

台湾岱恩(DAIN)公司的发展小趣事

以下是关于台湾岱恩(DAIN)电子工业股份有限公司在电子行业中发展起来的五个相关故事,每个故事都基于事实进行描述,避免主观褒贬:

  1. 创业初期的专注与坚持

岱恩电子工业股份有限公司成立于1989年,初期专注于薄膜电容器的研发与生产。公司凭借对技术的深入研究和对品质的严格把控,迅速在薄膜电容器领域崭露头角。在创业初期,岱恩电子就明确了以技术创新和品质保证为核心竞争力的战略定位,为公司的长远发展奠定了坚实的基础。

  1. 品质管理的建立与提升

岱恩电子始终将品质管理作为企业发展的重中之重。自成立之初,公司就引进了ISO9001国际品质认证体系,并在随后的几年中不断完善和提升。通过严格的质量控制流程和持续的品质改进活动,岱恩电子的产品品质得到了客户的广泛认可,并在市场上建立了良好的口碑。

  1. 环保理念的贯彻与实践

随着全球环保意识的不断提高,岱恩电子积极响应环保号召,将环保理念贯穿于企业发展的全过程。公司不仅取得了ISO14001环境管理系统认证,还严格遵守RoHS及Reach等欧盟环保标准,确保产品从原材料采购到生产过程的环保性。此外,岱恩电子还积极推广绿色制造技术,努力降低生产过程中的能源消耗和废弃物排放。

  1. 产品创新的突破与引领

在薄膜电容器领域,岱恩电子一直致力于产品创新和技术突破。公司不断投入研发资源,推出了一系列具有高性能、高可靠性和长寿命特点的薄膜电容器产品。其中,X2电容作为公司的明星产品之一,凭借其优异的电气性能和稳定性,赢得了众多客户的青睐。同时,岱恩电子还积极拓展产品线,将业务范围扩展至发光二极体等领域,进一步提升了公司的市场竞争力。

  1. 全球市场的拓展与布局

为了更好地服务全球客户,岱恩电子在中国大陆和台湾设立了完整的销售体系,并积极拓展海外市场。公司通过与全球知名企业的合作与交流,不断提升自身的品牌影响力和市场占有率。同时,岱恩电子还注重本地化服务,根据不同地区的市场需求和文化特点,提供定制化的产品和服务解决方案,赢得了客户的信任和赞誉。

ALTERA(阿尔特拉)公司的发展小趣事

阿尔特拉(Altera Corporation)是一家以可编程逻辑器件(FPGA)和相关技术为主的半导体公司,成立于1983年,总部位于美国加利福尼亚州的圣塔克拉拉。以下是关于阿尔特拉公司发展的五个相关故事:

  1. 创立与早期发展:阿尔特拉公司由Robert Hartmann和Michael Magranet等人于1983年创立,最初致力于设计和制造电可擦除可编程只读存储器(EEPROM)。1984年,公司推出了业界第一个商用FPGA产品,即EP300系列,标志着阿尔特拉在FPGA领域的开创性突破。随后,公司不断扩大产品线,加大研发投入,逐步成为FPGA领域的领军企业之一。

  2. FPGA技术创新:阿尔特拉公司在FPGA技术方面持续进行创新。1992年,公司推出了基于静态随机存储器(SRAM)的FPGA器件,使得FPGA在速度和灵活性方面有了显著提升。此后,阿尔特拉不断推出新的器件系列和工具软件,以满足客户对于性能和可编程性的不断提升的需求。

  3. 与竞争对手的竞争:在FPGA市场,阿尔特拉与Xilinx是两大主要竞争对手。两家公司之间展开了激烈的竞争,包括技术研发、产品性能、市场份额等方面。为了在市场上取得优势,阿尔特拉不断加大研发投入,推出了一系列领先的产品和解决方案,并通过全球销售网络拓展市场。

  4. 收购与合并:阿尔特拉公司在发展过程中进行了多次收购与合并,以扩大市场份额和提升技术实力。2015年,英特尔公司以约160亿美元的价格收购了阿尔特拉,将其并入英特尔旗下成为其子公司。这一收购使得英特尔得以整合阿尔特拉的FPGA技术和产品,进一步巩固了其在半导体行业的地位。

  5. 公司发展与创新:作为英特尔的子公司,阿尔特拉继续致力于技术创新和业务拓展。公司不仅持续改进现有产品的性能和功能,还积极投入到新兴领域的研发与应用,如数据中心、人工智能、物联网等。阿尔特拉通过不断推出创新产品和解决方案,保持了在半导体行业的领先地位。

以上是关于阿尔特拉公司发展的五个相关故事,这些故事展示了阿尔特拉从创立初期到被英特尔收购的发展历程,以及其在FPGA技术领域的技术创新、市场竞争和业务拓展等方面的重要进展。

Horizon Electronics Enterprises Group公司的发展小趣事

随着技术产品的成功推出,Horizon开始积极拓展市场。公司首先在国内市场建立了完善的销售和服务网络,通过参加行业展会、举办技术研讨会等方式提升品牌知名度。同时,Horizon也意识到国际市场的巨大潜力,逐步在海外设立分支机构,将产品推向全球市场。通过持续的市场推广和优质的客户服务,Horizon的品牌影响力逐渐增强,成为电子行业内备受瞩目的新兴企业。

ACCRETECH公司的发展小趣事

随着工业互联网和智能制造技术的快速发展,Horizon紧跟时代步伐,积极推进数字化转型和智能制造升级。公司引入先进的自动化生产线和智能管理系统,实现生产过程的智能化和精细化管理。通过数字化转型,Horizon不仅提高了生产效率和产品质量,还降低了运营成本和市场风险。同时,公司还积极探索智能制造的新模式和新应用,为电子行业的未来发展贡献智慧和力量。

DRI Relays Inc公司的发展小趣事

为了满足全球客户的需求,DRI Relays Inc公司开始实施全球化战略。公司先后在亚洲、欧洲和美洲等地设立了分公司和研发中心,以便更好地了解当地市场需求和提供定制化服务。同时,公司还积极参与国际展览和交流活动,加强与全球客户的沟通和合作。这些举措不仅提高了公司的国际知名度,还为公司赢得了更多的订单和市场份额。

贝特莱公司的发展小趣事

贝特莱在电子行业中以其创新产品而闻名。例如,作为国内首家推出生物传感技术的厂商,其研发的BL1860心率心电芯片在智能可穿戴设备市场占据了重要地位。此外,贝特莱还推出了国内首款无袖带血压监测方案,这些创新产品的推出无疑引爆了智能可穿戴设备市场的热点,也为贝特莱带来了可观的市场份额。

问答坊 | AI 解惑

AD6智能PDF导出时,中文字符无显示

Altium Designer 6 中,制件的原理图文件中若有中文字,用自带的\"智能PDF\"导出时,则在产生的PDF中显示不了中文字符.本人用Altium Designer 6.3~Altium Designer 6.9都试过,均有此问题,不知能否解决,请哪位大侠指点,若不能人为修改,是否要等待A ...…

查看全部问答>

6个变态的C语言Hello World程序

下面的六个程序片段主要完成这些事情: 输出Hello, World混乱C语言的源代码下面的所有程序都可以在GCC下编译通过,只有最后一个需要动用C++的编译器g++才能编程通过。 hello1.c 01     #define _________ }   02 ...…

查看全部问答>

谈谈天线锡焊要点

锡焊要点可以简单归纳如下:   1.使用烙铁(包括火烙铁)前,必须使烙铁头表面蒙上一层锡(俗称“吃锡”),这样烙铁头才能拉住锡。上锡的方法是在烙铁未加热前,将烙铁头挫光,除去氧化物或污垢,然后对刮亮后的烙铁头加热,直到光亮部分变成紫 ...…

查看全部问答>

请教Modbus高手makesoft:实现Modbus协议一定需要超时检测吗?

首先声明,我对Modbus不熟悉,尤其是如何实现它,最近才从网上下载了协议研究了一下,特此向高手请教。搞清楚这些问题,才能有效地在芯片中实现相应的功能,满足大家的需要。此帖的目的是继续另一帖的讨论:建议STM32的芯片加上串口超时功能, ...…

查看全部问答>

向高手请教一个关于STM32的PF,PG口的问题

                                 在STM32的DS里面,管脚介绍的表格中Main function(after reset)一栏中,大部分的IO口都是如PA7样式的口 ...…

查看全部问答>

关于正弦余弦函数的问题

我用CCS编程调试时,出现了“error: identifier \\"sinwt\\" is undefined”的错误信息,请请教一下是怎么回事?是不是需要加入某个头文件?还是我的写法有问题啊?谢谢大家~~~…

查看全部问答>

关于CCS在软件延时上的探讨

      在使用CCS的过程中,我发现在有关于有软件延时的程序中会出现问题,感觉延时没起到作用,比如一个简单的例子,让灯闪烁,使用delay函数(函数体内用两个for循环嵌套那种),这种延时就不会有效果,而用i=50000;   while ...…

查看全部问答>

STM32F407学习板全部例程+原理图

全部代码都已测试通过,若发现有什么问题请和我联系。因为时间仓促,基本上都是一些硬件测试程序。记得要把例程和固件库放在同一目录下,全部工程共用一个库的。至于SD卡里的文件只是几个测试图片和音 ...…

查看全部问答>

Kernel - Common Problems Booting Linux中文手册改1

Kernel - Common Problems Booting Linux中文手册改1…

查看全部问答>

EK-LM4F120XL ADC参考电压问题

在EK-LM4F120XL Launchpad中, 我分别用 AIN0(PE3口)采样1.3V电压 AIN1(PE2口)采样0.65V电压, AIN8(PE5口)采样1.95V电压, AIN9(PE4口)采样2.6V电压, 假如以3.0V作为参考电压,那么在数据寄存器中采样结果应该是: 1775,对应1.3V电压 ...…

查看全部问答>