USB-HID技术报告(VR接口)

时间:2024-05-31 08:40:30

名 称 : USB-HID技术报告
姓 名 : 殷松
时 间 : 2017年7月3日
目 录

一、 HID设备简介以及范畴
二、HID设备通信方式以及功能特征
三、HID报表描述符分类
四、HID的特定请求

USB-HID技术报告
HID(Human Interface Device,人机接口设备)是USB设备中常用的设备类型,是直接与人交互的USB设备,例如键盘、鼠标与游戏杆等。在USB设备中,HID设备的成本也较低。
HID类是Windows完全支持的第一批USB设备类型中的一种。在Windows 98以及后来的版本中内置有 HID设备的驱动程序,应用程序可以直接使用这些驱动程序来与设备通信。由于这个原因,符合HID类USB设备才就可很容易的设置运行。
一. HID设备简介以及范畴
1.1 HID设备简介
目前市场上USB 设备的种类繁多, 但是这些设备会有一些共同的特性, 根据这些特性可以把USB 设备划分为不同的类,如显示设备、通信设备、音频设备、大容量存储设备、人机接口设备(HID)。人机接口设备(HID)主要是指一些人与计算机进行交互的设备,如键盘、鼠标、游戏杆等;但是HID 设备不一定非要是这些人机交互设备, 只要符合HID 设备级定义规范要求的都可以认为是HID 设备。HID 设备有以下主要特点:
①交换的数据存储在报告的结构内, 设备必须支持HID 报告格式。
②每笔事务可以携带小量或中量的数据。低速设备每笔事务最大为8字节, 全速设备每笔最大为64 字节, 高速设备最大为1024 字节;
③有最大传输速度的限制。低速设备最快10 ms一笔事务,最高速度为800 B/s ;全速设备最快1ms一笔事务, 最高速度为64 KB/s;高速设备最快125μs一笔事务,最高速度为24.576 MB /s 。
④没有传输速度的保证。
除此之外,H.265 同样使用了更新的运动矢量测试,在多核并行化工作方面完成了更大的改进,在某些新技术下,能够高效地完成压缩处理工作。
1.2 HID设备范畴
HID 类提供了人机接口的界面,典型的HID 设备包括:
•Keyboard and pointing device—-例如:标准鼠标,跟踪球,操纵杆。
•Front-panel controls—-例如:球柄,开头,滑轮。
•在电话、VCR 远程控制、游戏及模拟设备中有可能用到的设备—-例如:数据采集器,节流阀,方向盘,方向踏板。
•也许不需要人为参与,但数据格式与HID 类设备相同—-例如:数据采集枪、温度计、电压表。
许多典型的 HID 类设备具有批示灯、格式化的显示、音频反馈、压力传感反馈,因此HID 类定义包括了不同类型的批示,以反馈到用户端。
二. HID设备通信方式以及功能特征
1.1 HID设备通信方式
USB设备有4 种传输方式与主机进行通信:控制方式、中断方式、批量方式和同步方式。每种方式都有它的应用领域。HID 只支持控制和中断传输方式。如图1和表1所示,HID设备必须要有默认的控制管道和一个中断输入端点;中断输出端点是可选的。
USB-HID技术报告(VR接口)
主机与设备之间所交换的数据,可以分成两种类型:
 一.低延迟的数据,必须尽快地到达目的;
 二.配置或其他的数据,没有严格时间限制的需求。
