--作者:赖玉平(Peter Lai)aulyp@163.com
本实例通过给开发板加入一个全新的按键,因为该按钮是自已搭的电路外接到开发板上的,开发板的源码中并没有相关的原码,所以要使这个按键能正常工作那就得真刀真枪地往按键驱动中添加相关代码来实现,这样能读者知道要驱动一个按键要涉及到哪些部份,更有利于理解按键驱动的框架。
要达到的效果:该按钮定义为数字键“8”,这是为了方便验证功能,在进入系统后直接打开搜索框,按这个键,如果它工作正常,就能看到往输入框里输入数字“8”,
一、硬件连接
EINT9 ---GPN9 CON1:第24脚 按键为低电平
开发板实物图和定义图
本次实验,我们选用CON1接口里的EINT9作为输入,外接一个按键,平时给EINT9的是高电平,按键按下为低电平,所以中断的触发方式是下降沿触发!
通过上面的图,就能知道怎么接线了
6410的Datasheet上GPNCON寄存器定义
二、写驱动程序
因为原来android就提供有按键驱动的原型了,所以我们只要在它的基础上加入新加的按键操作就行了,没必要重新写起。
1、 按键定义
查数字键“8”对应的code
linux-2.6.36-android/include/linux/input.h
#define KEY_1 2
#define KEY_2 3
#define KEY_3 4
#define KEY_4 5
#define KEY_5 6
#define KEY_6 7
#define KEY_7 8
#define KEY_8 9
#define KEY_9 10
#define KEY_0 11
添加定义:
Linux-2.6.36-android\arch\arm\mach-s3c64xx\Mach-mini6410.c文件,
static struct gpio_keys_button gpio_buttons[] = {
……
加入
, {
.gpio = S3C64XX_GPN(9),/*GPN9*/
.code = 9,
.desc = "KEY _8",
.active_low = 1,/*低电平有效*/
.wakeup = 0,
}
}
这里是以Tiny6410开发板为例子进行讲解,如果你的开发平台是其他平台没有
Mach-mini6410.c文件,请在你的平台里搜索一下“struct gpio_keys_button”就能找到您平台按键定义的文件,作上面的修改
2、初始化
gpio_keys_setup_key()函数
初始管脚 为输入,获得EINT9的物理中断号,申请系统中断等,这一套机制原来和GPIO_keys驱动已级做好gpio_direction_input,gpio_to_irq()等函数都能直接用了,所以不用特别的写,按原来的就好。
要注意的中断触发方式,原来驱动的其他按键是双边沿触发
irqflags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING;
这样做的效果是:按键按下一个中断,按键抬起来一个中断,驱动给上层发送的事件也是有KEY_UP和KEY_DOWN事件的,
如果想让这个按键只有KEY_DOWN事件,可以改为如下
if(button->gpio == S3C64XX_GPN(9))
{
irqflags = IRQF_TRIGGER_FALLING;
}
else
{
irqflags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING;
}
如果这样改的代码,测试时会发现,在输入框,按下该键后,一直在输入“88888888888…”这样,这是不正常的,这里只是为了进一步说明影响才这么改!
到这一步,新加入的按键已经能正常工作了,验证方法就是,编译出zImage烧录到开发板,然后点击桌面上的搜索框,进输入状态,然后按我们外接的按钮,会看里按一下就输入一个“8”。正是我们想要的效果!
总结:
如果只是简单地用一个外中断管脚接个按键加入到系统,作为一个通用的键盘按钮,那么驱动修改将会非常简单,只要修改
static struct gpio_keys_button gpio_buttons[] = {}结构,添加相应的按钮信息就行了,
如果要加入的是否中断脚,需要主动去扫描,那就要另外写一个线程,用于键盘扫描,得到状态后用gpio_keys_report_event一样的方法向系统发送按键信息就行了。
没有评论:
发表评论