Android 10 添加一个新物理按键

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验证我们的功能实现是否正常

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值