USB学习之七:设备描述符请求与回应

一、抓取USB数据包

拔插USB设备,可以抓取到数据如下:
image

当然,我们可以使用过滤方法,找到需要观察的数据包:

usb.addr == 1.3.0 || usb.addr == 1.3.1

二、设备地址

在USB(通用串行总线)协议中,设备地址(Device Address)是主机用来唯一标识连接到USB总线上的设备的标识符。USB设备地址的格式通常是一个层次化的结构,用于表示设备在USB总线上的位置。你提到的 usb.addr == 1.3.0 是一种常见的表示方法,但需要明确其具体含义。

  1. USB设备地址的层次结构
    USB设备地址通常包括以下几个层次:
    Bus Number(总线号):表示USB总线的编号。
    Device Number(设备号):表示在特定总线上的设备编号。
    Interface Number(接口号):表示设备中的特定接口编号。
    Endpoint Number(端点号):表示接口中的特定端点编号。
  2. 地址格式的解释
    你提到的 usb.addr == 1.3.0 可以解释为:
    1:总线号(Bus Number)
    3:设备号(Device Number)
    0:接口号(Interface Number)
    这种表示方法通常用于描述USB设备在系统中的位置。例如:
    1.3.0 表示在总线号为1的USB总线上,设备号为3的设备的接口号为0的接口。

三、URB头部示例

请参考章节usb学习之四: USB Request Block (URB)
image

四、bRequestType和bRequest

请参考章节usb学习之三: bRequestType 和 bRequest字段

bRequestType 二进制 方向 类型 接收者 bRequest 请求名称 描述
0x00 0000 0000 主机到设备 标准 设备 0x00 GET_STATUS 获取设备的状态信息
0x00 0000 0000 主机到设备 标准 设备 0x03 SET_FEATURE 设置设备的特征(如端点停滞)
0x00 0000 0000 主机到设备 标准 设备 0x01 CLEAR_FEATURE 清除设备的特征(如端点停滞)
0x00 0000 0000 主机到设备 标准 设备 0x05 SET_ADDRESS 设置设备的地址
0x00 0000 0000 主机到设备 标准 设备 0x09 SET_CONFIGURATION 设置设备的配置
0x80 1000 0000 设备到主机 标准 设备 0x06 GET_DESCRIPTOR 获取设备的描述符(如设备描述符、配置描述符等)
0x80 1000 0000 设备到主机 标准 设备 0x00 GET_STATUS 获取设备的状态信息
0x80 1000 0000 设备到主机 标准 设备 0x07 GET_CONFIGURATION 获取当前的设备配置
0x00 0000 0000 主机到设备 标准 设备 0x0B SET_INTERFACE 设置接口的配置
0x80 1000 0000 设备到主机 标准 设备 0x0A GET_INTERFACE 获取当前接口的配置
0x40 0100 0000 主机到设备 设备 0x01 SET_IDLE 设置HID设备的空闲状态
0x40 0100 0000 主机到设备 设备 0x03 SET_PROTOCOL 设置HID设备的协议
0xC0 1100 0000 设备到主机 设备 0x00 GET_REPORT 获取HID设备的报告
0xC0 1100 0000 设备到主机 设备 0x01 GET_IDLE 获取HID设备的空闲状态
0xC0 1100 0000 设备到主机 设备 0x02 GET_PROTOCOL 获取HID设备的协议
0x20 0010 0000 主机到设备 厂商 设备 自定义 自定义请求 厂商自定义的请求
0xA0 1010 0000 设备到主机 厂商 设备 自定义 自定义请求 厂商自定义的请求

五、协议分析

设备描述符请求:
0000   1c 00 00 00 00 00 00 00 00 00 00 00 00 00 0b 00
0010   00 01 00 03 00 80 02 08 00 00 00 00 80 06 00 01
0020   00 00 12 00

这段URB数据包是一个控制传输请求,具体是请求设备描述符。以下是解析后的详细信息:

字段 字节范围 含义
Length 0-1 0x001C URB数据包总长度(28字节)
IRP ID 2-9 0x0000000000000000 I/O请求包的唯一标识符(未使用)
IRP USBD STATUS 10-13 0x00000000 请求成功
URB Function 14-15 0x000B URB_FUNCTION_CONTROL_TRANSFER(控制传输)
Flags 16 0x00 无特殊标志
URB bus id 17-18 0x0001 USB总线ID(1)
Device address 19-20 0x0003 设备地址(3)
Endpoint 21 0x80 端点地址(方向为IN,端点号为0)
URB transfer type 22 0x02 控制传输
Packet Data Length 23-26 0x00000008 数据包长度(8字节)
Control transfer stage 27 0x00 控制传输阶段:SETUP阶段(SETUP(0))
bmRequestType 28 0x80 请求类型:从设备到主机,标准请求,设备
bRequest 29 0x06 请求代码:GET_DESCRIPTOR(获取描述符)
wValue 30-31 0x1200 描述符类型:0x12(设备描述符),索引:0x00
wIndex 32-33 0x0000 语言ID(对于设备描述符,通常为0)
wLength 34-35 0x0012 请求的数据长度(18字节)
设备描述符响应:
0000   1c 00 00 00 00 00 00 00 00 00 00 00 00 00 08 00
0010   01 01 00 03 00 80 02 12 00 00 00 03 12 01 10 01
0020   00 00 00 08 ef 17 8d 60 10 01 01 02 00 01

