Purlvin's private Weblog ‹℘›

through the EyE, through the Life

USB读取U盘数据技术文档-1

USB读取U盘数据技术文档
USB通信与Mass Storage协议
相关描述符和设置
对于U盘此类的大容量存取介质,USB一般是使用Mass Storage协议来进行通信的。然而在使用Mass Storage协议通信之前主机需先获取设备的相关信息,并进行一些设置。
对于读取U盘所用的Mass Storage协议而言,端点描述符和传输协议是需要关注的。传输协议一般有CBI(Control/Bulk/Interrupt Protocol)和Bulk_Only Transport两种,并且在同种传输方式下又分多种指令集。而U盘一般常用Bulk_Only传输方式和SCSI指令集。
Bulk_Only的传输方式中需要用到Bulk_In和Bulk_Out两个端点,而对于不同U盘,这两个端点号是不尽相同的。所以首先要获取Bulk_In和Bulk_Out这两个端点号,方可进行USB的正常通信。
Mass Storage协议与Bulk_Only传输协议
Mass Storage协议中包括CBI和Bulk_Only两种传输协议,但后者较为简单也比较常用。
Bulk_Only传输协议是将指令和数据按照一定的格式进行封装,其格式如下:CBW(Command Block Wrapper)->[DATA]->CSW(Command Status Wrapper)。CBW是主机向U盘发送指令的命令封包,U盘在接受到CBW后根据相应的指令集对命令解析,作出回应。或向主机发送数据,或接受数据,或不进行任何数据操作。完成数据部分的操作后,U盘会向主机发送CSW,以反馈命令的执行情况。
CBW(Command Block Wrapper)
主机通过这个包来通知U盘做何种操作以及传递的数据量。CBW是以0x55534243(Little Endian)开始。CBW中的数据项dCBWTAG可以任意取,在CSW中会返回同样的数据以作验证用。dCBWDataTransferLength表征之后传输DATA的长度,该长度根据不同指令返回数据的多少来决定。若是使用READ10指令来读取U盘,则可以赋值为0x200。bmCbWFlags指示了数据传输的方向。主机读数据为0x80,写则为0x00。bCBWLUN是指分区号,一般U盘只有一个分区,写入0x00即可。bCBWCBLength是其后CBWCB(指令)的有效长度,由于CBW的长度固定为31Byte,不足的部分将由0x00填充。CBWCB因具体指令集而异,一般U盘使用SCSI。也有些使用UFI,但UFI是基于SCSI指令集的,因而会发现一些常用的指令是完全一样的。
在CBWCB中常用的SCSI指令的数据结构中有一项Logical Unit Number可以忽略,使用0x00来填充。这是由于现在使用的SCSI指令集通常是指SCSI-2,而Logical Unit Number是为了和SCSI-1兼容用的。另外还需注意的是对于其后的多个字节的数据项如地址,都是以低字节作为高位的(Big Endian),与整个命令包中各项的以低地址开始(Little Endian)有所区别。
DATA包
DATA包没有任何特殊之初,仅仅只包含数据而已。不过对于指令PREVENT-ALLOW MEDIUM REMOVAL和TEST UNIT READY是没有数据包的。接受完CBW后,U盘会直接返回CSW。
CSW(Command Status Wrapper)
CSW是U盘对执行指令的反馈,其长度为13个字节。若是以0x55535342开始则表明CSW是正常的,当然还要对比一下CBW包的dCBWTag和此处的dCSWTag是否一致,以及dCSWDataResidue的剩余长度是否正确。特别需要关注的是最后一个字节bCSWStatus,若是0x00则一切正常,否则就要找原因了。
U盘的访问流程
使用软件工具Bus Hound监测PC对U盘访问的整个过程如下:(对端点、地址的设置)->Inquiry->Read Format Capacities->Read Capacity->Read10(0x00 Block)…然而实际使用时在对端点和地址设置正确的前提下,直接使用READ10指令读取U盘也是没有任何问题的。
另外有些U盘在设置地址时会出错,这时只需将端口重置,再设置一次地址即可。

USB读取U盘数据技术文档
USB通信与Mass Storage协议
相关描述符和设置
对于U盘此类的大容量存取介质,USB一般是使用Mass Storage协议来进行通信的。然而在使用Mass Storage协议通信之前主机需先获取设备的相关信息,并进行一些设置。
对于读取U盘所用的Mass Storage协议而言,端点描述符和传输协议是需要关注的。传输协议一般有CBI(Control/Bulk/Interrupt Protocol)和Bulk_Only Transport两种,并且在同种传输方式下又分多种指令集。而U盘一般常用Bulk_Only传输方式和SCSI指令集。
Bulk_Only的传输方式中需要用到Bulk_In和Bulk_Out两个端点,而对于不同U盘,这两个端点号是不尽相同的。所以首先要获取Bulk_In和Bulk_Out这两个端点号,方可进行USB的正常通信。
Mass Storage协议与Bulk_Only传输协议
Mass Storage协议中包括CBI和Bulk_Only两种传输协议,但后者较为简单也比较常用。
Bulk_Only传输协议是将指令和数据按照一定的格式进行封装,其格式如下:CBW(Command Block Wrapper)->[DATA]->CSW(Command Status Wrapper)。CBW是主机向U盘发送指令的命令封包,U盘在接受到CBW后根据相应的指令集对命令解析,作出回应。或向主机发送数据,或接受数据,或不进行任何数据操作。完成数据部分的操作后,U盘会向主机发送CSW,以反馈命令的执行情况。
CBW(Command Block Wrapper)
主机通过这个包来通知U盘做何种操作以及传递的数据量。CBW是以0x55534243(Little Endian)开始。CBW中的数据项dCBWTAG可以任意取,在CSW中会返回同样的数据以作验证用。dCBWDataTransferLength表征之后传输DATA的长度,该长度根据不同指令返回数据的多少来决定。若是使用READ10指令来读取U盘,则可以赋值为0x200。bmCbWFlags指示了数据传输的方向。主机读数据为0x80,写则为0x00。bCBWLUN是指分区号,一般U盘只有一个分区,写入0x00即可。bCBWCBLength是其后CBWCB(指令)的有效长度,由于CBW的长度固定为31Byte,不足的部分将由0x00填充。CBWCB因具体指令集而异,一般U盘使用SCSI。也有些使用UFI,但UFI是基于SCSI指令集的,因而会发现一些常用的指令是完全一样的。
在CBWCB中常用的SCSI指令的数据结构中有一项Logical Unit Number可以忽略,使用0x00来填充。这是由于现在使用的SCSI指令集通常是指SCSI-2,而Logical Unit Number是为了和SCSI-1兼容用的。另外还需注意的是对于其后的多个字节的数据项如地址,都是以低字节作为高位的(Big Endian),与整个命令包中各项的以低地址开始(Little Endian)有所区别。
DATA包
DATA包没有任何特殊之初,仅仅只包含数据而已。不过对于指令PREVENT-ALLOW MEDIUM REMOVAL和TEST UNIT READY是没有数据包的。接受完CBW后,U盘会直接返回CSW。
CSW(Command Status Wrapper)
CSW是U盘对执行指令的反馈,其长度为13个字节。若是以0x55535342开始则表明CSW是正常的,当然还要对比一下CBW包的dCBWTag和此处的dCSWTag是否一致,以及dCSWDataResidue的剩余长度是否正确。特别需要关注的是最后一个字节bCSWStatus,若是0x00则一切正常,否则就要找原因了。
U盘的访问流程
使用软件工具Bus Hound监测PC对U盘访问的整个过程如下:(对端点、地址的设置)->Inquiry->Read Format Capacities->Read Capacity->Read10(0x00 Block)…然而实际使用时在对端点和地址设置正确的前提下,直接使用READ10指令读取U盘也是没有任何问题的。
另外有些U盘在设置地址时会出错,这时只需将端口重置,再设置一次地址即可。

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: