USB协议学习(二)大容量存储设备枚举过程分析
笔者来聊聊大容量存储设备枚举过程分析.。
1、USB2.0 标准设备请求
标准设备的请求命令主要有以下几条:
- Get Configureation :获取设备配置信息
- Set Configureation:设置设备配置信息
- Get Descriptor:获取描述符
- Set Descriptor:设置描述符
- Set Address:设置设备的地址
- Get Interface:获取特定接口的设置
- Set Interface:配置特定接口的设置
比较常用的就是:设置地址,获取描述,设置/获取配置。
设备请求的编码如下:
所以设置地址(05),获取描述(06),设置/获取配置(09/08)。
1.1 设置地址
上述命令简单,wValue填写实际分配的地址即可。
- 观察下面逻辑分析仪抓的数据,就可以看到命令码是05,设置的地址是0x40,所以后面的地址就是40。
- 观察下面的USB分析仪抓的数据,可以更清晰的看出来Host 与 Device的交互。
- 过程基本都是三个阶段,详情见[USB2.0协议介绍]()。
1.2 获取描述符
获取描述符的协议定义如下:通过参数不同,可以获取多个不同类型的描述符数据。
- ReuestType:06
- wValue:2Byte,分成两个字节使用,低字节:index,高字节:描述符类型,如下面表格所示。
- wIndex:Language ID
- 首先获取Device类型,主要是USB版本,USB类以及子类等。
offset | Field | Size | value | Description | example |
---|---|---|---|---|---|
0 | bLength | 1 | Number | Size of this descriptor in bytes,字节数 | 0x12 |
1 | bDescriptionType | 1 | Number | DEVICE Descriptor Type,描述类编码值 | 0x1 |
2 | bcdUSB | 2 | BCD | USB Specification Release Number in Binary-Coded Decimal (i.e., 2.10 is 210H),USB版本 | 0x0210 |
4 | bDeviceClass | 1 | Class | Class code,USB类编码 | 0x00 |
5 | bDeviceSubClass | 1 | Class | SubClass code,USB子类编码 | 0x00 |
6 | bDeviceProtocol | 1 | Protocol | Protocol code,协议编码 | 0x00 |
7 | bMaxPacketSize0 | 1 | Number | Maximum packet size for endpoint zero(only 8, 16, 32, or 64 are valid) | 0x40 |
8 | idVendor | 2 | ID | Vendor ID,厂商ID | 0x090C |
10 | idProduct | 2 | ID | Product ID,厂商里面的设备iD | 0x8381 |
12 | bcdDevice | 2 | BCD | Device release number in binary-codeddecimal | 0x1100 |
14 | iManufacturer | 1 | Index | Index of string descriptor type describing manufacturer,获取厂商的描述,Get Descripor 请求类型 | 0x01 |
15 | iProduct | 1 | Index | Index of string descriptor type describing product,获取产品的描述 | 0x02 |
16 | iSerialNumber | 1 | Index | Index of string descriptor type describing the device’s serial number,获取序列号的描述, | 0x03 |
17 | bNumConfigurations | 1 | Number | Number of possible configurations , | 0x01 |
多看几种设备比如USB转串口:USB 2.0版本
下面这个是USB1.1版本,相对比较老,
ST的STM32 USB大容量存储设备,USB发布版本 USB2.0。
闪迪U盘,USB2.1版本。
- 获取配置信息,编码是02,其实会把接口描述符,和端点描述符都获取上来
配置描述符,
offset | Field | Size | value | Description | example |
---|---|---|---|---|---|
0 | bLength | 1 | Number | Size of this descriptor in bytes,字节数 | 0x09 |
1 | bDescriptionType | 1 | Constant | CONFIGURATION Descriptor Type ,配置类别type | 0x02 |
2 | wTotalLength | 2 | Number | Total length of data returned for this configuration,配置的总长度,包含了其他描述符 | 0x0020 |
4 | bNumInterfaces | 1 | Number | Number of interfaces supported by this configuration | 0x01 |
5 | bConfigurationValue | 1 | Number | Value to use as an argument to the SetConfiguration() request to select this configuration | 0x01 |
6 | iConfiguration | 1 | Index | Index of string descriptor describing this configuration | 0x04 |
7 | bmAttributes | 1 | Bitmap | Configuration characteristics | 0xC0 |
8 | bMaxPower | 2 | mA | Maximum power consumption of the USBdevice,1 value 代表2ma, | 0x32 |
接口描述符的说明,可以获得USB的类以及子类等信息
offset | Field | Size | value | Description | example |
---|---|---|---|---|---|
0 | bLength | 1 | Number | Size of this descriptor in bytes,字节数 | 0x09 |
1 | bDescriptionType | 1 | Constant | INTERFACE Descriptor Type ,接口描述符类别 | 0x04 |
2 | bInterfaceNumber | 1 | Number | Number of this interface ,接口个数 | 0x00 |
3 | bAlternateSetting | 1 | Number | Value used to select this alternate setting for the interface identified in the prior field , | 0x00 |
4 | bNumEndpoints | 1 | Number | Number of endpoints used by this interface (excluding endpoint zero). | 0x02 |
5 | bInterfaceClass | 1 | Class | Class code | 0x08,代表大容量存储设备 |
6 | bInterfaceSubClass | 1 | SubClass | SubClass code ,设备子类,06代表U盘, | 0x06 |
7 | bInterfaceProtocol | 1 | Protocol | Protocol code ,0x50代表批量传输 | 0x50 |
8 | iInterface | 1 | Index | Index of string descriptor describing this interface | 0x05 |
端点描述符:编码05
offset | Field | Size | value | Description | example |
---|---|---|---|---|---|
0 | bLength | 1 | Number | Size of this descriptor in bytes,字节数 | 0x07 |
1 | bDescriptionType | 1 | Constant | INTERFACE Descriptor Type ,接口描述符类别 | 0x05 |
2 | bEndpointAddress | 1 | Number | The address of the endpoint on the USB device described by this descriptor , | 0x81 |
3 | bmAttributes | 1 | Number | This field describes the endpoint’s attributes when it is configured using the bConfigurationValue, 00:控制传输,01 同步传输,02 批量传输,03 中断传输 | 0x02 |
4 | wMaxPacketSize | 2 | Number | Maximum packet size this endpoint | 0x0040 |
6 | bInterval | 1 | Number | Interval for polling endpoint for data transfers. | 0x00 |
- 获取字符信息,编码是03,可以获取序列号,厂商以及产品描述。
- 获取序列号
- 获取设备信息
- 获取厂商描述信息
- 获取接口描述信息
- 获取编码
offset | Field | Size | value | Description | example |
---|---|---|---|---|---|
0 | bLength | 1 | Number | Size of this descriptor in bytes,字节数 | 0x1A |
1 | bDescriptionType | 1 | Constant | STRING Descriptor Type ,接口描述符类别 | 0x03 |
2 | bString | 1 | Number | UNICODE encoded string , | string |
- 04 是接口信息:MSC Config (大容量接口配置)
- 03 是序列号:3A0941884250
- 02 设备信息:Mass Storage in FS Mode
- 01 厂商信息:STMicroelectronics(意法半导体公司)
- 00 获取语言编码:language ID 0904
1.3 获取Max Lun
获取最大的逻辑单元数,可以理解为有多少个存储介质设备。返回值就1个字节,lun的个数=返回值+1。
2、大容量存储设备上电过程
USB2.0 示例
可以看到是HS ,高速设备,如果是FS,则是全速设备。
- 首先上电,根据上电可以知道是低速还是高速设备
- 设置地址信息
- 获取描述符
- 设置配置信息
- 获取最大的逻辑单元数(如果是大容量存储设备 )
- USB协议分析来看一下
- 首先设置地址,0x1B=27,通过Setup和IN 设置设备信息。
- 获取设备描述符,配置信息,VID:0781 (SanDisk) PID:55A9 ,U盘系列
- 设备信息是:Dual Drive
- 设备序列号是:0101xxxx,总共0xF2=242个字符。
- 首先设置地址,0x1B=27,通过Setup和IN 设置设备信息。
- 逻辑分析仪看一下
同上面分析 - BusHound 分析仪一下
a. 没有看到设备地址设置信息
b. 获取设备描述符 , VID=0x0781 PID=0x558a
c. 获取设备名字信息和厂商信息:Ultra 以及SanDisk。
d. 获取序列号:4C534001620603120390
e.设置config信息
f.获取最大的逻辑单元数:0
USB3.1 示例
可以看到是USB G1.,就是USB3.1 ,
- 设置地址
- 获取描述符,设备类别
- 获取描述符,配置信息
- 获取描述符,字符串信息
- Set ISOCH Dealy
- Set Feature
- 设置配置信息
- 获取最大的逻辑单元数(如果是大容量存储设备 )
继续总结。
版权声明:
作者:ZhangYixi
链接:http://zyixi.xyz/usb%e5%8d%8f%e8%ae%ae%e5%ad%a6%e4%b9%a0%ef%bc%88%e4%ba%8c%ef%bc%89%e5%a4%a7%e5%ae%b9%e9%87%8f%e5%ad%98%e5%82%a8%e8%ae%be%e5%a4%87%e6%9e%9a%e4%b8%be%e8%bf%87%e7%a8%8b%e5%88%86%e6%9e%90/
来源:一西站点
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论