1.bulk-only传输定义:
通过设备端点将包含CBW(共31字节)通过数据封包发送至OUT端点,如果有命令需要传送至主机,则向IN端点发送IN令牌,再通过控制传输接受所需要的数据,传输完成后,再接收CSW.
注意:所有的CBW包必须按低字节在前的方式传送
2. 在BULK-ONLY协议中,有三种类型数据需要在USB总线中传输,它们是命令块包(CBW),命令执行状态包(CSW)和普通数据包。CBW是主机发往设备的命令。格式如下:
第0~3字节: dCBWSignature
第4~7字节: DCBWTag
第8-11字节: DCBWDataTransferLength
第12字节: BmCBWFlags
第13个字节: bCBWLun
第14个字节: bCBWLength
第15到30个字节: SCSI 指令集
上述字节含义:
dCBWSignature :
表示当前发送的是一个CBW,是CBW的标志,固定值为0x43425355,所有CBW的值在USB总线上传输的时候都是按照LSB顺发送的,即最先发送低位,然后发送高位。
DCBWTag:
由主机产生的并发送给设备,设备会将此值填入CSW的dCSWTag,以此返回给主机。
DCBWDataTransferLength:主机希望在批量端点上传输数据的大小。
BmCBWFlags:
位D7=“0”时表示主机输出数据,反之主机接受数据,D6没有用到,D5-D0保留位。
BCBWCBLength:
表示命令的长度。为后续字符串中命令字节的长度
CBWCB:
表示本次磁盘操作命令,也即是SCSI命令。当设备从主机收到CBW块以后,它会把SCSI命令从CBW中分离出来,然后根据要求执行,执行的结果又以CSW的形式发给主机。CBW是以二进制位发送的,每个包必须是精确的31个字节,不满足的要补0。
SCSI命令内容:
Operation Code:
是SCSI命令操作代码。
Logical Block Address:
逻辑块地址,对U盘而言应是扇区。前面已经讲过:通用海量存储设备是一个基于块/扇区存储的设备,因此在SCSI中要提供这个参数是很显然的。
transfer length: 为要传送的扇区数
SCSI中直接存取类型的存储介质的传输命令有很多,如:
INQUIRY:其操作码为12H
Test Unit Ready:其操作码为00H
Format Unit:其操作码为04H
CSW的格式如下:
dCSWSignature:
CSW的标志,表示当前发送的是一个CSW,固定值为0x53425355,CSW的值也都是按LSB顺序发送。
DCSWTag:
必须CBW中dCBWTag一样。
DCSWDataResidue:
还要传送的数据。即CBWDataTransferLength字段中主机希望的数据长度与实际发送的数据长度之间的差额。
BCSWStatue:
命令执行状态,命令正确执行时,为0。命令错误执行失败1,命令错误执行是2其他保留
/****以下为批量传输返回的数据*************/
发UFI_CMD_INQUIRY命令:
buf[0]=0x00; 直接存储设备
buf[1]=0x80; 设备是可移动设备
buf[2]=0x02;
buf[3]=0x02;...........
注意:一般U盘的一个扇区为512字节,而Bulk端点的最大包长为64字节,即一个扇区的读写操作需要8个循环才能完成。
文章评论(0条评论)
登录后参与讨论