我们在学习完kl文件的适配后,是设定是遥控器已经被识别的情况下进行。列如我在某宝花八块九包邮的遥控器,对着红外接收头按下按键getevent
是没有效果的。amlogic使用的是38khz的红外接收器,遥控器只要支持NEC远程协议即可被支持。
先来解释一下大致流程:内核启动->加载/etc/remote.conf配置文件->红外接收扫描->匹配设备码factory_code->键码值+设备码生成校验码与校验码匹配->上报framework层。
之前提到的kl文件适配就在framework层发生。内核扫码匹配时如果键值不支持会记录在内核报告信息中。我们执行dmesg -s 5000
即可获取5000毫秒内的内核报告。
我们先将/etc/remote.conf
文件adb pull /etc/remote.conf D:/key
本地计算机。并删除设备中/etc/remote.conf
文件。shell命令模式下rm /etc/remote.conf
如果未获得root权限请先获取root权限。这样我们就可以获取到每次遥控器按下的内核报告。按下遥控器后shell命令模式下执行dmesg -s 5000
。我们可以得到类似以下打印:
..
...
[ 5097.694000] Wrong custom code is 0xee119c21
如果我们没有获取到上述打印,说明遥控器不支持NEC远程协议,需要更换一个遥控器进行适配。
我们将后面的十六进制数据如:0xee119c21
与按键名称记录下来。重复上诉动作按下所有的按键,并且记录下来。我们可以得到以下结果:
主页
0xee119c21
退出
0xee139c21
音量加
0xee819c21
....
例如主页键home的键值0xee119c21
释义如下:
0x | ee | 11 | 9c21 |
---|---|---|---|
十六进制标志 | 校验码 | 键值keycode | 设备码factory_code |
每个按键均以改标志开头 | 用于校验数据是否正确 | 按键键值 | 遥控器的设备码,每个按键均一样,用于标记是哪个遥控发生过来的 |
打开我们本地的remote.conf
文件,先将我们获取到的factory_code填到对应的位置例如:
#原有值
factory_code = 0x77dd0001
#修改为,后面的0001不要动,原来是什么就是什么
factory_code = 0x9c210001
我们定位到第一个key_begin
会发现有以下结构
0xc1 106 #HOME
0xca 103 #BACK
0xd2 108 #V +
例如0xc1 106 #HOME
其中释义如下:
0xc1 | 106 | #HOME |
---|---|---|
遥控器对接按键键值 | 上报framework值 | 注释 |
0x保持不变,后面的填上我们之前获取到的键值keycode | 上报值,保持不变 | 注释,保持不变 |
到了这里就可以做很多操作了,列如配置文件没有注释时上报framework值我们就可以1-999随意填写,然后再去kl文件中纠正。如果我们的遥控键比配置文件多则则新增一行再去kl文件新增即可。修改完之后再将remote.conf
文件上传到/etc
目录,列如:adb push D:/key/remote.conf /etc
。然后重启设备即可进行按键测试。
注意某些设备remote.conf文件可能在/system/etc
目录,需要根据实际需求进行修改。
推荐阅读: