USB 报告描述符 详细解析

C:\Users\tangfeng\Desktop\USB_HID协议中文版.pdf

HID Windows编程接口函数
文件 hid.dll 中提供了很多个 API
HidD_GetAttributes  请求获得 HID 设备的厂商 ID、产品 ID 和版本号 
HidD_FreePreparsedData  释放函数 HidD_GetPreparsedData 所使用的资源 
HidD_GetHidGuid  请求获得 HID 设备的 GUID 
HidD_GetIndexString  请求获得由索引识别的字符串 
HidD_GetManufactureString  请求获得设备制造商字符串 
HidD_GetPhysicalDescriptor  请求获得设备实体字符串 
HidD_GetPreparsedData  请求获得与设备能力信息相关的缓冲区的代号 
HidD_GetProductString  请求获得产品字符串 
HidD_GetSerialNumberString  请求获得产品序列号字符串 
HidP_GetButtonCaps  请求获得 HID 报表中所有按钮的能力 
HidP_GetCaps  请求获得用于描述设备能力的结构的指针 
HidP_GetLinkCollectionNotes  请求获得描述在顶层集合中的连接集合(Link Collection)关系的结构的数组 
HidP_GetSpecificButtonCaps  请求获得报表中按钮的能力,该请求可以设定一个 Usage Page、Usage 或是 Link Collection 
HidP_GetSpecificValueCaps  请求获得报表中数值的能力,该请求可以设定一个 Usage Page、Usage 或是 Link Collection 
HidP_GetValueCaps  请求获得 HID 报表中所有数值的能力 
HidP_MaxUsageListLength  请求获得 HID 报表中可以回传的按钮的最大数目,该请求可以设定一个 Usage Page 
HidP_UsageListDifference  比较两个按钮列表,并且求出在一个列表中设定而在另一个列表中没有设定的按钮用于从设备读取、向设备传送报表的 API 函数(hid.dll) 
HidD_GetFeature  从设备读取一个特征报表 
HidD_SetFeature  向设备传送一个特征报表 
HidP_GetButtons  从设备读取包含每个按下的按钮的用法(Usage)的缓冲区的指针,该请求可以设定一个 Usage Page 
HidP_GetButtonEx  从设备读取包含每个按下的按钮的 Usage 和 Usage Page 的缓冲区的指针 
HidP_GetScaledUsageValue  从设备读取一个已经经过比例因子调整的有符号数值 
HidP_GetUsageValue  从设备读取一个指向数值的指针 
HidP_GetUsageValueArray  从设备读取包含多个数据项的 Usage 的数据 
HidP_SetButtons  向设备传送设置按钮的数据 
HidP_SetScaledUsageValue  将一个实际数值转换成设备使用的逻辑数值,并将其插入到报表中 
HidP_SetUsageValue  向设备传送数据 
HidP_SetUsageValueArray  向设备传送包含多个数据项的 Usage 的数据 
HidD_FlushQueue  清空输入缓冲区 
HidD_GetNumInputBuffer  获得驱动程序用于存储输入报表的环形缓冲区的大小,默认值是 8 
HidD_SetNumInputBuffer  设置驱动程序用于存储输入报表的环形缓冲区的大小 用于查找和识别设备的 API 函数(setupapi.dll) 
SetupDiGetClassDevs  获得 HID 的信息,针对已安装的设备,回传一个指向其信息集的代码 
SetupDiEnumDeviceInterfaces  请求获得设备信息群内的一个设备的信息 
SetupDiGetDeviceInterfaceDetail  请求获得设备的路径 
SetupDiDestroyDeviceInfoList  释放 SetupDiGetClassDevs 使用的资源 用于打开、关闭设备和实现数据传送的 API 函数(kernal32.dll) 
CreatFile  取得设备的路径后,调用该函数获得设备代号 202                                                                计算机高级接口实践 
WriteFile  向设备传送输出报表 
ReadFile  从设备读取输入报表 
CloseHandle  关闭设备,释放 CreateFile 所使用的资源


报表描述符定义了执行设备功能的数据格式和使用方法。 

报表描述符是报表描述项目(Item)的集合
报表描述符由描述 HID 设备的数据项目(Item)组成,项目的第一个字节(项目前缀)
由三部分构成,即项目类型(item type)、项目标志(item tag)和项目长度(item size)。
其中项目类型说明项目的数据类型,项目标签说明项目的功能,项目长度说明项目的数据
部分的长度

|Data bTag bType bSize |
 ——————————————————————
短项目的数据字节数由 bSize 的值定义,bSize 为 0、1、2、3 时 Data 部分的字节数
分别为 0、1、2、4 个字节。短项目的项目类型由 bType 定义,bType 为 0、1、2 时分别
为 Main、Global 和 Local 类型。 

长项目
暂不研究

