首页 > 编程知识 正文

arm9嵌入式系统设计基础课后答案(linux下矩阵键盘设备名,基于ARM的矩阵键盘设计及其linux驱动实现)

时间:2023-05-03 08:42:05 阅读:122722 作者:4856

1 .引言

ARM微处理器广泛应用于工业控制、家电产品、通信系统等领域。 矩阵键盘是常用的键盘形式,将键设计成m行n列,需要M N条信号线,但可以驱动MTImes; n个密钥大大节约了I/O资源。 本文介绍了一种基于TQ2440开发板的GPIO端口扩展5TImes; 4矩阵键盘方法,将所有按键重新定位为手持终端的键盘格式,操作方便。

2 .硬件设计

在本设计中,如图1所示,扩展了5行4列的矩阵键盘。 其中行线ROW1-ROW5与S3C2440中断端子EINT8、EINT9、EINT11、EINT13、EINT14[1]连接. 这些中断引脚本身连接有10k的上拉电阻,用于提高中断引脚的电平,防止钥匙空闲时发生中断。 列线COL1-COL4连接到S3C2440上的常规I/O端口GPF3、GPF4、GPG7和GPG10。 此处需要注意的问题是,确保用于行线的中断未被Linux上的其他设备使用。 如果不使用,驱动程序和其他驱动程序的初始化将失败。

考虑到手持终端设备按键的常用性和易操作性,只取矩阵键盘的前18个按键,将它们重新布局为图2的形状。 其中,Ent键具有确认功能(短按)和电源关闭功能(长按)双重功能,该功能安装在驱动程序中。

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

3.1键盘驱动程序概述

驱动程序是操作系统内核和硬件设备之间的接口。 设备驱动程序为APP应用程序屏蔽硬件细节,使APP应用程序能够像处理普通文件一样操作硬件设备[2]。 驱动程序没有main函数,以模块初始化函数为入口,初始化完成后不工作,等待系统调用。

因为驱动程序是linux内核的一部分,所以在编程中使用linux这个表达。 首先,将列I/O端口定义为数组。 col_table []={ S3C2410_GPF3,S3C2410_GPF4,…},行I/O端口定义为结构类型。

button_irqs []={ {IRQ_EINT8,S3C2410_GPG0,s3c 2410 _ gpg0_ eint 8,0,“R1”},

{IRQ_EINT9,S3C2410_GPG1,s3c 2410 _ gpg1_ ein T9,1," R2 ",

…}。 //中断编号(irq )、针(pin )、针设定、序列号、名称

矩阵键盘已作为Linux的字符设备注册到系统中。 首先,在系统中注册矩阵键盘设备,包括设备编号、设备名称和file_operaTIons结构。 file_operaTIons结构的成员函数是字符设备驱动程序设计的主体内容,这些函数实际上在APP应用程序进行Linux的open ()、write ()、read ()、close )等系统调用时用户没有对键盘进行写入操作。 该file_operations结构的成员函数为open (,read )、close )、poll )。

的注册和矩阵初始化在打开键盘时(即open ) )用函数)实现。 注册中断包括中断号码、中断入口程序、中断方式、中断名称和符号。 重要语句是request_IRQ(button_irqs[i].IRQ,buttons_interrupt,IRQ_TYPE_EDGE_FALLING,Button_irqs[I] 然后进行矩阵初始化。 将行线设置为中断并启用上拉。 在linux上,其表现如下。

s3c 2410 _ gpio _ CFG pin (button _ irqs [ I ]。

pin,S3C2410_GPIO_SFN2; 使第//I行的端子中断

s3c 2410 _ gpio _ pull up (button _ irqs [ I ] )。

pin,1; //I行的读取

将列线设为输出,设为低电平。 词句也一样,受篇幅限制,这里不再列举。

read ) )函数实现从设备读取数据。 该函数不按键,程序进入休眠,键码:

静态解码器_ wait _ queue _ head (button _ waitq ); 生成名为button_waitq的队列的起始队列

静态电压int ev _ press=0; 放置//1,表示有键按下

当ev_press为0时执行语句。 wait _ event _ interruptible (button _ waitq,ev_press ),程序进入休眠。 如果ev_press为1,则将数据从内核空间复制到用户空间。 重要句子:

复制_ 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后再进入键盘扫描函数。

本设计的键盘扫描程序采用先确定行再确定列的方法,最后对行列进行一定的运算即得键值。首先确定行:逐行扫描,判断是否有行引脚为低电平。若有,保存该行值(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嵌入式设备扩展手持终端式键盘提供了一种解决方案。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。