七、USB描述符分类

  USB描述符有以下几种:设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符、HID描述符

1、设备描述符

  设备描述符描述了USB设备的通用信息。一个USB设备只有一个设备描述符。比较特殊的是, 默认控制管道的数据包的长度(也就是USB设备端点0的长度)是在设备描述符中定义的, 而不像其他端点一样是在端点描述符中定义的。

   描述设备速度,走的是USB1.1、USB2.0;设备的PID、VID等信息,设备描述符字段组成如下:

偏移量

字段名称

长度(字节)

字段值

意义

0

bLength

1

数字

设备描述符的字节数大小

1

bDescriptor Type

1

常数

设备描述符类型编号

2

bcdUSB

2

BCD码

USB版本号

4

bDeviceClass

1

USB分配的设备类代码

5

bDeviceSubClass

1

子类

USB分配的子类代码

6

bDeviceProtocol

1

协议

USB分配的设备协议代码

7

BMaxPacketSize0

1

数字

端点0的最大包大小

8

idVendor

2

ID编号

厂商编号

10

idProduct

2

ID编号

产品编号

12

bcdDevice

2

BCD码

设备出厂编号

14

iManufacturer

1

索引

描述厂商字符串的索引

15

iProduct

1

索引

描述产品字符串的索引

16

iSerialNumber

1

索引

描述设备序列号字符串的索引

17

bNumConfigurations

1

数字

可能的配置参数

(1)、bLength

这是一个以1字节二进制数为内容的字段。 该字段表示整个设备描述符的字节数大小,而整个设备描述符占用了17个字节, 因此bLength的值是固定的, 就是18, 用十六进制表示就是0x12。

(2)、bDescriptorType

设备描述符的类型,USB定义的设备描述符的类型编号为常数0x01,因此,该字段的值为固定值0x01。

(3)、bcdUSB

BCD码为内容的字段,该字段代表设备所遵循的USB协议的版本号。

如:USB1.1,其bcdUSB值为0x0110

USB2.0,其bcdUSB值为0x0200

一个2字节的数0xABCD, AB为1个字节, CD为另一个字节, 其中AB为版本号的整数部分, C为版本号的第一个小数部分, D为版本号的第二个小数部分。

(4)、bDeviceClass

设备类型的代码,值从0x01~0xFE为USB定义的标准设备类,而值为0xFF时表示该设备类型代码是厂商自定义的类。如果设备类型不是在设备描述符中定义的, 则该值为0, 比如人机接口设备 ( HID) 类。

(5)、bDEviceSubClass

设备类中的子类类型,和bDeviceClass一样由USB规定和分配,当 bDeviceClass为0时, 此值也为0, 代表该子类类型不在设备描述符中定义。 值为0xFF时, 也代表子类类型是由厂商所定义的。

(6)、bDeviceProduct

设备所遵循的协议,该值有USB协议规定,当值为0xFF时,表示该设备采用厂商自己为该类定义的协议。

(7)、bMaxPacketSize0

描述了端点0的最大包的大小, 低速设备的bMaxPacketSize0恒为8, 全速设备可以是一般为 8、16、32或64, 即0x08、0x10、0x20或0x40, 而高速设备则为64。

(8)、idVendor

USB设备的生产厂商从USB开发者论坛(USB Implementers Forum)获得的ID号。  

(9)、idProduct

设备的生产厂商所定义的该设备的产品ID号。

(10)、bcdDevice

设备生产厂商来定义, 代表该设备的产品版本号。

(11)、iMenufacturer

设备生产厂商的字符串的索引值。值为0则代表没有使用该字段。

(12)、iProduct

描述该产品的字符串的索引值。值为0时表示没有使用该字段。

(13)、iSerialNumber

设备的序列号的索引值。每个设备都有一个特定的序列号, 可供主机来识别不同的设备。

(14)、bNumConfigurations

该设备总共支持的配置描述符的数量。

                                                   Bus hound抓取的设备描述符

2、配置描述符

  配置描述符用于描述一个USB设备的属性和能力等配置信息。一个USB设备只需要一个配置描述符就可以了。比如一个USB接口的鼠标,其功能仅仅是简单的双向数据中断传输, 并且是总线供电, 因此按照这些要求来填写一个配置描述符即可。但是, 有些设备如果需要具有几种相对独立的配置(但前提是属于 同一种USB设备类), 比如一个USB接口的ISDN, 就可以有2种配置, 一种配置下建立 64 KB/ s 的双向数据交换通道; 而同时可以有另一种 128 KB/ s 的双向数据通道配置。这样, 这个ISDN就可以根据不同的网络情况来自动选择任一种数据交换方式。配置描述符字段组成如下:

