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文件

如有紕漏,歡迎指正。

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