MTK6735+Android之按键(key)修改

本文介绍MTK6577平台上的按键布局、硬件设计、按键值传递流程及配置方法。详细说明了如何使用DrvGen.exe工具进行GPIO、KEYPAD等设置,并生成相关代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


<think>我们正在处理一个Android系统开发问题,特别是关于按键映射的。用户希望在Android13的MTK平台上更新按键布局文件,以确保KEYCODE_MOVE_HOME正确映射到物理按键。根据引用[2],我们知道Android通过设备特定的.kl(keylayout)文件完成从Linux键值到Android键值的映射。因此,我们需要修改或创建对应的.kl文件。步骤:1.确定物理按键产生的扫描码(scancode)。可以通过`getevent`命令获取。例如,连接设备并执行:```bashadbshellgetevent-l```然后按下目标物理按键,记录输出的扫描码(例如:MSC_SCAN0089)。2.根据扫描码,在对应的.kl文件中添加映射。.kl文件位于设备的`/system/usr/keylayout/`或`/vendor/usr/keylayout/`目录下。对于MTK平台,通常需要修改`Vendor_XXXX_Product_XXXX.kl`这样的文件(其中XXXX是设备的USB厂商和产品ID)或者使用通用的`Generic.kl`。但更推荐使用设备特定的文件。3..kl文件中添加一行,将扫描码映射到`KEYCODE_MOVE_HOME`。格式为:```key<SCANCODE>HOME#注意:这里应该是KEYCODE_MOVE_HOME?但是注意,在Android中,KEYCODE_MOVE_HOME是系统定义的键值,但在.kl文件中我们使用的是字符串标签。然而,标准Android键值标签中并没有直接对应KEYCODE_MOVE_HOME的标签。我们需要确认KEYCODE_MOVE_HOME对应的标签是什么。实际上,在.kl文件中,我们映射的是Android键值标签(如HOME,BACK,MENU等)。KEYCODE_MOVE_HOME是一个整数常量(在KeyEvent.java中定义为KEYCODE_MOVE_HOME=122),但在.kl文件中我们使用字符串标签。我们需要查找这个键值对应的标签。查看Android源码KEYCODE_MOVE_HOME的标签是"MOVE_HOME"。但是,请注意,标准的.kl文件标签通常使用大写,并且常见的标签都是预定义的(如HOME,MENU等)。对于非标准的按键,我们需要使用自定义标签?但实际上,KEYCODE_MOVE_HOME是Android定义的,所以标签应该是存在的。在Android系统中,.kl文件中的字符串标签对应KeyEvent.java中的常量名(去掉KEYCODE_前缀并转为大写)。例如,KEYCODE_HOME的标签是"HOME"。因此,KEYCODE_MOVE_HOME的标签应该是"MOVE_HOME"。所以,映射行应该写为:key<SCANCODE>MOVE_HOME例如,如果扫描码是89(十六进制0x89),则写:key0x89MOVE_HOME```4.修改后的.kl文件放到设备的`/vendor/usr/keylayout/`目录下(推荐使用此位置,因为/system分区通常是只读的)。可以通过重新编译系统镜像并刷机,或者直接推送到设备(需要root权限)并重启。5.验证:修改后重启设备,使用`dumpsysinput`命令查看当前使用的.kl文件,并确保修改生效。然后测试按键功能。注意:如果设备上已经存在一个.kl文件处理该扫描码,则修改该文件即可。如果没有,可能需要创建一个新的.kl文件。设备会根据输入设备的厂商和产品ID来匹配.kl文件,如果找不到则使用`Generic.kl`。另外,引用[4]提到,可以通过`dumpsysinput`来获取当前设备使用的kl文件,这有助于我们确定需要修改哪个文件。具体操作步骤总结:-获取物理按键的扫描码。-确定目标.kl文件(通过`dumpsysinput`查看当前使用的kl文件)。-修改或创建.kl文件,添加映射:`key<扫描码>MOVE_HOME`。-将文件放到设备的`/vendor/usr/keylayout/`目录(覆盖原有文件或新增)。-重启设备并测试。注意:修改系统文件需要系统签名或者root权限,如果是系统开发,通常是在编译时修改。在AOSP中,我们可以将自定义的.kl文件放在设备树目录下,例如:`device/<vendor>/<device>/overlay/frameworks/base/data/keyboards/`,然后在编译时覆盖系统默认的.kl文件。但具体路径可能因平台而异。对于MTK平台,可以参考设备原有的配置路径。如果用户是在开发设备固件,那么应该在设备树中修改,然后重新编译系统镜像。如果只是临时修改,可以push文件并重启。最后,注意权限问题,确保.kl文件权限正确(通常为644)。相关问题:1.如何获取Android设备上物理按键的扫描码?2.Android系统中,如何查看当前输入设备使用的按键布局文件(.kl)?3.如何在不重新编译整个系统的情况下更新按键布局文件?4.除了.kl文件,还有哪些文件可能影响按键映射?5.Android13上,按键映射的流程与之前版本有何不同?</think>### 如何在 Android 13 MTK 平台更新按键布局文件映射 KEYCODE_MOVE_HOME 根据引用[2]的说明,Android 通过 `.kl` 文件完成 Linux 键值到 Android 键值的映射。以下是具体操作步骤: #### **步骤 1:确定物理按键的扫描码** 1. 使用 `getevent` 命令获取按键原始扫描码: ```bash adb shell getevent -l ``` 2. 按下目标物理按键,记录输出的 `MSC_SCAN` 值(如 `MSC_SCAN 0x89`) #### **步骤 2:修改按键布局文件 (.kl)** 1. 找到对应的按键布局文件(位于 `/vendor/usr/keylayout/` 或 `/system/usr/keylayout/`): ```bash adb shell dumpsys input # 查看当前设备使用的 .kl 文件 [^4] ``` MTK 常用文件:`Vendor_XXXX_Product_XXXX.kl` 或 `Generic.kl` 2. 添加映射规则(示例): ```bash key 0x89 MOVE_HOME # 0x89 替换为实际扫描码 ``` > **说明**: > - `0x89`:物理按键扫描码(十六进制) > - `MOVE_HOME`:Android 系统定义的键值常量 #### **步骤 3:部署并验证** 1.修改后的文件推送到设备: ```bash adb push Vendor_XXXX.kl /vendor/usr/keylayout/ adb shell chmod 644 /vendor/usr/keylayout/Vendor_XXXX.kl ``` 2. **重启设备**使配置生效 3. 验证映射: ```bash input keyevent 122 # 触发 KEYCODE_MOVE_HOME (122 是键值编码) ``` 或通过 `dumpsys input` 检查当前激活的 .kl 文件 [^4] #### **注意事项** 1. **分区权限**:Android 13 要求修改 `/vendor` 分区,需在编译时集成或 root 后推送 2. **键值冲突**:确保扫描码未被其他功能占用(参考现有 .kl 文件) 3. **系统签名**:系统级修改MTK 平台签名(非 root 设备需重新编译固件) 4. **蓝牙设备**:蓝牙键盘需单独配置对应的 .kl 文件 [^4] > **底层原理**: > 物理按键扫描码 → Linux 驱动 → .kl 文件映射 → Android 系统键值 [^2] > 修改 .kl 文件直接干预第二步映射过程。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值