偏移量

字段名称

长度(字节)

字段值

意义

0

bLength

1

数字

设备描述符的字节数大小

1

bDescriptor Type

1

常数

配置描述符类型编号

2

wTotalLength

2

数字

此配置所返回的所有数据大小

4

bNumInterfaces

1

数字

此配置所支持的接口数量

5

bConfigurationsValue

1

数字

Set_Configuration命令需要的参数值

6

iConfiguration

1

索引

描述改配置的字符串的索引值

7

bmAttributes

1

位图

供电模式的选择

8

MaxPower

1

mA

设备从总线提取的最大电流

(1)、bLedgth

整个配置描述符的长度, 因此bLength是固定的, 值为9, 即0x09, 二进制表示为 00001001。

(2)、bDescriptorType

USB给配置描述符分配的类型编号, 值为常数0x02。

(3)、wTotalLength

该置所返回的所有描述符(包括配置、接口和端点描述符)的大小总和。

(4)、bNumInterfaces

该配置所支持的接口总数。

(5)、bConfigurationValue

该字段的值作为参数, 可被Set_Configuration和 Get_Configuration命令来调用, 用于该命令选定这个配置。

(6)、iConfiguration

该字段指向描述该配置描述符的字符串。 如果该设备没有用字符串描述该配置, 那么此字段为0。

(7)、bmAttributes

该字段1字节二进制数的每一位代表一个固定的含义:

D7:Reserve,固定为1;

D6:供电方式的选择, 值为1表示自供电, 值为0表示总线供电;

D5:远程唤醒功能的选择, 值为1表示支持远程唤醒, 值为0则不支持;

D4~D0:没有意义, 均把值固定为0。

(8)、MaxPower

设备从总线上获取的电流总量。电流值为字段值的两倍,设备可以获取到的最大电流为500mA,所以字段值最大为0xFA;

                                                  Bus hound上抓取的配置描述符

3、接口描述符

  接口描述符用于描述一个特定接口的属性。接口一般是由一系列端点所组成的集合体,用于实现某种特定的USB的数据传输功能。一般一个USB设备只需具有一个接口。比如,USB移动存储设备中就只有一个用于实现Mass Storage类的接口, 在该接口下使用了批量输入Bulk_IN和批量输出Bulk_OUT 2个非0 端点用于传输文件。接口描述符还可以在配置后加以改变。前面已经提到, 标准的USB设备类型都是在 设备描述符中定义的, 但是有些类是基于接口在接口描述符中定义的, 如HID设备。接口描述符字段组成如下:

偏移量

字段名称

长度(字节)

字段值

意义

0

bLength

1

数字

设备描述符的字节数大小

1

bDescriptor Type

1

常数

接口描述符类型编号

2

bInterfaceNumber

1

数字

该接口的编号

3

bAlternateSetting

1

数字

备用的接口描述符编号

4

bNumENDpoits

1

数字

该接口使用的端点数,不包括端点0

5

bInterfaceClass

1

接口类型

6

bInterfaceSubClass

1

子类

接口子类类型

7

bInterface

1

协议

接口遵循的协议

8

iInterface

1

索引

描述该接口的字符串索引值

(1)、bLength

整个配置描述符的长度,固定为0x09.

(2)、bDescriptorType

由USB给配置描述符分配的类型编号, 值为常数0x04。

(3)、bInterfaceNumber

接口的编号,如果一个配置拥有N个接口, 那么这些接口都是互不相干的, 每一个接口都有惟一的编号, USB就是通过此字段来识别不同的接口。默认值为0。

(4)、bAlternateSetting

USB设备的配置与USB配置描述符是一一对应的, 即一个配置只能有一个配置描述符。USB允许多个接口描述符来描述同一个接口, 而且这些描述符都可以通过命令来切换。这里,此字段就是每一个这类描述符惟一的编号。USB可以通过调用这个字段来切换描述同一个接口的不同描述符。控制传输中可以通过Get_Interface和Set_Interface来获取、设置目前正在使用的描述一个确定接口的接口描述符的编号。

(5)、bNumEndpoints

该接口使用的端点总数(除端点0之外)。如果此值为0, 则意味着该接口只使用了端点0。

(6)、bInterfaceClass