报表的项目有 Main、Global 和 Local 三大类
Main  类项目用于定义报表描述符中的数据项。
带数据项的 Main用于生成报表中的数据项,包括 Input、Output 和 Feature 项目
不带数据的 Main 项目不生成报表中的数据项,包括 Collection 和 End Collection 项目

Global 类项目实现对数据的描述,用来识别报表并且描述报表内的数据,包括数据的
功能、最大与最小允许值以及数据项的大小与数目等

Local 类项目定义控制的特征,这一类项目的作用域不超过下一个 Main 项目,所以在
每一 Main 项目之前可能有多个 Local 项目。Local 项目用于描述后面的 Input、Output 和
Feature 项目

Main 类项目包括:input; output; feature; collection; endcollection

Global 类项目包括: Usage Page(设备的功能 ); Logical Min/Max; 
Physical Min/Max; Unit Exponent(定义数值是基于 10 的指数);  
Unit( 单位 );Report Size/Id/Count; Push(将 Global 项目状态表送入堆栈 ); Pop(从堆栈恢复 Global 项目状态表 )

Local 类项目包括:Usage(设备的用法); Usage Minimum/Maximum(第一和最后用法); Designator Index/Minimum/Maximum  
String Index/Minimum/Maximum    Delimiter

在每一个 Input、Output 和 Feature 项目的前缀字之后是 32 位描述数据,目前最多定
义了 9 个位,余的位则是保留。

Input、Output Feature位定义如下:
Data  数据:表示项目的内容是可更改的(读/写)。 
Constant  常数:表示项目的内容是不可更改的(只读)。 

Array 数组:报告全部控制的状态。如在键盘报表中每一个键在报表中占一位,报表传输全部键的状态,可以同时按下任意多个键。 
Variable 变量:报告作用中的控制。如在键盘报表中只报告按下的键的编号,可以同时按下的键的数目等于报表的计数(Global 类项目Report Count) 

Absolute 绝对:表示数值以一个固定值为基准。游戏杆通常是报告绝对数据(游戏杆目前的位置)。 
Relative 相对:表示数据的改变以上一个读数为基准。鼠标通常是报告相对数据(鼠标的移动位置)

No Wrap :如果设置为 1 表示回转,当数值超过最小值到最大值的范围时将回转,如果最小值是 0 而最大值是 10,超过最大值的下一个数值是 0。 
Wrap

Linear 线形:表示测量的数据与报表的数据有线性的关系。
Non-Linear 非线性:表示测量的数据与报表的数据没有线性的关系

Preferred 优选状态:表示控制在没有用户交互时会回到一个特定的状态。如按钮就有优选状态,在无操作时保持未按下的状态。
Non-Preferred 非优选状态:它维持在上一个用户选择的状态。如交替的开关就没有优选状态。

No Null Position 无空状态位置:表示控制永远在传送有效的数据
Null State 空状态:表示控制支持一个没有传送有效数据的状态。如操纵杆可能具有一个多方向的按钮开关,在没有按下时在空状态,这时控制将传送一个在  Logical Minimum 与 Logical Maximum 范围之外的数值来表示它在空状态

Non-Volatile 
不可变的:表示设备只有在主机请求时才改变数值。当主机传送
一个报表并且不要改变不可变项目时,如果该项目是定义成相对
(Relative)的,数值 0 表示不改变数据,如果不可变项目是定
义成绝对(Absolute)的,超出范围外的数值则表示不改变数据
Volatile
可变的:表示设备可以自己改变数值,并不是必须主机传送报表
要求给设备来改变数值。例如设备控制面板可以由主机软件传送
一个报表给设备,也可以由用户自己按设备上的实际按钮

Bit Field 位字段:表示每一个位或是一个字节内的一组位可以代表一份数据
Buffered Bytes 缓冲字节:表示信息包含一个或多个字节,缓冲字节的报表大小必须是 8



Collection 和 End Collection
打开和关闭集合
Collection 有 3 种类型:Application、Physical 与 Logical
Application 包含有共同用途的项目或执行单一功能的项目。
如键盘的开机描述符将键盘的按键与 LED 指示灯数据集合成一个 Application Collection。
所有的报表必须在一个 Application Collection 内

Physical  Collection 包含在一个单一几何点上的数据项目,
可以将每个位置的数据集合成一个  Physical  Collection
在设备报告多个传感器的位置的时候,使用 Physical Collection 指明不同的数据来自不同的传感器

Logical Collection 



Usage Page 和 Usage 
功能和用法可以在HID协议中找到,功能描述此设备的功能,用法描述 控制,集合和数据,如on off enable disable


Report ID 
放在信息包中报表数据之前,设备可以支持多个相同类型的报表,每一个报表包含不同的数据与其特有的 ID。 在

Logical Minimum 和 Logical Maximum
定义报表的变量(Variable)或阵 列(Array)数据的限制范围,此限制范围以逻辑单位来表示。
如设备报表的一个电流值读数是500mA,而一个单位是 2mA,则  Logical Maximum 值等于 250

