安卓版本: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 } }这时候编译重新烧录看就正常了


2068

被折叠的 条评论
为什么被折叠?



