5、USB协议学习:USB的枚举过程

news2024/12/23 14:50:32

文章目录

  • 枚举顺序
  • 枚举过程
  • 标准请求
    • bmRequestType
    • bReqest
    • 请求类型
  • GetDescriptor
    • 设备描述符
      • 设备描述符定义
      • 获取设备描述符
      • 返回设备描述符
    • 配置描述符
      • 配置描述符定义
      • 获取配置描述符
      • 返回配置描述符
    • 接口描述符&端点描述符&HID描述符
      • 接口描述符定义
      • 返回接口描述符
      • HID描述符定义
      • 返回HID描述符
      • 端点描述符定义
      • 返回端点描述符
    • 字符串描述符&语言ID
      • 语言ID描述符定义
      • 字符串描述符定义
      • 获取字符串描述符
        • 字符串描述符-语言ID
        • 字符串描述符-厂商字符串
        • 字符串描述符-产品字符串
  • SetAddress
  • SetConfiguration
  • SDX24抓包数据
    • 总览
    • 虚拟端口
    • 网卡

枚举顺序

  USB的枚举过程中设备需要通过一系列的描述符来告诉主机自己的各种信息。

  从上到下,先是通过设备描述符,告知主机自己是什么。紧接着通过配置描述符,告诉主机自己支持一种或多种配置,一般情况下都只有一种配置。随后通过接口描述符,告诉主机自己支持哪些功能。最后通过端点描述符,告诉主机接口具备的端点是什么。

  USB中端点就是主从机之间数据交互的桥梁,输入输出分别在不同端点中进行,且不可复用。

输入图片说明

枚举过程

  从下图可以看出设备在接入host时,首先第一步会使用地址0进行一次复位,并发送获取设备描述符的请求。

  第二步会对设备进行第二次复位(可选操作),紧接着设置一个新的地址,该地址唯一。在后续所有的通讯过程中都是使用该地址。设备接收到地址后,会使用该地址用于表明身份。

  新地址启用后,会使用新的地址获取设备的各项描述符(设备描述符,配置描述符、接口描述符、端点描述符),开始真正意义上的枚举动作。

输入图片说明

  下图是抓包的一个键盘的枚举过程。后面将按照顺序对枚举动作进行分析

输入图片说明

标准请求

  由于USB所有的通信过程都是由主机发起的,枚举过程中所涉及到的动作在USB协议里都有对应的请求报文。

  USB协议定义了一个8字节的标准设备请求,主要用在设备的枚举过程中。这8字节的数据是在控制传输的建立过程通过默认控制端点0发出的。

  在这8字节的数据中,包含了数据过程所需要传输数据传输的方向、长度以及数据类型等信息。正是由于8字节标准请求的原因,USB协议规定,端点0的最大包长度至少为8字节。1
也就是说,任何一个USB设备都能够(而且必须要)接收8字节的标准请求。

  USB标准请求的个字节分为5个部分,其变量分别定义为: 1字节的bmRequestType,1 字节的bReqest,2字节的wValue,2字节的wIndex和2字节的wLength。

itemlength(Byte)
bmRequestType1
bReqest1
wValue2
wIndex2
wLength2

bmRequestType

  bmRequestType字段中D7定义了接下来的数据方向,D6和D5定义了请求类型,D4-D0定义了目标类型

数据位功能取值(bit)
D7下一步数据的方向0 = 主机到设备(SET)
1 = 设备到主机(GET请求)
D6-D5命令的类型00=标准请求
01=类请求(UVC)
10=用户定义的请求
11=保留
D4-D0命令接受者的类型00000=接受者为设备
00001=接收者为接口
00010=接受者为端点
00011=其它
其他保留

bReqest

  bReqest代表当前请求的功能,部分请求需要和bmRequestType配合理解才能确定具体的含义。

  下表列举usb2.0中定义的11种标准请求。

请求名请求号(hex)功能
GetStatus00H读取设备、接口或端点的状态
ClearFeature01H清除或禁止设备、接口或端点的某些特性
SetFeature03H设置或使能设备、接口或端点的某些特性
SetAddress05H分配设备地址
GetDescriptor06H读取指定描述符
SetDescriptor07H更新已有的描述符或添加新的描述符
GetConfiguration08H读取USB设备当前的配置值
SetConfiguration09H为USB设备选择一个合适的配置
GetInterface0AH读取指定接口的当前可替换设置值
SetInterface0BH为指定接口选择一个合适的可替换设置
SynchFrame0CH读取同步端点所指定的帧序号

  在usb3.0中除了上述的请求外,还增加了下表的内容

