Amlogic方案遥控器配置(Android11)

配置路线

键值变化路径:
ScanCode --> Keycode Lable --> KeyCode Layout --> KeyLable --> Keycode – > KeyEvent
文件映射路径:
*.dtsi --> input-event-codes.h --> *.kl --> InputEventLable.h --> kecodes.h --> PhoneWindowManager.java

一、获取Scancode

当一个红外遥控器的某个按键未适配时,有多种方法查看这个按键的scancode。

  1. 在控制台输入logcat 查看log,如:
meson-ir fe084040.ir: scancode 76 undefined
meson-ir fe084040.ir: no valid key to handle

如果已经适配了就会显示如下信息:

RemoteIME: keycode: 20, realAction: false
RemoteIME: keycode: 20, realAction: true
  1. 在控制台输入dmesg -c
[ 3195.358431] meson-ir fe084040.ir: scancode 76 undefined
[ 3195.358479] meson-ir fe084040.ir: no valid key to handle

输入之后再按下按键,然后再输入一次dmesg -c就会显示上面的内容,如果适配了这个按键则不会有任何显示
3. 在控制台输入echo 8 > /proc/sys/kernel/printk

可以看到我上面未定义的物理码值是76,转换成十六进制后是4c

二、获取Customcode

不同款式的遥控器有不同的用户码,使用cat /sys/devices/virtual/remote/amremote/customcode命令进行查看遥控器用户码,在串口执行该命令后,按下遥控器的任意键,再次执行该命令就可以看到你使用这款遥控器的用户码了。我这款遥控器的用户码为0x7984

三、Scancode和Customcode的映射文件DTSI

path:common/arch/arm64/boot/dts/amlogic/meson-ir-map.dtsi
按照里面原本的内容的样子添加,注意customcode改成你的遥控器的,里面面的映射如下:

customcode = <0x7984>;
release_delay = <80>;
size  = <31>;   /*keymap size*/
keymap = <REMOTE_KEY(0x12, KEY_POWER)
REMOTE_KEY(0x06, KEY_HOME)
REMOTE_KEY(0x1A, KEY_BACK)
REMOTE_KEY(0x10, KEY_VOLUMEUP)

前面的这个十六进制数就是scancode的十六进制,当然我们也可以看遥控器的规格书,上面会直接标注好scancode
后面的KEY_XXX需要在linux-event-codes.h文件中定义。
Path: external/u-boot/include/dt-bindings/input/linux-event-codes.h

#define KEY_BACK        158 /* AC Back */
#define KEY_FORWARD     159 /* AC Forward */

这个文件中后面那一列的数字则会在.kl文件中定义
进行到这里的时候,使用getevent -l再按下按键就已经能有相应的反馈了。

四、kl文件

4.1 getevent -l

无论是蓝牙遥控器还是红外遥控器,都需要确定其使用的kl (KeyLayoutFile)文件。在安卓shell 环境(串口控制台)执行命令确认kl 文件:getevent -l
首先会显示当前适配的遥控器列表

add device 1: /dev/input/event1name:     "cec_input"
add device 2: /dev/input/event4name:     "ir_keypad"
add device 3: /dev/input/event5name:     "ir_keypad1"
add device 4: /dev/input/event3name:     "gpio_keypad"
add device 5: /dev/input/event2name:     "vad_keypad"
add device 6: /dev/input/event0name:     "input_btrcu"
add device 7: /dev/input/event6name:     "adc_keypad"

以上内容代表了适配了七套遥控器,名称分别是"cec_input" “ir_keypad” 等
下面我们按下遥控器的某一个按键会出现下面的内容

/dev/input/event4: EV_KEY       KEY_RIGHT            DOWN
/dev/input/event4: EV_SYN       SYN_REPORT           00000000
/dev/input/event4: EV_KEY       KEY_RIGHT            UP
/dev/input/event4: EV_SYN       SYN_REPORT           00000000

前两行表示按键被按下,后两行表示按键被释放
EV_SYN: 用作分隔事件的标记。 事件可以在时间或空间上分开,例如使用多点触控协议。
EV_KEY: 用于描述键盘,按钮或其他类似键的设备的状态更改。
根据这里显示显示的event4我们可以知道我们的遥控设备为"ir_keypad"

