BLE-hid report descriptor解析

redsc文件

redsc 文件,反應的是按鍵的映射信息,獲取這個文件大致有三個途徑

  1. hid 設備供應商提供相關設計規範文件,vendor spec
  2. 通過hci log 提取(本文以這個爲例)
  3. 通過kernel log 提前(路徑:sys/kernel/debug/hid/[device id]/redsc), add device 階段,bt 寫到kernel 的,設備連接成功後,肯定會生成這個文件。

在這裏插入圖片描述
寫到kernel 的就是下列地段16進制數字,包含了hid 設備的所有映射信息
在這裏插入圖片描述

hid report descriptor 解析

如上述截圖,是一個hid 設備的映射表,從hci log中提取

  1. collection 開始,collection end結束,可以理解爲一個括號,這個例子有兩個collection,分別對應report id =1 ,reporte id = 2
  2. 每個子單元都是以 input/output/feature三類結束,分別快速找到這些。例子中4個input,2個output。根據這兩點很快能夠把整體結構區分開

下面我們來仔細分析每一個子單元鍵值的信息:

report id =1 ,first field input:

  1. usage page,表示類型,是一個keyboard,
  2. usage mininum/maximum,鍵值從224到231
  3. logical minnmun/max, 傳輸的邏輯值,只有0和1,
    表示有(231-224+1)個按鍵,每個按鍵有兩種狀態,分別有0和1表示
  4. report size 的單位是bit,每個按鍵佔有1位標識按下和彈起 report count * report size /8 =
    1byte,第一個字端元佔用1個字節
  5. input(data,variable,absolute)含義是這是一個input 類型,hid 設備輸入到host
    ,傳輸的數據是一個絕對值變量

以此類推
report id =1 ,second field input:

  1. 佔用1byte 空間,但是沒有定義按鍵

  2. input(constant,array,absolute),傳遞的是一個常量,一般作用是佔位,沒有實際用途,可以忽略

  3. report id =1, third field output
    佔用5bit 空間,定義了5個led燈狀態,

  4. report id=1,fourth field output
    佔用3bit,傳遞常量,補位作用,跟上述5bit led 燈,湊一個字節

  5. report id=1,fifth field input
    定義了6個按鍵,每個按鍵攜帶信息8bit,每個按鍵的值從0到241,整體所佔6byte

  6. report id =2, first input 定義了一個按鍵,佔用2個字節,16bit,
    每按鍵一次,發送一個2byte的數據出來,數據大小從1到652,整體所佔2byte

  7. 所以整體這個hid device report descriptor 佔用11個字節,一般爲了kernel 能夠快速處理map 信息,要求device 端在定義report 的時候,儘量精簡,實現功能的前提下,所佔字節越少越好

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