中断管道是控制管道之外的另一种数据交换的方式,特别适合使用在接收端需定时或是尽可能及时收到数据的时候。中断输入管道携带数据到主机,中断输出管道则是携带数据到设备。在总线忙的时候,控制管道可能会被延迟,而中断管道保证会有可得到的带宽。HID不需要一定有中断输出管道。如果没有中断输出管道,主机会在控制管道上使用HID设备特有的Set_Report请求来传送所有的报表。
2.2 HID设备功能特性
HID设备功能特性分为三类分别是:
•Class(类)
USB 设备划分类别有几个标准:
•拥有相同的数据传输需要
•拥有同一个类驱动。
•Subclass(子类)
Report Descriptor(报告描述符) 被HID 类驱动解析,而Report Descriptor (报告描述符)将不同的数据类型组合构成了通信protocol(协议),它是可扩展的,能够适应新的设备。
•Interface(接口)
即上述通信方式
三、HID报表描述符分类
3.1 简介
当插入USB设备后, 主机会向设备请求各种描述符来识别设备。为了把一个设备识别为HID类别, 设备在定义描述符的时候必须遵守HID规范。图2显示了HID各种描述符之间的关系。事实上,每个设备可以有多个接口描述符来实现多接口设备,而且每个接口描述符下应该有多个端点描述符。
USB-HID技术报告(VR接口)
从图2中可以看出, 除了USB标准定义的一些描述符外,HID设备还必须定义HID描述符。另外设备和主机的通信是通过报告的形式来实现的, 所以还必须定义报告描述符;而物理描述符不是必需的。还有就是HID描述符是关联于接口(而不是端点)的, 所以设备不需要为每个端点都提供一个HID描述符。
3.2 HID各设备的描述符:
HID 设备的描述符除了5个USB的标准描述符(设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符)还包括3 个HID 设备类特定描述符:HID 描述符、报告描述符、实体描述
符。
除了HID 的三个特定描述符组成对HID 设备的解释外,5个标准描述符中与HID 设备有关的部分有:
• 设备描述符中bDeviceClass、bDeviceSubClass 和bDeviceProtocol 三个字段的值必须为零。
• 接口描述符中bInterfaceClass 的值必须为0x03,bInterfaceSubClass 的值为0或1,为1 表示HID设备符是一个启动设备(Boot Device,一般对PC 机而言才有意义,意思是BIOS启动时能识别并使用您的HID设备,且只有标准鼠标或键盘类设备才能成为Boot Device。如果为0则只有在操作系统启动后才能识别并使用您的HID 设备)bInterfaceProtocol 的取值含义如下表所示:
USB-HID技术报告(VR接口)
下面分别对这3个HID设备类特定描述符进行说明。

