android平台矩阵键盘驱动[基于x210开发板]
来源:互联网 发布:少年犯之七人知乎 编辑:程序博客网 时间:2024/06/05 22:34
矩阵键盘驱动源文件:
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口:
注意,这里需和硬件电路匹配,具体使用了8*8或是4*4或是2*5等,最好程序做相应的调整。
紧接着,在devs.c中,会有平台设备的定义以及一些资源的定义:
最后,就是键盘驱动了,具体在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函数,然后通过算
法判断是否有键按下,关键语句如下:
然后通过两个while循环检测按下的键值,并上报给系统。
以上三条语句非常的巧妙,能够很好的识别按下和抬起的事件,在keypad_scan函数中,利用
逐行扫描法,以4*4为例,如首先将行设置为0xe,这时最末一列被赋为低,再检测列上的电平,
如也出现低电平,则根据具体的位置判断是哪颗键按下。然后依次将行设置为0xd,0xb,0x7。
将检测到的键保存到rval后再取反,再保存到keymask数组中,然后利用上面的算法得到
press_mask和release_mask,根据得到的值判断是否有键按下或抬起。
键值码表在s3c-keypad.h中,定义如下:
这里是2*5的码表,如是4*4或是其他组合,修改该码表即可,上面对应了相应按键发送给系统的
键值,android键值码表在device/samsung/smdkv210/s3c-keypad.kl中,内容如下:
如我们按下第9个键时,驱动中发送的是34,对应android码表中key34为BACK键,那么第9个
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口:
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中,会有平台设备的定义以及一些资源的定义:
/* 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函数,然后通过算
法判断是否有键按下,关键语句如下:
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中,定义如下:
int keypad_keycode[] = {1, 2, 3, 4, 5,6, 7, 8,34, 10};
这里是2*5的码表,如是4*4或是其他组合,修改该码表即可,上面对应了相应按键发送给系统的
键值,android键值码表在device/samsung/smdkv210/s3c-keypad.kl中,内容如下:
key 42 VOLUME_UP WAKEkey 58 VOLUME_DOWN WAKEkey 51 HOME WAKE_DROPPEDkey 50 MENU WAKE_DROPPEDkey 26 ENDCALL WAKE_DROPPEDkey 34 BACK WAKE_DROPPEDkey 57 DPAD_LEFT WAKE_DROPPEDkey 49 DPAD_RIGHT WAKE_DROPPEDkey 25 DPAD_UP WAKE_DROPPEDkey 41 DPAD_DOWN WAKE_DROPPEDkey 33 DPAD_CENTER WAKE_DROPPEDkey 10 POWER WAKE
如我们按下第9个键时,驱动中发送的是34,对应android码表中key34为BACK键,那么第9个
键将扮演返回的角色,其他同理。
附:相关源码下载:
http://xboot.org/forum.php?mod=viewthread&tid=348&extra=
0 0
- android平台矩阵键盘驱动[基于x210开发板]
- android平台矩阵键盘驱动[基于x210开发板]
- S5PV210 Android 矩阵键盘驱动[基于x210开发板]
- S5PV210 Android 矩阵键盘驱动[基于x210开发板]
- S5PV210 Android 矩阵键盘驱动[基于x210开发板]
- android平台按键驱动[基于x210开发板]
- android平台按键驱动[基于x210开发板]
- android平台init.rc脚本修改-[基于x210开发板]
- android平台init.rc脚本修改-[基于x210开发板]
- android平台init.rc脚本修改-[基于x210开发板]
- android平台busybox的终极解决方案---基于x210开发板
- android平台busybox的终极解决方案---基于x210开发板
- android平台busybox的终极解决方案---基于x210开发板
- 在s5pv210开发板的android平台上添加busybox的支持[基于x210开发板]
- 基于X210开发板平台下的刷机教程
- 降龙十八掌搞定rt3070 USB WIFI模块在android2.3平台上上网[基于x210开发板]
- 降龙十八掌搞定rt3070 USB WIFI模块在android2.3平台上上网[基于x210开发板]
- 降龙十八掌搞定rt3070 USB WIFI模块在android2.3平台上上网[基于x210开发板]
- ubuntu 下如何安装 rpm 软件包
- android平台busybox的终极解决方案---基于x210开发板
- Linux文件查找命令find,xargs详述
- linux find 命令详解
- android平台init.rc脚本修改-[基于x210开发板]
- android平台矩阵键盘驱动[基于x210开发板]
- 降龙十八掌搞定rt3070 USB WIFI模块在android2.3平台上上网[基于x210开发板]
- Eclipse中使用自己的makefile管理工程
- android平台按键驱动[基于x210开发板]
- 分析Windows和Linux动态库
- Android Studio logcat 颜色
- register_chrdev,class_create()
- misc_register和register_chrdev的区别
- Allegro 16.5详细破解步骤