该接口所属的类别。这个类别编号由USB来分配。当值为0xFF时, 表示该接口是厂商所定义的接口类型。而值0保留。

(7)、bInterfaceSubClass

接口所属的类别中的子类类型。这个子类编号也由USB分配。同bInterfaceClass字段一样, 当其值为0xFF时代表该接口由厂商自己所定义。而值0保留。

(8)、bInterfaceProtocol

此接口类所遵循的类的协议。因而, 该字段的值跟bInterfaceClass和bInterfaceSubClass字段是相关的。其值从1~0xFE由USB分配, 代表不同标准的设备类的协议。 当值为0时, 表示该接口不遵循任何类协议; 而值为0xFF时, 表示该接口应用了厂商自定义的类协议。

(9)、iInterface

指向字符串描述符中相应的字符串内容, 用于描述该接口。 如果设备没有启用字符串描述符 , 则该值为0。

                                                  Bus hound中抓取到的接口描述符

4、端点描述符

端点描述符用于描述接口所使用的非0端点的属性, 包括输入/输出方向、端点号和端点容量即包的大小等。端点描述符字段组成如下:

偏移量

字段名称

长度(字节)

字段值

意义

0

bLength

1

数字

设备描述符的字节数大小

1

bDescriptorType

1

常数

端点描述符类型编号

2

bEndpointAddress

1

端点

端点地址及输入输出属性

3

bmAttributes

1

位图

端点传输类型属性

4

wMaxPacketSize

2

数字

端点收、发的最大包的大小

5

bIterval

1

数字

主机查询端点的时间间隔

(1)、bLength

这个端点描述符的长度。

(2)、bDescriptorType

USB为端点描述符分配的类型编号, 因此, 此字段的值固定, 即为0x05。

(3)、bEndpointAddress

D7 端点方向

0       OUT端点

1       IN端点

D6~D4     保留

D3~D0     端点编号

(4)、bmAttributes

D5~D4 用途

00     数据端点

01     反馈端点

10     隐式反馈数据端点

11     保留

D3~D2 同步类型

00     非同步

01     异步

10     自适应

11     同步

D1~D0 传输类型

00     控制传输

01     同步传输

10     块传输

11     中断传输

如果该端点不是同步端点,D5~D2保留且必须置0。

(5)、wMaxPacketSize

该端点最大包的大小。其中D10~D0位共11位为有效内容。在USB协议1 .1中D15~D11位保留, 值为0, 且最大包的大小范围为0~1023。

(6)、bIterval

主机轮询设备的周期。在USB协议1.1中, 对于中断端点, 该字段的值为1~255,时间单位ms,因此假设值为250, 则表示时间间隔为250ms; 对于同步端点, 该字段值固定为1 ; 而批量端点和控制端点则忽略该字段 ,值无效。

                                                 Bus hound中抓取的端点描述符

5、字符串描述符

  字符串描述符是一个可选的描述符,长度不固定。字符串描述符字段组成如下:

偏移量

字段名称

长度(字节)

字段值

意义

0

bLength

1

数字

设备描述符的字节数大小

1

bDescriptorType

1

常数

字符串描述符类型编号

2

bString

N

数字

UNICODE编码的字符串

(1)、bLength

整个字符串描述符的长度。

(2)、bDescriptorType

USB为端点描述符分配的类型编号, 因此, 此字段的值固定, 即为0x03。

(3)、bString

一个以UNICODE编码的字符为内容的字符串。

                                                   Bus hound抓取的字符串描述符

7、HID描述符

         bLength: 描述符长度。

         bDescriptorType:描述符类型,HID描述符的类型为0x21。

         bcdHID: 所遵循的HID协议版本。

         bCountryCode: 国家代码。

         bNumDescriptors: 下级描述符数量,通常至少需要一个报告描述符。

         bDescriptorType: 下级描述符类型,例如报告描述符。

         wDescriptorLength: 下级描述符长度。

                                                 Bus hound中抓取的HID描述符

总的来说,描述符的作用就是,让主机知道你是什么设备信息(PID、VID、序列号...),跑的是那种速度的协议(USB1.0、USB1.1、USB2.0...),然后给你分配相应的地址。

如有错误或者疑问,请及时提出。谢谢!!!

                    上一篇                                                                                 下一篇