请求名请求号(hex)功能
SET_ENCRYPTION0DH设置加密
GET_ENCRYPTION0EH获取加密
SET_HANDSHAKE0FH设置握手
GET_HANDSHAKE10H获取握手
SET_CONNECTION11H设置连接
SET_SECURITY_DATA12H设置安全数据
GET_SECURITY_DATA13H读取安全数据
SET_WUSB_DATA14H设置总线数据
LOOPBACK_DATA_WRITE15H回环数据写入
LOOPBACK_DATA_READ16H回环数据读取
SET_INTERFACE_DS17H设置子接口的描述符
SET_SEL30H请求通知设备系统退出时延
SET_ISOCH_DELAY31H设置等时时延

  不同的请求对于其接收者wValue和wIndex,其各字段的意义是不一样的。需要注意的是wValue、wIndex、wLength这三个域都是两字节的,在USB协议中规定,使用的是小端结构,即低字节在先,高字节在后。

请求类型

  下表是各个标准请求的结构以及数据过程需要传输的数据。其中第一列有的有多个,主要是最低5位不同,即表示接收者不同。有的请求只能发送到设备,而有的请求可以发送到设备、接口和端点。

bmRequestType(bit)bReqestwValuewIndexwLengthdata process
b0000 0000
b0000 0001
b0000 0010
ClearFeature特性选择0
接口号
端点号
0没有
b0000 0000SetConfiguration配置值00没有
b1000 0000GetConfiguration001配置值
b0000 0000SetDescriptor描述符类型和索引0或者语言ID描述符长度描述符
b1000 0000GetDescriptor描述符类型和索引0或者语言ID描述符长度描述符
b0000 0001SetInterface备用接口号接口号0没有
b1000 0001GetInterface0接口号1备用接口号
b1000 0000
b1000 0001
b1000 0010
GetStatus00
接口号
端点号
2设备状态
接口状态
端点状态
b0000 0000SetAddress设备地址00没有
b0000 0000
b0000 0001
b0000 0010
SetFeature特性选择0
接口号
端点号
0没有
b1000 0010SynchFrame0端点号2帧号

  上面中记录的请求,常用的只有三个分别是GetDescriptor、SetAddress和SetConfiguration

GetDescriptor

  GetDescriptor(获取描述符)请求是在枚举过程中用得最多的一个请求。主机通过发送获取描述符请求读取设备的各种描述符,从而可以获知设备类型、端点情况等众多重要信息。

  获取描述符的接收者只能是设备,从bmRequestTypee的第7位可以看出,它是请求数据输人的。bRequest的值为0x06(GET_DESCRIPTOR)。

bmRequestType(1Byte)bReqest(1Byte)wValue(2Byte)wIndex(2Byte)wLength(2Byte)
1000 0000(0x80)GetDescriptor(0x06)描述符类型和索引0或者语言ID描述符长度

  wValue域的第一字节(低字节)表示的是索引号,用来选择同一种描述符(例如字符串描述符和配置描述符)中具体的某个描述符。

  wValue域的第二字节,表示描述符的类型编号。各种描述符的类型编号定义如下表所列。对于全速模式和低速模式,获取描述符的标准请求只有三种:获取设备描述符,获取配置描述符和获取字符串描述符。

  另外的接口描述符和端点描述符是跟随配置描述符一并返回的,不能单独请求返回(如果单独返回,主机无法确认它们属于哪个配置)

  USB描述符分为标准描述符、类描述符、HID相关描述符、厂商自定义描述符。下表是标准描述符中定义的描述符个数。

描述符描述符值(Hex)
设备描述符01
配置描述符02
字符串描述符03
接口描述符04
端点描述符05
设备限定描述符06
其他速率配置描述符07

  wlndex域只在获取字符串描述符中有用,它表示字符串的语言ID号,获取除字符串描述符的其他描述符时,wIndex的值为0。

  wLength域为请求设备返回数据的字节数,设备实际返回的字节数可以比该域指定的字节数少。设备在收到获取描述符的请求后,应该按照所请求的描述符类型编号,在数据过程中返回相应的描述符。

设备描述符

设备描述符定义

地址偏移量字段名长度说明
0bLength1描述符长度(字节):12H
1bDescriptorType1描述符类型:设备=01H
2bcdUSB2USB 规范版本号(BCD 码)
4bDeviceClass1类代码
5bDeviceSubClass1子类代码
6bDeviceProtocol1协议代码
7bMaxPacketSize01端点 0 支持最大数据包长度
8idVender2供应商 ID
10idProduct2产品 ID
12bcdDevice2设备版本号(BCD 码)
14iManufacturer1供应商字符串描述符索引值
15iProduct1产品字符串描述符索引值
16iSerialNumber1设备序列号字符串描述符索引值
17bNumConfigurations1所支持的配置数

  bDeviceClass指明USB设备所属的设备类,bDeviceSubClass和bDeviceProtocol子段会根据bDeviceClass字段的不同而不同。bDeviceClass字段代码可查下表:

