redsc文件
redsc 文件,反应的是按键的映射信息,获取这个文件大致有三个途径
- hid 设备供应商提供相关设计规范文件,vendor spec
- 通过hci log 提取(本文以这个为例)
- 通过kernel log 提前(路径:sys/kernel/debug/hid/[device id]/redsc), add device 阶段,bt 写到kernel 的,设备连接成功后,肯定会生成这个文件。
写到kernel 的就是下列地段16进制数字,包含了hid 设备的所有映射信息
hid report descriptor 解析
如上述截图,是一个hid 设备的映射表,从hci log中提取
- collection 开始,collection end结束,可以理解为一个括号,这个例子有两个collection,分别对应report id =1 ,reporte id = 2
- 每个子单元都是以 input/output/feature三类结束,分别快速找到这些。例子中4个input,2个output。根据这两点很快能够把整体结构区分开
下面我们来仔细分析每一个子单元键值的信息:
report id =1 ,first field input:
- usage page,表示类型,是一个keyboard,
- usage mininum/maximum,键值从224到231
- logical minnmun/max, 传输的逻辑值,只有0和1,
表示有(231-224+1)个按键,每个按键有两种状态,分别有0和1表示 - report size 的单位是bit,每个按键占有1位标识按下和弹起 report count * report size /8 =
1byte,第一个字端元占用1个字节 - input(data,variable,absolute)含义是这是一个input 类型,hid 设备输入到host
,传输的数据是一个绝对值变量
以此类推
report id =1 ,second field input:
-
占用1byte 空间,但是没有定义按键
-
input(constant,array,absolute),传递的是一个常量,一般作用是占位,没有实际用途,可以忽略
-
report id =1, third field output
占用5bit 空间,定义了5个led灯状态, -
report id=1,fourth field output
占用3bit,传递常量,补位作用,跟上述5bit led 灯,凑一个字节 -
report id=1,fifth field input
定义了6个按键,每个按键携带信息8bit,每个按键的值从0到241,整体所占6byte -
report id =2, first input 定义了一个按键,占用2个字节,16bit,
每按键一次,发送一个2byte的数据出来,数据大小从1到652,整体所占2byte -
所以整体这个hid device report descriptor 占用11个字节,一般为了kernel 能够快速处理map 信息,要求device 端在定义report 的时候,尽量精简,实现功能的前提下,所占字节越少越好