WinUSB描述符是与Windows USB驱动程序模型相关的重要概念,用于描述USB设备的各种特性和配置,以便操作系统能够正确识别和与设备进行通信。以下是对WinUSB描述符的详细介绍: ### 设备描述符(Device Descriptor) 设备描述符提供了关于USB设备的总体信息,包括设备的厂商ID(VID)、产品ID(PID)、设备版本号等。一个USB设备只有一个设备描述符,其长度固定为18字节。以下是设备描述符的主要字段: - **bLength**:描述符的长度,固定为18字节。 - **bDescriptorType**:描述符类型,值为0x01表示设备描述符。 - **bcdUSB**:USB规范版本号,如0x0200表示USB 2.0。 - **bDeviceClass**、**bDeviceSubClass**、**bDeviceProtocol**:设备的类别、子类和协议,用于操作系统对设备进行初步分类。 - **idVendor**、**idProduct**:厂商ID和产品ID,用于唯一标识设备。 - **bcdDevice**:设备版本号。 - **iManufacturer**、**iProduct**、**iSerialNumber**:分别指向厂商字符串、产品字符串和序列号字符串描述符的索引。 示例代码(Python,使用`pyusb`库获取设备描述符): ```python import usb.core # 查找设备 dev = usb.core.find(idVendor=0xXXXX, idProduct=0xXXXX) if dev is not None: # 获取设备描述符 device_descriptor = dev.bus.read(dev.address, 0x80, 18) print("设备描述符:", device_descriptor) ``` ### 配置描述符(Configuration Descriptor) 配置描述符描述了设备的一种可能配置,一个USB设备可以有多个配置。每个配置描述符包含了该配置下的接口数量、配置编号、电源要求等信息,长度为9字节。主要字段如下: - **bLength**:描述符长度,固定为9字节。 - **bDescriptorType**:描述符类型,值为0x02表示配置描述符。 - **wTotalLength**:该配置下所有描述符的总长度。 - **bNumInterfaces**:该配置下的接口数量。 - **bConfigurationValue**:配置编号,用于选择不同的配置。 - **iConfiguration**:指向配置字符串描述符的索引。 - **bmAttributes**:配置的属性,如是否支持远程唤醒、是否为自供电等。 - **bMaxPower**:设备在该配置下的最大功耗。 ### 接口描述符(Interface Descriptor) 接口描述符描述了设备的一个逻辑功能单元,一个配置可以包含多个接口。每个接口描述符包含了接口的编号、类别、子类、协议以及端点数量等信息,长度为9字节。主要字段如下: - **bLength**:描述符长度,固定为9字节。 - **bDescriptorType**:描述符类型,值为0x04表示接口描述符。 - **bInterfaceNumber**:接口编号。 - **bAlternateSetting**:备用设置编号,用于选择接口的不同设置。 - **bNumEndpoints**:该接口下的端点数量。 - **bInterfaceClass**、**bInterfaceSubClass**、**bInterfaceProtocol**:接口的类别、子类和协议。 - **iInterface**:指向接口字符串描述符的索引。 ### 端点描述符(Endpoint Descriptor) 端点描述符描述了设备的一个数据传输端点,每个接口可以有多个端点。端点描述符包含了端点的地址、传输类型、最大包大小等信息,长度为7或11字节(USB 3.0及以上可能更长)。主要字段如下: - **bLength**:描述符长度,通常为7字节。 - **bDescriptorType**:描述符类型,值为0x05表示端点描述符。 - **bEndpointAddress**:端点地址,包含端点编号和传输方向(输入或输出)。 - **bmAttributes**:端点的属性,如传输类型(控制、批量、中断、同步)。 - **wMaxPacketSize**:端点的最大包大小。 - **bInterval**:中断传输的轮询间隔。 ### 字符串描述符(String Descriptor) 字符串描述符用于提供设备的可读信息,如厂商名称、产品名称、序列号等。字符串描述符的长度和内容可变,第一个字节为描述符长度,第二个字节为描述符类型(值为0x03),后面是Unicode编码的字符串。 ### 二进制对象存储描述符(Binary Object Store - BOS Descriptor) BOS描述符USB 3.0引入的一种描述符,用于描述设备支持的扩展功能。BOS描述符可以包含多个设备能力描述符,如USB 3.0设备能力描述符、超高速设备能力描述符等。 ### 设备能力描述符(Device Capability Descriptor) 设备能力描述符用于描述设备支持的特定功能或特性,如USB 3.0的超高速模式、无线USB等。每个设备能力描述符包含了能力类型和具体的能力信息。 WinUSB描述符USB设备的识别、配置和通信中起着至关重要的作用。通过解析这些描述符,操作系统可以了解设备的功能和特性,并为设备加载合适的驱动程序。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值