4.2 dumpsys input

在前面我们看到我们按下按键时相应的是event4,我们可以使用cat /proc/bus/input/devices查看我们系统中连接的输入设备的详细信息。

I: Bus=0010 Vendor=0001 Product=0001 Version=0100
N: Name="ir_keypad"
P: Phys=keypad/input0
S: Sysfs=/devices/platform/fe084040.ir/input/input4
U: Uniq=
H: Handlers=rfkill mouse0 event4
B: PROP=0
B: EV=7
B: KEY=ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff 0 0 70000 ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe
B: REL=103

从我们之前监听到的按键事件我们可以看到处理该按键的事件是event4,这里我们对应上的设备名应该是 “ir_keypad”
然后在(串口控制台)执行命令 dumpsys input,可以根据所连接的遥控器的名称找到遥控器对应的kl文件。
根据这个IR遥控器设备ir_keypad的设备名,我们找到了下面这段内容:

  ir_keypadClasses: 0x00000029Path: /dev/input/event4Enabled: trueDescriptor: d2c52ff0f656fac4cd7b7a118d575e0109a9fe1cLocation: keypad/input0ControllerNumber: 0UniqueId:Identifier: bus=0x0010, vendor=0x0001, product=0x0001, version=0x0100KeyLayoutFile: /vendor/usr/keylayout/Vendor_0001_Product_0001.klKeyCharacterMapFile: /system/usr/keychars/Generic.kcmConfigurationFile:HaveKeyboardLayoutOverlay: falseVideoDevice: <none>

可以看到这里所用到的Android层映射文件为/vendor/usr/keylayout/Vendor_0001_Product_0001.kl(这里的usr对于不同项目是不一样的)
我这里是device/amlogic/common/products/mbox/Vendor_0001_Product_0001.kl

4.3 踩过的坑请注意

当我找到我的device/amlogic/common/products/mbox/目录下之后发现有多个kl文件
在这里插入图片描述

按理说应该是Vendor_0001_Product_0001.kl才对,但是实际上使用的却是Vendor_0001_Product_0002.kl文件,经过多方排查发现是因为在编译的时候mk文件对他进行了改动:
path:device/amlogic/common/products/mbox/sc2/device.mk

#use tv remote layout for mbox if livetv is built
ifeq ($(TARGET_BUILD_LIVETV), true)PRODUCT_COPY_FILES += \device/amlogic/common/products/mbox/Vendor_0001_Product_0002.kl:$(TARGET_COPY_OUT_VENDOR)/usr/keylayout/Vendor_0001_Product_0001.kl
elsePRODUCT_COPY_FILES += \device/amlogic/common/products/mbox/Vendor_0001_Product_0001.kl:$(TARGET_COPY_OUT_VENDOR)/usr/keylayout/Vendor_0001_Product_0001.kl
endif

这里由于变量TARGET_BUILD_LIVETV的值为true,所以将Vendor_0001_Product_0002.kl文件的内容拷贝到了Vendor_0001_Product_0001.kl里面,所以虽然用的是0001但是其实改动需要在0002中进行。

4.4 改动kl文件

patch: device/amlogic/common/products/mbox/Vendor_0001_Product_0002.kl

 key 158      BACKkey 139      MENUkey 102      HOME

前面的值是DTSI中的值,后面的是有底层文件与之相对应的。
进行到这里,按键功能就已经生效了,一般做到这里也就可以了。
继续往下追查这个值是在KeyLabel文件中定义的

五、KeyLabel文件

  • Path: frameworks/native/include/input/InputEventLabels.h
  • Content:
DEFINE_KEYCODE(BACK),

再往下就是Keycode值的对应

六、Keycode

包含以下三个文件:

  • Native
    • Path: frameworks/native/include/android/keycodes.h
    • Content:
AKEYCODE_BACK            = 4,
  • Java
    • Path: frameworks/base/core/java/android/view/KeyEvent.java
    • Content
public static final int KEYCODE_BACK            = 4;
  • Res
    • Path: frameworks/base/core/res/res/values/attrs.xml
    • Content:
