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

<think>嗯,用户给了一段关于USB HID描述符配置的代码,需要我帮忙解释或者介绍这部分内容。首先,我需要仔细看看这段代码的结构,了解每个字段的含义。看起来这是一个结构体的初始化,可能是在嵌入式开发或者USB设备驱动中使用的。 用户可能是在学习USB HID设备的开发,遇到了配置描述符的问题,需要理解每个字段的作用。他们可能不太清楚各个描述符之间的关系,比如配置描述符、接口描述符、端点描述符等。也有可能是在调试设备时遇到了问题,需要检查描述符是否正确设置。 首先,我要确定这个结构体是用于配置USB HID设备的描述符。USB描述符有多个层次,比如配置描述符、接口描述符、HID描述符、端点描述符等。每个描述符都有特定的字段需要设置,比如bLength表示描述符的长度,bDescriptorType表示类型,然后是各种属性。 接下来,我需要分部分解析代码。首先是config部分,属于配置描述符,里面包括头部信息、总长度、接口数量、配置值等。然后hid_itf是接口描述符,说明接口编号、端点数量、类、子类、协议等信息。hid_vendor可能是HID描述符,包含HID版本、国家代码、报告描述符长度等。hid_epin是端点描述符,设置端点地址、传输类型、最大包大小和间隔。 需要注意每个字段的取值是否正确。例如,bInterfaceClass设为USB_HID_CLASS,表明这是HID设备。bInterfaceProtocol设置为键盘协议,说明这个设备是键盘类型。端点地址可能是一个输入端点,使用中断传输方式。 用户可能想知道每个字段的具体作用,以及如何根据需求修改这些值。例如,如果需要修改报告描述符的长度,或者调整端点的轮询间隔,应该改哪里。还有可能想知道各个描述符之间的关系,比如配置描述符包含接口描述符,接口描述符又关联到端点和HID描述符。 另外,用户提到后面的语言ID描述符注释,可能在问是否需要配置这部分,或者是否有遗漏。需要指出语言ID描述符通常是在设备描述符中指定,但这段代码可能没有包含,可能需要另外定义。 最后,要确保解释清晰,帮助用户逐步理解每个部分,并确保他们能够正确配置自己的USB HID设备。可能还需要提醒常见的错误点,比如描述符长度计算错误,端点地址方向设置不对等。</think>这是一个USB HID设备配置描述符的结构体初始化代码,主要用于定义USB人机交互设备(如键盘)的通信特征。以下是对各部分的逐层解析: --- ### 一、配置描述符(Configuration Descriptor) ```c .config = { .header = { .bLength = sizeof(usb_desc_config), .bDescriptorType = USB_DESCTYPE_CONFIG }, .wTotalLength = USB_HID_CONFIG_DESC_LEN, // 配置描述符总长度 .bNumInterfaces = 0x01U, // 包含1个接口 .bConfigurationValue = 0x01U, // 配置编号为1 .bmAttributes = 0xA0U, // 总线供电,支持远程唤醒 .bMaxPower = 0x32U // 最大功耗 100mA (0x32*2mA=100mA) } ``` - **关键字段**: - `bmAttributes=0xA0`: 二进制 `10100000`,最低位为1表示总线供电,bit6为1表示支持远程唤醒 - `bMaxPower=0x32`: 十进制50,计算功耗为 $50 \times 2\text{mA} = 100\text{mA}$ --- ### 二、接口描述符(Interface Descriptor) ```c .hid_itf = { .header = { .bLength = sizeof(usb_desc_itf), .bDescriptorType = USB_DESCTYPE_ITF }, .bInterfaceNumber = 0x00U, // 接口0 .bNumEndpoints = 0x01U, // 1个端点 .bInterfaceClass = USB_HID_CLASS, // HID类设备 .bInterfaceSubClass = USB_HID_SUBCLASS_BOOT_ITF, // 支持BIOS级启动协议 .bInterfaceProtocol = USB_HID_PROTOCOL_KEYBOARD // 键盘协议 } ``` - **协议特性**: - 支持`Boot Protocol`,可在BIOS/UEFI层直接识别为键盘 - 使用`Keyboard`协议,符合USB HID规范中的键盘设备定义 --- ### 三、HID描述符(HID-Specific Descriptor) ```c .hid_vendor = { .header = { .bLength = sizeof(usb_desc_hid), .bDescriptorType = USB_DESCTYPE_HID }, .bcdHID = 0x0111U, // HID规范版本1.11 .bNumDescriptors = 0x01U, // 包含1个报告描述符 .bDescriptorType = USB_DESCTYPE_REPORT, .wDescriptorLength = USB_HID_REPORT_DESC_LEN // 报告描述符长度 } ``` - **版本信息**: - `bcdHID=0x0111` 表示遵循HID 1.11规范 - 报告描述符长度需要与实际的键盘报告描述符长度一致 --- ### 四、端点描述符(Endpoint Descriptor) ```c .hid_epin = { .header = { .bLength = sizeof(usb_desc_ep), .bDescriptorType = USB_DESCTYPE_EP }, .bEndpointAddress = HID_IN_EP, // 输入端点地址(通常为0x81) .bmAttributes = USB_EP_ATTR_INT, // 中断传输模式 .wMaxPacketSize = HID_IN_PACKET, // 最大包大小(例如8字节) .bInterval = 0x40U // 轮询间隔64ms } ``` - **传输特性**: - 中断传输(Interrupt Transfer)适合HID设备的实时性要求 - 典型键盘输入包大小为8字节(包含按键码和修饰键状态) --- ### 五、常见问题 1. **为什么需要多个描述符?** USB设备通过分层描述符定义功能: - 配置描述符 → 接口描述符 → HID描述符 → 端点描述符 2. **如何扩展功能?** 修改`bNumInterfaces`并添加新的接口描述符,例如同时实现键盘+鼠标功能 3. **描述符长度计算:** `wTotalLength`需包含所有子描述符的长度总和,错误计算会导致枚举失败 --- ### 、语言ID描述符补充 代码末尾的注释`/* USB language ID Descriptor */`提示需要定义语言描述符,通常如下: ```c { 0x04, USB_DESCTYPE_STRING, 0x09, 0x04 } // 0x0409表示英语(美国) ``` 这个结构体完整定义了USB HID键盘设备的标准通信参数,实际开发中需配合报告描述符共同工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值