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

平台 :RK3288

OS:Android7.1

kernel部分添加键值:

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

Android 调用键盘删除按钮 android 键值_android注入键值如何监听键值

因我们使用的键值操作是通过gpio触发的,则配置成gpio-key。

linux,code 键码可以查看内核自定义键码来选择。定义在kernel/include/uapi/linux/input-event-codes.h下。

Android 调用键盘删除按钮 android 键值_键码_02

因键值较多,就只列一部分出来,在定义键码的时候,注意不要与现正在使用的键码重复。如不确认哪些键码是已经使用的,可以在该文件中添加自定义键码。

在dts中添加键值属性后,需要在驱动(我的是在/kernel/drivers/input/keyboard/rk_reys.c)里,做dts解析:

Android 调用键盘删除按钮 android 键值_Android 调用键盘删除按钮_03

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

Android 调用键盘删除按钮 android 键值_键码_04

键值上报:

1.注册input事件:

通过input_register_device()函数来向内核注册input事件。

2.input事件上报:

input事件上报是通过input_event()或input_report_key()函数上报。

input_event()函数简介:

函数原型:

Android 调用键盘删除按钮 android 键值_键值_05

参数介绍:

struct input_dev *dev:需要上报的事件

unsigned int type:上报的事件类型(在前面的input-event-codes.h文件中有定义)

unsigned int code:上报的键码

int value :上报的键值

使用实例:

Android 调用键盘删除按钮 android 键值_键值_06

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

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

内核部分确认调试成功后,需要将键值上报至上层:

1.修改按键布局映射文件,都是以.kl结尾的文件,可通过

cat bus/input/devices 命令来查看我们系统目前正在使用的布局文件是哪个。

我使用的是/device/rockchip/common/rk29-keypad.kl布局文件

Android 调用键盘删除按钮 android 键值_Android_07

在这后面添加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 调用键盘删除按钮 android 键值_键值_08

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

Android 调用键盘删除按钮 android 键值_键码_09