APP下载

基于龙芯2H的Linux矩阵键盘驱动的研究与实现

2016-11-09李泽银吴昌昊

电子设计工程 2016年19期
关键词:龙芯寄存器中断

李泽银,龚 俊,吴昌昊

(中国兵器工业第五八研究所 特种电子技术部,四川 绵阳621000)

基于龙芯2H的Linux矩阵键盘驱动的研究与实现

李泽银,龚 俊,吴昌昊

(中国兵器工业第五八研究所 特种电子技术部,四川 绵阳621000)

针对某龙芯2H主板扩展的4乘4矩阵键盘的需求,分析了键盘硬件电路及串行通信接口。在Linux 2.6.32的输入子系统模型的基础之上,设计了矩阵键盘输入设备的驱动程序并给出了驱动程序实现的过程。测试结果证明,该驱动满足了设计的需求,工作稳定、高效,并且通用性较强,在以后的项目中只需更改少量接口就可以使用。

龙芯2H;CH456;矩阵键盘;Linux驱动

键盘在个人电脑中是标准配置,在嵌入式系统中也是非常重要的配置,是嵌入式系统最重要的人机交互手段之一。嵌入式系统普遍是针对特定的应用而设计的,不同的应用对输入设备的要求也各不相同,因此需要根据具体应用在系统中配置自己的键盘。Linux可应用于各种硬件平台、内核稳定高效、源代码开放和网络通信驱动齐全等优良特性,成为嵌入式系统领域中的一个研究热点[1]。在此提出以Linux操作系统和龙芯2H处理器为软硬件平台的矩阵键盘驱动程序的设计方案。

1 软硬件平台

1.1硬件平台

本系统采用的主处理器为龙芯2H,龙芯2H是龙芯2G处理器与龙芯1A(2F南桥)的后继产品,其目标是为安全适用计算机提供单片解决方案。龙芯2H采用65 nm工艺实现,主频达1 GHz。片内集成定点处理器、浮点处理器、流媒体处理和图形图像处理功能,以及南桥、北桥等配套芯片组功能。龙芯2H内部采用多级总线,低速外设(I2C、UART等)作为一个集合加在南桥总线上[2-3]。

本系统采用了扩展一片沁恒公司的CH456芯片来实现键盘的功能,其中芯片连接示意图如图1所示。

该芯片可以进行64键的扫描,通过兼容I2C线路2线串行接口和龙芯 2H进行数据交换。INT#连接到龙芯2H的 GPIO13,SCL和SDA连接到龙芯2H的IIC1_SCL和IIC1_SDA。

图1 CH456连接示意图

芯片最大支持8×8键盘,本项目使用的是4×4键盘是可以兼容的。将矩阵键盘的4跟行线连接到XKI0-3,4跟列线连接到XKO0-3。插座示意图如图2所示。

图2 键盘插座连接示意图

1.1.1龙芯2H的I2C接口

龙芯2H集成了两个I2C控制器,在Linux下通过内存映射直接访问芯片的寄存器。I2C-1模块寄存器物理地址基址为:0x1fe91000,地址空间16 kB。在键盘驱动中需要对龙芯I2C-1的发送数据寄存器(TXR)、接受数据寄存器(RXR)、命令控制寄存器(CR)和状态寄存器(SR)4个寄存器进行读写操作。

1.1.2键盘工作原理

CH456芯片会定期对键盘进行扫描,在键盘扫描期间,XKO7~XKO0引脚按照XKO0至XKO7的顺序依次输出高电压,其余引脚输出低电压;KI7~KI0引脚的输出被禁止,当没有键被按下时,XKI7~XKI0都被下拉为低电压;当有按键被按下时,例如连接XKO3与XKI4的按键被按下,则当XKO3输出高电压时XKI4检测到高电压。经过抗干扰处理后,如果CH456确认检测到有效的按键,则记录下该按键代码,并通过INT#引脚(即XKO7)产生低电平有效的键盘中断,此时龙芯2H可以通过I2C接口读取按键代码;在没有检测到新的有效按键之前,CH456不再产生任何键盘中断。另外CH456不支持组合键,同一时刻不能有两个或者更多的键被按下[4]。

1.2软件平台

本系统采用Linux 2.6.32内核作为操作系统。Linux内核提供了良好的驱动框架,输入子系统部分非常利于键盘、鼠标等驱动的开发。设备驱动的意义是为上层应用程序提供了访问设备的方法,还屏蔽了硬件的具体细节,便于软件的开发与维护[5]。

2 键盘驱动分析

