HOGP/HID 设备 新增自定义按键

起因

经常听客户反馈, 怎么这个按键不响应?? 怎么RC 部分按键 scan code不正确?
netflix key 怎么不能唤醒app? 怎么新增一个特殊的功能按键?
或者遇到一个更加鲜活的情形,某天,你手上有一个非常nice的蓝牙遥控器,你想好好利用起来,用来控制你的平台,该如何实现呢?

HID 设备的映射信息

针对 一个陌生的设备,可能你无法提前获得到该设备设计规范,
但是仍有几种方法可以在使用期间获得到映射信息(report description)

HOGP/HID设备需要遵守 USB-HID Usge table,按键发出的物理编码叫做scan code,与红外遥控器一样。
通常情况下满足标准的usb-hid usge table 的按键,不需要特殊处理,无论是android 还是linux,上层都能有对应的event 相应。

例如: keyboard 支持的键值范围0-231
大多数蓝牙遥控器都可以控制不同平台,就是这个原因,大家都使用的标准keyboard map 表。

但是往往有很多大厂,会自定义一些专用按键,启动特殊功能,针对特殊类型的键值需要在uhid kernel 和input kernel 层做特别处理,才不至于key 被kernel 层丢掉。

回归正题,怎么获取到未知设备的映射信息? 以便于我们找到该设备的自定义按键。

将该设备与任意平台(linux或android 都行)配对,然后有如下两种方法:
1.hci log 中有完整的映射信息,可以直接提取(另一篇做过介绍,本文不累述)
2.通过设备节点,获取rdesc,
cd sys/kernel/debug/hid
ls
cd xxxxxxxx

设备节点中有完整的映射信息,内容如下:
在这里插入图片描述
第一行就是完整的解析前的数据,根据usb hid usage table 去解析按键定义。
文件后面也会完成自动解析的结果。

有兴趣的朋友可以留言探讨一下。

厂商定义的特殊按键

在上述rdesc中,0x06 vendor special define ,允许厂商自定义一些按键,往往出问题,没有起作用的就是这些按键,例如
在这里插入图片描述

input kernel 修改

bt 收到的scan code 会经过一次映射,转为input 层的key code,
映射表一般正常情况,都是在kernel 注册input driver 和hid driver 时 决定

注册阶段:

例如常见的keyboard 类型,映射信息在下面数组里:
在这里插入图片描述
但是客户自定义类型的按键,并没有现成的映射表,需要在
函数 hidinput_configure_usage()中针对特殊类型,新增event 类型,
将收到的特殊按键,转为已经存在的input key code

如下一些操作:
在这里插入图片描述

input kernel 到input framwork

在android 平台中,input kernel 收到一些 key code 之后,可能并没有对应的event 去处理这些特殊案件,这时候需要修改或新增key code 对应的event。
这时需要修改 对应kl 文件。

此时已经是常规操作了,有感兴趣的可以继续交流

小结

针对特殊设备按键的处理流程,重点是搞清楚bt 到kernel 的两次映射转换
scan code --> input kernel --> input framwork
第一次通常使用标准的usb hid usage table ,特殊按键需要额外处理
第二次映射使用kl文件

如有纰漏,欢迎指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章