值(Hex)说明
00由接口描述符提供类的值
02通信类
09集线器类
DC用于诊断用途的设备类
E0无限通信设备类
FF厂商定义的设备类

获取设备描述符

bmRequestType(1Byte)bReqest(1Byte)wValue(2Byte)wIndex(2Byte)wLength(2Byte)
1000 0000(0x80)GetDescriptor(0x06)设备描述符(0x0001)0或者语言ID描述符长度

  设备枚举时获取设备描述符一般情况下都会获取两次。

  第一次获取设备描述符主机只需要知道端点0的最大包长即可。这里需要注意的是,某些主机为了减少在枚举过程中说产生的开销。只会读取一个数据包的设备描述符。标准的描述符有18字节,有些USB设备的端点0大小不足18字节(低速设备只有8字节)。

输入图片说明

  在这种情况下,USB主机也是只发送一次数据输入请求,多余的数据将不会再次请求。因此,如果当设备端点0大小不足18字节时,就需要注意到这个问题。也就是说在第一次获取设备描述符时,只需要返回一次数据即可。

  当主机成功获取到设备描述符的前8字节之后(USB协议规定端点0最大包长至少要有8字节),它就知道端点0的最大包长度了,因为端点0最大包长度刚好在设备描述符的第八字节处。

输入图片说明

  第二次枚举的过程中,主机需要获取全部信息,就会连续发起IN事务,共接收18个字节。

输入图片说明

返回设备描述符

输入图片说明

Data stage (18 bytes) :
------------------------------------

       DEVICE Descriptor
       -----------------
Offset|       Field        | Value |  Description  
------|--------------------|-------|--------------------
  0   |      bLength       |  0x12 |The size of this descriptor is 18 bytes
------|--------------------|-------|--------------------
  1   |  bDescriptorType   |  0x01 |DEVICE Descriptor Type
------|--------------------|-------|--------------------
  2   |       bcdUSB       | 0x0110|Device compliant to the USB specification version 1.10   
------|--------------------|-------|--------------------
  4   |    bDeviceClass    |  0x00 |Each interface specifies its own class information
------|--------------------|-------|--------------------
  5   |  bDeviceSubClass   |  0x00 |Each interface specifies its own subclass information
------|--------------------|-------|--------------------
  6   |  bDeviceProtocol   |  0x00 |No protocols on the device basis
------|--------------------|-------|--------------------
  7   |  bMaxPacketSize0   |  0x08 |Maximum packet size for endpoint zero is 8
------|--------------------|-------|--------------------
  8   |      idVendor      | 0x03F0|Vendor ID is 1008: Hewlett Packard
------|--------------------|-------|--------------------
  10  |     idProduct      | 0x0324|The Product ID is 0x0324
------|--------------------|-------|--------------------
  12  |     bcdDevice      | 0x0100|The device release number is 1.00
------|--------------------|-------|--------------------
  14  |   iManufacturer    |  0x01 |The index of the string descriptor describing the manufacturer is 1
------|--------------------|-------|--------------------
  15  |      iProduct      |  0x02 |The index of the string descriptor describing the product is 2
------|--------------------|-------|--------------------
  16  |   iSerialNumber    |  0x00 |The device doesn't have the string descriptor describing the serial number
------|--------------------|-------|--------------------
  17  | bNumConfigurations |  0x01 |The device has 1 possible configurations
------|--------------------|-------|--------------------

配置描述符

  一般情况下设备都只有一个配置,我这抓包的键盘和模块都是只有一个配置的。

  USB设备在下列情况下可能会存在多个配置描述符。

  • 多个速度支持:USB设备可能支持不同的传输速度,例如USB 2.0和USB 3.0。在这种情况下,设备可以为每种速度定义一个不同的配置描述符,以便在不同速度下进行适当的配置。
  • 多种工作模式:某些USB设备可以在不同的工作模式之间切换,例如存储设备可以在存储模式和MTP(Media Transfer Protocol)模式之间切换。每种工作模式可能需要不同的配置,因此设备可以为每种模式定义一个配置描述符。
  • 多个功能:某些USB设备可能具有多个功能,例如同时作为存储设备和音频设备。每个功能可能需要不同的配置描述符来配置其特定的功能。
  • 不同的电源模式:某些USB设备可能支持不同的电源模式,例如使用总线供电或外部电源供电。每种电源模式可能需要不同的配置描述符来配置相应的电源设置。

配置描述符定义

地址偏移量字段名长度(字节)说明
0bLength1描述符长度(字节):09H
1bDescriptorType1描述符类型:配置=02H
2wTotalLength2配置信息的总长度
4bNumInterfaces1所支持的接口数
5bConfigurationValue1配置值
6iConfiguration1配置字符串描述符索引值
7bmAttributes1配置特性
8bMaxPower1所需的最大总线电流(2mA)