键盘在系统中属于输入设备,Linux内核的输入子系统,不仅支持键盘和鼠标等常规输入设备,而且还支持蜂鸣器、触摸屏等设备,这些输入设备都可以利用系统的接口函数来实现设备驱动。输入子系统由设备驱动层、核心层和事件层3部分组成如图3所示。

在Linux内核中,使用输入子系统实现输入设备驱动的时候,驱动的工作目的是向系统报告按键等输入事件,不需要关心文件系统的接口,因为Linux的输入子系统已经帮驱动完成了文件操作[6]。在本系统中,设备驱动层的工作就是当矩阵键盘的按键被按下时,芯片CH456产生一个中断,内核检测到这个中断并对其进行处理,这也是本次需要设计的驱动。核心层和事件层在Linux内核中已经帮我们实现,只需要调用需要的函数即可。

图3 输入子系统结构图

3 键盘驱动设计

CH456芯片通过兼容I2C的串行接口与龙芯2H进行数据通信,当有按键被按下时,芯片提供低电平有效的中断,Linux进入中断处理程序,再通过输入子系统上报按键的信息。驱动的流程图如图4所示。

3.1数据通信的实现

由于CH456芯片没有使用标准的I2C接口,故不能使用I2C驱动进行通信,需要自己操作龙芯2H内相关寄存器来进行通信。通信参考I2C分为start、write、read和stop 4个函数。例如start函数实现如下:

由于CH456不是标准I2C设备,没有固定的地址,所以需要每次通信的start部分都需要发送对应的地址位。先向发送寄存器写入地址,再向控制寄存器写入产生Start信号与写信号的命令。程序尝试5次发送,如果没有收到ACK则返回-1告知驱动发生了通信错误。

3.2键盘中断的实现

CH456的INT#用于键盘中断输出,默认是高电平。当CH456检测到有效按键时,INT#输出低电平有效的键盘中断;龙芯2H收到中断信号后,由Linux处理中断进入中断处理程序对CH456执行读操作。当CH456收到读指令后,芯片会自动将INT#恢复为高电平,并从SDA输出按键代码。龙芯2H从SDA获得一个字节的数据,其中低7位是按键代码。

中断处理函数的实现如下:

为了消除键盘抖动,在进入中断5毫秒后才开始读取按键的值。首先判断按键是否被按下,按键代码的第6位为1时代表按键被按下,本系统的设计不考虑连续按住键盘不放的情况,所以不需要对按下的时间进行监测,如果读取到按下,先后通过输入子系统上报按下与弹起的键值。

3.3键盘驱动的初始化

在probe函数内对键盘驱动进行初始化,首先检查结构体 platform_data各个参数是否存在,然后通过 input_ allocate_device()分配 input设备并设置事件类型为EV_KEY,另外设置好其他参数后用input_register_device()注册输入设备。

在注册完设备后对中断进行初始化:

error=request_threaded_irq(client->irq,NULL,ch456_irq,IRQF_TRIGGER_LOW|IRQF_ONESHOT,client-> dev.driver->name,kpad);

在实现CH456的中断之前,需要在龙芯2H中断寄存器的初始化处手动添加龙芯2H中断的配置,包括配置GPIOOE输入输出配置寄存器将复用为中断的GPIO位设成输入,配置INTIEN中断使能寄存器寄存器使能中断,配置INTPOL中断极性寄存器寄存器设置为电平触发,配置INTEDGE中断模式寄存器设置为低电平触发。

3.4键盘芯片的配置

CH456芯片可以用来控制数码管显示,当做键盘芯片时也可以不使用中断而使用查询,所以在驱动初始化之后,按键使用之前还需要对芯片进行初始化配置:

ch456_write(CH456_SYSTEM,CH456_XINT_ON);

ch456_write(CH456_CONFIG,0x00);

首先配置system寄存器,设置参数为支持显示驱动、键盘驱动和中断(配置的数值为0x0B),再配置config寄存器,配置参数X15作为键盘中断输出引脚,禁止GPO引脚(配置的数值为0x00)。

3.5驱动的加载与测试

在/drivers/input/keyboard/Kconfig内添加:

config KEYBOARD_CH456

tristate"CH456 I2C 8*8 Keypad and IO Expander"

depends on I2C

在/drivers/input/keyboard/Makefile内添加:

obj-$(CONFIG_KEYBOARD_CH456)+=ch456.o

编译menuconfig,在Device Drivers-Input device support -Keyboards下选择CH456驱动如图5所示。

图5 驱动编译示意图

然后编译内核,重启加载镜像。

经过系统测试,在Linux的控制台下手动按键进行测试,按下按键后即出现所按字母,未出现键盘双击或者未响应等错误状态,也没有按键错误的情况,多次测试后可以证明该驱动稳定可靠。

