USB系列六:USB HID设备配置

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所示。

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值