bmAttributes 字段的信息如下:

bit含义
D7保留(置 1)
D6总线供电为 0,自给电源为 1
D5支持远程唤醒为 1,不支持远程唤醒为 0
D4…0保留(置 0)

获取配置描述符

bmRequestType(1Byte)bReqest(1Byte)wValue(2Byte)wIndex(2Byte)wLength(2Byte)
1000 0000(0x80)GetDescriptor(0x06)设备描述符(0x0002)0或者语言ID描述符长度

输入图片说明

返回配置描述符

输入图片说明


Data stage (9 bytes) :
------------------------------------

       CONFIGURATION Descriptor
       ------------------------
Offset|        Field        | Value |  Description  
------|---------------------|-------|--------------------
  0   |       bLength       |  0x09 |The size of this descriptor is 9 bytes
------|---------------------|-------|--------------------
  1   |   bDescriptorType   |  0x02 |CONFIGURATION Descriptor Type
------|---------------------|-------|--------------------
  2   |    wTotalLength     | 0x0022|The total length of data for this configuration is 34. This includes the combined length of all the descriptors returned
------|---------------------|-------|--------------------
  4   |   bNumInterfaces    |  0x01 |This configuration supports 1 interfaces
------|---------------------|-------|--------------------
  5   | bConfigurationValue |  0x01 |The value 1 should be used to select this configuration
------|---------------------|-------|--------------------
  6   |   iConfiguration    |  0x00 |The device doesn't have the string descriptor describing this configuration
------|---------------------|-------|--------------------
  7   |    bmAttributes     |  0xA0 |Configuration characteristics :
      |                     |       |Bit 7: Reserved (set to one) 1 
      |                     |       |Bit 6: Self-powered          0 
      |                     |       |Bit 5: Remote Wakeup         1 
------|---------------------|-------|--------------------
  8   |      MaxPower       |  0x23 |Maximum power consumption of the device in this configuration is 70 mA
------|---------------------|-------|--------------------


接口描述符&端点描述符&HID描述符

  前面提到对于全速模式和低速模式,获取描述符的标准请求只有三种:获取设备描述符,获取配置描述符和获取字符串描述符。

  另外的接口描述符和端点描述符是跟随配置描述符一并返回的,不能单独请求返回(如果单独返回,主机无法确认它们属于哪个配置)
输入图片说明

接口描述符定义

地址偏移量字段名长度(字节)说明
0bLength1描述符长度(字节):09H
1bDescriptorType1描述符类型:接口=04H
2bInterfaceNumber1接口号
3bAlternateSetting1可替换设置值
4bNumEndpoints1所使用端点数(不包括端点 0)
5bInterfaceClass1类代码
6bInterfaceSubClass1子类代码
7bInterfaceProtocol1协议代码
8iInterface1接口字符串描述符的索引值

  bInterfaceClass 指明接口所属的设备类,bInterfaceSubClass 和 bInterfaceProtocol 字段会根据bInterfaceClass 字段的不同而不同。bInterfaceClass 字段代码可查下表:

值(Hex)类别
01音频类
02CDC 控制类
03人机接口类(HID)
05物理类
06图像类
07打印机类
08大数据存储类
09集线器类
0ACDC 数据类
0B智能卡类
0D安全类
DC诊断设备类
E0无线控制器类
FE特定应用类(包括红外的桥接器等)
FF厂商定义的设备

返回接口描述符

输入图片说明

       INTERFACE Descriptor
       --------------------
Offset|       Field        | Value |  Description  
------|--------------------|-------|--------------------
  0   |      bLength       |  0x09 |The size of this descriptor is 9 bytes
------|--------------------|-------|--------------------
  1   |  bDescriptorType   |  0x04 |INTERFACE Descriptor Type
------|--------------------|-------|--------------------
  2   |  bInterfaceNumber  |  0x00 |The number of this interface is 0
------|--------------------|-------|--------------------
  3   | bAlternateSetting  |  0x00 |The value used to select alternate setting for this interface is 0
------|--------------------|-------|--------------------
  4   |   bNumEndpoints    |  0x01 |The number of endpoints used by this interface is 1 (excluding endpoint zero)
------|--------------------|-------|--------------------
  5   |  bInterfaceClass   |  0x03 |The interface implements HID class
------|--------------------|-------|--------------------
  6   | bInterfaceSubClass |  0x01 |The subclass code is 0x01
------|--------------------|-------|--------------------
  7   | bInterfaceProtocol |  0x01 |The protocol code is 0x01
------|--------------------|-------|--------------------
  8   |     iInterface     |  0x00 |The device doesn't have the string descriptor describing this interface
