关于USB的枚举,是学习USB协议所面临的第一个最基础也是最重要的内容。
USB枚举,USB Emulation,从字面意思看,就是去列举USB,而列举啥呢,其实就是USB的初始化。
简单来说,USB的枚举,对应的就是USB的Host和Device之间的对话,即Host根据Device所报告上来的参数,得知USB的device是啥类型的,具有啥功能,然后初始化相关参数。
接下来,就USB Device就可以正常工作了。
所以,可以简单的理解为,USB枚举,就是USB设备的初始化(init)。
此处摘录一个,[12]中的关于windows下USB枚举的过程的总结:
- The host or hub detects the connection of a new device via the device's pull up resistors on the data pair. The host waits for at least 100ms allowing for the plug to be inserted fully and for power to stabilise on the device.
- Host issues a reset placing the device is the default state. The device may now respond to the default address zero.
- The MS Windows host asks for the first 64 bytes of the Device Descriptor.
- After receiving the first 8 bytes of the Device Descriptor, it immediately issues another bus reset.
- The host now issues a Set Address command, placing the device in the addressed state.
- The host asks for the entire 18 bytes of the Device Descriptor.
- It then asks for 9 bytes of the Configuration Descriptor to determine the overall size.
- The host asks for 255 bytes of the Configuration Descriptor.
- Host asks for any String Descriptors if they were specified.
At the end of Step 9, Windows will ask for a driver for your device. It is then common to see it request all the descriptors again before it issues a Set Configuration request.
而相对来说,更加详细一点的解释,可以去看Enumeration: How the Host Learns about Devices
其实,单独看此文字描述,虽然解释的很是详细了,但是还是很难彻底搞懂。
所以,后面会专门通过第 4.4.3 节 “举例详解USB的枚举过程”来彻底的解析,到底USB的枚举的过程如何,以及发送的数据的详细所对应的含义。
既然说到举例,那么就要有相应的数据。
此处的USB枚举所涉及到的数据,是之前某次开发过程中,通过第 2.2.3 节 “其他一些USB测试和协议分析等软件”中所介绍的SBAE USB所抓取出来的数据,并且软件可以详细分析每个字节所对应的含义。
抓包工具抓到了共0x42=66字节的数据,其中每个字节对应的十六进制表示是两个数字,所以一共是66x2=132个数字:
0902420002010480E10904000002FF000000092110010001223F0007050103400001070581034000010904010001030000000921100100012221000705820340000A
可被拆分为对应的8组:
而关于为何可以被分成这8组,此处先解释一下:
如何(解析)看懂USB枚举的数据 | |
---|---|
对于Configuration,Interface,Endpoint,Class等部分,其数据格式的定义中,首字节,都是表示长度,即,接下来多少个字节,属于当前这部分。 所以,对于上述数据来说,从开始的“09”,我们就知道了,接下来的8个字节的数据“02420002010480E1”,都是属于当前Configuration部分的。 以此接着往下判断,则分别可以判断出对应的每一部分的数据,都是哪些。 而对于这些数据分组的依次顺序,则是USB协议中定义的。详细定义,请参考USB协议。 |
接下来,就是分析,每一部分的数据,到底对应的是何种含义。
此处,再把上述数据贴出来,并进行分析:
0902420002010480E1 0904000002FF000000 092110010001223F00 07050103400001 07058103400001 090401000103000000 092110010001222100 0705820340000A
此部分内容对应着的是:Configuration 其定义为: 表 4.3. USB Configuration Descriptors
其每个字节对应的含义为: |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
此部分内容对应着的是:Interface 其定义为: 表 4.4. USB Interface Descriptors
其每个字节对应的含义为: |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
此部分内容对应着的是:Class 由于其前面的中bInterfaceClass=0xFF,对应着表 4.1 “USB Class表”中的vendor-specific,所以此部分的值的含义,是针对特定厂家的特定的含义,因此此处就不具体解释了。 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
此部分内容对应着的是:Endpoint 其定义为: 表 4.5. USB Endpoint Descriptors
其每个字节对应的含义为: |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
对应定义为:表 4.5 “USB Endpoint Descriptors” 其每个字节对应的含义为: |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
此部分内容对应着的是:Interface 其定义为参考:表 4.4 “USB Interface Descriptors” 其每个字节对应的含义为: |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
由于中bInterfaceClass=0x03,对应着表 4.1 “USB Class表”中的HID,所以,此部分内容的解析,依赖于对应的HID中的定义。 可在官方的1.1版本的HID协议:HID1_11.pdf中的“6.2.1 HID Descriptor”部分找到对应的定义: 表 4.6. USB HID Descriptors
其每个字节对应的含义为: 表 4.7. USB HID Descriptor: 090401000103000000
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
对应定义为:表 4.5 “USB Endpoint Descriptors” 其每个字节对应的含义为: |