MTK6577+Android之按键(key)修改

MTK6577按键驱动详解

1.     产品按键布局和定义


图1

图1括号里面的是android系统采用的键值,注意了,这可不是linux系统里用到的scan code。

 

2.     按键硬件设计

MTK6577的Keypad分为两部分:

(1)  Keypad接口,包括8*8按键和一个专用的power按键。

(2)  Key检测块(key detection block),提供按键按下、按键释放和抖动(de-bounce)机制。

 

按键和对应的行与列关系如下:

 

KCOL0(GPIO103/EINT30)

KCOL1(GPIO108/EINT31)

KCOL2

KROW0(GPIO98/EINT6)

F6(136,右边侧按键)

 

 

KROW1(GPIO97/EINT7)

F7(137,左边侧按键)

 

 

KROW2(GPIO95/EINT8)

 

F10(140,右边按键)

 

KROW3(GPIO99/EINT9)

 

F9(139,中间按键)

 

KROW7(GPIO107/EINT13)

 

F8(138,左边按键)

 

 

这是我们实际产品的按键定义,在这里,我重新定义,如下所示:

 

HW keycode

Linux keycode

Android code

右边侧按键

9

115---KEY_VOLUMEUP

24

左边侧按键

0

114---KEY_VOLUMEDOWN

25

左边按键

64

105--- KEY_LEFT

21

中间按键

28

28--- KEY_ENTER

66

右边按键

19

106--- KEY_RIGHT

22

 

3.     按键传递键值的流程

 

图2

 

4.     修改及编译

 

MTK6577提供\mediatek\source\dct\DrvGen.exe来配置GPIO设置、中断设置、ADC设置、KEYPAD设置和PMIC设置,打开的文件对应\mediatek\custom\hsimobile77_ics2\kernel\dct\dct\ codegen.dws:

 

 

4.1  DrvGen.exe的使用


图3

图3是在ubuntu系统安装了Wine之后,用Wine打开的。

 

(1)  打开DrvGen.exe

(2)  选择Open打开codegen.dws

(3)  如果要修改就选择Edit,修改完成之后可选择Gen Code来产生代码,更新的代码位于\mediatek\custom\hsimobile77_ics2\kernel\dct\dct目录下。也可以采用./mk drvgen命令来生成新的对应的代码。

 

(4)  然后选择Save,再Exit。

 

4.2  GPIO设置

根据上面表格,需要设置按键对应GPIO引脚的模式,如下图:


图4

红色矩形框是我新修改的,之前是NC状态,要配置为对应的模式,GPIO修改后对应的头文件是\mediatek\custom\hsimobile77_ics2\kernel\dct\dct\ cust_gpio_boot.h和cust_gpio_usage.h。

 

4.3  KEYPAD设置

结合上面的表格,知道哪个功能按键对应在哪一行和哪一列,配置如下:


图5

对应的头文件为\mediatek\custom\hsimobile77_ics2\kernel\dct\dct\ cust_kpd.h。

 

4.4  设置后生成新的代码

(1)  ./mkdrvgren或是点击图3的Gen code

(2)  ./mk rk

(3)  ./mkbootimage

更新新的boot.img

 

 

参考:

MTK Android 之MT6577驱动笔记

http://blog.youkuaiyun.com/cbk861110/article/details/9385439

 

MTK Android Driver:adda new key

http://blog.youkuaiyun.com/cbk861110/article/details/19043607

 

android系统移植之按键驱动篇

http://blog.youkuaiyun.com/armeasy/article/details/6713642

 

android定制化软件修改或添加按键驱动的核心操作步骤讲解  

http://linsheng1990526.blog.163.com/blog/static/2038241502012320111925656/

MTK平台上使用Android 12系统开发时,配置GPIO按键功能需要从硬件定义、驱动适配、DCT工具设置以及上层应用接口等多个方面进行处理。以下是详细的配置方法及开发指南: ### GPIO按键配置流程 #### 1. 硬件定义 在硬件设计阶段,需明确按键所连接的GPIO引脚编号。例如,若使用`gpio23`作为按键中断引脚,应确保其功能定义与硬件设计一致,并在原理图中标明该引脚的用途。 #### 2. DCT工具配置 使用DCT工具对GPIO进行模式配置。以`gpio23`为例,该引脚用于触摸屏中断,因此应在`EintMode`一栏打勾,表示启用外部中断功能。同时,`VarName1`字段应设置为`GPIO_EINT_CHG_STAT_PIN`,该变量名将在驱动代码中引用。 若使用的是普通GPIO按键(如`gpio26`),则不应勾选`EintMode`,而应在`Def Mode`中选择`gpio26`作为默认功能。此外,若该引脚具备复用功能(如PWM、UART等),则在`M0-M7`中选择对应功能并打勾,但需注意同一时间只能启用一种功能。 #### 3. 驱动代码配置 在Android 12系统中,GPIO按键的驱动通常位于`/kernel-4.19/drivers/input/keyboard/`目录下。开发者需要创建或修改对应的GPIO按键驱动文件,例如`gpio-keys.c`。 以下是一个简化的GPIO按键驱动配置示例: ```c #include <linux/input.h> #include <linux/gpio_keys.h> #include <linux/of_gpio.h> static struct gpio_keys_button mt65xx_gpio_keys_table[] = { { .code = KEY_HOME, .gpio = 26, .active_low = 1, .desc = "Home Key", .type = EV_KEY, .wakeup = 1, .debounce_interval = 10, }, }; static struct gpio_keys_platform_data mt65xx_gpio_keys_data = { .buttons = mt65xx_gpio_keys_table, .nbuttons = ARRAY_SIZE(mt65xx_gpio_keys_table), }; static struct platform_device mt65xx_gpio_keys_device = { .name = "gpio-keys", .id = -1, .dev = { .platform_data = &mt65xx_gpio_keys_data, }, }; static int __init mt65xx_gpio_keys_init(void) { return platform_device_register(&mt65xx_gpio_keys_device); } arch_initcall(mt65xx_gpio_keys_init); ``` 在上述代码中,`gpio = 26`表示按键连接到GPIO26,`code = KEY_HOME`表示该按键被映射为“Home”键,`debounce_interval`用于设置按键去抖动时间。 #### 4. 设备树配置(Device Tree) 在`dts`文件中添加GPIO按键节点,确保驱动能够正确识别硬件配置。例如: ```dts gpio-keys { compatible = "gpio-keys"; input-name = "gpio-keys"; input-phys = "gpio-keys/input0"; home { label = "Home Key"; gpios = <&gpio 26 GPIO_ACTIVE_LOW>; linux,code = <KEY_HOME>; debounce-interval = <10>; gpio-key,wakeup; }; }; ``` 上述配置描述了GPIO26作为低电平有效的Home键,并启用了按键唤醒功能。 #### 5. 上层接口与调试 在Android系统中,按键事件会通过`/dev/input/eventX`设备节点上报。可以通过`getevent`命令查看按键事件是否正常上报: ```bash adb shell getevent /dev/input/eventX ``` 若事件未上报,需检查GPIO配置、中断设置、驱动是否加载等问题。 ### 注意事项 - 在DCT工具中配置GPIO时,确保未错误启用中断功能(如非中断GPIO勾选了`EintMode`)[^1]。 - 若按键用于唤醒系统,需在驱动和设备树中启用`wakeup`标志,并在电源管理中配置相应的唤醒源。 - 去抖动时间(`debounce_interval`)建议设置为10ms左右,具体值可根据硬件特性调整。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值