<enum name="KEYCODE_BACK" value="4" />

现在,当你使用logcat -s RemoteIME命令就能够看到控制台输出了keycode,这个值就和我们上面的值对应上了
[图片]

七、KeyEvent

当按键传到 fromworks 我们只需要更改 KeyEvent.java 来完成最后的按键定义,之后就是到 PhoneWindowManager.java 来实现按键功能实现拦截或继续传递。

  • Path: frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
  • Content:
 onKeyDowncase KeyEvent.KEYCODE_YOUR_PRIVATE_KEY: {//do sthreturn true;
}

总之

一般情况下按照dtsi–>linux-event-codes.h–>kl 的顺序来改就可以了,如果还出现其他问题则继续查看。

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

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

相关文章

通过这个简单的技巧让我们的 JavaScript 代码变得异常快

通过这个简单的技巧让我们的 JavaScript 代码变得异常快 秘诀&#xff1a;了解JavaScript 虚拟机(VM)的内部工作原理。 首先&#xff0c;我们来谈谈像 V8 这样的JavaScript 虚拟机(VM)。可以把它想象成我们的操作的大脑 —— 它将我们简洁的代码变成计算机可以理解和执行的东…

免费图书教材配套资料:Spark大数据技术与应用(第2版)

《Spark大数据技术与应用&#xff08;第2版&#xff09;》课程内容全面介绍了Spark大数据技术的相关知识&#xff0c;内容包含包括Spark概述、Scala基础、Spark编程、Spark编程进阶、Spark SQL结构化数据文件处理、Spark Streaming实时计算框架、Spark GraphX图计算框架、Spark…

方法签名【C#】

1条件&#xff1a; 签名的作用&#xff1a;为了在众多方法中找到匹配的方法。【自己想要的方法】类似明星的签名。虽然2个人的名字一样&#xff0c;但并不是同一个人&#xff0c;这就需要用到签名的条件。 方法名称&#xff1a;注意大小写。 参数个数。 参数类型及顺序&…

STL—next_permutation函数

目录 1.next_permutation函数的定义 2.简单使用 2.1普通数组全排列 2.2结构体全排列 2.3string 3.补充 1.next_permutation函数的定义 next_permutation函数会按照字母表顺序生成给定序列的下一个较大的排列&#xff0c;直到整个序列为降序为止。与其相对的还有一个函数—…

实用工具推荐 | 在线制作电子书

​随着互联网的发展&#xff0c;越来越多的人开始关注知识的传播和分享。而电子书作为一种方便携带、易于分享的形式&#xff0c;越来越受到人们的青睐。今天&#xff0c;就为大家推荐一款实用的工具——FLBOOK在线制作电子杂志平台&#xff0c;让你轻松在线制作电子书&#xf…

【python学习】基础篇-常用模块-re模块:正则表达式高效操作字符串

在Python中&#xff0c;正则表达式主要通过re模块来实现。以下是一些常用的正则表达式用法&#xff1a; 匹配值&#xff1a; pattern r\d # 匹配一个或多个数字 pattern r\b\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\b #匹配日期格式 pattern rhello # 匹配字符串“hello”\…

【LeetCode】挑战100天 Day12(热题+面试经典150题)

【LeetCode】挑战100天 Day12&#xff08;热题面试经典150题&#xff09; 一、LeetCode介绍二、LeetCode 热题 HOT 100-142.1 题目2.2 题解 三、面试经典 150 题-143.1 题目3.2 题解 一、LeetCode介绍 LeetCode是一个在线编程网站&#xff0c;提供各种算法和数据结构的题目&…

HTTP客户端警告:Going to buffer response body of large or unknown size

HTTP客户端警告&#xff1a;Going to buffer response body of large or unknown size 点关注不迷路&#xff0c;欢迎再访&#xff01; 精简博客内容&#xff0c;尽量已行业术语来分享。 努力做到对每一位认可自己的读者负责。 帮助别人的同时更是丰富自己的良机。 目录 HTTP客…

IAR为恩智浦S32M2提供全面支持,提升电机控制能力

