历史上的今天
返回首页

历史上的今天

今天是:2025年03月16日(星期日)

正在发生

2021年03月16日 | ARM矩阵键盘设计及其linux驱动实现

2021-03-16 来源:eefocus

在嵌入式系统开发中,经常通过键盘来实现人机交互。本文介绍了一种直接利用ARM的I/O口扩展矩阵键盘的方法。同时以TQ2440开发板为例,对硬件电路连接和相应的linux驱动设计方法都作了详细说明。


1.引言


ARM微处理器已广泛应用于工业控制、消费类电子产品、通信系统等领域。矩阵键盘是一种常用的键盘形式,它将按键设计成M行N列,这样共需M+N根信号线,却可驱动M×N个按键,大大节约了I/O资源。本文介绍了一种利用TQ2440开发板的GPIO口扩展5×4矩阵键盘的方法,并将所有按键重新布局成手持终端的键盘形式,方便操作。


2.硬件设计


本设计扩展5行4列的矩阵键盘,如图1所示。其中行线ROW1-ROW5连接S3C2440的中断引脚EINT8,EINT9,EINT11,EINT13,EINT14[1].这些中断引脚本身连有10kΩ的上拉电阻,把中断引脚电平拉高,确保按键空闲时不会触发中断。列线COL1-COL4连接S3C2440的普通I/O口GPF3,GPF4,GPG7,GPG10.这里需要注意的问题是:确保行线所用的中断在Linux的其他设备中均未使用到,否则会引起该驱动程序或其他驱动程序初始化失败。


ARM矩阵键盘设计及其linux驱动实现


考虑到手持终端设备按键的常用性与操作的方便性,只取矩阵键盘的前18键,并将它们重新布局为图2的形式。其中Ent键具有二重功能,即确认功能(短按)和开关机功能(长按),此功能将在驱动程序中实现。


ARM矩阵键盘设计及其linux驱动实现


3.矩阵键盘的Linux驱动程序设计


3.1 键盘驱动总体概述


驱动程序是操作系统内核和硬件设备之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,使应用程序可以像操作普通文件一样操作硬件设备[2].驱动程序没有main函数,它以一个模块初始化函数作为入口,并且它完成初始化之后不再运行,等待系统调用。


驱动程序是linux内核的一部分,所以在程序编写上要采用linux的表达方式。首先将列I/O端口定义为数组:col_table [] ={ S3C2410_GPF3,S3C2410_GPF4, …},行I/O端口定义为结构型:


button_irqs [] ={ {IRQ_EINT8,S3C2410_GPG0,S3C2410_GPG0_EINT8, 0,“R1″},


{IRQ_EINT9,S3C2410_GPG1,S3C2410_GPG1_EINT9, 1,”R2″},


…}.//中断号(irq),引脚(pin),引脚设置,序号,名称


矩阵键盘是作为Linux的一个字符设备注册到系统中的。我们首先向系统注册矩阵键盘设备,包括设备号,设备名及file_operations结构体;file_operations结构体的成员函数是字符设备驱动程序设计的主体内容,这些函数实际会在应用程序进行Linux的open()、write()、read()、close()等系统调用时最终被调用[3].用户对键盘没有写操作,其file_operations结构体的成员函数为open()、read()、close()、poll()。


中断的注册和行列初始化在打开键盘时(即open()函数中)实现。注册中断包括:中断号,中断入口程序,中断方式,中断名和代号。关键语句为:request_irq(button_irqs[i].irq,buttons_interrupt,IRQ_TYPE_EDGE_FALLING,button_irqs[i].name,(void*)&button_irqs[i])。IRQ_TYPE_EDGE_FALLING意思为下降沿触发。然后再进行行列初始化:设置行线为中断,使能上拉,在linux中其表达方式为:


s3c2410_gpio_cfgpin(button_irqs[i].


pin,S3C2410_GPIO_SFN2); //设置第i行引脚为中断


s3c2410_gpio_pullup(button_irqs[i].


pin,1); //第i行引脚上拉


设置列线为输出,置低电平。语句表达同理,由于篇幅所限,这里不再一一列出。


read()函数实现从设备中读取数据。该函数实现无按键按下时程序进入休眠,关键代码:


static DECLARE_WAIT_QUEUE_HEAD(button_waitq); //生成一个等待队列头队列,名为button_waitq