------|--------------------|-------|--------------------

HID描述符定义

地址偏移量字段名长度(字节)说明
0bLength1描述符长度(字节):0CH
1bDescriptorType1描述符类型:人机接口类=21H
2bcdHID2HID 规范版本号(BCD 码)
4bCountryCode1硬件目的国家的识别码(BCD 码)
5bNumDescritors1支持附属描述符目录
6bDescriptorType1HID 相关描述符类型
21H:HID 描述符
22H:报告描述符
23H:实体描述符
7wDescriptorLength2报告描述符总长度
9bDescriptorType1用于识别描述符类型的常量,使用在有一个以上描述符的设备
10wDescriptorLength2描述符总长度,使用在有一个以上描述符的设备

返回HID描述符

输入图片说明

       HID Descriptor
       --------------
Offset|       Field       | Value |  Description  
------|-------------------|-------|--------------------
  0   |      bLength      |  0x09 |The size of this descriptor is 9 bytes
------|-------------------|-------|--------------------
  1   |  bDescriptorType  |  0x21 |HID Descriptor Type
------|-------------------|-------|--------------------
  2   |      bcdHID       | 0x0100|Device compliant to the HID specification version 1.00   
------|-------------------|-------|--------------------
  4   |   bCountryCode    |  0x00 | Localisation Not Supported
------|-------------------|-------|--------------------
  5   |  bNumDescriptors  |  0x01 |The number of class descriptors is 1
------|-------------------|-------|--------------------
  6   |  bDescriptorType  |  0x22 |The class descriptor is Report descriptor
------|-------------------|-------|--------------------
  7   | wDescriptorlength | 0x0041|The total size of the class descriptor is 65
------|-------------------|-------|--------------------

端点描述符定义

地址偏移量字段名长度(字节)说明
0bLength1描述符长度(字节):07H
1bDescriptorType1描述符类型:端点=05H
2bEndpointAddress1端点号及传输方向
D3…0 : 端点号
D6…4 : 保留,为零
D7=0:输出端点(主机到设备)
D7=1:输入端点(设备到主机)
3bmAttributes1端点特性
D 1…0 :传送类型
00=控制传送
01=同步传送
10=批传送
11=中断传送
所有其它的位都保留。
4wMaxPacketSize2端点支持的最大数据包长度
6bInterval1端点数据传输的访问间隔

返回端点描述符

输入图片说明

       ENDPOINT Descriptor
       -------------------
Offset|      Field       | Value |  Description  
------|------------------|-------|--------------------
  0   |     bLength      |  0x07 |The size of this descriptor is 7 bytes
------|------------------|-------|--------------------
  1   | bDescriptorType  |  0x05 |ENDPOINT Descriptor Type
------|------------------|-------|--------------------
  2   | bEndpointAddress |  0x81 |This is an IN endpoint with address (endpoint number) 1
------|------------------|-------|--------------------
  3   |   bmAttributes   |  0x03 |Types - 
      |                  |       |Transfer:INTERRUPT 
      |                  |       |Sync:No Sync 
      |                  |       |Usage:Data EP
------|------------------|-------|--------------------
  4   |  wMaxPacketSize  | 0x0008|Maximum packet size 
      |                  |       |value for this 
      |                  |       |endpoint is 0x8 
      |                  |       |(Bits 12-11: Addtl. Transactions/frame)
------|------------------|-------|--------------------
  6   |    bInterval     |  0x18 |bInterval:24. The 
      |                  |       |polling interval 
      |                  |       |value is bInterval 
      |                  |       |or 2**(bInterval-1)
------|------------------|-------|--------------------

字符串描述符&语言ID

  在USB协议中,字符串描述符是可选的。当某个描述符中的字符串索引值为非0时,就表示它具有那个字符串描述符,注意索引值不能重复。

  在上面提到的设备描述符中,申请了2个非0的索引值,分别是厂商字符串、产品字符串,其索引值分别为1,2。

输入图片说明

  USB主机使用获取字符串描述符和索引值来获取对应的字符串。当索引值为0时,表示获取语言ID。语言ID是一个描述该设备支持的语言种类的数。

语言ID描述符定义

地址偏移量字段名长度(字节)说明
0bLength1描述符长度(字节):N+2
1bDescriptorType1描述符类型:字符串=03H
2wLANGID[0]2语言ID号0
2
2*n+2wLANGID[n]2语言ID号n

  语言ID可跟随多个,一般情况下都是使用美式英语这一种,既0x0409。如果使用中文,则部分主机可能不会获取后续的字符串描述符。

字符串描述符定义

