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 的时候,尽量精简,实现功能的前提下,所占字节越少越好

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