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/event1
  name:     "cec_input"
add device 2: /dev/input/event4
  name:     "ir_keypad"
add device 3: /dev/input/event5
  name:     "ir_keypad1"
add device 4: /dev/input/event3
  name:     "gpio_keypad"
add device 5: /dev/input/event2
  name:     "vad_keypad"
add device 6: /dev/input/event0
  name:     "input_btrcu"
add device 7: /dev/input/event6
  name:     "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_keypad
  Classes: 0x00000029
  Path: /dev/input/event4
  Enabled: true
  Descriptor: d2c52ff0f656fac4cd7b7a118d575e0109a9fe1c
  Location: keypad/input0
  ControllerNumber: 0
  UniqueId:
  Identifier: bus=0x0010, vendor=0x0001, product=0x0001, version=0x0100
  KeyLayoutFile: /vendor/usr/keylayout/Vendor_0001_Product_0001.kl
  KeyCharacterMapFile: /system/usr/keychars/Generic.kcm
  ConfigurationFile:
  HaveKeyboardLayoutOverlay: false
  VideoDevice: <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
else
    PRODUCT_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      BACK
 key 139      MENU
 key 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 的顺序来改就可以了,如果还出现其他问题则继续查看。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

某高品质房产企业:借助NineData平台,统一数据库访问权限,保障业务安全

该企业是中国领先的优质房产品开发及生活综合服务供应商。在 2022 年取得了亮眼的业绩表现&#xff0c;销售额市场占有率跻身全国前五。业务涵盖房产开发、房产代建、城市更新、科技装修等多个领域。 2023 年&#xff0c;该企业和玖章算术&#xff08;浙江&#xff09;科技有限…

jenkins springCloud项目优雅下线

文章目录 场景解决下线请求效果如图贴一个可用的部署脚本 场景 在 Spring Cloud 项目的微服务实例关闭时&#xff0c;需要首先从注册中心设置为下线&#xff0c;避免该服务的消费者继续请求该服务实例&#xff0c;导致请求失败如果我们在服务实例从注册中心取消注册后&#xff…

Oracle(2-5)Usage and Configuration of the Oracle Shared Server

文章目录 一、基础知识1、 Server Configurations服务器配置2、Dedicated server process专用服务器进程3、Oracle Shared ServerOracle共享服务器4、Benefits of Shared Server 共享服务器的优点5、Processing a Request 处理请求6、Configuring Shared Server 配置共享服务器…

利用ros实现单片机通讯(转载)

我觉得如果使用这个人的micro_ros通信协议&#xff0c;就不用再去Ubuntu或者Windows上面自己写驱动程序了&#xff0c; 利用micro_ros实现esp32与ros2的通讯 Tianci ​ 天津大学 工学博士 参考&#xff1a;https://github.com/micro-ROS/micro_ros_arduino https://blog.cs…

格式化名称节点,启动Hadoop

1.循环删除hadoop目录下的tmp文件&#xff0c;记住在hadoop目录下进行 rm tmp -rf 使用上述命令&#xff0c;hadoop目录下为&#xff1a; 2.格式化名称节点 # 格式化名称节点 ./bin/hdfs namenode -format 3.启动所有节点 ./sbin/start-all.sh 效果图&#xff1a; 4.查看节…

Java核心知识点整理大全8-笔记

Java核心知识点整理大全7-笔记-CSDN博客文章浏览阅读1.2k次&#xff0c;点赞27次&#xff0c;收藏26次。但是如果锁的竞争激烈&#xff0c;或者持有锁的线程需要长时间占用锁执行同步块&#xff0c;这时候就不适合 使用自旋锁了&#xff0c;因为自旋锁在获取锁前一直都是占用 c…

Servlet实现一个简单的表白墙网站

文章目录 前言效果展示事前准备HTML、CSS、JavaScript分别负责哪些HTML和CSS构架出页面的基本结构和样式JavaScript 实现行为和交互实现服务器端的业务代码整理pom.xmlweb.xmlmessageWall.htmlMessageServlet.java 前言 前面我们学习了 Java 中知名的 HTTP 服务器 tomcat 的安…

电脑盘符错乱,C盘变成D盘怎么办?

在一些特殊情况下&#xff0c;磁盘盘符会出现错乱&#xff0c;C盘可能会变成D盘。那么&#xff0c;这该怎么办呢&#xff1f;下面我们就来了解一下。 通过磁盘管理更改盘符 磁盘管理是Windows自带的工具&#xff0c;它位于“计算机管理”的控制台中。管理硬盘及其所包含的卷或…

Word隐藏批注知识分享,快速提升工作效率!

