电子工程师名片——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盘插入后发送一次,此后不再发
送。

时间: 2024-08-29 05:07:19

电子工程师名片——UFI Command,USB盘符的显示的相关文章

java显示本地磁盘所有盘符,显示桌面路径

import java.io.File; import javax.swing.filechooser.FileSystemView; /** 显示本地磁盘根盘符,显示桌面路径 */ public class RDDemo { static File[] files; public static void main(String[] args) { FileSystemView sys = FileSystemView.getFileSystemView(); files = sys.getRo

让虚拟机的软盘盘符不显示(适用于所有windows系统包括Windows Server)

windows server 2008 R2 域中用组策略隐藏指定磁盘驱动器(盘符)

1.首先在C:\Windows\SYSVOL\sysvol\xxx.com\Policies文件夹下,创建文件夹PolicyDefinitions. 2.将%systemroot%\PolicyDefinitions\下所有文件复制到C:\Windows\SYSVOL\sysvol\xxx.com\Policies\PolicyDefinitions下. 3.修改C:\Windows\SYSVOL\sysvol\xxx.com\Policies\PolicyDefinitions\Windows

在Ubuntu Linux下制作Windows 启动安装 USB盘

最近想 ,在Ubuntu上刻录个windows的安装U盘,在网上看了些资料,不过好多都说的很模糊,于是乎,我走了不少弯路.这里记录下来,希望了帮到大家. 首先你的有个USB吧,这里我们假定USB在ubuntu中为/dev/sdb 1. 给USB设备 /dev/sdb 分区,注意,要是主分区, sudo fdisk /dev/sdb Command (m for help): n Partition type: p primary (0 primary, 0 extended, 4 free) e

USB 描述符

标准的USB设备有5种USB描述符:设备描述符,配置描述符,字符串描述符,接口描述符,端点描述符. 1 // Standard Device Descriptor 2 typedef struct 3 { 4 u8 bLength; 5 u8 bDescriptorType; 6 u16 bcdUSB; 7 u8 bDeviceClass; 8 u8 bDeviceSubClass; 9 u8 bDeviceProtocol; 10 u8 bMaxPacketSize0; 11 u16 idVe

python遍历所有盘符下的图片并拷贝下来

最近在学习python,闲着无聊就试着写啦这个小的脚本,虽然有很多不足,但是还是收获不少. 该脚本的功能: ①遍历本地计算机中的所有盘符,并将名称记录下来: ②循环遍历盘符下的所有图片(当然这里可以根据自己的需求来遍历不同类型的文件),并下载. 源代码(有不足的地方请联系我,谢谢): 1 #coding=utf-8 2 import os 3 import shutil 4 5 #返回当前工作目录 6 beforedir = os.getcwd() 7 8 def dir(way): 9 pic

Windows Server 2012修改光驱盘符

Windows Server 2012修改光驱盘符,可通过下面的步骤完成: windows+R ,输入diskmgmt.msc 这时可以看到我们熟悉的磁盘管理界面: 右击盘符,选择"更改驱动器号和路径"或"Change Drive Letter and Paths". 修改盘符:

当移动硬盘识别盘符并变成RAW打不开的解决办法

今天我的西部数据移动硬盘打不开了,里面好照片和软件还有视频,心想这下打不开可是不行,原因是昨天我把移动硬盘从这个电脑拔到别的电脑上插了,今天插到自己的电脑上就打不开了,插回昨天的电脑也打不开了,今天魅力网络亲身经历告诉大家解决办法. 这种问题症状是:电脑上显示磁盘符,但打不开了,也不显示磁盘容量 感觉打开我的电脑也卡很多. 解决办法:首先邮件我的电脑管理--磁盘管理---看一下是否显示这个移动硬盘--容量和磁盘系统是否显示---一般win7win10 会显示磁盘系统 我的win10显示磁盘系统跟

Windows Server 2008 R2控制站点隐藏并限制访问任意盘符的组策略配制方法

域控隐藏盘符的设置项 在组策略管理编辑器中,依次打开的用户配置→策略→管理模板→Windows组件→Windows资源管理器,其中有两项: 隐藏"我的电脑"中的这些指定的驱动器 防止从"我的电脑"访问驱动器 只设置* 第一项 能让盘符在资源管理器窗口中消失,但是仍然可以通过快捷方式的打开文件位置等方式进入到磁盘:同时设置 第二项 *既能够隐藏盘符,也能避免用户通过其他方式直接在资源管理器中访问磁盘. 系统默认的配置方案 在上述两项的编辑窗口选择启用,发现系统默认都只