实例讲解USB的枚举过程

https://www.cnblogs.com/ljf181275034/articles/2942642.html
(实例讲解USB的枚举(配置)过程)
结合自己用BUShound抓的数据(下图),发现几乎完全一致。

实例讲解USB的枚举过程
中间涉及到一个USB Mass Storage协议,可以参考这个:
https://blog.****.net/melvda/article/details/38370437
和这个:
https://www.cnblogs.com/shangdawei/archive/2013/06/13/3133526.html

系统梳理一下USB设备的使用过程:
1.标准请求过程
USB设备上电之后,host会下发各种8字节标准请求(总共十一种)以配置USB设备(获取USB描述符,配置USB设备地址等等),标准请求使用USB四种传输方式之一的控制传输类型。控制传输使用三种事务中的SETUP事务,SETUP事务又由三个包(令牌包、数据包、握手包)组成,这8个字节就隐藏在数据包过程中。不同的设备支持不同的传输类型,枚举期间设备会告知host,比如U盘支持批量传输等等。

USB设备上电配置过程就好像一个USB设备去host那面试,上来host就会发一个get descriptor标准请求问USB:你有什么能耐啊,你是USB设备中的哪一类设备啊?之后的标准请求都是类似这种一来一回的问答,host满意了,就会给USB分配一个地址,或者办公位置,下次host遇到相关的问题了,就会在这个位置让USB处理了。
https://blog.****.net/go_str/article/details/80782229(下图来源)
实例讲解USB的枚举过程

2.类请求
USB设备描述符包含下面几个特征值:
bInterfaceClass
bInterfaceSubClass
bInterfaceProtocol
分别对应USB的class,subclass,protocol。
而U盘对应就是0x08(Mass Storage),0x06(SCSI 命令集),0x50(Bulk Only传输协议)。
就是说,host和u盘之间使用Bulk Only传输协议,该传输协议由cbw,csw,data组成,scsi命令结构就封装在cbwdb中。过程中使用的传输类型是批量传输,批量传输由in out事务构成,每个事务由令牌包,数据包,握手包组成。
而bulk only中的cbw、csw等包则是在数据包阶段传输过去。
唯一不清楚的是,单一的cbw或者csw是否算一次事务,就是传一次cbw是否会经历令牌包,数据包,握手包三个阶段。

传输类型由一个或多个事务组成,USB事务有in,out,setup三种
每个事务由令牌包数据包握手包组成
不同的包由不同的域组成