地址偏移量字段名长度(字节)说明
0bLength1描述符长度(字节):N+2
1bDescriptorType1描述符类型:字符串=03H
2bStringNUNICODE 编码的字符串

  字符串描述符中的bString字段是使用UNICODE编码的字符串。UNICODE用2字节来表示一个字符,如果是英文字符,则直接在ASCII码前补1字节的0扩充为2字节的UNICODE码。

获取字符串描述符

bmRequestType(1Byte)bReqest(1Byte)wValue(2Byte)wIndex(2Byte)wLength(2Byte)
1000 0000(0x80)GetDescriptor(0x06)字符串描述符(0x0X03)0或者语言ID描述符长度

字符串描述符-语言ID

输入图片说明

  语言ID,这里只使用美式英语一种,即0x0409。

输入图片说明

字符串描述符-厂商字符串

输入图片说明

  获取到的厂商描述符字符串是:LiteON

输入图片说明

字符串描述符-产品字符串

输入图片说明

  获取到的产品描述符字符串是:HP Basic USB Keyboard

输入图片说明

SetAddress

  SetAddress(设置地址)请求是主机请求设备使用指定地址的请求,指定的地址就包含在8字节数据中的wValue字段中。设置地址请求是没有数据过程的,因而wLength的值为0。wIndex也用不着,值为0。

bmRequestType(1Byte)bReqest(1Byte)wValue(2Byte)wIndex(2Byte)wLength(2Byte)
0000 0000(0x00)SetAddress(0x05)设备地址00

  每个连接在同一个主控制器上的USB设备都需要具有一个唯一的设备地址,这样主机才能区分每个不同的设备。当设备复位后,都使用默认的地址0。主机从地址为0的设备获取设备描述符,一旦收到第一次设备描述符之后,主机就会发送设置地址的请求,以尽量诚少设备使用公共地址0的时间。

  当设备收到设置地址请求后,就直接进人状态过程,等待主机读取0长度的状态数据包。主机成功读取到状态数据包(用ACK响应设备)后,设备将启用新的地址。这以后的传输中,主机都将使用新的地址与设备进行通信。

输入图片说明

SetConfiguration

  SetConfiguration(设置配置)请求和设置地址请求很类似。区别在于wValue域的意义。在设置地址请求中,wValue的第一字节(低字节)为设备的地址;而在设置配置请求中,wValue的第一字节为配置的值。

bmRequestType(1Byte)bReqest(1Byte)wValue(2Byte)wIndex(2Byte)wLength(2Byte)
0000 0000(0x00)SetAddress(0x09)配置值00

  当wValue值与某配置描述符中的配置编号一致时,表示选中该配置。该值通常为1,因为大多数USB设备只有一种配置,配置编号为1;如果该值为0,则会让设备进入设置地址状态。设备只有在收到非0的配置值后,才能启用它的非0端点。

输入图片说明

输入图片说明

SDX24抓包数据

  枚举的流程和键盘枚举流程基本一致,区别就是接口描述符存在多个,每一个虚拟端口和网卡都是一个独立的接口,每个接口里面都会有独立的端点。

总览

输入图片说明

虚拟端口

  其中的虚拟端口的接口描述符中使用的是vendor-specific(厂商定义的设备)

FieldLength (bits)Offset (bits)DecodedHex ValueDescription
bLength821200x090x09Descriptor size is 9 bytes
bDescriptorType821280x040x04INTERFACE Descriptor Type
bInterfaceNumber821360x060x06The number of this interface is 6.
bAlternateSetting821440x000x00The value used to select the alternate setting for this interface is 0
bNumEndpoints821520x020x02The number of endpoints used by this interface is 2 (excluding endpoint zero)
bInterfaceClass821600xFF0xFFThe interface class is vendor-specific
bInterfaceSubClass821680x420x42The Subclass code is 66
bInterfaceProtocol821760x010x01The Protocol code is 1
iInterface821840x090x09The interface string descriptor index is 9

网卡

  一个网卡中会存在多个接口,相比虚拟串口会多出一个接口关联描述符。

  关联(association)包括两个或多个接口及其所有备用设置接口。设备必须对需要多个接口的每个设备功能使用接口关联描述符 (Interface Association Descriptor)。接口关联描述符(Interface Association Descriptor)总是通过GetDescriptor(Configuration) 请求,作为配置信息的一部分返回。接口关联描述符 (Interface Association Descriptor)不能直接通过 GetDescriptor()或SetDescriptor()请求进行访问。接口关联描述符必须位于与其关联的接口的接口描述符集(包括所有备用设置接口)之前。所有关联接口集的接口号必须是连续的。

