android系统添加按键检测

1.前言
在Android开发中可能会遇到添加新的按键的需求,本文将简单介绍如何在Android系 统中完成一个新的按键的添加。当系统有新的按键需要添加时,Linux内核下的键码到 Android系统中键码是如何进行转换映射的?
2.内核添加设备节点
首先,我们需要在Linux内核添加新的按键值,在Linux内核中提供了按键的驱动程序gpio_keys.c,该驱动是基于设备树实现的,因此,先添加自己的设备节点,如下:

 gpio_keys {
		compatible = "gpio-keys";
		input-name = "gpio-keys";
		pinctrl-names = "tlmm_gpio_key_active","tlmm_gpio_key_suspend";
		pinctrl-0 = <&gpio_key_active>;
		pinctrl-1 = <&gpio_key_suspend>;

		camera_focus {
			label = "camera_focus";
			gpios = <&tlmm 87 0x1>;
			linux,input-type = <1>;
			linux,code = <0x210>;
			debounce-interval = <15>;
		};

		camera_snapshot {
			label = "camera_snapshot";
			gpios = <&tlmm 86 0x1>;
			linux,input-type = <1>;
			linux,code = <0x2fe>;
			debounce-interval = <15>;
		};

		vol_up {
			label = "volume_up";
			gpios = <&tlmm 85 0x1>;
			linux,input-type = <1>;
			linux,code = <115>;
			debounce-interval = <15>;
		};
		gps_ant_open {		
			label = "GPS_ANT_OPEN_CIRCUIT";
			gpios = <&tlmm 1 0x1>;
			linux,input-type = <1>;
			linux,code = <63>;
			debounce-interval = <15>;
		};
		
		gps_ant_short {		
			label = "GPS_ANT_SHORT_CIRCUIT";
			gpios = <&tlmm 0 0x1>;
			linux,input-type = <1>;
			linux,code = <64>;
			debounce-interval = <15>;
		}; 

在该设备树节点中,定义了两个按键,分别是gps_ant_open(键码值为63)和gps_ant_short(键码值为64),关于该设备节点的更详细介绍,可以查看下面的设备树绑定文档:
msm8953/kernel/Documentation/devicetree/bindings/gpio/gpio_keys.txt

关于Linux内核中的键码值定义在文件:
msm8953/kernel/include/uapi/linux/input.h

将Linux内核进行编译并烧写,查看新添加的设备节点是否已经添加完成:
$ cd/sys/class/input/input2/device
$ cat uevent
或者
cat /system/usr/keylayout

msm8953_64:/system/usr/keylayout # ls
AVRCP.kl                    Vendor_1689_Product_fd01.kl
Generic.kl                  Vendor_1689_Product_fe00.kl
Vendor_0079_Product_0011.kl Vendor_18d1_Product_2c40.kl
Vendor_045e_Product_028e.kl Vendor_18d1_Product_5018.kl
Vendor_046d_Product_b501.kl Vendor_1949_Product_0401.kl
Vendor_046d_Product_c216.kl Vendor_1bad_Product_f016.kl
Vendor_046d_Product_c219.kl Vendor_1bad_Product_f023.kl
Vendor_046d_Product_c21d.kl Vendor_1bad_Product_f027.kl
Vendor_046d_Product_c21f.kl Vendor_1bad_Product_f036.kl
Vendor_046d_Product_c294.kl Vendor_1d79_Product_0009.kl
Vendor_046d_Product_c299.kl Vendor_22b8_Product_093d.kl
Vendor_046d_Product_c532.kl Vendor_2378_Product_1008.kl
Vendor_054c_Product_0268.kl Vendor_2378_Product_100a.kl
Vendor_0583_Product_2060.kl ft5x06_ts.kl
Vendor_05ac_Product_0239.kl gpio-keys.kl
Vendor_0b05_Product_4500.kl qwerty.kl
Vendor_1038_Product_1412.kl synaptics_dsx.kl
Vendor_12bd_Product_d015.kl synaptics_dsxv26.kl
Vendor_1532_Product_0900.kl synaptics_rmi4_i2c.kl
Vendor_1689_Product_fd00.kl

3.键值上报到应用层
已经完成了Linux内核中按键的设备节点的添加,但是这仅仅是在Linux内核里面的键值,因此,我们需要修改按键的布局文件,并完成按键的键值上报到应用层。
(1)添加按键布局文件
按键布局文件是用来完成映射过程的,文件以kl结尾,用于将Linux内核中input子系统上报的键值转换成对应得按键值供Android系统上层使用,在下面的目录添加test-keys.kl文件:
msm8953/device/qcom/msm8909/
如下所示:
key 63 F5
key 64 F6
需要注意的是,按键布局文件的名称必须与input输入设备的名称一致,否则在EvenHub在加载设备时将找不到对应得kl文件而加载默认的kl文件,从而键值转换错误,在kl文件中,key是固定的,中间的数字代表的是Linux内核对应得键码。
接下来需要将按键的kl文件添加到系统中:
在AndroidBoard.mk中添加编译的命令,文件如下:
msm8953/device/qcom/msm8953_64/AndroidBoard.mk

include $(CLEAR_VARS)
LOCAL_MODULE       := gpio-keys.kl
LOCAL_MODULE_TAGS  := optional eng
LOCAL_MODULE_CLASS := ETC
LOCAL_SRC_FILES    := $(LOCAL_MODULE)
LOCAL_MODULE_PATH  := $(TARGET_OUT_KEYLAYOUT)
include $(BUILD_PREBUILT)

修改base.mk文件,否则该kl文件将不会被打包,文件如下:
msm8953/device/qcom/common/base.mk
添加内容如下:
#add new .kl
KEYPAD += gpio-keys.kl
(2)Android上层添加按键
在上面,我们已经完成了按键布局文件的添加,接下来将在Android Framework层完成按键的添加。需要注意的是,在实例中,关于POWER和HOME的按键,Android系统中默认已经定义了,如果需要添加新的,则需要自己完成定义:
首先需要添加按键对应得KeycodeLable,文件:
msm8953/frameworks/native/include/input/InputEventLabels.h
添加内容如下:

static const InputEventLabel KEYCODES[] = {
    ...
    ...
      DEFINE_KEYCODE(SYSTEM_NAVIGATION_LEFT),
      DEFINE_KEYCODE(SYSTEM_NAVIGATION_RIGHT),

    { NULL, 0 }
}

接下来,进行键码定义,在文件:
msm8953/frameworks/native/include/android/keycodes.h

enum {
    ...
    ...
    /** fingerprint navigation key, left. */
    AKEYCODE_SYSTEM_NAVIGATION_LEFT = 282,
    /** fingerprint navigation key, right. */
    AKEYCODE_SYSTEM_NAVIGATION_RIGHT = 283
};

还需要修改java定义,在文件:
msm8953/frameworks/base/core/java/android/view/KeyEvent.java
添加内容如下:

public class KeyEvent extends InputEvent implements Parcelable {
    ...
    ...
    ...
    /** Key code constant: Consumed by the system for navigation left*/
    public static final int KEYCODE_SYSTEM_NAVIGATION_LEFT = 282;
    /** Key code constant: Consumed by the system for navigation right */
    public static final int KEYCODE_SYSTEM_NAVIGATION_RIGHT = 283;

    private static final int LAST_KEYCODE = KEYCODE_SYSTEM_NAVIGATION_RIGHT;
    ...
    ...
    ...
}

需要注意的是,该文件的键码必须与前面定义的一致。
接下来修改资源文件:
msm8953/frameworks/base/core/res/res/values/attrs.xml

使用下面命令查看,新的按键与布局文件:# dumpsys input
到这里,Android系统添加新键值就完成了,接下来进行按键测试。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值