电子工程师名片——UFI Command,USB盘符的显示
USB Mass Storage类规范概述
USB Mass storage Device协议即海量存储设备协议适用于硬盘,U盘等大容量存储设备。协议使用的接口端点有BulkIn、BulkOut和Interrupt端点。该设备类又包含6个独立的子类以及3种传输协议。
Bulk- Only 传输规范仅仅使用Bulk 端点传送数据/命令/状态,CBI 传输规范则使用Control/Bulk/Interrupt 三种类型的端点进行数据/命令/状态传送。
我们手中的U盘就是遵循SCSI协议的。要知道U盘不仅仅是USB设备,它还是一种存储设备,类似硬盘,USB协议本身没有定义对存储设备操作的指令,所以需要通过SCSI来完成读写等操作。
Microsoft Windows 中提供对Mass Storage 协议的支持,因此USB 移动设备只需要遵循 Mass Storage 协议来组织数据和处理命令,即可实现与PC 机交换数据。而Flash 的存储单元组织形式采用FAT16 文件系统,这样,就可以直接在Windows的浏览器中通过可移动磁盘来交换数据了,Windows 负责对FAT16 文件系统的管理,USB 设备不需要干预FAT16 文件系统操作的具体细节。
USB成功枚举之后会在设备管理器上面显示USB MassStorage Device(且带有黄色感叹号),否则会显示unknow device,而只有在进行UFI(具体是在inquiry命令之后)通讯之后主机才会显示盘符,且本来在设备管理器中USB MassStorage Device上的黄色的感叹号消失。
因为这个时候USB设备已经枚举成功(主机发送的GetDescriptor、SetAddress等之类的请求都回复成功才能正确的枚举),所以可以通过BusHound来查看在USB UFI Command的情况,USB设备的枚举都是通过端点0来实现,而USB UFI Command都是通过端点1来实现,所有的命令的数据流都在端点1。除了BusHound之外,还有很多查看USB总线数据的软件,例如USB View等,查看Flash数据的软件有winhex。
枚举过程CATC仪器抓取数据的文件:http://download.csdn.net/detail/luckywang1103/6315437 usbUFI.usb
1、GetMaxLun(0xFE)
1)Setup Stage
2)Data Stage
3)Status Stage
以上这个阶段对应的程序是
case GetMaxLun:
//实际上对U盘来说,忽略该步骤也没有影响
//要求设备返回一个字节给主机,以表明USB设备有多少个
//逻辑设备,返回的数据就是这个最大设备逻辑号(0到15)
//如果返回2,代表有0、1、2三个逻辑设备
SFR_Write(FIFO0,0x00);
SFR_Write(E0CSR,0x0a);
break;
接下来开始在端点1进行UFI Command传输
UFI Command构成如下:CBW—>数据—>CSW,三个阶段
CBW:Command Block Wrapper 命令块数据包
CSW:Command Status Wrapper 命令执行状态
2、Inquiry Command(0x12)
1)CBW
主机在端点1所发出的UFI Command的DATA0数据可以对照图Table 5.1进行解析。
dCBWSignature:55 53 42 43 help identify this data packet as CBW
dCBWTag:90 C8 E8 88 Command Block Tag send by host
dCBWDataTransferLength:24 00 00 00 data numbers that host expect to transfer on the Bulk-In or Bulk-Out endpoint
剩余的12 Bytes就是CBWCB:12 00 00 00 24 00 00 00 00 00 00 00
CBWCB(CBW里面的command block)12个字节的解析参考《USB Mass Storage Class-UFI Command Specification》
12:Inquiry Command
24:Allocation Length specifies the maximum number of bytes of inquiry data to be returned,数据阶段最大传送36 Bytes
2)Data In
这36 Bytes是按照Inquiry data的格式要求返回的,具体协议数据的分析参考《USB Mass Storage Class-UFI Command Specification》
3)CSW
dCSWSignature:55 53 42 53 help identify this data packet as CSW
dCSWTag:90 C8 EB 88 CSW的这个字段同CBW的dCBWTag字段
3、Read_Format_Capacity(0x23)
1)CBW
2)Data
3)CSW
4、Read_Capacity(0x25)
1)CBW
2)Data
3)CSW
5、Read_10(0x28)
上面几个请求如果均正确返回,Host会发出Read读文件系统0簇0扇区的DBR数据,进入文件系统识别阶段。
1)CBW
2)Data
3)CSW
6、ModeSense6(0x1A)
1)CBW
2)Data
3)CSW
7、重复第6步,ModeSense6(0x1A)
8、重复第4步,Read_Capacity(0x25)
9、重复第4步,Read_Capacity(0x25)
10、重复第5步,Read_10(0x28)
11、重复第5步,Read_10(0x28)
12、重复第4步,Read_Capacity(0x25)
13、重复第4步,Read_Capacity(0x25)
14、重复第5步,Read_10(0x28)
15、Test Unity Ready(0x00)
1)CBW
3)CSW
16、重复第4步,Read_Capacity(0x25)
17、重复第4步,Read_Capacity(0x25)
18、重复第4步,Read_Capacity(0x25)
19、重复第5步,Read_10(0x28)
20、接下来一直会重复Test Unity Ready(0x00)
说明:
MASS Storage设备所使用的SCSI命令集
0x00: testUnityReady
0x03: Request Sense
0x12: Inquiry
0x1A: ModeSense6
0x1B: StartStop
0x1E: MediumRemoval
0x23: ReadFormatCapacity
0x25: ReadCapacity
0x28: Read10
0x2A: Write10
0x2F: Verify
0x5A: ModeSense10
主机首先发出Inquiry命令,响应了Inquiry之后就可以看到盘符.
Inquiry之后会发出ReadFormatCapacity命令,这个命令在SCSI规范中是“厂家自定义命令”,可以参考UFI命令集文档(实际上,U盘所使用的所有SCSI命令集都可以参考UFI文档,它比SCSI标准文档更简洁明了)。注意这个命令在BusHound里是没有描述的,必须在“Device”选项页里勾选上这个U盘所对应的USB Mass Storage Device这个节点,才能看到这个命令的数据流。
ReadFormatCapacity之后会发出ReadCapacity命令。
U盘读数据(读扇区)时会发送Read(10)。ReadCapacity完成后就会发送Read(10)读取U盘的第一个扇区。
U盘写数据时(写扇区)会发送Write(10)。
TestUnitReady会在无其他数据传输时会定时发送,如果设备没有回应成功的CSW给主机,则主机认为设备已不存在。此时如果再双击磁盘图标,Windows会提示“请插入磁盘”。
Verify在写数据时有用,表示核实数据,一般直接返回成功的CSW就可以了。一般来说,数据校验的工作在接收和向介质写数据时就已经顺带做了,如果发现错误,则直接告诉主机那次的数据传输有误,不会等到主机Verify时。当然,这不是一个必然的方案。
RequestSense:如果CSW指示此次传输不成功,那么主机会发出此请求。
StartStop暂时未发现大用处,一般直接返回成功的CSW。
MediumRemoval在U盘被Eject的时候有用,处理不正确会Windows会弹出错误信息。
ModeSense6/10这两个命令可以不支持(不支持不代表不反应,任何一个命令你都要做出反应,对于不支持的命令,可以通过STALL握手来向主机表明),暂时也未遇到过什么异常情况,而且我查看过一些U盘,有相当一部分就是随便回了几个数据给主机。这两个命令只会在U盘插入后发送一次,此后不再发送。
电子工程师名片——UFI Command,USB盘符的显示的更多相关文章
- 电子工程师名片——FAT16文件系统(转)
源:电子工程师名片——FAT16文件系统 从8月8号开始,连续一个月利用每天下班时间和周末的时间终于初步完成了一个电子工程师的电路板名片,就像U盘一样,不过这个FLASH只有64KB的大小,用的单片机 ...
- java显示本地磁盘所有盘符,显示桌面路径
import java.io.File; import javax.swing.filechooser.FileSystemView; /** 显示本地磁盘根盘符,显示桌面路径 */ public c ...
- 电子工程师名片——FAT16文件系统
从8月8号开始,连续一个月利用每天下班时间和周末的时间终于初步完成了一个电子工程师的电路板名片,就像U盘一样,不过这个FLASH只有64KB的大小,用的单片机是C8051F320,是一个USB型的单片 ...
- 电子工程师名片——SPI NOR Flash
使用了MX25L512的SPI接口的Flash 电路连接图: 总的大小512kb,即64kB,sector的大小为256 Bytes,block的大小为4k Bytes 调试时出现的问题: 1.Fla ...
- 让虚拟机的软盘盘符不显示(适用于所有windows系统包括Windows Server)
- Win10 隐藏盘符
1.隐藏盘符 打开磁盘管理 -> 对要隐藏的盘符单击右键 -> 更改驱动器号和路径 -> 删除. 打开资源管理,已经看不到该盘符,该盘符已被隐藏.只是隐藏,该盘符上的数据仍然还在. ...
- 真相:中国版BBB用USB连电脑没有盘符的根本原因分析
很多网友在问:为什么中国版的装完驱动插上板子没有显示端口号和69M的盘符??楼主发现,在开机启动的时候,加载g_multi模块时出现错误提示 invalid argument. Emb ...
- Windows下USB磁盘开发系列一:枚举系统中U盘的盘符
个时候我们需要区分系统磁盘中,哪些是U盘,这样我们在访问的时候可以区别对待.具体方法如下: 1,调用GetLogicalDrives()返回系统盘符标记位 API GetLogicalDrives() ...
- 外网远程顶级域名连接群晖的WebDAV文件服务映射盘符
外网远程顶级域名连接群晖的WebDAV文件服务映射盘符 https://www.cnblogs.com/delphixx/p/11846546.html 电子文件管理规范 1.手机拍照截屏 ...
随机推荐
- linux----设置、添加别名(alias,unalias)
以下的说明针对centOS. 查看当前的别名 在命令行下,直接输入alias来查看. 添加临时的别名 方法为:alias[别名]=[指令名称] 该方法只是临时的,仅对当前终端有效,因此重启系统或在其他 ...
- ActionResult解析
原文地址:http://blog.csdn.net/gulijiang2008/article/details/7642213 ActionResult是一个抽象类, 在Action中返回的都是其派生 ...
- linux中patch命令 -p 选项
patch命令和diff命令是linux打补丁的成对命令,diff 负责生产xxxxx.patch文件,patch命令负责将补丁打到要修改的源码上.但是patch命令的参数-p很容易使人迷惑,因为对- ...
- UVALive 6190 Beautiful Spacing (2012 Tokyo regional)
Beautiful Spacing 题意是给一个文本排版,求在满足题目所给要求的条件下,最长连续空格最小是多少. trick: 贪心地模拟是错的,至少无法证明正确性. 正解应该是二分答案+验证. 比较 ...
- python学习之路-2 初识python数据类型
数字 int(整型) 在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1,即-2147483648-2147483647 在64位系统上,整数的位数为64位,取值范围为-2** ...
- springmvc工作原理和环境搭建
SpringMVC工作原理 上面的是springMVC的工作原理图: 1.客户端发出一个http请求给web服务器,web服务器对http请求进行解析,如果匹配DispatcherServle ...
- PHP连接sql server 2005环境配置
一.Windows下PHP连接SQLServer 2005 设定:安装的Windows操作系统(Win7 或XP均可.其它系统暂未測试),在C盘下:PHP的相关文件位于c:/PHP以下,其配置文件ph ...
- 面试前的准备---C#知识点回顾----02
经过昨天大量的简历投递,今天陆续收到面试邀约,明日准备大战一场,是死是活一试便知 1.数据库的范式 这算入门问题了吧,但凡是个数据库类的,都得问吧, 但我们在回答的时候开始背书啦 第一范式(1NF)无 ...
- MongoDB学习笔记06
在shell中删除一个集合,执行db.test.drop()或者db.runCommand({"drop":"test"}),在MongoDB中命令其实是作为一 ...
- oracle 初探内存结构
数据库的存储机构 分为 逻辑存储结构 和 物理存储结构 逻辑存储结构: 数据库.表空间.段.区.块 物理存储结构: 数据库.控制文件.数据文件.初始化参数文件.OS块等. 一个区只能在 ...