转载:https://blog.csdn.net/weixin_43854010/article/details/94390803

Android 添加键值并上报从驱动到上层

平台 :RK3288

OS:Android7.1

kernel部分添加键值:

1.在dts中(kernel/arch/arm/boot/dts/rk3288-android.dtsi)添加键值属性,可以仿照power按键配置

Android 添加键值并上报从驱动到上层-LMLPHP

因我们使用的键值操作是通过gpio触发的,则配置成gpio-key。
linux,code 键码可以查看内核自定义键码来选择。定义在kernel/include/uapi/linux/input-event-codes.h下。

Android 添加键值并上报从驱动到上层-LMLPHP

因键值较多,就只列一部分出来,在定义键码的时候,注意不要与现正在使用的键码重复。如不确认哪些键码是已经使用的,可以在该文件中添加自定义键码。
在dts中添加键值属性后,需要在驱动(我的是在/kernel/drivers/input/keyboard/rk_reys.c)里,做dts解析:

Android 添加键值并上报从驱动到上层-LMLPHP

如该按键需要以中断的方式触发,则可以为这个按键申请中断:

Android 添加键值并上报从驱动到上层-LMLPHP

键值上报:
1.注册input事件:
通过input_register_device()函数来向内核注册input事件。
2.input事件上报:
input事件上报是通过input_event()或input_report_key()函数上报。

input_event()函数简介:
函数原型:
Android 添加键值并上报从驱动到上层-LMLPHP

参数介绍:
struct input_dev *dev:需要上报的事件
unsigned int type:上报的事件类型(在前面的input-event-codes.h文件中有定义)
unsigned int code:上报的键码
int value :上报的键值

使用实例:

Android 添加键值并上报从驱动到上层-LMLPHP

注意:input_event()上报按键事件必须先上报1(意为按下),再上报0(意为弹起),不能单独上报1,或者上报0。

kernel部分添加完成后,可通过getevent命令来确认事件有无上报成功。

内核部分确认调试成功后,需要将键值上报至上层:
1.修改按键布局映射文件,都是以.kl结尾的文件,可通过
cat bus/input/devices 命令来查看我们系统目前正在使用的布局文件是哪个。
我使用的是/device/rockchip/common/rk29-keypad.kl布局文件

Android 添加键值并上报从驱动到上层-LMLPHP

在这后面添加key 117 F1 则表示内核上报的117键值映射到系统的键值为F1
系统的键值定义在frameworks/base/core/java/android/view/KeyEvent.java下。

添加完成后可以在frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java里添加打印信息,查看键值是否上报成功。

Android 添加键值并上报从驱动到上层-LMLPHP

上层APK可通过调用frameworks/base/core/java/android/view/KeyEvent.java中的接口去拦截键值

Android 添加键值并上报从驱动到上层-LMLPHP

04-18 17:08