最终龙芯主板与键盘的连接如图6所示。

图6 主板照片

4 结束语

本文介绍了基于龙芯2H和CH456芯片的4乘4矩阵键盘Linux驱动的实现方案。该驱动以静态编译的方式加入内核后,通过输入测试证明了矩阵键盘驱动工作稳定、高效。在未来的项目中,这一驱动设计方案也具有参考价值,只需要修改I2C通信接口和中断引脚即可方便移植。

[1]董志国,李式巨.嵌入式 Linux设备驱动程序开发 [J].计算机工程与设计,2006,27(20):3737-3740.

[2]龙芯中科技术有限公司.龙芯2H处理器用户手册[EB/OL].(2015)[2015-11-03].http://www.loongson.cn/uploadfile/cpumanual/Loongson2H_Processor_User_Manual.pdf.

[3]龙芯中科技术有限公司.龙芯2H处理器数据手册[EB/OL].(2015)[2015-11-03].]http://www.loongson.cn/uploadfile/cpumanual/Loongson2H_processor_data_sheet.pdf.

[4]江苏沁恒股份有限公司.16位数码管驱动及键盘控制芯CH456.[EB/OL].(2013)[2015-11-03].http://www.wch.cn/downfile/182

[5]李其珂,付红桥.基于嵌入式Linux的矩阵键盘驱动研究与实现 [J].重庆理工大学学报:自然科学,2012,26(12): 88-92.

[6]杨斌斌,张雪英,王玉宏.基于嵌入式Linux的矩阵键盘驱动程序研究与开发[J].现代电子技术,2009(2):39-41.

【相关参考文献链接】

童凯,张红雨.基于Linux与Qt4的网络数码相框实现[J]. 2014,22(2):130-133.

田苗,冯进良,文琴,等.基于Linux系统的指纹识别门禁系统的研究[J].2014,22(2):134-136,139.

李梅.Linux实时性能优化算法分析与研究[J].2014,22(5):56-58.

王明绪,靳果,桂博.基于ARM-LINUX的物流复检系统设计[J].2014,22(6):162-164.

裴欧亚,康慕宁,张磊.基于SystemTap的Linux服务器性能分析系统的设计与实现[J].2014,22(10):28-31.

许文明.基于ARM-Linux嵌入式系统的多进程并发服务器设计[J].2014,22(13):1-3.

张龙,殷亚玲.Linux内存管理图形化的研究与实现[J].2014,22(13):72-74.

王腾飞,马志峰,王昊,等.基于ARM-Linux的数据采集和网络传输系统设计[J].2014,22(16):21-24.

徐海宝,杜伟龙,曹江涛.基于ARM-Linux多功能机器人的设计[J].2014,22(17):19-21.

刘青,杨勇.基于嵌入式LINUX的智能车载终端系统的设计[J]. 2014,22(23):81-83.

杨鹏.基于Linux系统的FPGA芯片在线加载的设计和实现[J]. 2015,23(6):161-164.

蒋琳娇,刘淼,金星.基于嵌入式Linux系统的Qt Quick应用启动优化[J].2015,23(7):151-154.

张蒙.基于LINUX的PBOC3.0关键读卡技术的研究与应用[J]. 2015,23(8):188-192.

Research and implementation ofmatrix keyboard driver of Linux on Loongson2H

LIZe-yin,GONG Jun,WU Chang-hao
(1.Department of Special Electronics Technology,No.58 Research Institute of China Ordnance Industries,Mianyang 621000,China)

For the Loongson2H board 4×4matrix keyboard extension requirements,analyzed the keyboard hardware and serial communication interface.Designed matrix keyboard input device driver based on Linux 2.6.32 input subsystem model and showed the driver implementation process.The test results showed that the driver meets the design requirements,stable,efficientand versatile.In the later project,the driver can be used directlywith littlemodification.

loongson2H;CH456;matrix keyboard;Linux driver

TN492

A

1674-6236(2016)19-0180-04

2015-10-28稿件编号:201510203

李泽银(1990—),男,四川绵阳人,助理工程师。研究方向:嵌入式编程。

猜你喜欢

龙芯寄存器中断
基于国产化龙芯的动环数据采集系统
STM32和51单片机寄存器映射原理异同分析
Lite寄存器模型的设计与实现
基于FPGA的中断控制器设计*
Linux中断线程化分析及中断延时测试
移位寄存器及算术运算应用
跟踪导练(二)(5)
千里移防,卫勤保障不中断
“龙芯之父”胡伟武
龙芯发布新一代处理器产品