蓝牙遥控器添加
1.前期准备工作:
拿到一个蓝牙遥控器时,键值和对应码值都是未知的,我们需要连接蓝牙遥控器,在串口输入getevent,再按下任意按键:
我们可以看到上图中我们获取到的信息:
1.设备连接到event7
- 遥控器名为"Bluetooth remote Keypad"
- “0004”为按下遥控器时的值,这个值为16进制,后续我们需要在.kl和.xml中将其转换成十进制
在拿到遥控器信息时,Ctrl+c退出getevent,在串口输入dumpsys input,会打印出来之前配置的信息,然后搜索"Bluetooth remote Keypad"
我们需要关注框起来的几点:
1.Vendor = 0x0525 product=0x0001
2.调用了Generic.kl Generic.kcm
kl文件也就是keylayout文件,它的作用是将Linux ScanCode转换为Android keycode。ScanCode就是硬件直接扫描到的数字,而这些数字会通过这个kl文件对应到字符串,也就是keycode。
Generic.kl是系统提供的一个特殊的内置常规按键布局文件,当找不到专属的kl或者专属kl报错的时候就会用Generic.kl。
我们拿到Vendor和Product就可以先配置该蓝牙遥控器的专属kl,格式一般是
Vendor_0x0525_Product_0001.kl
- 映射.kl文件和.xml文件
.kl和.kcm文件路径:kernel\android\R\device\realtek\common\keylayout
.xml路径:kernel\android\R\device\realtek\common\keylayout\extension
注意:这是2885N的路径,其他Code的路径可以通过dumpsys input查看
其他家不一定需要配置xml文件,2885N 需要
如果之前有人添加过的话可以先拿一份之前的.kl和.kcm文件重命名再添加对应的键值,如果没有的话可以拿同家原厂的其他方案(譬如说9269拿M家方案的kl映射)
.kcm文件多半不需要更改,重命名即可,我们重点更改.kl和.xml文件
编译烧录进去,连接蓝牙遥控器,先输入dumpsys input看看遥控器是否有映射到Vendor_0x0525_Product_0001.kl,如果像下图那样,仍然拿到Generic.kl的话,可能是里面的键值有误,我们通过在线修改,注释掉一些键值排查
如果成功关联到Vendor_0x0525_Product_0001.kl,即可进行下一步
3.获取键值和码值
在完成上述步骤后,我们可能会遇到几种情况:
1.按下一个键,但是功能是另一个按键
2.按下一个键,没有任何响应
其实都是因为没有这个按键或者没有匹配对应的值
我们用两个案例来解决上述两种问题
现象1:
BT_Smart_RC001这个遥控器,按下Back 建,Home键不起作用。
先使用 getevent 按下Back健,拿到event 的值
这种通用的按键,在KeyEvent 是有的,我们要做的,就是修改 kl 的值即可。
使用 dumpsys input 拿到 kl 的位置:
可以看到 kl 在 Android 系统映射的位置,修改里面的值,0x9e 转成十进制为 158,同理拿到HOME的值,修改如下
修改后重启就发现已经起作用了。
现象2:
BT_Smart_RC001 有个按键0x59,我们想把它定义为新的健,所以需要走一遍按键添加流程;
查看Linux映射表hid-input.c
位置在linux/linux-5.4/drivers/hid/hid-input.c ,去到 HID_UP_CONSUMER 这个方法,把0x59 添加进去,并新增 KEY_SOURCE 这个字符串,后续给Android使用的
查看input-event-codes.h,添加刚才的KEY_SOURCE,注意不要重复即可
在 KeyCodes.h 增加刚才的SOURCE,注意不要重复即可
然后再去到 frameworks/native/include/input,修改 InputEventLabels.h,定义刚才的source
最后,再去到修改给Android 上层使用的 KeyEvent.java 即可:
我们的按键值,就从 linux 传到 KeyEvent.java 了。
4.在配置时出现过的其他问题:
问题1:AD键之前有过BUG,导致原来的ui不可用了,调用了新的ui,所以需要在上层RtkKeyInterceptService.java做一下判断,调用新ui
问题2:如果在kl加不进去,可以在
kernel/android/R/device/realtek/common/keylayout/extension/
下添加到对应遥控器的.xml文件
中间的label是在input-event-codes.h拿的,后面的keycode是rtkkeyintercept,我们需要修改对应遥控器的scancode即可
标签:xml,文件,安卓,蓝牙,kl,遥控器,按键,input From: https://blog.csdn.net/m0_64680064/article/details/144338833