IAR Embedded Workbench for Arm已全面支持恩智浦最新的S32系列&#xff0c;可加速软件定义汽车的车身和舒适性应用的开发 瑞典乌普萨拉&#xff0c;2023年11月22日 – 嵌入式开发软件和服务的全球领导者IAR现已全面支持恩智浦半导体&#xff08;NXP Semiconductors&#xff0…

python脚本后台执行

nohup python script.py &

CMS垃圾收集器深入解析

1.CMS的两种模式与一种特殊策略 1.1Backgroud CMS(没有并发失败的情况) 1.1.1并发标记还能被整理成两个流程 (1)初始标记 (2)并发标记(3)(4)在这个阶段发生(3)并发预处理 (4)可中止的预处理 (5)重新标记 (6)并发清除 1.1.2为什么我们的并发标记细化之后还会额外有两个流…

【pandas数据处理】数据结构

数据结构 Series基于列表创建数据结构自定义元素的行标签基于字典创建数据结构 DataFrame对象基于列表创建数据结构设置参数来定义行列标签基于字典 Series 一维数组对象&#xff0c;不仅包含数据元素&#xff0c;还包含一组与数据元素对应的行标签。 基于列表创建数据结构 …

C++设计模式之工厂模式(下)——抽象工厂模式

抽象工厂模式 介绍示例示例使用运行结果抽象工厂模式的优缺点优点缺点 总结 介绍 抽象工厂模式是一种创建型设计模式&#xff0c;它提供了一种封装一组相关或相互依赖对象的方式&#xff0c;而无需指定它们具体的类。它允许客户端使用抽象接口来创建一系列相关的对象&#xff…

Jquery ajax 同步阻塞引起的UI线程阻塞的坑(loading图片显示不出来 )

Jquery ajax 同步阻塞引起的UI线程阻塞的坑&#xff08;loading图片显示不出来&#xff0c;layer.load延迟&#xff09;jax重新获取数据刷新页面功能&#xff0c;因为ajax属于耗时操作&#xff0c;想在获取数据且加载页面时显示加载遮罩层&#xff0c;结果发现了ajax的好多坑。…

Elasticsearch自动清理脚本

脚本 我在data下创建的脚本文件就叫:vi /data/clear_log.sh,内容如下 #!/bin/sh #获取时间 time=`date +%Y-%m-%d %H:%M:%S` cipan=`df -h| grep sda3` #查询磁盘使用率 liang=`df -h| grep sda3 |grep -v grep |awk {print $5}|tr -d

【数据结构】一题带你出师链表!

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 题目链接 138. 随机链表的复制https://leetcode.cn/problems/copy-list-with-random-pointer/ 题目描述 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机…

Make a BESD file from QTLtools output

Make a BESD file from QTLtools output # 根据基因名与变异rsid编号去重 library(tidyverse) library(readxl) qtltoolsnomi <- read_table("qtltoolsnomi.txt",col_names F) qtltoolsnomi %>% distinct(X1,X8, .keep_all TRUE) -> qtltool qtltool …

qml ParticleSystem3D使用介绍

在 Qt Quick 3D 中,ParticleSystem3D 是用来创建和控制3D粒子系统的元素。粒子系统是图形编程中用于模拟液体、烟雾、火、星空等现象的技术,它通过生成大量小粒子来模拟这些效果。ParticleSystem3D 提供了一个框架,允许开发者定义粒子的各种属性,如生命周期、速度、颜色、大…

王道p149 9.设树B是一棵采用链式结构存储的二叉树,编写一个把树 B中所有结点的左、右子树进行交换的函数。(c语言代码实现)

本题代码如下 void swap(tree* t) {if (*t){treenode* temp (*t)->lchild;(*t)->lchild (*t)->rchild;(*t)->rchild temp;swap(&(*t)->lchild);swap(&(*t)->rchild);} } 完整测试代码 #include<stdio.h> #include<stdlib.h> typed…

C#string.Format的一些使用

C#中的string.Format方法是一个用于格式化字符串的功能强大的方法。它允许您通过将占位符替换为实际的值来创建格式化的字符串。 一、基本语法是&#xff1a; string.Format(format, arg0, arg1, arg2, ...) 其中&#xff0c; format是一个字符串&#xff0c;其中包含要格式…