| Length (bits) | Offset (bits) | Decoded | Hex Value | Description |
| --------------------- | ------------- | ------------- | ------- | --------- | ------------------------------------------------------------ |
| bLength | 8 | 1432 | 0x08 | 0x08 | Descriptor size is 8 bytes |
| bDescriptorType | 8 | 1440 | 0x0B | 0x0B | INTERFACE_ASSOCIATION Descriptor Type |
| bFirstInterface | 8 | 1448 | 0x04 | 0x04 | The first interface number associated with this function is 4 |
| bInterfaceCount | 8 | 1456 | 0x02 | 0x02 | The number of contiguous interfaces associated with this function is 2 |
| bFunctionClass | 8 | 1464 | 0x02 | 0x02 | The function belongs to the Communication Device/Interface Class |
| bFunctionSubClass | 8 | 1472 | 0x0E | 0x0E | The function belongs to the Mobile Broadband Interface Model Subclass |
| bFunctionProtocol | 8 | 1480 | 0x00 | 0x00 | The function uses the No class specific protocol required Protocol |
| iFunction | 8 | 1488 | 0x00 | 0x00 | The Function string descriptor index is 0 |

  其中控制接口使用的是cdc控制类,数据接口是cdc数据类。

FieldLength (bits)Offset (bits)DecodedHex ValueDescription
bLength814960x090x09Descriptor size is 9 bytes
bDescriptorType815040x040x04INTERFACE Descriptor Type
bInterfaceNumber815120x040x04The number of this interface is 4.
bAlternateSetting815200x000x00The value used to select the alternate setting for this interface is 0
bNumEndpoints815280x010x01The number of endpoints used by this interface is 1 (excluding endpoint zero)
bInterfaceClass815360x020x02The interface implements the Communication Device/Interface class
bInterfaceSubClass815440x0E0x0EThe interface implements the Mobile Broadband Interface Model Subclass
bInterfaceProtocol815520x000x00The interface uses the No class specific protocol required Protocol
iInterface815600x070x07The interface string descriptor index is 7
FieldLength (bits)Offset (bits)DecodedHex ValueDescription
bLength818640x090x09Descriptor size is 9 bytes
bDescriptorType818720x040x04INTERFACE Descriptor Type
bInterfaceNumber818800x050x05The number of this interface is 5.
bAlternateSetting818880x000x00The value used to select the alternate setting for this interface is 0
bNumEndpoints818960x000x00The number of endpoints used by this interface is 0 (excluding endpoint zero)
bInterfaceClass819040x0A0x0AThe interface implements the Data Interface class
bInterfaceProtocol819200x020x02The interface uses the Reserved Protocol
bInterfaceSubClass819120x000x00The Subclass code is 0
iInterface819280x000x00The device doesn’t have a string descriptor describing this iInterface

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/591903.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于 ESP32 的高级气象站,带有 BME280 和实时天气数据

在这个项目中,我们将学习如何创建一个气象站,它将在网络服务器中显示来自 BME280 模块的读数和来自 OpenWeatherMap API 的实时天气数据。该设备将从 BME280 传感器获取温度、湿度、气压和高度,并从 OpenWeatherMap API 获取外部温度、湿度、天气状况以及日出和日落。我们可…

基于springboot+vue的校园二手交易市场

一、项目背景介绍: 校园二手交易市场是大学生生活中的重要组成部分,它为学生提供了一个便捷的方式来买卖物品。然而,传统的校园二手交易方式存在着信息不对称、交易风险高等问题。为了解决这些问题,基于Spring Boot和Vue的校园二手…

从瀚海到万家,易开得为净水器开辟新航道

前不久,我们报道过一家净水器品牌易开得,将“航母展台”搬到了家电行业展的事情。不仅现场观众纷纷前去打卡,网络读者们也都倍感神奇直呼666。 大众的兴奋感从何而来呢?我想是因为航母这类“重器”和卫星、导弹、航天飞机一样&…

【JUC基础】12. 线程池(一)

1、前言 我们知道多线程的使用,是为了最大限度发挥现代多核处理器的计算能力,提高系统的吞吐量和性能。但是如果不加以控制和管理,随意使用多线程,对系统性能反而会有不利的影响。线程数量和系统CPU资源是息息相关的,…

FPGA纯vhdl实现XGMII接口10G万兆网UDP协议 配合10G Ethernet PCS/PMA使用 提供工程源码和技术支持

目录 1、前言2、我这里已有的UDP方案3、详细设计方案本 10G-UDP 协议栈功能和性能描述本 10G-UDP 协议栈设计框图用户发送AXIS接口描述用户接收AXIS接口描述控制接口描述XGMII接口描述 4、vivado工程详解10G-UDP协议栈10G Ethernet PCS/PMA IP核 5、上板调试验证并演示6、福利&…

自动缩放Kubernetes上的Kinesis Data Streams应用程序

