高通 Android 12 framework添加自定义按键上报应用层

news2024/11/22 19:39:20

Android下添加新的自定义键值和按键处理流程

       首先分析下Android下怎么添加新的自定义键值。在Android的原生系统中键值默认情况下是92个,从0-91;一般情况下,这些键值是够用的,但是如果想扩充的话,还是需要添加新的键值的,那么如何将一个新的键值从驱动的设置映射到上层,使应用可以对我们自定义的键值进行相应的处理呢?

    在介绍Android怎么添加新的键值以前先介绍下Android下INPUT子系统FLOW的流程,下面就是精简的流程图示意图:

 1.添加按键及其映射

1)如果系统有新的按键需要添加,是怎么添加并上报到系统上层去的呢(这里的上层主要指的是Android应用层),首先要确定的是我们的遥控设备是通过/dev/input目录下那个event调用那个kl文件,这里可以通过如下命令超看cat /proc/bus/input/devices,下面是在Window终端下的打印信息

  1. getevent -p得到以下数据信息

3)命令查看如下 通过getevent查看驱动调节的按键值是否上传ok。adb shell getevent 驱动上报O按键键值 如下图所示 0259是16进制数 对应10进制601  1,0: 是指按下和弹起的动作。

Kernel修改

  1. LINUX/android/kernel/msm-4.19/include/uapi/linux/input-event-codes.h 增加二个宏定义

  1. old mode 100644
  2. new mode 100755
  3. index 8876c98..7afdee6
  4. --- kernel/msm-4.19/include/uapi/linux/input-event-codes.h
  5. +++/kernel/msm-4.19/include/uapi/linux/input-event-codes.h
  6. @@ -337,6 +337,11 @@
  7.  
  8.  #define KEY_MICMUTE            248     /* Mute / unmute the microphone */
  9.  
  10. +#define KEY_EM_O           601
  11. +//add end
  12. +
  13.  /* Code 255 is reserved for special needs of AT keyboard driver */
  14.  
  15.  #define BTN_MISC               0x100

