rk3588/rk3566 Android11/13 添加自定义物理按键 映射到Android层

实现:添加自定义键值需要修改kernel层和framework层下代码,rk3566和rk3588修改的代码和文件路径有差异。

目录

一、kernel层

1、设备树添加键值

2、rk-input.h

3、input-event-codes.h

二、framework层

1、KeyEvent.java

2、current.txt

3、attrs.xml

4、keycodes.h

5、InputEventLabels.cpp

6、Generic.kl(映射到安卓层)

三、添加系统按键功能

四、功能测试


 

一、kernel层

1、设备树添加键值

我这里随意给了一个名字叫做imagevideo,它的键值名字是KEY_USERKEY1,这个需要我们后面定义,gpio口自己要配对。

gpio_keys: gpio-keys {
        status = "okay";
        compatible = "gpio-keys";
        autorepeat;

        imagevideo {
                    debounce-interval = <20>;
                    gpios = <&gpio1 RK_PA7 GPIO_ACTIVE_LOW>;
                    label = "imagevideo";
                    linux,code = <KEY_USERKEY1>;
                     wakeup-source;
                };

};

2、rk-input.h

Rockchip_Android13.0_SDK_RELEASE\kernel-5.10\include\dt-bindings\input rk-input.h

定义 KEY_USERKEY1        

#define KEY_USERKEY1        0x2e8

3、input-event-codes.h

Rockchip_Android13.0_SDK_RELEASE\kernel-5.10\include\uapi\linux\input-event-codes.h

#define KEY_USERKEY1        0x2e8

二、framework层

1、KeyEvent.java

Rockchip_Android13.0_SDK_RELEASE\frameworks\base\core\java\android\view KeyEvent.java

这里定义的UI_LANGUAGE 是在Android层自己定义的按键名称,317 是安卓层下的键值

public static final int KEYCODE_UI_LANGUAGE = 317;

注意:如果你定义的按键放在最后,必须得修改LAST_KEYCODE,否则后面定义的按键无效,

如果放在中间没影响。(根据自己实际情况修改)

 public static final int LAST_KEYCODE = KEYCODE_UI_LANGUAGE

2、current.txt

Rockchip_Android13.0_SDK_RELEASE\frameworks\base\core\api current.txt (RK3588)

3566_Android11\sdk\frameworks\base\api current.txt(RK3566)

注意:rk3588、rk3566 文件路径不同。在新增api后,进行系统编译可能会报错,需要先在系统中使用make命令,对current.txt进行自动更新。需要配置编译环境后,执行 make update-api 和make test-api-stubs-docs-update-current-api 实现系统更新current文档,再进行编译。

field public static final int KEYCODE_UI_LANGUAGE = 317; // 0x13d

3、attrs.xml

Rockchip_Android13.0_SDK_RELEASE\frameworks\base\core\res\res\values attrs.xml

<enum name="KEYCODE_UI_LANGUAGE" value="317" />

4、keycodes.h

Rockchip_Android13.0_SDK_RELEASE\frameworks\native\include\android keycodes.h

AKEYCODE_UI_LANGUAGE     = 317,

5、InputEventLabels.cpp

Rockchip_Android13.0_SDK_RELEASE\frameworks\native\libs\input InputEventLabels.cpp(RK3588)

3566_Android11\sdk\frameworks\native\include\input InputEventLabels.h (RK3566)

DEFINE_KEYCODE(UI_LANGUAGE), \

6、Generic.kl(映射到安卓层)

Rockchip_Android13.0_SDK_RELEASE\frameworks\base\data\keyboards Generic.kl

这里的744 是kerne层的0x2e8的十进制,与framework层相匹配

key 744   UI_LANGUAGE

三、添加系统按键功能

在PhoneWindowManager.java中的interceptKeyBeforeDispatching和interceptKeyBeforeQueueing中添加新按键事件的case

3566_Android11\sdk\frameworks\base\services\core\java\com\android\server\policy 

PhoneWindowManager.java

这个有要求的可以添加,不会写的可以搜索PhoneWindowManager.java这个文件分析。一般APP内要求的就只需要APP内获得键值添加功能就行,不需要去安卓系统层添加。

四、功能测试

可以自己用Android studio写一个简单的APP。

public boolean onKeyDown ( int keyCode, KeyEvent event){
             Toast.makeText(MainActivity.this, keyCode+"", Toast.LENGTH_SHORT).show();
            return true;
        }

有键按下就会进入这个函数,安卓界面会打印键值(安卓层定义的键值)

598c99571c7644be913ce57acec99497.png

adb输入这两个命令都可以。

也可以在PhoneWindowManager.java内将按键打印log打开,查看打印来判断是否成功添加。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值