“请问大家&#xff0c;word里的批注应该怎么隐藏呢&#xff1f;有没有什么简单的方法可以将批注隐藏的呀&#xff1f;感谢感谢&#xff01;” Word中的批注功能在文档编辑中起着重要的作用&#xff0c;但有时为了保护文档的隐私和保密性&#xff0c;我们需要隐藏批注。 Word隐…

uboot移植-野火imx6ull

uboot移植及LCD和网络驱动设置 环境&#xff1a; Ubuntu 20.04 野火imx6ull pro开发板 tftp服务的搭建 IMX6ULL开发板参考的是NXP官方的I.MX6ULL EVK开发板做的硬件。 Linux的移植要复杂的多&#xff0c;在移植Linux之前我们需要先移植一个 bootloader 代码&#xff0c;这…

寄存器、缓存、内存之间的关系和区别

https://blog.csdn.net/m0_46761060/article/details/124689209 目录 关系1、寄存器2、缓存&#xff08;Cache&#xff09; 2.1、寄存器和缓存的区别2.2、一级缓存和二级缓存3、内存 3.1、只读存储器 ROM&#xff08;Read Only Memory&#xff09;3.2、随机存储器 RAM&#xf…

什么是凸函数

假设函数是定义在某个向量空间的凸子集上的实值函数&#xff0c;并且&#xff0c;如果对于中的任何两个向量和&#xff0c;都满足&#xff1a; 则称为上的凸函数

ESP32 Arduino实战Web篇-使用 WebSocket 创建 ESP32 Web 服务器

本文将详细介绍如何使用 WebSocket 创建 ESP32 Web 服务器,解释WebSocket原理与搭建步骤,并附超详细的代码解释 假设我们需要创建一个使用 ESP32 通过 WiFi 控制灯泡的项目。实现非常简单:我们将 ESP32 设置为软 AP 或 STA 模式,使其能够提供一个网页,显示灯开关的状态为…

计数排序+桶排序 详讲(思路+图解+代码详解)

文章目录 计数排序和桶排序一、计数排序概念&#xff1a;写法一&#xff1a;写法二&#xff1a; 二、桶排序概念代码 计数排序和桶排序 一、计数排序 时间复杂度&#xff1a;空间复杂度&#xff1a;稳定性&#xff1a;稳定 概念&#xff1a; 非基于比较的排序 计数排序又称为…

【Pytorch】Visualization of Fature Maps(2)

学习参考来自 使用CNN在MNIST上实现简单的攻击样本https://github.com/wmn7/ML_Practice/blob/master/2019_06_03/CNN_MNIST%E5%8F%AF%E8%A7%86%E5%8C%96.ipynb 文章目录 在 MNIST 上实现简单的攻击样本1 训练一个数字分类网络2 控制输出的概率, 看输入是什么3 让正确的图片分…

Visual Studio连接unity编辑器_unity基础开发教程

Visual Studio连接unity编辑器 问题描述解决方法意外情况 问题描述 当我们在unity编辑器中打开C#脚本的时候发现Visual Studio没有连接unity编辑器&#xff0c;在编写代码的时候也没有unity关键字的提醒。 简单来说就是敲代码没有代码提示。 解决方法 这时候需要在unity中进行…

【Pytorch】Visualization of Feature Maps(1)

学习参考来自 CNN可视化Convolutional Featureshttps://github.com/wmn7/ML_Practice/blob/master/2019_05_27/filter_visualizer.ipynb 文章目录 filter 的激活值 filter 的激活值 原理&#xff1a;找一张图片&#xff0c;使得某个 layer 的 filter 的激活值最大&#xff0c…

限时开发、码力全开、2w奖金!AGI Hackathon等你挑战!

AGI时代&#xff0c;我们已不再满足于简单的产品开发&#xff0c;与大模型结合的无限想象力&#xff0c;成为开发者们新的追求。 你有能力将想法转化为现实吗&#xff1f;你有勇气接受挑战&#xff0c;创造全新的AI应用吗&#xff1f; 如果你有热情&#xff0c;有信心&#x…

Git 教程

目录 Git 与 SVN 区别 Git 快速入门 学习目录 git简明指南 Git 安装配置 Git 工作流程、工作区、暂存区和版本库 Git 创建仓库 Git 基本操作 Git 分支管理 Git 查看提交历史 Git 标签 Git 远程仓库(Github) Git 服务器搭建 Git 是一个开源的分布式版本控…

909-2014-T1

文章目录 1.原题2.算法思想3.关键代码4.完整代码5.运行结果 1.原题 为带表头的单链表类Chain编写一个成员函数Reverse&#xff0c;该函数对链表进行逆序操作&#xff08;将链表中的结点按与原序相反的顺序连接&#xff09;&#xff0c;要求逆序操作就地进行&#xff0c;不分配…