想要学习如何在Kubernetes上自动缩放您的Kinesis Data Streams消费者应用程序,以便节省成本并提高资源效率吗?本文提供了一个逐步指南,教您如何实现这一目标。 通过利用Kubernetes对Kinesis消费者应用程序进行自动缩放,您可以从其…

nps与npc内网穿透搭建

1.简介 nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发,可支持任何tcp、udp上层协议,支持内网http代理、内网socks5代理、p2p等,并带有功能强大的web管理端。 使用内网穿透技术可以使你在公共网络环境也能…

第二章 部署DNS服务

♥️作者介绍:奇妙的大歪 ♥️个人名言:但行前路,不负韶华! ♥️个人简介:云计算网络运维专业人员 目录 一.DNS是什么? 1.DNS的工作原理 二.DNS内容 1.本章单词 2.域名空间结构: 3.顶级域…

企业级开发1.6 JdbcTemplate操作

JdbcTemplate操作 一、JdbcTemplate案例演示(一)创建数据库与表1、创建数据库2、创建用户表3、用户表添加记录4、查看用户表内容 (二)打开Spring项目(三)添加数据库相关依赖(四)创建…

李彦宏疯了?百度要把全部产品重做一遍

大家好,我是校长。 前几天李彦宏参加了在北京举办的 2023 中关村论坛,发表了题为《大模型改变世界》的演讲。 聊到了很多有意思的观点,分享几个,我们一起看看。 1、大模型重新定义了人机交互。 李彦宏说:过去几十年&am…

playwright - 剧作家, 端对端测试

本文基于 playwright v1.34.3, node v18.16.0 注意:playwright 版本随 node lts 版本更新而更新,所以请确保 node 版本与 playwright 版本匹配。 写在前面 前端开发阶段,少不了测试,一般包含两类测试:单元测试、端对端…

chatgpt赋能python:Python中输入怎么写?完整教程

Python中输入怎么写?完整教程 如果你正在学习Python编程,那么输入是你必须掌握的重要概念之一。在Python中,输入是指将数据从用户的键盘输入到程序中。这些数据可以是字符串、整数、浮点数或其他任何类型的值。本文将提供有关Python中输入的…

外贸大环境下soho人策略

前阵子也跟一个工厂在聊,现在普遍毛利率只有5%-6%,根本不敢涨价,能不降价就不错了(汇率在涨,所以有的客户还会要求降价)。 卷是一定的。而且,各位如果有了解过拼多多的TEMU业务的,应…

1727_使用虚拟机安装CentOS-7

全部学习汇总:GreyZhang/little_bits_of_linux: My notes on the trip of learning linux. (github.com) 离开Linux很久了,甚至怀念,虚拟机里装个CentOS 7玩玩。使用的是VM虚拟机,下载了CentOS 7的everything安装包。 1&#xf…

chatgpt赋能python:Python中符号怎么输入

Python中符号怎么输入 如果你是一位Python程序员,你肯定会经常使用各种符号,比如冒号、逗号、括号、引号等等。但是有些符号在输入的时候可能会有一些困难,尤其是对于初学者而言。那么在Python中符号怎么输入呢?下面我们来详细介…

4.1 文件操作(File类)

ava中,对文件操作的常用类是java.io.File。这个类提供了许多方法来操作文件和目录。本章节我们将学习关于File类的重要方法以及如何使用它们来操作文件。 4.1.1 创建File对象 创建一个File对象不会在磁盘上创建一个新文件。File对象只是一个在Java代码中表示文件或…

代码覆盖率

在做单元测试时,代码覆盖率常常被拿来作为衡量测试好坏的指标,甚至,用代码覆盖率来考核测试任务完成情况,比如,代码覆盖率必须达到80%或 90%。于是乎,测试人员费尽心思设计案例覆盖代…

【30天熟悉Go语言】4 Go的变量、常量、运算符

文章目录 一、前言二、变量1、变量的基础使用2、变量的多种使用方式1)全局变量2)局部变量3)丢弃赋值 3、Go和Java的变量对比 三、常量1、Go和Java的常量对比 三、运算符1、算术运算符 、--2、运算符 &、* 四、总结 一、前言 Go系列文章&a…

计算机组成原理 之 第四章 指令系统

1. 指令格式 通常包括操作码字段(OP)和地址码字段(A),有的指令不需要地址码 指令系统(指令集):一台计算机的所有指令的集合,eg:X86、ARM (1&#…

手机安卓Termux搭建Hexo博客网站,发布公网访问

文章目录 1. 安装 Hexo2. 安装cpolar内网穿透3. 公网远程访问4. 固定公网地址 转载自cpolar极点云的文章:安卓手机使用Termux搭建Hexo个人博客网站【内网穿透公网访问】 Hexo 是一个用 Nodejs 编写的快速、简洁且高效的博客框架。Hexo 使用 Markdown 解析文章&#…