3.1.1 HID描述符
HID 描述符关联于接口描述符,因而如果一个设备只有一个接口描述符,则无论它有几个端点描述符,HID设备只有一个HID描述符。HID设备描述符主要描述HID规范的版本号、HID通信所使用的额外描述符、报表描述符的长度等。表3所示为HID描述符的结构:
USB-HID技术报告(VR接口)
3.1.2 报表描述符(相对复杂)
报表描述符定义了执行设备功能的数据格式和使用方法。如果设备是鼠标,则数据报表鼠标的运动按钮点击。如果设备是延迟控制器,则数据包含了指定开关延迟的代码。
报表描述符需要足够的灵活,来处理设备不同的功能。格式应该简单,这样当传输数据时不会浪费设备的存储空间或总线时间。HID报表描述符通过付出了比较原始数据更复杂的格式的代价来实现上述目的。这样格式不限制报表里数据类型,但是报表描述符必须提前描述报表的大小和内容。报表描述符的内容和长度随设备而不同,可以短而简单,长复杂,或者介于二者之间。
报表描述符是一种类描述符。主机通过发送wValue高位字节为22H的Get_Descriptor请求来获得报表描述符。默认的报表数量为00h。获取报表描述符包含的内容和它的结构的一个途径是查看一个报表。
3.1.3 物理描述符
物理描述符是一个数据结构,提供有关的信息正在**控制或控制的人体的特定部分或部分。例如,物理描述符可能指示右手拇指用于**按钮5.应用程序可以使用此信息进行分配功能到设备的控制。
类似的物理描述符被分组成集合。指示者索引项目包含在报表描述符中的地图项(或控件)到特定物理描述符包含在物理描述符集中(以下称为
一般作为描述符集)。
每个物理描述符由以下三个字段组成:
(1)Designator指示符:识别影响项目的实际身体部位,例如,手。
(2)Qualifier限定词:进一步定义指示符,例如右手或左手。
(3)Effort努力:量化用户必须采取的努力来实现该项目。
四、HID的特定请求
除了USB设备的11个标准请求外,HID规范另外还定义了6个HID特定控制请求,表4列举出了这些请求,下面的内容中更详细的描述了每个请求。 所有的HID设备都必须支持Get_Report请求,同时支持启动的设备必须支持Get_Protocol请求和Set_Protocol请求,其他的请求是可选择的。如果设备没有中断输出端点,此设备需要支持Get_Report请求来从主机读取数据。
USB-HID技术报告(VR接口)
4.1 Get_Report请求
Get_Report的作用是启用主机使用控制传输,来从设备读取数据。在使用时wValue字段的高字节是报表类型,1表示Input报表,2表示Output报表,3表示Feature报表。wValue的低字节是报表的Report ID,如果没有定义Report ID,该字节为设0。
在携带请求的控制传输的数据阶段,HID设备回传指定的报表内容。
HlD规范不建议使用该请求获得未经定时的数据,这样的数据建议使用中断输入管道获得.该请求用来取得在主机初始化设备时的特征项目状态和其他信息。使用开机协议的主机可以使用此请求来获得按键或鼠标数据。
4.2 Set_Report请求
Set_Report请求的参数含义和Get_Report一样,但Set_Report请求的数据方向与Get_Report相反,在后面的数据阶段,主机传送报表到HID设备,这样的输出报表可以用于复位设备的控制,复位产生的效果取决于对应的控制的类型是相对(Reletive)的还是绝对(Absolute)的。
4.3 Set_Idle请求
Set_Idle请求的作用是静默一个在中断输入管道的特定的报表,直到一个发生一个相关的事件或过去了规定的时间,当数据从上一个报表后没有改变时,可以通过限制中断输入端点的报表频率来节省传输带宽。HID设备不是必需支持此请求。
wValue字段的高字节是设置的闲置时间,是报表之间的最大间隔时间。该字节为0表示闲置时间为无限长,在这种情况下,设备只有在报表数据有改变时才传送报表,否则设备传回一个NAK。
wValue的低字节是报表的Report ID。如果低字节是0,此请求应用到设备的所有输入报表。
闲置时间以4ms为单位,范围在4ms~1020ms之间。如果报表的数据自从上一次报表后有改变,或是接收到一个请求,设备会传送一个报表。
如果报表的数据没有改变,而且从上一次报表后过去的时间自尚未达到规定的闲置时间,设备会传回一个NAK。如果报表的数据没有改变,而且持续时间已经达到的闲置时间,设备会传送一个报表。闲置时间设置为0表示无限长的闲置时间,设备只有在报表的数据有改变时才会传送一个报表,对于其他的中断输入请求则是传回NAK。
在检测HID设备时,Windows的HID驱动程序会试图将闲置时间设置成0。如果HID设备不支持此请求,主机会收到传回的Stall。
4.4 Get_Idle请求
Get_Idle请求的作用是过的设备的当前闲置时间,在数据阶段,HID设备回传一个字节的闲置时间值。
4.5 Get_Protocol请求
Get_Protocol请求的作用是主机获取设备目前作用的是启动协议还是报表协议。
在数据阶段中设备回传的1个字节信息包中的数据值为0表示启动协议,为1表示报表协议。
启动设备必需支持该请求。
4.6 Set_Protocol请求
Set_Protocol的作用是主机指定设备使用启动协议或报表协议。
在数据阶段中主机传送的1个字节信息包中的数据值为0表示指定启动协议,为1表示指定报表协议。
启动设备必需支持该请求。
参考资料:USB-HID英文文献