HID的全称为HumanInterfaceDevices,即人机接口设备。HID设备是USB协议中最早提出并支持的一种设备类。USBHID类设备使用非常普遍,例如USB接口的鼠标、键盘、游戏手柄等等。本章将对USBHID设备进行介绍,特别是USBHID类设备的描述符和设备请求。
本章包括
USBHID设备的基本知识
USBHID设备描述符
USBHID设备类请求
一、USB HID设备简介
USB HID设备主要用于和计算机进行交互通信,典型的USB HID类设备包括USB键盘、USB鼠标、USB游戏手柄等等,这些都是日常生活中常见的设备。以USB接口的鼠标为例,打开计算机的“设备管理器”,可以在“鼠标和其他指针设备”中找到USBHID接口的鼠标,其名称一般为“HID-Compliantmouse”,如图9.1所示。双击该设备,在打开的“HID-Compliantmouse属性”对话框中查看设备类信息,如图9.2所示。这里显示了当前设备属于Mouse类,也就是鼠标类。
USB HID设备的传输类型
这里需要注意的是,中断IN传输一般是必须的,而并不是所有的设备都要支持中断OUT传输。例如USB鼠标和USB键盘只需由设备向主机发送数据,而不需要USB主机的返回信息。因此,这类USB HID设备可以没有中断OUT传输。
USB HID设备的主要功能特点如下。
USBHID设备的固件程序支持USB协议中的HID报表格式,USB HID设备交换的数据保存在报表的结构内。这个格式包含了丰富的信息,可以处理任何类型的数据。
USB HID设备可以作为低速、全速或高速设备来使用。对于USB HID设备,一般要求对于每个用户输入都能够及时响应。为了对USB设备发出的少量数据进行及时响应,USBHID设备中普遍采用中断传输。
由于采用中断数据传输类型,因此USB HID设备适合于传输少量的数据。对于USB低速设备,其最大数据包长度为8字节;对于USB全速设备,其最大数据包长度为64字节;对于USB高速设备,其最大数据包长度为1024字节。
USB HID设备的输入一般是随机的,也就是说数据的传输具有突发性,例如USB鼠标或者USB键盘。因此,USB主机一般需要周期读取外部HID设备发送的数据并及时进行处理。
在USB总线接口协议规范中,对HID设备的最大传输速率有限制,并且其传输速率不是固定的,根据USB总线的繁忙程度而定。这就注定了USB HID设备不能进行大量数据的高速传输。
二、USB HID设备描述符
在USB协议中,USBHID设备的定义放置在接口描述符中,USB的设备描述符和配置描述符中不包含HID设备的信息。除了一些标准的描述符之外,USBHID设备还支持3个类描述符:HID描述符、报告描述符和物理描述符。
1、USB HID设备的定义
由于USBHID设备定义在接口描述符中。因此,接口描述符必须包括一个HID设备接口类。对于一些多功能的USBHID设备,可能包含多个接口描述符,此时只要有其中一个接口为HID设备类即可。当定义一个USB设备为USBHID设备时,其设备描述符一般设置可按如下参数执行即可:
bDeviceClass=0
bDeviceSubClass=0
bDeviceProtocol=0
而对于USB HID设备的接口描述符,应该置bInterfaceClass=03H,表示为HID类代码。
2、USB HID基本描述符
在USB总线技术接口协议中,USB HID设备需要支持标准的USB描述符以及HID类描述符。这里首先介绍USB HID设备类支持的5个USB标准描述符:设备描述符、配置描述符、接口描述符、端点描述符和字符串描述符。
2.1.设备描述符
USBHID设备的设备描述符格式如表9.2所示。需要重点指出的是,对于USB HID设备来说,其中类代码、子类代码和协议代码必须设置为0。而USB端点0所支持的最大数据包长度,可选8、16、32和64。
下面详细说明USBHID设备描述符各个字段的具体含义:
bLength字段,用于表示USB设备描述符的长度,长度占用1个字节,地址偏移量为0。对于USBHID设备描述符来说,bLength字段的值固定为18,也就是12H。
bDescriptorType字段,用于表示USB描述符的类型值,长度占用1个字节,地址偏移量为1。对于USBHID设备描述符来说,bDescriptorType字段的值固定为01H。
bcdUSB字段,用于表示该USB设备所遵循的USB规范版本号,长度占用2个字节,地址偏移量为2。bcdUSB字段以BCD码的形式表示,其格式为0xAABC,其中AA为主版本号,B为次版本号,C为子次版本号。
bDeviceClass字段,用于表示该USB设备所属的标准设备类,长度占用1个字节,地址偏移量为4。对于USBHID设备bDeviceClass字段需要设置为0x00。
bDeviceSubClass字段,用于表示USB设备所属的标准设备子类,长度占用1个字节,地址偏移量为5。bDeviceSubClass字段主要用于对USB设备类进行了更加细致的定义,对于USBHID类设备需要设置为0x00。
bDeviceProtocol字段,用于表示USB设备所采用的设备类协议,长度占用1个字节,地址偏移量为6。bDeviceProtocol字段的值和bDeviceClass及bDeviceSubClass的值有关。对于USBHID类设备需要设置为0x00。
bMaxPackerSize0字段,用于表示在USB设备中,端点0所支持最大数据包的长度,长度占用1个字节,地址偏移量为7。bMaxPackerSize0字段以字节为单位,对于对于低速USB设备,bMaxPackerSize0=8;对于全速USB设备,bMaxPackerSize0=8、16、32或64;对于高速USB设
2.2 配置描述符
USB HID设备的配置描述符格式如表9.3所示。下面详细说明USBHID配置描述符各个字段的具体含义:
2.3.接口描述符
USB HID设备的接口描述符格式如表7.4所示。USBHID设备的接口描述符需要将类代码字段设置为0x03,以表示HID接口。此时,子类代码可以设置为0x00或0x01,协议代码可以设置为0x00、0x01或0x02。
2.4.端点描述符
USB HID设备的端点描述符格式如表9.5所示。下面详细说明USBHID设备描述符各个字段的具体含义:
2.5.字符串描述符
USB HID设备的字符串描述符格式如表9.6所示。HID设备的字符串描述符与USB字符串描述符类似,下面详细说明USBHID设备的字符串描述符各个字段的具体含义:
3、USB HID类描述符
USB HID设备在标准的USB描述符之为,还必须支持HID描述符、报告描述符和物理描述符。同时,一个USBHID设备只能包含一个HID描述符,但其可以支持多个报告描述符,而物理描述符则可以有也可以没有。
下面分别介绍这3种USB HID类描述符。
3.1.HID描述符
USB HID设备的HID描述符用于识别HID设备中所包含的额外描述符,例如报告描述符或者物理描述符等。HID描述符的格式如表9.7所示。
下面分别介绍USBHID设备的HID描述符各个字段的具体含义。
bLength字段:HID描述符的长度。
bDescriptorType字段:HID描述符的类型,值为21H。
bcdHID字段:HID设备所遵守的HID规范版本号,为4位十六进制的BCD码数据,例如1.0版本为0100H,1.1版本为0110H,2.0版本为0200H。
bCountryCode字段:HID设备的国家代码。USB协议中详细划分了不同的国家代码,其取值如表9.8所示。
3.2.报告描述符
USB HID设备的报告描述符是一种数据报表,其类型值为22H。USB HID设备的报告描述符主要用于定义USB HID设备和USB主机之间的数据交换格式。报告描述符使用自定义的数据结构,用于传输特定的数据包。例如对于USB键盘,需要在数据包中指明按键所对应的键值,而对于USB鼠标则需要在数据包中指明左右键键值及滚轮信息。
USBHID设备的报告描述符使用数据项将这些数据结构组织起来,主机获得这些报告描述符后,根据数据项中的数据进行相应的处理。
4 、USB HID设备类请求
USB HID设备首先是一种特殊的USB设备,因此其必须首先支持标准的USB控制请求。除此之外,USB HID设备作为一类特殊的人机交互设备,还需要支持6个HID特定的控制请求。
这6个HID设备类请求如下所示。
GetReport请求,请求号为01H,其主要用于USB主机接收USBHID设备发送来的报告,报告中包含了USBHID设备发送的各类数据。
GetIdle请求,请求号为02H,其主要用于读取HID设备的当前空闲速率。
GetProtocol请求,请求号为03H,其主要用于读取HID设备的协议值。
SetReport请求,请求号为09H,其主要用于USB主机向HID设备发送报告,报告中包含了USB主机发送的各类数据。
SetIdle请求,请求号为0AH,其主要用于设置HID设备的空闲速率。
SetProtocol请求,请求号为0BH,其主要用于设置HID设备的协议值。和标准的USB设备请求一样,这些USBHID设备类请求一般采用控制传输方式进行。下面将分别介绍这些USBHID设备类请求的定义格式。
4.1、获取报告请求GetReport
获取报告请求GetReport用于获取USB主机接收USB HID设备发送来的报告,请求号为01H,其包括Setup事物处理包以及数据阶段。USBHID设备的GetReport请求的定义格式如表9.9所示。
4.2、获取空闲速率请求GetIdle
获取空闲速率请求GetIdle用于获取空闲速率,请求号为02H。空闲速率是指当USBHID设备没有报告数据时,USB主机限制USBHID设备中断IN端点的报告间隔时间。获取空闲速率请求GetIdle的定义格式如图9.10所示。
4.3、获取HID协议请求GetProtocol
获取HID协议请求GetProtocol的请求号为03H,用于获取USBHID设备的协议值。USBHID设备的获取HID协议请求GetProtocol的定义格式如图9.11所示。
4.4、设置报告请求SetReport
设置报告请求SetReport请求号为09H,用于USB主机向USB HID设备发送报告数据,其包括Setup事物处理包以及数据阶段。USB HID设备的设置报告请求SetReport定义格式如表9.12所示。
4.5、设置空闲速率请求SetIdle
设置空闲速率请求SetIdle的请求号为0AH,用于设置空闲速率。空闲速率是指当USBHID设备没有报告数据时,USB主机限制USBHID设备中断IN端点的报告间隔时间。USBHID设备的设置空闲速率请求SetIdle定义格式如图9.13所示。
4.6、设置HID协议请求SetProtocol
设置HID协议请求SetProtocol的请求号为0BH,用于设置USBHID设备的协议值。USBHID设备的设置HID协议请求SetProtocol的定义格式,如图9.14所示。