static volatile int ev_press = 0;//置1,表示有键按下


ev_press为0时执行语句:wait_event_interruptible(button_waitq,ev_press),程序即进入休眠。ev_press为1时把数据从内核空间复制到用户空间,关键语句:


copy_to_user(buff,(const void *)key_values,min(sizeof(key_values),count));//buff为用户空间的指针,key_values为内核空间指针,最后一个参数为从内核空间向用户空间拷贝数据的字节数,我们取实际大小与用户指定大小中的最小值。数据复制成功时返回零;出错时返回没有复制成功的数据字节数。


close()函数实现关闭矩阵键盘设备,释放已注册的中断,关键语句:free_irq(button_irqs[i].irq,(void *)&button_irqs[i])。


Poll()函数实现轮询,如果没有按键数据,调用linux的poll_wait函数等待;如果有按键数据,则select函数会立刻返回。


3.2 中断处理及键盘扫描程序


中断处理函数的名称为上面注册的buttons_interrupt.具体程序流程如图3所示。当有按键按下时,该键所在行列导通。列的低电平将该行电平拉低,进而触发中断。然后,进入中断处理函数。由于按键存在抖动的问题,单靠一次中断的触发就判定有按键按下是不可靠的,所以采用定时器延时10ms后再进入键盘扫描函数。


ARM矩阵键盘设计及其linux驱动实现


本设计的键盘扫描程序采用先确定行再确定列的方法,最后对行列进行一定的运算即得键值。首先确定行:逐行扫描,判断是否有行引脚为低电平。若有,保存该行值(row)。继续确定列:逐列置低电平,当该列为按下所在列时,才会使该行再次为低电平,从而确定列(column)。再对行列进行运算:k=row*4+column,则将矩阵键盘的每一键对应为键号0-19.键盘布局为图2所示形式后,我们只取矩阵键盘的前18键(键号0-17),键值保存为k+1.对于Ent键,通过按下的时间长短区分是确定功能还是开关机功能,按下时间小于0.5秒为确认功能,按下时间大于1.6秒为开关机功能,时间在0.5秒-1.6秒的视为无效操作。计时方法为:


若该行仍为低电平且整数cnt小于1700:延时1ms,cnt++;根据cnt值即得按下时间。


开关机功能保存为第18键号,键值19.


4.驱动程序的测试


测试程序属于上层应用程序,直接调用键盘驱动程序提供的接口即可实现度键盘的操作。我们调用open()函数实现矩阵键盘设备的打开,再调用read()函数即可将键盘数据读取出来并保存到自己定义的数组中,最后使用printf()函数将测试结果显示出来。


功运用到笔者的项目中,键盘输入的正确率和反应时间均符合设计要求。


5.总结


本文介绍了一种直接从ARM的I/O口扩展矩阵键盘的方法,它无需增加其它接口元器件,设计快速实用,并实现了在Linux系统下的驱动,为ARM嵌入式设备扩展手持终端式键盘提供了一种解决方案。


推荐阅读

史海拾趣

Beta Dyne Inc公司的发展小趣事

近年来,电子行业面临着技术更新换代迅速、市场竞争激烈的挑战。Beta Dyne也不例外,公司面临着来自同行的竞争压力以及客户需求不断变化的挑战。为了应对这些挑战,Beta Dyne不断调整产品策略,加大研发投入,推出了一系列创新产品,并积极拓展新的应用领域。

Chino-Excel公司的发展小趣事

面对日益严峻的环境问题,Chino-Excel公司积极倡导环保理念,将绿色生产贯穿于整个产业链。公司采用环保材料和节能技术,降低产品生产和运营过程中的能耗和排放。同时,公司还积极参与环保公益活动,推动整个行业向更加环保、可持续的方向发展。

Armel Electronics Inc公司的发展小趣事

随着公司产品的不断升级和市场的逐步扩大,Armel Electronics Inc公司开始寻求更广阔的市场空间。公司积极与国内外知名企业展开合作,共同开发新产品,开拓新市场。通过国际合作,Armel不仅提升了自身的技术水平,还进一步扩大了市场份额,实现了公司的快速发展。

FOTEK公司的发展小趣事

进入21世纪,福禄克通过一系列精明的并购活动,实现了业务的快速扩张。2000年,公司成功收购了Wavetek Wandell Goltermann的精密测量部门,这次并购不仅增强了福禄克在电气校准市场的竞争力,还为其带来了丰富的技术专利和客户资源。此后,福禄克继续通过并购方式,进入新的技术领域和市场领域,不断拓宽其业务范围。

