USB Mass Storage中的BBB协议、SCSI协议的命令块传输传输,
USB插拔数据
1. 控制传输部分
第二周->三、Bus Hound抓包学习->2. USB插拔数据->控制传输、
2. 数据传输部分
参考文档和资料
USB Mass Storage协议
USB Mass Storage大容量存储的基本知识
0. 基础知识
0.1 相关协议
数据传输依托SCSI协议,传输CBW和CSW命令块和数据块。
Host和Device间数据通讯协议是Bulk-only Transport。也称为BBB协议,这是与CBI对应的一种说法。因为CBI是指Commond、Bulk和Interrupt。而对于Bulk-only所有的传输都是通过BULK EP完成。
USB Device内部和数据存储介质之间通信协议为SCSI(Small Computer System Interface)。
USB 设备中的固件(firmware)或者硬件(hardware),必须要实现下面这些功能:
检测和响应通用的USB Request和USB总线上的事件。
检测和响应来自USB设备的关于信息或者动作的USB Mass Storage Request。
检测和响应从USB Transfer中获得的SCSI Command。这些业界标准的命令,是用来获得状态信息,控制设备操作,向存储介质块中读取(read block)和写入(write block)数据的。
image.png
USB Mass Storage相关协议
USB Mass Storage Class Control/Bulk/Interrupt (CBI) Transport
USB Mass Storage Class Bulk-Only (BBB) Transport
USB Mass Storage Class Universal Floppy Interface (UFI) Command Specification
USB Mass Storage Class Bootability Specification
USB Mass Storage Class Compliance Test Specification
USB Lockable Storage Devices Feature Specification (LSD FS)
USB Mass Storage Class USB Attached SCSI Protocol (UASP)
U盘和PC之间的交互主要关心以下几个协议:SCSI、BBB和UASP协议(提高USB利用率,提高传输速度后是UASP协议)。
0.2 IN和OUT事务传输
批量纯属分为IN和OUT,IN和OUT事务传输过程。
image.png
image.png
0.3 三种返回包:ACK(确认)、NAK(未确认)、STALL(不支持的控制请求)
**ACK(确认):ACK(确认) 表示主机和设备已经收到数据,没有出现错误。**设备必须在Setup 事务的交换包中返回ACK,设备也必须在OUT事务的交换中返回ACK。主机在IN事务的交换包中返回ACK。
**NAK(未确认):NAK(未确认) 表示设备正忙或没有数据要返回。**如果主机在设备太忙而不能接受数据时发送数据,则设备在交换包中发出NAK。如果主机在设备没有数据可发送时向设备请求数据,则设备在数据包中发出NAK。在上述两种情况的任何一种下,NAK表示一个暂时的状况,而主机会在以后重试。
**STALL:不支持的控制请求,控制请求失败或终端失败。当一个设备接收到一个终端不支持的控制传输请求,那么这个设备返回一个STALL 给主机。**设备在它支持这个请求但是由于某些原因不能采取请求的动作时,也会发出STALL给主机。STALL 的另一个用途是在终端暂停特性设置的情况下来响应传输请求,表示终端根本不能发送或接收数据。规范称这个类型的延迟为功能延迟。批量和中断终端必须支持功能延迟。在接收到一个功能STALL后,主机停止所有与设备悬而未决的请求,并且不会恢复通信直到它已经发送一个成功的请求来清除设备的暂停特性。主机绝不会发送STALL
3. SCSI命令
3.0 基本概念
CBW(Command Block Wrapper):包含命令块和相关信息的数据包
**CSW(Command Status Wrapper):**包含命令块状态的数据包
**Data-In:**设备到主机的数据传输
**Data-Out:**主机到设备的数据传输
**Phase Error(相位误差):**从设备返回的处理结果,在设备复位之前后续的CBW是不确定的
Processed:接收到数据,而且设备到主机端点的内部控制不再需要考虑
Relevant:发送到主机的数据是有意义的。
Reset Recovery:一个错误恢复过程,主机可以给设备准备好下一个CBW。
3.1 Bulk-Only Mass Storage Reset (class-specific request)
用来重置大容量存储设备和相关接口,这个类请求可以让设备准备好接收CBW。
bmRequestType为:类定义请求,请求为专属接口,主机到设备。
wIndex为相关接口数字
image.png
3.2 Get Max Lun
Get Max Lun请求用来确定设备支持的逻辑单元数量,数量从0(00h)到15(Fh)连续,发送此请求需要发送以下命令:
bmRequestType为:类定义请求,请求为专属接口,设备到主机。
image.png
设备返回一个字节的数据包含设备的逻辑单元数量,返回值为x,则设备有(x+1)个逻辑单元。
3.3 主机/设备数据包传输顺序
主机写(Data-Out)之前需要发送一个CBW命令。
主机在读(Data-In)之前需要发送CBW命令,读之后需要发送CSW命令。
主机可以在发送相关CBW之前进行读或者发送CSW命令。
3.4 Command Queuing(命令队列)
主机收到上一个的CBW的CSW之前不能发送CSW。
主机连续发送两个CBW,中间没有复位和CSW的发送,设备对第二个CBW的响应是不确定的。
3.5 Bi-Directional Command Protocol(双向命令协议)
单个命令中不能进行双向数据传输。
3.6 SCSI在Mass Storage中常用指令集
相应的回应在:
image.png
4. 描述字
4.1 设备描述字、配置描述字->链接
4.2 接口描述字
接口描述字包含设备实现的功能和特性的信息,含有类、子类和协议以及接口使用的端点数量。
每个接口有自己的接口描述字和附属描述字,每个接口含有一个或多个接口设置,同一个接口的设置都是互斥的,每次只有一个设置被激活。(链接《USB开发大全》70-71页:详细字段内容介绍)
image.png
4.3 端点描述字
4.3.1 Control(控制传输)
除了端点0外(梭有设备都支持端点0)每一个端点有一个端点描述字。设备描述字含有最大信息包尺寸以及端点的全部信息。端点描述字作为配置描述字的附属描述字而被发送给主机。(链接《USB开发大全》71-73页)
image.pngimage.png
image.png
4.3.2 Bulk-In端点
Bulk-In端点用于将数据和状态从设备发送到主机。
image.png
4.3.3 Bulk-Out端点
Bulk-Out端点用于将命令和数据从主机发送至设备。
image.png
5. Bulk_Only数据传输过程(命令、数据和状态传输过程)
image.png
5.1 CBW(Command Block Wrapper)命令块
CBW传输的字节数为31(1Fh)。按照小端格式(低地址存放字数据的低字节,高地址存放字数据的高字节,与之相反为大端格式)排列。
image.png
dCBWSignature:帮助识别为一个CBW数据包,包含43425355h(小端)
**dCBWTag:**主机发送的对一个CBW块进行标记,设备需要在CSW的dCSWTag中将相应的内容反馈给主机,dCSWTag可以把CSW同CBW联系起来。
dCBWDataTransferLength:主机期望传输的数据长度。
bmCBWFlags: 定义数据的传输方向,由bit7定义(0:Data-Out,1:Data-In),其他比特默认为0。
bCBWLUN::设备逻辑单元号(LUN)。对于支持多个LUN的设备,主机把指向的LUN写在这个字段里,没有指向则置零。
bCBWCBLength:CBW的CB的有效长度
CBWCB:设备执行的命令块,这里是SCSI命令,一般是16字节。设备应将该字段中的第一个bCBWLength字节解释为由bInterfaceSubClass标识的命令集定义的命令块。如果设备支持的命令集使用的命令块长度小于16 (10h)字节,则优先传输有效字节,从偏移量为15 (Fh)的字节开始。设备将忽略CBWCB字段的内容超过偏移量(15 + bcbwclength - 1)的字节。
image.png
5.2 CSW(Command Status Wrapper命令传输状态包)
CSW传输13个字节的数据,按照小端格式,表示CBW传输状态(设备到主机)
image.png
dCSWSignature:帮助识别此数据包为CSW的签名。签名字段必须包含值53425355h(小端),表示CSW。
**dCSWTag:**和相应的CBW进行对应。
**dCSWDataResidue:**主机对设备进行数据写时,由于dCBWDataTransferLength中规定的预期数据量与设备实际处理的数据量之间存在差异,设备应在dCSWDataResidue中报告Data-Out的数据量。主机对设备进行数据读时,在设备中,由于dCBWDataTransferLength中预期的数据量与设备实际发送的相关数据量之间存在差异,设备应在dCSWDataResidue中报告Data-In的数据量。dCSWDataResidue不能超过在dCBWDataTransferLength中发送的值。
**bCSWStatus:**CBW是否传输成功,0为成功,非零为失败
image.png
5.3数据传输条件(Data Transfer Conditions)
描述传输如何保持同步,主机使用CBW的方向和长度域(dCBWDataTransferLength)进行传输。设备确定实际的传输方向和长度。设备用合适的CSW返回CBW的结果。
image.png
5.3.1 命令传输
主机通过Bulk-Out端点发送CBW,每个CBW包含一个命令块。CBW为31(1Fh)个字节。
5.3.2 数据传输
主机尝试按照dCBWDataTransferLength和方向位(主机到设备还是设备到主机)进行数据方向和大小的确定。
在数据完成之前设备可以报告错误,需要在使用中的端点(数据输入:Bulk-In端点,数据输出:Bulk-Out端点)传输STALL进行命令终止。
5.3.3 状态传输
设备需要通过Bulk-In端口发送CSW到主机传输状态。一个CSW大小为13(Dh)个字节。
6. 逐行解析
对以下数据进行逐行解析:
查询官方文档获取相关返回信息数据定义和类型(文档为
)
image.png
6.1 CBW
image.png
55 53 42 43为CBW的签名dCBWSignature(小端格式,实际为43425355h)
10 f0 18 8a为CBW标记块,连接下面的CSW
24 00 00 00为主机期望的数据长度,为36个字节
**80(10000000b)**为数据传输方向:为Data-In:数据读
00为逻辑设备单元号,设备只有一个逻辑设备单元,所以为0
06为CB的有效长度为6个字节
**12 00 00 00 24 00 00 00 00…**16个字节的数据为CBWCB:0x12为获取设备信息 0x24为分配程度36个字节
image.png
6.2 设备返回相关信息image.png
设备返回生产厂家、产品名称和版本等相关信息,信息格式如下:
image.png
6.3 CSW
image.png
55 53 42 53是CSW的前缀,在2号端口由存储设备向主机发送数据,10 f0 18 8a为和6.1的CBW对应的标记块,后面的00000000表示要传输的数据量和CBW中的要求相符,最后的00表示传输成功。
6.4 CBW
image.png
fc000000表示传输12+16*15=252个字节的数据
数据传输方向为数据读
0a为CB的有效长度,为10个字节
23 00 000 00 000 00 00fc为CB的有效数据:在SCSI指令集中0x23为查询可用容量及剩余空间,fc为最低位
image.png
6.5 返回可用容量和剩余空间(UFI文档33-36页)
image.png
实际返回的是Block(存储块)的数量(每块大小与文件系统有关),并非字节数:
image.png
image.png
image.png
6.6 CSW
image.png
CBW传输成功的信号,同上6.3
6.7 CBW
image.png
主机期望数据长度为15+15*16=255个字节
12 01 80 00 ff为获取设备信息:0x01为主机指定设备传送第一页的相关信息
6.8 返回设备相关指定信息
image.png
6.9 CSW
表示传送成功
image.png
6.10 Get Descriptor(获取设备描述符)
image.png
0x80为接收端是设备,标准类型,方向设备到主机
0x06为Get Descriptor
0x0300为描述符类型为字符串,索引为0x00
0000为wIndex
ff(15+16*15)为设备返回字节数,小于即可
————————————————
版权声明:本文为CSDN博主「小森豆丁」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_37769256/article/details/115672978