Physical Minimum 和 Physical Maximum 
定义数值的限制范围,该限制范围使用Unit 项目定义的单位来表示。
设备报表的一个电流值读数是 500mA,单位是 2mA,Logical Maximum 值等于 250,而 Physical Maximum 值是 500

Unit Exponent
定义了在使用LOGICAL范围和PHY范围将设备的返回数值转换成实际数值时,使用 10 的多少次方对数值进行定标。

Unit 单位:Unit 的数值部分可以长达 4 字节,按照 4 位为一段分段,可以分为 8 个半字节段,由高到低分别为半字节 7、半字节 6、…、半字节 0
采用 4 位 2 的补码表示,取值范围是-8~+7之间
半字节 1 表示长度(单位为厘米),如果其数值为 1 表示厘米,数值为 2 表示平方厘米 ,成为面积单位
以位的方式
0  测量系统 
1  长度 
2  质量 
3  时间 
4  温度 
5  电流
6  亮度 
7  保留 


Report Size 和 Report Count
Report Size 项目指定 Input、Output 与 Feature 项目字段的大小
Report Count 项目指定 Input、Output 与 Feature 项目包含的字段数目。 


Push 和 Pop
Push 项目将一个 Global 项目状态表格的副本压入 CPU 的堆栈内
Pop 项目恢复之前压入堆栈的 Global 项目状态的储存状态


Usage、Usage Minimum 和 Usage Maximum 
一个报表可以指定一个 Usage 给许多个控制,或是指定不同的 Usage 给每一个控制。
如果一个报表项目之前有一个 Usage,此 Usage 应用到该项目的所有控制。如果一个报
表项目之前有一个以上的 Usage,每一个 Usage 应用到一个控制,Usage 与控制是按顺
序结合的

Usage  Minimum 和 Usage  Maximum 可以指定一个  Usage 给多个控制或是数组项
目。将从 Usage Minimum 到 Usgae Maximun 定义的用法顺序对应到多个控制中。 


例子:
0x05, 1    ; Usage Page (1: Generic Desktop)  
0x09, 6    ; Usage (6: Keyboard) 表示报表定义的是HID键盘 
0xA1, 1    ; Collection (1: Application) ====================集合开始 
     ; 
     ;   以下定义了键盘的修饰键输入报表,共有8个键,组成一个字节 
     ;  用法见HID Usage Table中的第10节中的键盘用法定义 
0x05, 7    ;   Usage page (7: Key Codes)  
0x19, 224   ;   Usage Minimum (224) 
0x29, 231   ;   Usage Maximum (231) 
0x15, 0    ;   Logical Minimum (0) 
0x25, 1    ;   Logical Maximum (1) 
0x75, 1    ;   Report Size (1) 
0x95, 8    ;   Report Count (8) 
0x81, 2    ;   Input (Data,Variable,Absolute)  
     ; 
     ;  以下定义了一个保留字节的输入报表 
0x95, 1    ;  Report Count (1) 
0x75, 8    ;  Report Size (8), 
0x81, 1    ;   Input (Constant) = Reserved Byte 
     ; 
     ;  以下定义了键盘的LED指示灯输出报表项目,共有5个指示灯 
     ;  用法见HID Usage Table中的第11节中的LED用法定义 
0x95, 5    ;  Report Count (5) 
0x75, 1    ;  Report Size (1)
0x05, 8    ;  Usage Page (Page# for LEDs) 
0x19, 1    ;  Usage Minimum (1) 
0x29, 5    ;  Usage Maximum (5) 
0x91, 2    ;  Output (Data, Variable, Absolute) 
     ;   
     ;  以下定义了3个填充位,与前面的5个LED指示灯数据组成一个完整的字节 
0x95, 1    ;  Report Count (1) 
0x75, 3    ;  Report Size (3) 
0x91, 1    ;  Output (Constant) 
     ; 
     ;  以下定义了键盘的按键值输入报表项目,共6个字节,存放键编号(0~101) 
     ;  用法见HID Usage Table中的第10节中的键盘用法定义 
     ;  这样的设计可以允许一次输入6个按键的键值 
0x95, 6    ;  Report Count (6) 
0x75, 8    ;  Report Size (8) 
0x15, 0    ;  Logical Minimum (0) 
0x25, 101  ;  Logical Maximum (101) 
0x05, 7    ;  Usage Page (7: Key Codes) 
0x19, 0    ;  Usage Minimum (0) 
0x29, 101  ;  Usage Maximum (101) 
0x81, 0    ;  Input (Data, Array) 

0xC0     ; End_Collection ================================ 集合结束























 

USB 报告描述符 详细解析_第1张图片

USB 报告描述符 详细解析_第2张图片

USB 报告描述符 详细解析_第3张图片

USB 报告描述符 详细解析_第4张图片

 

 

你可能感兴趣的:(自我总结经验)