URB头部解析:

字段 长度(字节) 偏移 值(十六进制) 值(十进制) 含义
Length 2 0-1 1c 00 28 URB数据包总长度(28字节)
IRP ID 8 2-9 00 00 00 00 00 00 00 00 0 I/O请求包的唯一标识符(未使用)
IRP USBD STATUS 4 10-13 00 00 00 00 0 请求成功
URB Function 2 14-15 08 00 8 URB_FUNCTION_CONTROL_TRANSFER(控制传输)
Flags 1 16 00 0 无特殊标志
URB bus id 2 17-18 01 00 1 USB总线ID(1)
Device address 2 19-20 03 00 3 设备地址(3)
Endpoint 1 21 80 128 端点地址(方向为IN,端点号为0)
URB transfer type 1 22 02 2 控制传输
Packet Data Length 4 23-26 12 00 00 00 18 数据包长度(18字节)
Control transfer stage 1 27 03 3 控制传输阶段:数据阶段(Data Phase)
Data 18 28-45 12 01 10 01 00 00 08 ef 17 8d 60 10 01 01 02 00 01 - 实际传输的数据内容(18字节)

设备描述符解析

字段 长度(字节) 偏移 值(十六进制) 值(十进制) 含义
bLength 1 0 12 18 描述符长度
bDescriptorType 1 1 01 1 描述符类型(设备描述符)
bcdUSB 2 2-3 10 01 1.10 USB规范版本(1.10)
bDeviceClass 1 4 00 0 设备类代码(0 表示无特定类)
bDeviceSubClass 1 5 00 0 设备子类代码
bDeviceProtocol 1 6 00 0 设备协议代码
bMaxPacketSize0 1 7 08 8 端点 0 的最大包大小
idVendor 2 8-9 ef 17 6145 厂商 ID
idProduct 2 10-11 8d 60 24269 产品 ID
bcdDevice 2 12-13 10 01 1.00 设备版本号
iManufacturer 1 14 01 1 制造商字符串索引
iProduct 1 15 02 1 产品字符串索引
iSerialNumber 1 16 00 2 序列号字符串索引
bNumConfigurations 1 17 01 1 支持的配置数量

说明

  1. Length:URB数据包的总长度为28字节。
  2. IRP ID:I/O请求包的唯一标识符,这里未使用。
  3. IRP USBD STATUS:状态码为0,表示请求成功。
  4. URB FunctionURB_FUNCTION_CONTROL_TRANSFER,表示这是一个控制传输请求。
  5. Flags:无特殊标志。
  6. URB bus id:USB总线ID为1。
  7. Device address:设备地址为3。
  8. Endpoint:端点地址为0x80,表示方向为IN,端点号为0。
  9. URB transfer type:控制传输。
  10. Packet Data Length:数据包长度为18字节。
  11. Control transfer stage:控制传输阶段为数据阶段(Data Phase)。
  12. Data:实际传输的数据内容为12 01 10 01 00 00 08 ef 17 8d 60 10 01 01 02 00 01,共18字节。

数据部分解析

  • Data12 01 10 01 00 00 08 ef 17 8d 60 10 01 01 02 00 01
    • bLength0x12(18字节)
    • bDescriptorType0x01(设备描述符)
    • bcdUSB0x0110(USB 1.10)
    • bDeviceClass0x00(无特定类)
    • bDeviceSubClass0x00(无特定子类)
    • bDeviceProtocol0x00(无特定协议)
    • bMaxPacketSize00x08(8字节)
    • idVendor0x17EF(厂商ID:6145)
    • idProduct0x608D(产品ID:24269)
    • bcdDevice0x0110(设备版本号:1.00)
    • iManufacturer0x01(制造商字符串索引:1)
    • iProduct0x02(产品字符串索引:1)
    • iSerialNumber0x00(序列号字符串索引:2)
    • bNumConfigurations0x01(支持1种配置)

这个URB请求设备的状态信息,数据包长度为18字节,符合USB控制传输的标准格式。

posted @ 2025-08-15 11:20  cupid8505  阅读(264)  评论(0)    收藏  举报