蓝牙遥控器添加
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和.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即可
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |