MTK6577+Android之按键(key)修改

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/

<think>好的,用户想在MTK设备的安卓13系统中实现键盘自定义按键功能。首先,我需要回忆一下Android输入子系统的相关知识。Android的输入事件处理通常涉及InputReader和InputManagerService,而修改按键映射可能需要修改键值映射文件或者通过系统服务进行动态配置。 接下来,MTK平台可能有自己的定制部分,比如特定的硬件抽象层(HAL)或者内核驱动中的键码定义。用户需要确定他们的设备是否支持自定义按键,或者是否需要修改底层驱动。例如,有些设备可能在/system/usr/keylayout/目录下有特定的.kl文件,这些文件定义了按键码到Android键值的映射。 然后,考虑Android 13的新特性或限制。比如,从Android 10开始,对系统目录的写权限可能更加严格,需要root权限或者通过系统签名来修改系统文件。用户可能需要重新编译系统镜像,或者使用Magisk模块进行修改。 另外,实现自定义按键功能可能有几种方法:修改KeyLayout文件、使用InputManagerService的API、或者通过拦截输入事件并重新分派。需要检查MTK是否提供了相关的API或文档支持。如果用户没有系统签名权限,可能需要寻找其他方法,比如使用AccessibilityService或者第三方输入法。 还要考虑用户的具体需求,比如是修改物理键盘的按键,还是虚拟键盘。如果是物理键盘,修改.kl文件可能有效;如果是虚拟键盘,可能需要修改应用的输入处理逻辑。此外,是否需要持久化设置,或者在运行时动态更按键行为。 最后,生成相关问题时,需要涵盖实现步骤、权限需求、MTK特定配置、调试方法、动态修改的可能性以及系统限制等方面,帮助用户全面了解可能遇到的问题和解决方案。</think>### MTK Android 13自定义键盘按键实现步骤 #### 一、硬件键值映射基础 1. 关键文件路径: - `/system/usr/keylayout/Vendor_XXXX_Product_XXXX.kl`(MTK设备特定按键布局文件) - `/system/usr/keychars/`(按键字符映射) 2. 使用ADB获取原始键值: ```shell adb shell getevent -l # 按下目标按键将显示类似: # /dev/input/event2: EV_KEY KEY_F14 DOWN ``` #### 二、MTK平台特有配置 需特别注意MTK设备可能存在的以下特性: - 特殊功能键定义在`mediatek\frameworks\native\data\keyboards\Generic.kl` - 芯片级键值范围定义(如MT6797平台使用0x100-0x1ff保留区) #### 三、Android 13适配要点 1. **SELinux策略更新**: ```te # 新增自定义策略 allow system_app sysfs_irblaster:file { read write open }; ``` 2. **分区限制绕过**: ```shell # 需使用动态分区叠加技术 adb disable-verity adb remount ``` #### 四、内核层修改(需要源码级开发) 1. 在设备树中定义新键值: ```dts / { gpio-keys { custom_key { label "CUSTOM_KEY"; gpios = <&gpio1 18 GPIO_ACTIVE_LOW>; linux,code = <0x1F5>; // 需使用未分配的键值 }; }; }; ``` 2. 输入子系统事件处理: ```c // drivers/input/keyboard/gpio_keys.c static void custom_key_report(struct gpio_button_data *bdata) { input_event(bdata->input, EV_KEY, KEY_CUSTOM, 1); input_sync(bdata->input); } ``` #### 五、框架层实现 1. 自定义按键处理服务: ```java public class KeyInterceptorService extends AccessibilityService { @Override public void onKeyEvent(KeyEvent event) { if(event.getKeyCode() == KeyEvent.KEYCODE_UNKNOWN) { // 处理自定义键值 handleCustomKey(); } } } ``` 2. 键值映射覆盖(需系统签名): ```xml <!-- packages/SystemUI/res/values/key_config.xml --> <integer name="config_customKeyAction">KEYCODE_MEDIA_PLAY_PAUSE</integer> ``` #### 六、调试方法 1. 实时事件监控: ```shell adb shell dumpsys input ``` 2. 键值验证工具: ```java InputManager.getInstance().monitorInput(new CustomInputEventListener()); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值