适配遥控器键值匹配不到对应kl文件问题

安卓版本:9.0
一、背景:
适配遥控器按键按键,修改kl文件,导致遥控器按键没响应
二、原因:kl里面映射的安卓键值变量没有被定义,导致kl解析失败,对应的kl文件无法被加载

三、遥控器适配方法:
###遥控器键值配对修改步骤
3.1  开机打印查看板子运行的dts是哪一个,
比如gxlx2_p295_4g_wlw.dts;
在串口输入 cat /sys/devices/virtual/remote/amremote/customcode,
按对应遥控器,此时会显示遥控器对应的customcode
3.2  然后在gxlx2_p295_4g_wlw.dts找到里面导入的遥控器dtsi,
如 #include "mesongxlxp295.dtsi"
修改mesongxlxp295.dtsi文件里面通过customcode值找对对应遥控器键值表,
修正键值表内容(物理键值,linux键值)
3.3 补充:(遥控器适配流程)
3.3.1 按下遥控器的一个按键后,系统中的处理逻辑为:
物理键值——>Linux键值——>按键名称——>Android键值
3.3.2 海思:串口输入 android_ir_user -D ,按下某个具体键值,串口会输出
amlogic可尝试输入dmesg | grep 查看,物理鍵值可以查看"/sys/devices/virtual/remote/amremote/customcode"
 3.3.3 物理键值字符串含义
Received key: 0xb9461420,linux_keycode =0x67,103,1, UP, protocol: .
  该内容的意义如下:
   1>1420为遥控器头码
   3>46为遥控器物理键值
   4>b9为校验值
   5>0x67转换为实际值就是103,代表该按键对应的Linux键值
3.3.4 修改文件
物理键值:海思(key.xml),Amlogic(remote*.conf)
linux键值:linux_key.h或者linux.h
3.3.5 确定遥控器对应kl文件方法
可通过:getevnet -l或者getevent -v查看例如/dev/input/event4进而接下来通过此确定是哪个kl文件
按键名称(对应Android键值):串口输入 "dumpsys input" ,找到遥控器对应的.kl文件,例如Vendor_0001_Product_0001.kl;.kl文件里面格式一般为如 key 103(linux键值)   DPAD_UP(按键名称)
3.3.6 安卓键值
Android键值:适配上层Android键值,上层键值在framework代码实现,具体有这些文件frameworks/base/core/java/android/view/KeyEvent.java;frameworks/native/include/input/KeycodeLabels.h;frameworks/base/core/res/res/values/attrs.xml;
frameworks/native/include/android/keycodes.h

四、调试记录

4.1 烧写后调试异常

然后适配完之后,烧录进设备,按遥控器按键
输入adb shell dumpsys input  
找到遥控器匹配的键值匹配信息如下

根据上述结果,明显是不对的,没有加载到对应的
Vendor_0001_Product_0001.kl文件

4.2 调试修改


我查看了我修改的这个文件,发现就新增了三个新按键
将修改回退Vendor_0001_Product_0001.kl重新push到设备
这时候看

此时加载的kl是正确的
KeyLayoutFile: /vendor/usr/keylayout/Vendor_0001_Product_0001.kl

4.3 问题分析
1.
按遥控器按键然后输入adb shell logcat | grep KeyLayout
2.这时候看到异常打印
E KeyLayoutMap: /vendor/usr/keylayout/Vendor_0001_Product_0001.kl:449:
Expected key code label, got 'CMCC_FILM'.
3.这时候看到是找不到CMCC_FILM报错,导致Vendor_0001_Product_0001.kl解析失败

4.4 问题溯源
找到文件
frameworks/native/libs/input/KeyLayoutMap.cpp

就是这个
int32_t keyCode = getKeyCodeByLabel(keyCodeToken.string()); 返回失败
找到
frameworks/native/include/input/InputEventLabels.h

struct InputEventLabel {
    const char *literal;
    int value;
};
static const InputEventLabel KEYCODES[] = {
***
***,
{ NULL, 0 }
}
static int lookupValueByLabel(const char* literal, const InputEventLabel *list) {
    while (list->literal) {
        if (strcmp(literal, list->literal) == 0) {
            return list->value;
        }
        list++;
    }
    return list->value;
}
static inline int32_t getKeyCodeByLabel(const char* label) {
    return int32_t(lookupValueByLabel(label, KEYCODES));
}


然后发现其实是getKeyCodeByLabel函数中里面调用lookupValueByLabel(label, KEYCODES)
发现是KEYCODES没有对CMCC_FILM定义

然后在KEYCODES[]里面增加DEFINE_KEYCODE(CMCC_FILM), 如下

static const InputEventLabel KEYCODES[] = {
***
***,
DEFINE_KEYCODE(CMCC_FILM),
{ NULL, 0 }
}

这时候编译重新烧录看就正常了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值