基于嵌入式Linux系统的键盘驱动设计
摘要:为了适应嵌入式设备外设的多样性,本文以特殊矩阵键盘为例,设计了一套完整的驱动控制模块。硬件电路设计采用外扩3片SN74HC 164芯片的方式,节省了GPIO引脚的使用,大大提高了利用效率。同时,在此基础上引出了Linux内核中input子系统的特性和工作机制,呈现了较为完整的输入事件由内核空间传递到用户空间进程的过程。实验结果表明,设计的驱动模块具有良好的实时性和准确性。
关键词:SN74HC164;矩阵键盘;驱动控制模块;Linux内核;input子系统
引言
随着微处理器技术的不断发展和数字化产品的普及,嵌入式系统的研究开发逐渐成为热点,Linux也以其开源、稳定、可裁剪的优势成为嵌入式操作系统的主流。在众多的嵌入式系统中,键盘成为一种应用最为广泛的输入设备。然而,嵌入式设备的功能差异性又决定了为其提供一种通用性键盘是不可行的,往往需要根据系统的实际功能设计所需的特殊键盘,并实现相应的驱动程序。
S3C6410是三星公司高性能的32位RISC微处理器,内部集成了多种强大的硬件加速器,适合进行视频和图像处理,成为了目前嵌入式处理器领域的主流产品。本文以在S3C6410微处理器基础上实现一个24键矩阵键盘为例,呈现了在嵌入式系统中开发设备驱动程序的整体流程,并对Linux系统下输入事件的底层传递机制进行了研究和分析。
1 接口电路的设计
在嵌入式设备上扩展键盘的常用方式是通过对CPU的GPIO端口进行扫描实现的,显然这种方式在键盘按键数目较多的情况下,会占用过多的GPIO资源,增加了GPIO端口资源较为紧张的嵌入式处理器的负担。
本系统的硬件设计通过增加3片SN74HC164芯片来达到节约GPIO资源的目的。SN74HC164是一种8位的串行输入、并行输出移位寄存器,它的内部由8个D触发器串联而成。每当时钟信号由低电平变为高电平时,两个输入端将当前输入信号传送到并行输出端,并实现移位操作。系统硬件原理图如图1所示。
3个SN74HC164芯片串联后,将它们的CLK引脚接到S3C6410开发板的GPE4端口上。第一个SN74HC164芯片的A、B输入引脚共同接到开发板的GPE3端口上,并且将这两个GPIO端口配置成输出模式。GPE2端口与键盘按键的上拉端连接,系统运行时在中断模式和输入模式之间切换,以达到触发中断和对键盘扫描的目的。这样我们就借助于3个SN74HC164移位寄存器,只占用3个GPIO端口,给扫描键盘的24个按键提供输入信号,既节约了成本,又避免了GPIO资源的浪费。
2 扫描工作原理
扩展硬件电路的同时给键盘驱动程序的实现带来了一定的麻烦,驱动程序首先要将SN74HC164驱动起来,然后才能对电路进行控制。该电路的输出引脚被接到S3C6410的GPE2端口上,并且这个端口被配置成中断源,无键按下时直接读为高电位。键盘扫描时通过SN74HC164芯片先将键盘的24个键置低电平,任何一个键被按下,GPE2端口就会有从高电平到低电平的跳变,从而触发一次中断。
在中断处理过程中,将GPE2端口置为输入状态。然后根据SN74HC164芯片的输入/输出特性,给串联的3个SN74HC164芯片发送24个高电平信号,使得键盘的各键位均为高电平。在随后的24个时钟脉冲下,给SN74HC164芯片送入1个0和23个1,使得0在每个键位的输入端都只出现一次,同时在GPE2端口进行扫描。当被按下键处于0输入状态时,其所在行就会读到一个低电平,也就可以确定出键盘上哪个键被按下了。
3 驱动模块结构
在Linux2.6的版本中新加入了input子系统,给驱动编写者提供了一个完整的输入事件——从底层设备传递到用户进程的模型。本文基于input子系统架构,设计了一个较为完善的特殊键盘驱动模块。键盘驱动模块结构如图2所示。
在input子系统的设备内核模型中,最重要的数据结构体是struct input_dev,作为驱动的主体,每个structinput_dev代表一个输入设备。该结构体中既包含了设备所能响应的输入事件类型、响应按键种类、键盘码表,以及坐标范嗣等字段,同时还包含了设备打开、关闭以及回调函数等字段,能够完整地记录和标识整个设备的功能与行为。在向内核注册input_dev之前,需要进行input_dev结构的初始化,同时向内核申请键盘中断。
评论