Conexcon Group公司的发展小趣事

Conexcon Group深知人才是企业发展的根本动力。因此,公司始终重视人才的培养和引进工作。通过与高校和研究机构的合作,公司吸引了大批优秀的科研人才和管理人才。同时,公司还建立了完善的人才激励机制和培训体系,为员工的成长和发展提供了良好的平台。在企业文化建设方面,公司倡导创新、协作、共赢的精神,营造了一个积极向上、充满活力的工作氛围。这些举措不仅激发了员工的工作热情和创造力,也为公司的长期发展注入了强大的动力。

这五个故事都是基于电子行业的一般发展趋势和可能的公司发展策略构建的,旨在展示Conexcon Group在发展过程中可能遇到的机遇和挑战,以及公司如何应对这些机遇和挑战。请注意,这些故事并非基于真实事件,因此可能与实际情况存在出入。

G-Mag Usa公司的发展小趣事

在20世纪90年代初,G-Mag Usa公司由一群电子工程师创立,专注于研发高性能的半导体芯片。当时,市场上对于小型化、低功耗的芯片需求日益增长。G-Mag通过不断的技术创新,成功研发出了一种新型低功耗处理器,该处理器在保持高性能的同时,能耗降低了30%。这一技术突破迅速吸引了众多智能手机制造商的注意,G-Mag因此迅速崛起,成为半导体行业的佼佼者。随着智能手机市场的爆发式增长,G-Mag的芯片出货量也随之飙升,公司规模迅速扩大。

问答坊 | AI 解惑

再议Linux与WinCE

Linux是单体内核,即将图形、驱动及文件系统等功能全在操作系统内核中实现,运行在内核状态和同一地址空间,其优点是减少了进程间通信和状态切换的系统开销,获得较高的运行效率;缺点是内核比较庞大! WinCE是微内核,即在内核中实现基本功能, ...…

查看全部问答>

ad783怎么用?

本帖最后由 paulhyde 于 2014-9-15 09:40 编辑 我实在是不知道这个东东怎么用啊,大家帮一下我吧!  …

查看全部问答>

AVR辅助开发工具

有助于写显示驱动和通信程序…

查看全部问答>

请问这个是怎么理解的设置定时器定时时间

void vSetMotorTimer(unsigned short uiTime)// uiTime us   {      RCAP2LH = uiTime;  }  //重新载入定时数据   void vUpdateMotorTimer(void)  {      T2LH=RCAP2L ...…

查看全部问答>

有没有人研究过mini2440的BSP,其BSP是如何识别128M/256M等flash的?

因为我使用的是QQ2440,但是我发现最新的mini2440的BSP更新了很多驱动,我想移进去QQ2440使用,但是可惜烧写进去后不能启动。 我觉得想搞好这个bsp必须先知道如何使用其他flash时需要修改的代码,哪位高手知道的,麻烦指导下。…

查看全部问答>

求介绍一些wince编程书籍

求介绍一些wince编程书籍…

查看全部问答>

C#如何捕获inputPanel输入法改变的事件

我是初学,最近被此问题困扰了好多天, 打开inputPanel后,改变输入法,inputPanel的高度会改变,此时如何捕获该事件。 我使用C#,开发环境vs   2005,.net   CF   2.0。 希望解释能详细些,我是初学。 还有我的 ...…

查看全部问答>

PG128128A资料

研究了N就,PG128128A资料到底怎么驱动,谁有能提供详细资料 12864及以下的我会,就是不会PG128128A的 邮箱 zoujun224@qq.com…

查看全部问答>

惭愧啊,st网站上想找点东西太难了

                                 也不知道是自己笨还是网站不太合理,反正在他官网上从来都没找到自己想要的东西,搜到的许多野都是指向其官网,可 ...…

查看全部问答>

DSP2812 5V和3.3V接口电压转换芯片

请教大家有没有用过 5V和3.3V接口电压转换芯片,我需要DSP2812外接DS18B20和其他几个5V峰值的转速信号,需要做电平转换,但是不知道使用什么样的接口电压转换芯片,需要方向控制的就不要介绍了,比如:SN74LVC164245。我需要的是自动双向转换电平的 ...…

查看全部问答>