Bus Hound抓包学习(抓取相机数据学习UVC协议)
参考文档和资料
1. Bus Hound的使用方法
在Bus Hound的界面选择easy camera时要把路径的上一级也要选择在内,才能在Settings中显示UVC协议的驱动程序,此时打开相机就可以在Capture界面实现抓包处理。
2. USB插拔数据
左侧Device后的.0,.1等代表Endpoint的组数,只有Endpoint0具有CTL功能并且支持数据传输(支持两个方向的信息传输),其他组的Endpoint只有数据传输功能(IN:提供数据,发送给主机 OUT:存储从主机接收到的数据)。
0. 控制传输相关资料
设置阶段由一个设置事务构成,将整个传输确定为控制传输,发送请求及设备完成请求所需要的其他信息。
Bus Hound中高字节在左,低字节在右,比特位高位在左低位在右。
控制传输数据为:
bmRequestType | bRequest | wValue | wlndex | wLength | Data |
---|---|---|---|---|---|
2(字节) | 1 | 2 | 2 | 1 | 1 |
1. 一些基础的标准请求:
2. bmRequestType
1. Get descriptor(获取描述符)
第一个配置包数据为:
主控器不知道USB设备的描述符长度,插拔U盘之后Bus Hound出现第一行数据为抓包到的Get Descriptor,此时为主机发送Get descriptor请求,请求获取设备描述符。构成如下:
bmRequestType | bRequest | wValue | wlndex | wLength | Data |
---|---|---|---|---|---|
10000000B(0x80) | Get Descriptor(0x06) | 0x0100 | 0x0000 | 0x40(64个字节) | 0x00 |
1. bmRequestType 的类型:
此时数据为10000000B:接收端为设备(Device),类型为标准(Standard),方向为设备到主机。
2. bRequest类型
Get descriptor为0x06
3. wValue高字节为描述符类型,低字节为描述符索引(用于在设备具有多个重复描述符类型时选择)
描述符类型为Device(0x01),索引为0x00
4. wlndex
对于字符串描述符,该字段为语言ID(Language ID)。对于其他描述符,该字段为0x0000
5. wLength
让设备返回的字节数,设备返回的字节数小于此设定值,设定为64个字节。
6. Data
数据包请求的描述符。
2. 返回设备描述符
第二行数据类型为IN,数据从设备发往主机,此时数据为设备描数字,共有18个字节,数据为:
- 0x12和0x01字节为单位的描述字的常Device
- 0x0200代表USB2.0(USB3.0 为0x0300)
- 0x000000不使用联合描述字的类和功能
- 0x40为最大信息包尺寸
3. 再次Get decriptor获取配置描述字
此时设置wValue为高字节为02h,wLength字段为总长度wTotallength(15+15*16)个字节,来去的配置描述字和附属描述字。
4. 设备向主机发送配置描述字
链接USB开发者大全(P67-70)
字节数据为:
09 02 20 00 01 01 00 80 32 09 04 00 00 02 08 06 50 00 07 05 02 02 00 02 00 07 05 82 02 00 02 00
数据为前八个代表配置描述字,剩下的为附属描述字。**sTotalLength为0020h为32个字节。 **
5. 主机Get Descriptor,请求描述符类型为String(字符串)
字符串描述字为制造商、设备名字等文字信息,主机利用Get Descriptor来请求读取字符串描述字。
6. 返回字符串描述字
7. 8.Get Descripor再次获取字符串描述字
9. Endpoint0(端点0)进行class命令,
10. Set Configuration请求选择配置
主机获取了配置字之后(wValue的高字节为02h),利用Set Configuration请求进行配置的选择。
set configuration的结构
1. bmRequestType
此时数据为10000000B:接收端为设备(Device),类型为标准(Standard),方向为设备到主机。
3. wValue低字节为所需配置,高字节为0x00:配置为0x01
4. wIndex、wLengeh和Data均为0
11. Test Unit Ready测试存储设备是否准备好
非EndPoint数据交互,属于SCSI指令,
12. Set Interface设置接口请求
有三.2.0的数据表格可知:Set Interface的目标为接口所以bmRequestType值为00000001b,bRequest类型为0bh,剩下的均为0
13. Test Unit Ready测试存储设备是否准备好
14. Get Max Lun
Mass Storage类规范定义了两个请求:Get Max LUN和Mass Storage Reset,所有的Mass Storage类设备都必须支持这两个请求。处理Get Max Lun时返回逻辑单元个数(0-15),驱动仅支持一个存储设备,返回0即可。
15. 利用端点2发送数据
枚举成功,控制传输完成,转入数据传输。
四、SCSI协议
操作系统对外部设备(如磁盘、磁带、光盘、打印机等)的I/O操作均可以通过SCSI协议来实现,SCSI协议嵌入在设备驱动器或者主机适配器的板载逻辑中。