一.驱动层配置:
这里是rk3326为例
1.在驱动文件kernel-5.10/arch/arm64/boot/dts/rockchip/rk3326-evb-lp3-v11-avb.dtsi中
配置键值
adc-keys {
compatible = "adc-keys";
io-channels = <&saradc 2>;
io-channel-names = "buttons";
poll-interval = <100>;
keyup-threshold-microvolt = <1800000>; 按键抬起电压值
custom-key {
linux,code = <KEY_CUSTIOM>;
label = "custom";
press-threshold-microvolt = <1310000>; //按键按下电压采样值
};
2.在目录kernel-5.10/include/uapi/linux/input-event-codes.h文件修改添加
#define KEY_WWAN 246 /* Wireless WAN (LTE, UMTS, GSM, etc.) */
#define KEY_WIMAX KEY_WWAN
#define KEY_RFKILL 247 /* Key that controls all radios */
#define KEY_MICMUTE 248 /* Mute / unmute the microphone */
#define KEY_CUSTIOM 249 /* 新增按键 */
说明:这里定义的键名称一定要和上一步dtsi文件配件的键名称保持一致
二.上层映射配置
1.当驱动层添加完成配置后,通过getevent命令查看底层驱动配置的键值
Seoul_TF:/ $ Seoul_TF:/ $ getevent
add device 1: /dev/input/event2
name: "mtk-tpd"
add device 2: /dev/input/event0
name: "ACCDET"
add device 3: /dev/input/event1
name: "mtk-kpd"
/dev/input/event1: 0001 00f9 00000001
/dev/input/event1: 0000 0000 00000000
/dev/input/event1: 0001 00f9 00000000
/dev/input/event1: 0000 0000 000000002
———————————————————————————————————————————
2.添加KL 映射
按键布局文件由 供应商、产品(可能还包括版本)ID 或输入设备名称来确定位置。系统会按顺序查阅以下路径,在以下任一kl文件下添加映射即可:
如果所有文件都没有,系统会默认是去读取/data/system/devices/keylayout/Generic.kl配置
/odm/usr/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl
/vendor/usr/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl
/system/usr/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl
/data/system/devices/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl
/odm/usr/keylayout/Vendor_XXXX_Product_XXXX.kl
/vendor/usr/keylayout/Vendor_XXXX_Product_XXXX.kl
/system/usr/keylayout/Vendor_XXXX_Product_XXXX.kl
/data/system/devices/keylayout/Vendor_XXXX_Product_XXXX.kl
/odm/usr/keylayout/DEVICE_NAME.kl
/vendor/usr/keylayout/DEVICE_NAME.kl
/system/usr/keylayout/DEVICE_NAME.kl
/data/system/devices/keylayout/DEVICE_NAME.kl
/odm/usr/keylayout/Generic.kl
/vendor/usr/keylayout/Generic.kl
/system/usr/keylayout/Generic.kl
/data/system/devices/keylayout/Generic.kl
由第一步getevent查询 可知此按键是00f9,10进制249,名称可以自定义,这里我命名为 CUSTIOM_KEY,首先需要在/data/system/devices/keylayout/Generic.kl
添加红色部分:
....
key 165 MEDIA_PREVIOUS
key 168 MEDIA_REWIND
key 159 MEDIA_FAST_FORWARD
key 249 CUSTIOM_KEY
....
———————————————————————————————————————————
3. 在目录frameworks/native/include/android/keycodes.h文件中
末尾处添加 红色部分:
......
AKEYCODE_THUMBS_UP = 286,
/** Thumbs down key. Apps can use this to let user downvote content. */
AKEYCODE_THUMBS_DOWN = 287,
/** Used to switch current account that is consuming content.
* May be consumed by system to switch current viewer profile. */
AKEYCODE_PROFILE_SWITCH = 288,
/* AI Key */
AKEYCODE_CUSTIOM_KEY = 289
———————————————————————————————————————————
4. 在InputEventLabels.h里面也按顺序添加在最后面
在Android 10 以下包含Android10
frameworks/native/include/input/InputEventLabels.h
......
DEFINE_KEYCODE(ALL_APPS),
DEFINE_KEYCODE(REFRESH),
DEFINE_KEYCODE(THUMBS_UP),
DEFINE_KEYCODE(THUMBS_DOWN),
DEFINE_KEYCODE(PROFILE_SWITCH),
DEFINE_KEYCODE(CUSTIOM_KEY),
{ nullptr, 0 }
};
如果是Android 12 以上就需要
在frameworks/native/libs/input/InputEventLabels.cpp文件中添加
DEFINE_KEYCODE(DEMO_APP_1), \
DEFINE_KEYCODE(DEMO_APP_2), \
DEFINE_KEYCODE(DEMO_APP_3), \
DEFINE_KEYCODE(DEMO_APP_4), \
DEFINE_KEYCODE(CUSTIOM_KEY)
———————————————————————————————————————————
5.在frameworks/base/core/java/android/view/KeyEvent.java里面最后依次添加,并把LAST_KEYCODE改为才添加的
红色标记部分
/**
* Key code constant: Used to switch current {@link android.accounts.Account} that is
* consuming content. May be consumed by system to set account globally.
*/
public static final int KEYCODE_PROFILE_SWITCH = 288;
/**
* @hide
*/
public static final int KEYCODE_CUSTIOM_KEY = 289;
@TestApi
public static final int LAST_KEYCODE = KEYCODE_CUSTIOM_KEY;
———————————————————————————————————————————
6.更新api文档
test-current.txt这个API文档也需要同步修改LAST_KEYCODE
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;
}
———————————————————————————————————————————
7.最后一步在attrs.xml最后面同步添加
frameworks/base/core/res/res/values/attrs.xml
<enum name="KEYCODE_REFRESH" value="285" />
<enum name="KEYCODE_THUMBS_UP" value="286" />
<enum name="KEYCODE_THUMBS_DOWN" value="287" />
<enum name="KEYCODE_PROFILE_SWITCH" value="288" />
<enum name="KEYCODE_CUSTIOM_KEY" value="289" />
</attr>
———————————————————————————————————————————
验证:以上步骤完成
PhoneWindowManager.java里就能收到此按键点击事件了,对事件做对应处理即可
@Override
public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {
.......
// Handle special keys.
switch (keyCode) {
case KeyEvent.KEYCODE_CUSTIOM_KEY:{
.......
break;
}
case KeyEvent.KEYCODE_BACK:{
}
.......
}
注:文中红色标记部分为修改或者添加部分
总结:新的物理按键,要上层收到对应事件,只需要按部就班参照系统按键实现即可,system提供scancode,上层转换为keycode使用。