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 ================================ 集合结束