九鼎创展论坛中文版English
登录 | 立即注册 设为首页收藏本站 切换到宽版
查看: 9111|回复: 1
打印 上一主题 下一主题

android平台矩阵键盘驱动[基于x210开发板]

[复制链接]
跳转到指定楼层
楼主
发表于 2011-12-19 10:44:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
矩阵键盘驱动源文件:

kernel/drivers/input/touchscreen/keyboard/s3c-keypad.c

kernel/drivers/input/touchscreen/keyboard/s3c-keypad.h

kernel/arch/arm/mach-s5pv210/mach-smdkc110.c

kernel/arch/arm/plat-s5p/devs.c



首先,make menuconfig,

Device Drivers --->

Input device support --->

Keyboards --->

<*> S3C keypad support



注意,手动配置menuconfig后,需要手动将.config覆盖到arch/arm/configs下的

s5pv210_android_defconfig文件,否则脚本自动会将该文件覆盖到内核根目录下。



然后,在mach-smdkc110.c中配置矩阵键盘的IO口:

view plain

  • void s3c_setup_keypad_cfg_gpio(int rows, int columns)  
  • {  
  •     unsigned int gpio;  
  •     unsigned int end;  
  •   
  •   
  •     end = S5PV210_GPH3(rows);  
  •   
  •   
  •     /* Set all the necessary GPH2 pins to special-function 0 */  
  •     for (gpio = S5PV210_GPH3(0); gpio < end; gpio++)  
  •     {  
  •         s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(3));  
  •         s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP);  
  •     }  
  •   
  •   
  •     end = S5PV210_GPH2(columns);  
  •   
  •   
  •     /* Set all the necessary GPK pins to special-function 0 */  
  •     //for (gpio = S5PV210_GPH2(0); gpio < end; gpio++)  
  •     for (gpio = S5PV210_GPH2(3); gpio < (end+3); gpio++)//lqm changed.  
  •     {  
  •         s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(3));  
  •         s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);  
  •     }  
  • }  



注意,这里需和硬件电路匹配,具体使用了8*8或是4*4或是2*5等,最好程序做相应的调整。



紧接着,在devs.c中,会有平台设备的定义以及一些资源的定义:

view plain

  • /* Keypad interface */  
  • static struct resource s3c_keypad_resource[] = {  
  •     [0] = {  
  •         .start = S3C_PA_KEYPAD,  
  •         .end   = S3C_PA_KEYPAD + S3C_SZ_KEYPAD - 1,  
  •         .flags = IORESOURCE_MEM,  
  •     },  
  •     [1] = {  
  •         .start = IRQ_KEYPAD,  
  •         .end   = IRQ_KEYPAD,  
  •         .flags = IORESOURCE_IRQ,  
  •     }  
  • };  
  •   
  •   
  • struct platform_device s3c_device_keypad = {  
  •     .name             = "s3c-keypad",  
  •     .id               = -1,  
  •     .num_resources    = ARRAY_SIZE(s3c_keypad_resource),  
  •     .resource         = s3c_keypad_resource,  
  • };  




最后,就是键盘驱动了,具体在s3c-keypad.c和s3c-keypad.h中,s3c_keypad_probe

函数通过platform_get_resource获取按键的IO,中断资源,调用mach-smdkc110.c中

的s3c_setup_keypad_cfg_gpio函数配置IO口,通过s3c-keypad.h中的相关定义填充

结构体s3c_keypad,再利用了内核定时器不断扫描按键。

按键扫描函数在keypad_timer_handler中,它反复调用keypad_scan函数,然后通过算

法判断是否有键按下,关键语句如下:

view plain

  • press_mask = ((keymask[col] ^ prevmask[col]) & keymask[col]);  
  • release_mask = ((keymask[col] ^ prevmask[col]) & prevmask[col]);  
  • ......  
  • prevmask[col] = keymask[col];  
  • ......  


然后通过两个while循环检测按下的键值,并上报给系统。

以上三条语句非常的巧妙,能够很好的识别按下和抬起的事件,在keypad_scan函数中,利用

逐行扫描法,以4*4为例,如首先将行设置为0xe,这时最末一列被赋为低,再检测列上的电平,

如也出现低电平,则根据具体的位置判断是哪颗键按下。然后依次将行设置为0xd,0xb,0x7。

将检测到的键保存到rval后再取反,再保存到keymask数组中,然后利用上面的算法得到

press_mask和release_mask,根据得到的值判断是否有键按下或抬起。



键值码表在s3c-keypad.h中,定义如下:

view plain

  • int keypad_keycode[] = {  
  •     1, 2, 3, 4, 5,  
  •     6, 7, 8,34, 10  
  • };  


这里是2*5的码表,如是4*4或是其他组合,修改该码表即可,上面对应了相应按键发送给系统的

键值,android键值码表在device/samsung/smdkv210/s3c-keypad.kl中,内容如下:

view plain

  • key 42    VOLUME_UP         WAKE  
  • key 58    VOLUME_DOWN       WAKE  
  • key 51    HOME              WAKE_DROPPED  
  • key 50    MENU              WAKE_DROPPED  
  • key 26    ENDCALL           WAKE_DROPPED  
  • key 34    BACK              WAKE_DROPPED  
  • key 57    DPAD_LEFT         WAKE_DROPPED  
  • key 49    DPAD_RIGHT        WAKE_DROPPED  
  • key 25    DPAD_UP           WAKE_DROPPED  
  • key 41    DPAD_DOWN         WAKE_DROPPED  
  • key 33    DPAD_CENTER       WAKE_DROPPED  
  • key 10    POWER             WAKE  



如我们按下第9个键时,驱动中发送的是34,对应android码表中key34为BACK键,那么第9个

键将扮演返回的角色,其他同理。



附:相关源码:

keyboard.tar.gz (18.69 KB, 下载次数: 123)
回复

使用道具 举报

沙发
发表于 2015-3-13 10:37:07 | 只看该作者
android平台矩阵键盘驱动[基于x210开发板]
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳市九鼎创展科技官方论坛 ( 粤ICP备11028681号-2  

GMT+8, 2024-11-22 22:07 , Processed in 0.021432 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表