2、在qssi11/LINUX/android/vendor/qcom/proprietary/devicetree-4.19/qcom/kona-pinctrl.dtsi 中增加相关内容[key]: 添加方向键(上、下、左、右)、X/O 键、确认键、主页键、菜单键

  1. diff --git a/LINUX/android/vendor/qcom/proprietary/devicetree-4.19/qcom/kona-pinctrl.dtsi b/LINUX/android/vendor/qcom/proprietary/devicetree-4.19/qcom/kona-pinctrl.dtsi
  2. index a6398b6..9de20ea 100755
  3. --- a/LINUX/android/vendor/qcom/proprietary/devicetree-4.19/qcom/kona-pinctrl.dtsi
  4. +++ b/LINUX/android/vendor/qcom/proprietary/devicetree-4.19/qcom/kona-pinctrl.dtsi
  5. @@ -148,6 +148,31 @@
  6.                         };
  7.                 };
  8.  */
  9. +               tlmm_gpio_key {
  10. +                       gpio_key_em_active: gpio_key_em_active {
  11. +                    mux {
  12. +                            pins = "gpio160", "gpio161", "gpio164", "gpio165", "gpio166", "gpio167", "gpio168", "gpio169";
  13. +                            function = "gpio";
  14. +                    };
  15. +                    config {
  16. +                            pins = "gpio160", "gpio161", "gpio164", "gpio165", "gpio166", "gpio167", "gpio168", "gpio169";
  17. +                            drive-strength = <4>;
  18. +                            bias-pull-up;
  19. +                    };
  20. +            };
  21. +            gpio_key_em_suspend: gpio_key_em_suspend {
  22. +                    mux {
  23. +                            pins = "gpio160", "gpio161", "gpio164", "gpio165", "gpio166", "gpio167", "gpio168", "gpio169";
  24. +                            function = "gpio";
  25. +                    };
  26. +                    config {
  27. +                            pins = "gpio160", "gpio161", "gpio164", "gpio165", "gpio166", "gpio167", "gpio168", "gpio169";
  28. +                            drive-strength = <2>;
  29. +                            bias-pull-up;
  30. +                    };
  31. +            };
  32. +               };
  33. +
  34.                 trigout_a: trigout_a {
  35.                         mux {
  36. :

 framework修改

注意:需要注意 gpio 在其他地方的引用,这个会引起冲突。

3、QSSI12/device/qcom/qssi/gpio-keys.kl中增加键盘扫描码对应的键盘码key值X/O,600/601

4、在QSSI12/frameworks/base/data/keyboards/Generic.kl中增加X/O按键 如下所示

  1.  git diff frameworks/base/data/keyboards/Generic.kl
  2. diff --git a/QSSI12/frameworks/base/data/keyboards/Generic.kl b/QSSI12/frameworks/base/data/keyboards/Generic.kl
  3. index bd0e56a..e4eb2ae 100644
  4. --- a/QSSI12/frameworks/base/data/keyboards/Generic.kl
  5. +++ b/QSSI12/frameworks/base/data/keyboards/Generic.kl
  6. @@ -410,6 +410,9 @@ key 580   APP_SWITCH
  7.  key 582   VOICE_ASSIST
  8.  # Linux KEY_ASSISTANT
  9.  key 583   ASSIST
  10. +# ZM ADD KEY X O
  11. +key 158   KEY_BACK(X键目前BACK键替换)
  12. +key 601   KEY_EM_O

5、在 QSSI12/frameworks/native/include/android/keycodes.h路径中增加内容如下

  1. --- a/QSSI12/frameworks/native/include/android/keycodes.h
  2. +++ b/QSSI12/frameworks/native/include/android/keycodes.h
  3. @@ -776,7 +776,11 @@ enum {
  4.      AKEYCODE_THUMBS_DOWN = 287,
  5.      /** Used to switch current account that is consuming content.
  6.       * May be consumed by system to switch current viewer profile. */
  7. -    AKEYCODE_PROFILE_SWITCH = 288
  8. +    AKEYCODE_PROFILE_SWITCH = 288,
  9. +         /** add custom key X */
  10. +    AKEYCODE_KEY_EM_O = 289, 
  11.      // NOTE: If you add a new keycode here you must also add it to several other files.
  12.      //       Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list.

6、在Android 12目录下 QSSI12/frameworks/native/libs/input/InputEventLabels.cpp 将上面的宏展开就是 {KEY_EM_O, AKEYCODE_KEY_EM_O }

其中KEY_EM_O对应上面定制的字符串

     QSSI12/frameworks/native/libs/input/InputEventLabels.cpp

  1. @@ -314,7 +314,10 @@ namespace android {
  2.      DEFINE_KEYCODE(REFRESH), \
  3.      DEFINE_KEYCODE(THUMBS_UP), \
  4.      DEFINE_KEYCODE(THUMBS_DOWN), \
  5. -    DEFINE_KEYCODE(PROFILE_SWITCH)
  6. +    DEFINE_KEYCODE(PROFILE_SWITCH), \
  7. +    DEFINE_KEYCODE(KEY_EM_O)
  8.  
  9.  // NOTE: If you add a new axis here you must also add it to several other files.
  10.  //       Refer to frameworks/base/core/java/android/view/MotionEvent.java for the full list.

7、

高通Android 10/11目录 LINUX/android/frameworks/native/include/input/InputEventLabels.h添加DEFINE_KEYCODE 增加X/O按键映射

static const InputEventLabel KEYCODES[] = {

    // NOTE: If you add a new keycode here you must also add it to several other files.

    //       Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list.

    DEFINE_KEYCODE(UNKNOWN),

    DEFINE_KEYCODE(SOFT_LEFT),

    ......

    DEFINE_KEYCODE(PROFILE_SWITCH),

    DEFINE_KEYCODE(KEY_EM_O),

    { nullptr, 0 }

};

8、在QSSI12/frameworks/base/core/java/android/view/KeyEvent.java 增加X/O按键 经过如上的步骤就将"123"按键和Android系统中的KEYCODE_KEY_EM_X就对应起来,注意这里的"600键值并不是真正意义上的600键值,他只是linux驱动向上层抛出的键值。

  1. --- a/QSSI12/frameworks/base/core/java/android/view/KeyEvent.java
  2. +++ b/QSSI12/frameworks/base/core/java/android/view/KeyEvent.java
  3. @@ -831,6 +831,9 @@ public class KeyEvent extends InputEvent implements Parcelable {
  4.       */
  5.      public static final int KEYCODE_PROFILE_SWITCH = 288;
  6.  
  7. +       /** add by zm 2023/04/11*/
  8. +    public static final int KEYCODE_KEY_EM_O = 289;     /**
  9.       * Integer value of the last KEYCODE. Increases as new keycodes are added to KeyEvent.
  10.       * @hide
  11. @@ -1977,6 +1980,9 @@ public class KeyEvent extends InputEvent implements Parcelable {
  12.              case KeyEvent.KEYCODE_SYSTEM_NAVIGATION_DOWN:
  13.              case KeyEvent.KEYCODE_SYSTEM_NAVIGATION_LEFT:
  14.              case KeyEvent.KEYCODE_SYSTEM_NAVIGATION_RIGHT:
  15. +            case KeyEvent.KEYCODE_KEY_EM_O:
  16. +
  17.                  return true;
  18.          }

9、对应上层KeyEvent.java里面映射KEYCODE值

  1. --- a/QSSI12/frameworks/base/core/res/res/values/attrs.xml
  2. +++ b/QSSI12/frameworks/base/core/res/res/values/attrs.xml
  3. @@ -1984,6 +1984,9 @@
  4.          <enum name="KEYCODE_THUMBS_UP" value="286" />
  5.          <enum name="KEYCODE_THUMBS_DOWN" value="287" />
  6.          <enum name="KEYCODE_PROFILE_SWITCH" value="288" />
  7. +        <enum name="KEYCODE_KEY_EM_O" value="289" />
  8.      </attr>
  9.  
  10.      <!-- ***************************************************************** -->

10、最后在PhoneWindowManager增打开DEBUG_INPUT日志开关 如下代码所示

  1. --- a/QSSI12/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
  2. +++ b/QSSI12/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
  3. @@ -240,7 +240,7 @@ import java.util.HashSet;
  4.  public class PhoneWindowManager implements WindowManagerPolicy {
  5.      static final String TAG = "WindowManager";
  6.      static final boolean localLOGV = false;
  7. -    static final boolean DEBUG_INPUT = false;
  8. +    static final boolean DEBUG_INPUT = true;
  9.      static final boolean DEBUG_KEYGUARD = false;
  10.      static final boolean DEBUG_SPLASH_SCREEN = false;
  11.      static final boolean DEBUG_WAKEUP = false;
  12. @@ -2604,6 +2604,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
  13.          if (DEBUG_INPUT) {
  14.              Log.d(TAG, "interceptKeyTi keyCode=" + keyCode + " down=" + down + " repeatCount="
  15.                      + repeatCount + " keyguardOn=" + keyguardOn + " canceled=" + canceled);
  16. +                        Log.d("ZM", "interceptKeyBeforeDispatching KeyEvent="+event.toString());
  17. +
  18.          }
  19.  
  20.          if (mKeyCombinationManager.isKeyConsumed(event)) {
  21. @@ -3448,6 +3450,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
  22.              Log.d(TAG, "interceptKeyTq keycode=" + keyCode
  23.                      + " interactive=" + interactive + " keyguardActive=" + keyguardActive
  24.                      + " policyFlags=" + Integer.toHexString(policyFlags));
  25. +                                       Log.d("ZM", "interceptKeyBeforeQueueing KeyEvent="+event.toString());
  26.          }

Log.d("ZM", "interceptKeyBeforeQueueing KeyEvent="+event.toString())

Log.d("ZM", "interceptKeyBeforeDispatching KeyEvent="+event.toString())

11、编译之前执行 最后执行指令更新下api,再触发编译

make update-api

/frameworks/base/api/current.txt(qssi11路径)QSSI12 frameworks/base/core/api/current.txt

  1. git diff frameworks/base/core/api/current.txt
  2. diff --git a/QSSI12/frameworks/base/core/api/current.txt b/QSSI12/frameworks/base/core/api/current.txt
  3. index 1dd401d..c8ad206 100644
  4. --- a/QSSI12/frameworks/base/core/api/current.txt
  5. +++ b/QSSI12/frameworks/base/core/api/current.txt
  6. @@ -47609,6 +47609,8 @@ package android.view {
  7.      field public static final int KEYCODE_K = 39// 0x27
  8.      field public static final int KEYCODE_KANA = 218// 0xda
  9.      field public static final int KEYCODE_KATAKANA_HIRAGANA = 215// 0xd7
  10. +    field public static final int KEYCODE_KEY_EM_O = 289// 0x121
  11.      field public static final int KEYCODE_L = 40// 0x28
  12.      field public static final int KEYCODE_LANGUAGE_SWITCH = 204// 0xcc
  13.      field public static final int KEYCODE_LAST_CHANNEL = 229// 0xe5​​​​​​

注意事项:

  1. 防止冲突或者遗漏最好在QSSI12目录下搜索所有Generic.kl文件find -name ‘Generic.kl’ 

QSSI12/device/google/atv/Generic.kl

QSSI12/device/amlogic/yukawa/input/Generic.kl

QSSI12/frameworks/base/data/keyboards/Generic.kl

QSSI12/cts/tests/tests/view/res/raw/Generic.kl

最后编译产物out/target/product/qssi/system/usr/keylayout/Generic.kl

  1. 编译之前执行 最后执行指令更新下api,再触发编译
  2. make update-api
  3. /frameworks/base/api/current.txt
  4. (qssi11路径)QSSI12 frameworks/base/core/api/current.txt

3、调试可打开以下库文件的开关

3.1 \frameworks\native\libs\input

3.2 \frameworks\native\services\inputflinger

3.3 .  adb shell dumpsys input 查看现有输入系统

3. 4 adb shell getevent 可查看现有的输入事件

3.5 在/system/usr/keylayout中还有很多Vendor_xxxx_Product_xxxx.kl 之类的配置文件,但是我们没有配置对应的vend id等,所以一直使用默认的Generic.kl。

其他编译异常:

1、QSSI12/frameworks/native/libs/input/InputEventLabels.cpp 出现空格其他字

解决方案:去掉空格其他斜杠字符转义重新编译即可 用编译器修改最好不要用内部编辑器出现编码不一致问题(VSCode/NodePad++)

2、出现KeyCode Unknown 检查QSSI12/device/qcom/qssi/gpio-keys.kl中增加键盘扫描码对应的键盘码 是否添加,如果没有新增示例如下

3、其他相关参考文章

Android 10 添加一个新物理按键_gpio-keys.kl_卖报的小行家007的博客-CSDN博客

记一次查看KeyEvent.keyCodeToString方法源码 - 简书 (jianshu.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/457440.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux系统应用编程(五)Linux网络编程(上篇)

本篇主要内容&#xff1a; Linux系统应用编程&#xff08;五&#xff09;Linux网络编程&#xff08;上篇&#xff09;一、网络基础1.两个网络模型和常见协议&#xff08;1&#xff09;OSI七层模型&#xff08;物数网传会表应&#xff09;&#xff08;2&#xff09;TCP/IP四层模…

详解C语言string.h中常用的14个库函数(一)

我计划讲解C语言string.h这个头文件中&#xff0c;最常用的14个库函数。为了让大家更加深入的理解这些函数&#xff0c;部分函数我会模拟实现。篇幅所限&#xff0c;如果文章太长了&#xff0c;可能会较难坚持读完&#xff0c;所以我会分几篇博客来讲述。本篇博客主要讲解的函数…

FPGA时序约束(三)时序约束基本路径的深入分析

系列文章目录 FPGA时序约束&#xff08;一&#xff09;基本概念入门及简单语法 FPGA时序约束&#xff08;二&#xff09;利用Quartus18对Altera进行时序约束 文章目录 系列文章目录前言基本时序路径时钟偏差寄存器到寄存器&#xff08;reg2reg&#xff09;建立时间余量保持时…

PHP实现以数组var_dump,array_combine等函数的方法功能举例

目录 前言 一、什么是数组 二、把两个数组合并成一个数组 1.1运行流程&#xff08;思想&#xff09; 1.2代码段 1.3运行截图 三、自动创建数组的一个案例 1.1运行流程&#xff08;思想&#xff09; 1.2代码段 1.3运行截图 前言 1.若有选择&#xff0c;可实现在目录里…

小朋友排队

[蓝桥杯 2014 省 B] 小朋友排队 题目描述 n n n 个小朋友站成一排。现在要把他们按身高从低到高的顺序排列&#xff0c;但是每次只能交换位置相邻的两个小朋友。 每个小朋友都有一个不高兴的程度。开始的时候&#xff0c;所有小朋友的不高兴程度都是 0 0 0。 如果某个小朋友…

Python 学习曲线 从 Python 新手到 Pro

Python 学习曲线 从 Python新手到 Pro 使用代码片段介绍&#xff1a; Python 是世界上最通用和使用最广泛的编程语言之一&#xff0c;以其简单性、可读性和多功能性而闻名。 在本文中&#xff0c;我们将探讨一系列示例场景&#xff0c;其中代码由具有三个不同专业知识水平的程序…

文件系统和动静态库

目录 再识文件属性 查看文件属性的原理 初识inode 了解磁盘 什么是磁盘 磁盘的结构 磁盘的存储结构 CHS寻址 磁盘的逻辑结构 使用LBA地址的意义 理解文件系统 页框和页帧 分治思想管理 Linux ext2文件系统 软硬链接 软链接 硬链接 文件的三个时间 动静态库 …

java运行python脚本,待完善版

参考资料: windows下调用CMD运行方式 兼容linux/windows,同步异步方式 指定特殊运行环境的运行(如:anaconda运行环境) 整合以上三种方式终极版源码 相关内容: 调用python脚本传参说明 如果不传参数,python脚本可以随意写,比如:

【课程介绍篇】C/C++后台开发岗位技能知识树

1 C/C后台开发岗位技能知识树 2 Linux C/C后台架构开发 成长体系课程 3 C技术历史更新 https://www.0voice.com/uiwebsite/html/courses/

《UVM实战》学习笔记——第七章 UVM中的寄存器模型2——期望值/镜像值、自动/显示预测、操作方式

文章目录 前言一、寄存器模型对DUT的模拟1.1 期望值和镜像值1.2 常见操作对期望值和镜像值的影响 二、prediction分类2.1 自动预测2.2 显式预测 三、访问寄存器方式四、mem和reg的联系和差别五、内建built_in sequence5.1 寄存器模型内建序列5.2 存储器模型内建序列5.3 禁止域名…

安装APP时弹窗未知风险未知开发者,还能下载吗?

随着移动互联网的不断普及&#xff0c;人们的日常生活已与手机密不可分。根据相关研究&#xff0c;在使用手机时&#xff0c;人们90%以上的时间都花在某些应用程序上&#xff0c;巨大的需求使得各种各样的APP被开发出来。然而人们在使用APP时必须更加注意其是否来源可信企业&am…

数据结构与算法基础-学习-21-查找之平衡二叉树(AVL树)

目录 一、个人理解 二、最小失衡子树 三、平衡调整的四种类型 1、LL型 2、RR型 3、LR型 4、RL型 四、如何平衡调整 1、LL型调整 2、LR型调整 五、宏定义 六、结构体类型定义 1、AVL树结点类型 2、AVL树类型 3、AVL树结点搜索路径类型 七、函数定义 1、初始化AV…

基于CMS项目的JDBC的实战

基于CMS项目的JDBC的实战 使用的Javase技术&#xff0c;进行控制台输出的客户管理系统&#xff08;CMS&#xff09;&#xff0c;主要功能包含登录&#xff0c;注册、客户信息的展示&#xff0c;客户信息的更新&#xff0c;客户信息添加删除客户、退出系统。 设计创建数据库 …

PEX高效批量网络装机

目录 一、部署PXE远程安装服务 1&#xff09;PXE概述 若要搭建PEX网络体系&#xff0c;必须满足以下几个前提条件 2&#xff09;搭建PXE远程安装服务器 ①安装并启用 TFTP 服务 ②安装并启用 DHCP 服务 ​编辑 ③准备 Linux 内核、初始化镜像文件 ④准备 PXE 引导程序 …

CUDA下载与对应版本查询

文章目录 1 算力&#xff0c;CUDA Driver Version&#xff0c;CUDA Runtime Version2 显卡型号3 实操4 镜像 1 算力&#xff0c;CUDA Driver Version&#xff0c;CUDA Runtime Version 比如说我们进入pytorch官网中&#xff0c;点击下载&#xff0c;如何找到适合自己的CUDA版本…

SCAU 统计学 实验5

8.14 总体平均值&#xff08;μ&#xff09;&#xff1a;7.0 cm 总体方差&#xff08;σ&#xff09;&#xff1a;0.03 cm 样本平均值&#xff08;x̄&#xff09;&#xff1a;6.97 cm 样本方差&#xff08;s&#xff09;&#xff1a;0.0375 cm 样本大小&#xff08;n&#xff…

复旦MOSS大模型开源了!Github和Hugging Face同时上线

来源&#xff1a;量子位 复旦大模型MOSS&#xff0c;正式开源了&#xff01; 作为国内首个开放测试的类ChatGPT产品&#xff0c;MOSS开源地址一放出&#xff0c;又冲上知乎热搜&#xff1a; 从官网介绍来看&#xff0c;MOSS是一个拥有160亿参数的开源对话语言模型。 它由约7…

EventLog Analyzer:高效保护网络安全的强大工具

网络安全是当今数字化世界中最为重要的话题之一。随着越来越多的组织、企业和个人将其业务转移到互联网上&#xff0c;网络安全问题变得越来越严峻。针对这个问题&#xff0c;EventLog Analyzer提供了一个有效的解决方案&#xff0c;让网络管理员可以更好地监控和保护其网络环境…

【虚拟仿真】Unity3D中实现UI的单击、双击、按压、拖动的不同状态判断

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 之前写了一篇在Unity中鼠标的单击、双击、拖动的文章&#xff…

Improving Language Understanding by Generative Pre-Training 论文阅读

论文题目&#xff1a;通过生成式预训练提高语言理解能力 GPT的全称&#xff1a;Generative Pre-trained Transformer。 Generative是指GPT可以利用先前的输入文本来生成新的文本。GPT的生成过程是基于统计的&#xff0c;它可以预测输入序列的下一个单词或字符&#xff0c;从而生…