Android 10 添加一个新物理按键
下面简单记录下如何添加一个新的物理按键
一、kernel修改
kernel/msm-4.19/include/dt-bindings/input/linux-event-codes.h中定义新按键:
#define KEY_RFKILL 247 /* Key that controls all radios */
#define KEY_MICMUTE 248 /* Mute / unmute the microphone */
#define KEY_NEW 249 //添加新按键,映射给Android 上层的也是此值
/vendor/qcom/proprietary/devicetree-4.19/qcom/kona-xr.dtsi
&soc {
gpio_keys {
compatible = "gpio-keys";
label = "gpio-keys";
.........
new {
label = "new";
gpios = <&pm8150_gpios 6 GPIO_ACTIVE_LOW>;
linux,input-type = <1>;
linux,code = <KEY_NEW>;
gpio-key,wakeup;
debounce-interval = <15>;
linux,can-disable;
};
};
......
}
添加成功后操作此GPIO,在adb 串口可使用getevent命令,get到其映射到上层的值249的十六进制值 为f9
130|bengal:/ # getevent
/dev/input/event1: 0001 00f9 00000001
/dev/input/event1: 0000 0000 00000000
/dev/input/event1: 0001 00f9 00000000
/dev/input/event1: 0000 0000 00000000
其中:
0160: 是249的十六进制的值
1,0: 分别是按下和弹起的动作。
二、Android修改
1、/device/qcom/XXX/gpio-keys.kl
key 766 CAMERA WAKE_DROPPED
key 249 NEW //添加的新按键,此值为kernel映射到上层的键值
2、/frameworks/base/core/java/android/view/KeyEvent.java
public static final int KEYCODE_PROFILE_SWITCH = 288;
public static final int KEYCODE_NEW = 289; //添加新的按键
/**
* Integer value of the last KEYCODE. Increases as new keycodes are added to KeyEvent.
* @hide
*/
@TestApi
public static final int LAST_KEYCODE = KEYCODE_NEW; //将其修改为我们添加的最后一个按键KEYCODE_NEW
此处下方还有一段话,告知了我们需要修改那些文件:
// NOTE: If you add a new keycode here you must also add it to:
// isSystem()
// isWakeKey()
// frameworks/native/include/android/keycodes.h
// frameworks/native/include/input/InputEventLabels.h
// frameworks/base/core/res/res/values/attrs.xml
// emulator?
// LAST_KEYCODE
//
// Also Android currently does not reserve code ranges for vendor-
// specific key codes. If you have new key codes to have, you
// MUST contribute a patch to the open source project to define
// those new codes. This is intended to maintain a consistent
// set of key code definitions across all Android devices.
所以在KeyEvent.java文件中我们还需要修改 isSystem()、isWakeKey()如下:
public static final boolean isSystemKey(int keyCode) {
switch (keyCode) {
........
case KeyEvent.KEYCODE_NEW:
return true;
}
return false;
}
/** @hide */
public static final boolean isWakeKey(int keyCode) {
switch (keyCode) {
........
case KeyEvent.KEYCODE_NEW:
return true;
}
return false;
}
3、frameworks/native/include/android/keycodes.h
enum {
........
AKEYCODE_PROFILE_SWITCH = 288,
AKEYCODE_NEW = 289
};
4、frameworks/native/include/input/InputEventLabels.h
static const InputEventLabel KEYCODES[] = {
.........
DEFINE_KEYCODE(NEW),
{ nullptr, 0 }
};
5、frameworks/base/core/res/res/values/attrs.xml
<attr name="keycode">
.........
<enum name="KEYCODE_NEW" value="289" />
</attr>
6、frameworks/base/api/test-current.txt
public class KeyEvent extends android.view.InputEvent implements android.os.Parcelable {
method public static String actionToString(int);
method public final void setDisplayId(int);
field public static final int LAST_KEYCODE = 289; // 0x121 //改为最后一个按键的键码
}
7、frameworks/base/api/current.txt
此处的修改一般不建议上来直接修改,可以在上面的修改添加完成后,直接编译,他会直接报错告知你需要添加在哪里,按照其提示添加即可(要添加在报错的相应位置,否则再次编译还会报错)
field public static final int KEYCODE_SYM = 63; // 0x3f
field public static final int KEYCODE_NEW = 289; // 0x121
8、frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
在此文件中的interceptKeyBeforeQueueing方法中添加我们想要实现的按键功能
添加完成后我们可以使用input keyevent 289验证我们的功能实现是否正常