按键映射怎么用器怎么用

■西南交通大学 胡章勇 蒋朝根
关键词¥3C2410 键盘驱动 Qt/E键值映射Linux
引 言
随着嵌入式系统在消费类电子、工业控制、航空航天、
汽车电子、医疗保健、网络通信等各个领域的广泛应用。嵌
入式系统这个名词已经被各行各业的人所熟悉。嵌入式
系统已经走进了人们的生活,正在以各种不同的形式改变
着人们的生产、生活方式¨。。嵌入式系统一般由硬件平台
和软件平台2部分组成,其中硬件平台由嵌入式微处理器
和外围硬件设备组成,软件平台由嵌入式操作系统和应用
软件组成。因为有了操作系统的存在,应用程序就不能像
单片机那样直接控制底层的硬件,必须通过操作系统提供
的接口函数来完成对底层硬件的操作,这些接口函数就是
驱动程序。为了满足实际开发的需要,本文提供r36按
键小键盘驱动程序的编写方法,并在Qt/E实际应用程序
中调用了这些按键的键值,运行效果良好。
1按键硬件设计
系统按键输入部分的硬件原理如图1所示。36个按
键按6×6方式排列.其中行线分别接¥3C2410的GPB0、
GPBl、GPB2、GPB3、GPB4、GPB5口,列线分别接GPFO、
GPFl、GPG3、GPG5、GPG6、GPG7口。列线可以复用
EINTO、EINTl、EINTll、EINTl3、EINTl4、EINTl5口,
外接上拉电阻保证按键在未按下时中断口处于稳定的高
电平状态。
2驱动部分软件设计
2.1 驱动程序入口函数
人口函数主要完成键盘设备驱动的注册、创建键盘设
备文件系统节点以及行线GPIO的初始化。驱动采用自
动分配主设备号的方式,次设备号设为1[2]。设备驱动的
注册及文件节点的创建函数如下:
register_ehrdev(0,DEVICE-NAME,&s3c2410—kbd—fops);
devfs—register(NULL,DEVICE—NAME.DEVFS—FL—
DEFAULT,0,1。S—IFCHR S—IRUSR S—IWUSR。
s3c2410一kbd—fops.NULL);
register—chrdev()函数中的第一个参数0表示系统自
动分配一个未使用的主设备号,s3c2410一kbd—fops为驱动
程序提供的函数接口。devfs—register()函数成功返回后,
键盘在文件系统的目录为/dev/DEVINE-NAME。
行线GPIO口全部初始化为0,去除可能的开机GPIO
口高电平干扰,以方便以后的键盘扫描。实现函数如下:
set—.gpio_ctrl(gpio..rOW——tabEi]l GPl0..PULLUP—.DIS GPIO..
M()DE—OUT);
write_gpio—bit(gpio—row—tabEi],o);
gpio_row_tabEi-]为行线端口,set—gpio—ctrl()函数设
置行线GPIO口为输出模式,禁止上拉电阻。write—gpio—
bit()函数实现GPIO口初始化为0。
L_J
--_J
二-J
L_J
.-一S0 —-一S1 —-一S2 .-一S3 .J_LS4 —-一S5
_o呐 _o
01 -o叶‘
01’旧q‘_o叶GPBI
矿气野
瑚 删 删 嗣。一-_产刊占PB
与'掣2.
_.●一S13 —_一S14 .-一S15 -一S16
._.S17
叼01 旧叶
01‘ _o叶一-o叶GPB:
矿’§}8一
鼎号9_稍旷
.矿气誓1
粥2-‘严群k
—-一S24 —-一S25
—I—S26
—-一S27 — -一S28 —-一S29
_o n‘叼01一
01 旧01‘叼q
01GPB*
矿~§}o 矿弋普1 矿’鹭2 矿弋S}3 矿~S}4与铡PBI
图1 6x6键盘硬件原理图
2.2打开与关闭键盘设备函数
按键是一个输入设备,用于向系统输入外部的输入信
号。由于外部信号的输入是不可预见的,驱动设计采用了
“中断”的方式来实现。按键按下时,系统产生中断并响应
中断事件;没有按键按下时,进程进入睡眠等待。在open
()函数中完成中断申请并调用申请中断函数request.一irq
()。设置中断的触发模式为下降沿中断并禁止上拉电阻,
实现函数为set—external—irq(irq_coLtabVi],EXT_FALL--
ING二EDGE,GPIO—PUI。I。UP—DIS),其中irq—col—tab[-i3
为按键的列线端口。关闭函数release()中,由free—irq()
实现所有irq中断的释放,并打印提示信息。
2.3中断处理函数
中断处理函数是申请中断函数request.一irq()中最重
要和最关键的函数,用来实现按键的扫描和去除抖动等
工作。
2.3.1 键盘扫描
键盘扫描主要步骤如图2所示。
J扫描中断口(列线)
记录按键所在行号l
记录按键所在列号
根据行、列号l
计算键值 I
设置所有列线为
延tiv]350ms
输入模式
I +
将所有行线置位
将所有行线清零I
—t I
I读列线电平l 设置所有列线为I
中断模式 l
图2键盘扫描步骤
对驱动进行简单的测试,得到扫描时间延时的最佳数
值是350ms。键值的计算公式为:
key_value=rowno*6+col—no+1
其中row—no为行号,col—no为列号。主要函数代码如下:
for(i=0;i<CoL—NUM;i++){
if(irq_eo[一tab[i]一=irq){
//有中断发生
col—no=i, //得到发生中断的列号
break;
for(i一0;i<COL.NUM;i++){
set—gpio—etrl(gpio—col—tab[i]I GPIO—PULLUP—DIS
GPI()-MODEIN); //输入模式
for(i=0li<R()WNUM;I++){
write_gpio_bit(gpio_row_tab[i],1);
//行线置位
hat
r=read_gpio_bit(gpio_eol_tab[col_n01)//读列线电平
.write_gpio_bit(gpio_row_tab[i],o); //行线清零
if(r){
row—no=i; //得到按键所在的行号
key_value=row_no*6+∞Ln0+l} //计算键值
mdelay(350)l //延时350ms
break;
for(i一0;i<COL—NUM;i++){
set—gpio_ctrl(gpio.一col一.tab[i]l
GPIO—PULLUP—DISlGPIO—
MODE_ALTO); //中断模式
2.3.2去除抖动
每个按键都连接着中断口,抖动表现为一次按键多次
中断,且几次中断间隔时间很短。去抖动的方法就是只对
短时间内多次键盘中断的第1次进行处理,禁止其余的所
有中断,待处理结束后再使能中断,流程如图3所示。
中断发生H等待200ms
等待中断发生
二二[
开启中断
关闭中断l l关闭中断
按键扫描l l延时200ms
图3去抖动的中断处理事件流程
等待时间的算法中采用了定时器的时钟数jifties。定
义一个全局变量unsignedlongcount,初始化时赋值为0。
键盘中断产生时首先读取jifties值,并与count相减。若
差值大于某特定值(本文中为20),则说明有按键按下,将
count赋值为刚读取的jifties值,并实现全部中断处理程
序;若差值小于某特定值,就表示是一次抖动,如图3所示
简单延时后退出。
2.4读取键盘设备函数
利用read()函数,若有按键发生则读取该键值,并将
键值传递到用户空间,同时复位按键标志。读取过程中有
2个较重要的函数。一个是wait—event—interruptible(),
它有2个参数,第1个是由DECLARE—WAIT—QUEUE—
HEAD声明的等待队列,第2个是自定义的按键标志,是
全局变量,初始定义时为0,在扫描函数中若得到按键键
值则修改为1。另一个函数为copy—to—user(),将按键键
值从内核空间拷贝到用户空间,供应用程序在调用read()
时读取键值。
至此已经完成了驱动函数编写的大部分工作,最后对
该驱动函数做了简单的测试,将键值通过超级终端显示出
来,结果如图4所示,在整个过程中没有明显的抖动发生。
图4按键测试结果
3 Qt/E键盘的映射
Qt是一个多平台的C++图形用户界面应用程序框
架,完全面向对象,很容易进行扩展.并且允许真正的组件
编程。Qt采用SIGNAL/SL()T事件信号传递机制,由挪
威Trolhech公司出品,支持几乎所有的Unix系统,还支
持winNT/win2k等平台。Qt/E在嵌入式环境下使用,
其特性是町以直接在FrameBuffer上显示图形接口,运行
速度更快,这对硬件与容量都有限制的嵌入式应用来说非
常重要。Qtopia是Trolhech公司针对采用嵌入式Linux
系统的消费电子设备开发的综合应用平台,Qt/E包含完
整的应用层、灵活的用户界面、窗口操作系统、应用程序启
动程序以及开发框架。使用Qt/E不仅可以开发Qtopia,
也可以用来开发面向Qtopia的第三方软件∞1。
在我们的开发板上用Qt/E编写了应用程序,并通过
Qtopia显示。为了将自己制作的键盘与Qt/E的应用程
序连接起来,实现键盘的输入功能,需修改qt一2.3.10/
src/kernel下的qkeyboard—qws.cpp文件。由QWSKey—
boardHandler派生出QWSKeyboardHandler_6—6类,在构
造函数QwSKeyboardHandler一6—6(constQStringde—
vice)中完成打开在键盘驱动程序中注册的设备My—Key-
bord一6—6,实现其中的关键函数(槽函数)void
readKey—
boardData(),完成通过按键得到的键值与Qt/E键盘的映
射。部分代码如下:
QWSKeyboardHandler一6—6::QWSKeyboardHandler一6—6
(constQStringdevice){
Sft=false; //设置数字字符转化标志位,软件实现同一键
//值的不同功用
Cap false; //设置字母大小写转化标志位,软件实现同一
//键值的不同功用
fd=open(device.isEmpty()?”/dev/My—Keybord一6—6”:
device.1atinl(),0-RDONLYI()-NONBI。OCK,0);
if(fd>一0)(
QSocketNotifier。notifier;
notifier=flewQSocketNotifier(fd,QSocketNotifier::
Read,this);
connect(notifier,SlGNAL(activated(int))。this.SLOT
(readKeyboardData()));
voidQWSKeyboardHandler_6—6::readKeyboardData(){
intkey'valuel
read(fd,keyvalue,sizeof(keyvalue)); //读取按键值
if(keyvalue==1)
processKeyEVent(0,Qt::Key—Up,0,TRUE,FALSE);
//完成映射
if(keyvalue==2、
processKeyEvent(‘8’,Qt::Key_8,0,TRUE,FALSE);
processKeyEvent(intUnicode,intkeycode,intmodi—
tiers,boolisPress,boolautoRepeat)是Qt/E完成键盘映
射的关键函数。其中第1个参数是需要完成映射的值。如
要映射字母A,则该参数为“A”;要映射数字7,则该参数
为“7”;对于其他的功能码如TAB、Shift等,该参数均为
0。Qt::Key_Up为Qt/E定义的各个按键。囊括r所有的
PC标准按键,可以根据需要进行定制。本系统定义了26
个大小写英文字母、10个数字以及空格、确定等功能键。
最后在QWSKeyboardHandler*QWSServer::newKey-
boardHandler(constQStringspec)中,加入以下代码:
elseif(type==”MyKB”){handler—newQWSKey—
boardHandler_6—6(device);)
这段代码实现了刚才定义的QWSKeyboardHandler一
6_6类。同时在Qtopia的启动脚本中加入一句:export
QWS_KEYB()ARD=”MyKB:/dev/My—Keybord一6—6”。
当启动Qtopia时,将使用上面定义的键盘映射,并读取键
盘,使用所定义的各种按键信息。
结 语
本文讲述了通过¥3C2410的GPl0口制作按键以及
I.inux下按键驱动的编写方法,同时介绍了按键与Qt/E
应用程序的映射设计方法。在Qt/E的应用程序映射设
计中采用-r一个比较灵活的方法来防止按键抖动:驱动
的设计中,如果检测到抖动则赋按键键值为0,而在应用
程序中不对键值0做映射响应,即如果有抖动发生,西
◆总线出错率,总线单位时间的错误报文数。
◆总线负载,每秒钟节点发送的位数与总线波特率
之比。
除此之外,为了更方便地检杳总线状态,又增添了显
示功能,可以显示接收报文、状态寄存器、报文总数、报文
计数器、错误代码等。总线分析软件程序中所采用的算法
简述如下。
(1)总线吞吐量的测试
首先设定计数器i一0,定时器时间t=0,测量值数组
count[5]={0}。当接收到总线上的1个报文并释放接收
缓冲区时启动定时器,设定定时时间t=5S,等待定时中
断发生。计数器放在接收中断函数中,当成功接收l帧报
文时,i—i+1。定时器中断发生时,将计数器的值i存人
count[5]数组中。之后启动下一次定时,当数组满时,结
束测试,对count数组进行排序,并去除最大和最小值。
总线吞吐量y为:
.v一塑竺璺![!]±塑坚坐[!]±塑坚翌![!]
3×5
(2)总线负载的测试
通过之前的自适应波特率程序已经检测到总线上的
波特率为bore,设定计数器歹=1,定时器t=0,报文位数
设为cl=0,报文位数数组bit—count[20]一{0)。当接收
到总线上的1个报文并‘释放接收缓冲区时启动定时器,设
定定时时间t—ls,等待定时中断发生。报文位数、报文
位数数组和计数器放在接收中断函数中。当成功接收1
帧数据时,J一歹+l,通过读取接收帧信息SFF可以判定该
帧数据有多少位,将位数写入f1,并存入bit—count[20]数
组中。定时时间到时,拷贝计数器值,结束测试。总线负
载U为:
【,:堑![Q3±坠生[!j±:::±垒堡&=13×loo%
Dote
3.5 实验结果
为了便于测试分析仪的有效性和准确性,取单节点进
行实验,即总线上只有1个节点在进行报文发送。分别取
波特率5kbps、10kbps、50kbps、100kbps,发送报文时间
4PPf-/cA7Iyo~/、『o丁Esl堕旦玉丝l
●■●■■■■■■■■■■■■■●■■■■●■■■■●■●●■■■■●■■■■■■●■■■■■■一
间隔100ms、150
iTIS、200 ms、250
ms、400 ms、450
ms、 500ms、800
ms,每帧报文有8
字节数据域。实验
得到的结果如表1
所列。
表1 实验结果
波特率 发送报文 吞吐鼍 总线负载
/kbps 间隔jms/(帧 s。) /(%)
100 10 25.2
150 6.3 1 7.6
200 5.0 6.2
250 4.0 5.0
400 2.5 0.7
450 2.3 O.5
从实验结果可以看出,当每100ms发送1帧报文时,
检测到的总线吞吐量为10帧/s,即总线每秒传送的报文
总数为10帧,与实际相符。在不同的报文发送间隔和不
同的总线波特率下,所测得的总线吞吐量和总线负载与实
际相吻合。
4 结 论
本文设计的CAN总线分析仪在实验室和工业现场上
进行了调试,主要调试的项目包括自适应波特率、液晶显示
和CAN总线通信监测等。实践证明该设计实现了对
CAN2.0B标准节点(并兼容CAN2.0A节点)监测分析的功
能,指标达到预期的效果。为CAN总线的工程开发应用和
教学提供了一种简洁、高效的调试和监测手段。●E
参考文献
[1]邬宽明.CAN总线原理和应用系统设计[M].北京:北京航
空航天大学出版社,1996.
[23Philips.PHILIPS
DATASHEET(SJAlOOOStand—alone
CANcontroller),2000.
[3]AtmelCorporation.ATMELDATASHEET(mega64—
64L)。2001. .
[4]饶运涛,邹继军,郑勇芸.现场总线CAN原理与应用技术
[M].北京:北京航空航天大学出版社,2003.
凌威(硕士),主要研究方向为现场总线与气体检测。
(性稿日期:20.08-04‘16)
m系统不做任何工作,因而有效地防止了抖动。_E
参考文献
[1]李亚锋,欧文盛,等.ARM嵌入式Linux系统开发从入门到
精通[M].北京:清华大学出版社,2007.
[2]刘森.嵌入式系统接口设计与Linux驱动程序开发[M].北
京:北京航空航天大学出版社,2006.
[3]北京博创公司.UP—NETARM2410实验指导书,2003.
[4]BlanchetteGasmin,SummerfieldMark.C++GUIQt3编程
[M].齐亮,译.北京:北京航空航天大学出版社,2006.
[53Qt参考文档[0L].(2006一02—06)[2008一04—203.ht—
tp://www.qiliang.net/qt/index.html.
胡章勇(硕士)。研究方向为嵌入式系统;蒋朝根(副教授),研究方向
为计算机网络与信息系统、嵌入式系统以及DSP技术。
(收稿日期:2008—04—30)
Linux的键盘驱动与Qt/E的键盘映射
作者: 胡章勇, 蒋朝根, Hu Zhangyong, Jiang Chaogen
作者单位: 西南交通大学
刊名:
单片机与嵌入式系统应用
英文刊名: MICROCO***OLLERS & EMBEDDED SYSTEMS
年,卷(期): 2008,""(9)
被引用次数: 1次
参考文献(5条)
1.李亚锋.欧文盛 ARM嵌入式Linux系统开发从入门到精通 2007
2.刘淼 嵌入式系统接口设计与Linux驱动程序开发 2006
3.北京博创公司 UP-NETARM2410实验指导书 2003
4.Blanchette Gasmin.Summerfield Mark.齐亮 C++ GUI Qt3编程 2006
5.Qt参考文档 2008
相似文献(8条)
1.学位论文 刘爱斌 移动业务终端BSP与多媒体播放器的开发 2009
移动业务终端是对移动营业厅的补充,在具有手机功能的同时,也具有营业厅的部分功能,可部署在营业厅覆盖不到的地方。移动业务终端采用了
S3C2410嵌入式处理器和Windows CE.NET嵌入式操作系统。
在分析BootLoader已有功能的基础上,增加了对LCD的支持,使得系统启动时能够显示开机界面和启动进度;为了将数据保存到NAND Flash中,增加
了对NAND Flash的分区功能,创建FAT32和BinFS分区。手机软件下载就上软吧 - 绿色安全手机软件门户
智能专区:
您的位置:
按键映射
http://www.ruan8.com/soft_2655.html
将HotButton Plus定义在一个硬件按钮上,重复的按动此按钮,你设定的常用程序和系统功能(如系统和网络状态)将轮流出现在窗口,还可以拨打***。你甚至可以给每个任务制定一个声音文件,这样不用看你也知道当前出现...
按键映射
软件编号:2655
文件格式:EXE
推荐等级:
软件语言:简体中文
软件性质:免费软件
软件大小:39K
更新时间:2008-02-19
下载次数:528
鼠标点击
鼠标点击
大家推荐的软件
如何免费下载到手机
方法1.手机上网输入网址 ruan8.com 直接访问软吧。
方法2.免费发送短信“软吧”到“12114”获取wap链接,点击即可进入软吧。
方法3.下载***
,打开浏览器后,输入网址 ruan8.com 直接访问软吧,速度更快,更省流量!
方法4.下载***
,无需输入网址,一键访问软吧!
应用平台
SmartPhone
SmartPhone
适用机型:摩托罗拉 i930,MPx200,MPx220,MPx100 多普达 310,515,535,565,566,568,575,577,585,586,595,596,710,C500,C720,C720W,C730,C750,S300 三星 B6520,B7320,C6625,i200,i300,i308,i310,i318,i320,i328,i600,i607,i608,i620,i637,i640 夏新 E70,E72,E75,E78 HTC CHT9100,S510,S520,S521,S620,S710,S720,S730,S740,S620,S630,Dash 3G,Ozone,Snap 中兴 N61 华硕 V90,M530w 惠普 iPAQ 518
按键映射
将HotButton Plus定义在一个硬件按钮上,重复的按动此按钮,你设定的常用程序和系统功能(如系统和网络状态)将轮流出现在窗口,还可以拨打***。你甚至可以给每个任务制定一个声音文件,这样不用看你也知道当前出现的是什么程序了
支持:多普达566、多普达586、多普达577、多普达595、多普达S300、多普达C730、多普达C500、三星i300、三星i308、多普达710、HTCS730、多普达585、多普达575、多普达565、多普达310、
下载地址
点击高速下载软件,电脑用户请通过数据线、蓝牙把软件传入您的手机***,手机用户可直接***。
编辑短信“
软吧 2655
”(说明:软吧+空格+软件编号)发送到
,即可免费获取下载链接!
手机使用UC浏览器,输入网址 ruan8.com 直接访问软吧手机站,下载更快,更省90%流量!
软吧推荐 软件评论
您还能输入300字
下载分类
同类热门
同类最新
相关下载
· S60第三版
· S60第三版
· SmartPhone
· Pocket PC
· Java/S40,索爱Java
· S60第三版
· S60第三版
· Pocket PC,SmartPhone
· S60第三版
· S60第二版
关注手机软件,关注www.ruan8.com,请向您的5个QQ好友宣传www.ruan8.com,多谢支持!
Copyright (C) 1999-2008 Ruan8.com, All Rights Reserved .

参考资料

 

随机推荐