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.hqwc.cn/news/206181.html

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

相关文章

【Android】声浪 UI 效果并附上详细代码

声浪效果是基于第三方实现的。 https://github.com/xfans/VoiceWaveView 将三方的 Kotlin 代码转 java 使用&#xff08;按照他的readme 进行依赖&#xff0c;好像少了点东西&#xff0c;至少本项目跑不起来&#xff09; 声浪效果在android 8 以上都是比较好的&#xff0c;不会…

Redis整数集合

前言 整数集合(intset)是集合键的底层实现之一&#xff0c;当一个集合只包含整数值元素&#xff0c;并且这个集合的元素数量不多时&#xff0c;Redis就会使用整数集合作为集合键的底层实现。 一. 整数集合的实现 1.1 结构 整数集合(intset)是Redis用于保存整数值的集合抽象数据…

智能井盖传感器建设信息化时代智慧城市

近年来随着信息技术的快速发展和城市化进程的加速推进&#xff0c;智慧城市的概念逐渐成为现实。作为智慧城市生命线建设中的重要组成部分&#xff0c;智能井盖传感器的应用正在为城市的可持续发展和居民的生活质量提供新的解决方案。 智能井盖传感器能够实时监测井盖状态&…

规划类3d全景线上云展馆帮助企业轻松拓展海外市场

科技3D线上云展馆作为一种基于VR虚拟现实和互联网技术的新一代展览平台。可以在线上虚拟空间中模拟真实的展馆&#xff0c;让观众无需亲自到场&#xff0c;即可获得沉浸式的参观体验。通过这个展馆&#xff0c;您可以充分、全面、立体展示您的产品、服务以及各种创意作品&#…

解决wangeditor点击全屏被遮挡的问题

问题页面 尝试过的方法 1 添加样式 #editor-wrapper { z-index: 1000; /* 设置一个较大的值 */ } 无效 2 包裹在el-from标签里 无效 解决 把编辑器放在div中 注意在div中加上zindex&#xff0c;并且设置的层级高一点 整体代码 <div style"z-index: 1001; position…

详解Java的static关键字

文章目录 &#x1f384;静态方法&#x1f33a;静态方法和非静态方法对比&#x1f6f8;静态方法实例&#x1f6f8;非静态方法实例 &#x1f339;static关键字⭐static变量⭐static代码块 &#x1f384;静态方法 不依赖于对象实例&#xff1a;静态方法不需要依赖于任何对象实例&…

美团四年、字节三年,我的软件测试之路

前言 时间回到8年前&#xff0c;我人生中的第一份实习工作&#xff0c;是在某互联网公司做一个自动化测试工程师。当时的我可谓意气风发&#xff0c;想要大干一场&#xff0c;结果第一次做测试就出现了事故。由于对某些地方的不了解&#xff0c;把某一个地方侧漏了&#xff0c…

python练习题(markdown中的60道题)

1.Demo01 摄氏温度转化为华氏温度 celsius float(input(输入摄氏温度&#xff1a;)) fahrenheit (9/5)*celsius 32 print(%0.1f 摄氏温度转为华氏温度为 %0.1f % (celsius, fahrenheit))结果&#xff1a; 2.Demo02 计算圆柱体的体积 h, r map(float, input().split())# …

2014年8月20日 Go生态洞察:Go在OSCON的精彩亮相

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

文心大模型商业化领跑,百度在自我颠覆中重构生长力

随着科技巨头竞逐AI大模型&#xff0c;人工智能技术成为今年最受瞩目的新技术。但是&#xff0c;AI大模型的创新之路&#xff0c;还缺少一个足够有力的商业化答案。 作为全球最先发布大模型的互联网大厂&#xff0c;百度能否加速大模型的应用落地&#xff0c;以及文心大模型能…

云原生入门系列(背景和驱动力)

做任何一件事&#xff0c;或者学习、应用一个领域的技术&#xff0c;莫过于先要想好阶段的目标和理解、学习它的意义是什么&#xff1f;解决了什么问题&#xff1f; 这部分&#xff0c;就尝试来探讨下这个阶段需要理解并达成的目标以及践行云原生的意义在哪里。 1.历程 任何阶…

Windows平台Unity下实现camera场景推送RTMP|轻量级RTSP服务|实时录像

技术背景 我们在对接Unity平台camera场景采集的时候&#xff0c;除了常规的RTMP推送、录像外&#xff0c;还有一些开发者&#xff0c;需要能实现轻量级RTSP服务&#xff0c;对外提供个拉流的RTSP URL。 目前我们在Windows平台Unity下数据源可采集到以下部分&#xff1a; 采集…