码迷,mamicode.com
首页 > 其他好文 > 详细

USB Mass Storage大容量存储的基本知识

时间:2015-03-30 10:58:23      阅读:232      评论:0      收藏:0      [点我收藏+]

标签:

摘要

【todo】待整理:Linux USB MASS Storage driver流程图

 

USB Mass Storage所对应的层次和要实现哪些东西:

图 2.1. USB Mass Storage Framework

技术分享

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

PC电脑和U盘之间的关系,以及物理上的组成,可以用下图表示:

图 2.2. PC和U盘

技术分享

 

更深入的剖析,对于普通U盘的内部结构,则是一个USB物理接口,加上对应的控制芯片(微控制器(含Nand Flash的控制器)+ USB设备控制器)和一个Nand Flash芯片:

图 2.3. PC和U盘的芯片内部结构

技术分享

 

上述PC电脑和U盘的物理关系,以群联的PS2251-50 USB 2.0 Flash Controller为例,对应的逻辑关系为:

图 2.4. PC和U盘的内部逻辑框图

技术分享

关于U盘容量,再多解释一句:一般U盘的大小,就是对应着这个Nand Flash芯片的容量,比如2GB,4GB,8GB等。当然,比如一个8GB的U盘,内部也可以用两块4GB的Nand Flash芯片来构成。

PC和U盘的之间的抽象的逻辑关系,可用下图来表示:

图 2.5. PC和USB MSC设备

技术分享

上图中,Storage Media,就是我们例子中的Nand Flash芯片。而例子中的那个控制芯片,是Microcontroller with embedded USB device controller 和Media Controller的集合。

而上图中的USB MSC(Mass Storage Class) Device,从应用领域来说,可以分为以下几类:

图 2.6. USB MSC的分类

技术分享

  而像上述例子中那样的常用的U盘,属于上图中的Flash Drive,即,物理上存储数据的介质用的是Flash Memory,比如例子中的Nand Flash芯片,对应的,Media Controller,也就是Nand Flash的Controller,负责从Nand Flash芯片中读写数据。

  USB MSC设备中的固件(firmware)或者硬件(hardware),必须要实现下面这些功能:

  1. 检测和响应通用的USB Request和USB总线上的事件。
  2. 检测和响应来自USB设备的关于信息或者动作的USB Mass Storage Request。
  3. 检测和响应,从USB Transfer中获得的SCSI Command。这些业界标准的命令,是用来获得状态信息,控制设备操作,向存储介质块中读取(read block)和写入(write block)数据的。

另外,设备如果想要向存储介质中,创建/读取/写入,文件/文件夹的话,那么就涉及到文件系统,还要实现对应的文件系统。嵌入式系统中常见的文件系统有FAT16或FAT32。

2.1. USB Mass Storage相关的协议

除了本身USB的协议之外,Mass Storage作为其中USB的一种,USB Mass Storage自己又有相关的协议,对应的协议可以去官网下载:

http://www.usb.org/developers/devclass_docs/

其中有关于Mass Storage相关的,一堆的协议:

说实话,咋一看,这么多协议,不知道驴年马月才能看完和真正理解。不过,等待了解了这些协议的关系之后,会发现,其实需要特别关注和研究的协议,并不是很多,至少很多协议可以不用太关心。

 

2.1.1. USB Mass Storage相关协议简介

凡事至少得对整体系统有个大致了解后,才能继续下一步的深入的开发。所以,我们的目的,首先是要搞懂这么多协议之间都是啥关系,以及具体写U盘驱动的话,要看哪些协议。

从上面那一堆协议的名词上,我们就能看到,第一个:Mass Storage Class Specification Overview 1.4  就是对于这么多协议的概述,其中介绍了各个协议的关系。

下面就把其中的主要内容摘出来,解释如下:

关于USB Mass Storage相关的一些协议,都是由一个叫做USB Mass Storage Class Working Group (CWG)的组织定义的,如上所述,包括下面一些协议:

  • 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)

对于这些协议,我们一个个的简单解释和分析一下:

2.1.1.1. USB MSC Control/Bulk/Interrupt (CBI) Transport

我们所关注的U盘,就是所谓的MSC设备,大容量存储设备。

U盘的功能,就是数据存储。而对应的数据传输,用的是USB中的Bulk Transfer。而Control Transfer是用来发送Class-Specific的信息和Clear Stall。而其他方面的信息交换,是用Bulk-only协议。

而对于CBI,算是Bulk-only的替代品,也可以用来信息交换,但是只能用于full-speed的软盘(Floppy drive),也不推荐将CBI用于其它新出的MSC设备上。

【总结】USB MSC Control/Bulk/Interrupt (CBI) 主要用于Floppy设备,对于我们关心的U盘,用不到,不需要太关心,可以忽略之。

 

2.1.1.2. USB MSC Bulk-Only (BBB) Transport

如上所述,Bulk-only是USB设备端,此处的U盘和USB Host端,即普通PC,之间信息交换的协议。

Bulk Only Transport,也被简称为BOT。

2.1.1.2.1. 为何USB MSC中Bulk-only Transport被叫做 BBB

USB MSC中的Bulk-Only 常被叫做BBB,是相对于前面所说的CBI来说的。

看起来,USB MSC的CBI,是Control/Bulk/Interrupt的简写,但是其具体含义是:

  1. Control

    Control端点用于,除了传送标准的USB请求之外,还用于通过Class-specific的请求,将命令块(command block)传给设备;即Control端点传送命令块

  2. Bulk

    Bulk In和Bulk Out端点用于在主机(Host)和设备(Device)之间数据的传输。即,Bulk用于传送数据

  3. Interrupt

    Interrupt端点用于(设备向主机)通知命令完成。即Interrupt用于传送状态信息

因此,上面的USB MSC的Control/Bulk/Interrupt,才被简称为CBI。

和CBI中的用三种不同的端点来传送三种类型的信息,而不同的是,Bulk-only传送这些全部的信息,都之用Bulk端点。

即用Bulk端点来传送命令块,数据,状态,因此,才类似于Control/Bulk/Interrupt被简称为CBI一样,而Bulk/Bulk/Bulk被简称为BBB。 

【总结】USB MSC传输协议分CBI和BOT,而BOT又称为BBB。

 

2.1.1.2.2. 为何已经有了CBI,又再弄出个BBB

既然,对于USB MSC设备来说,USB设备和USB主机之间的通信,已经定义了一个CBI规范,那么为何还要再新定义一个Bulk-only(BBB)呢?

我的理解是,那是因为,最开始USB协议定义的时候,那时候市场上的Floppy Disk还是用的很多的。所以针对Floppy设备特点,分别定义了多个端点来传输不同的信息,即Control端点传命令块,Bulk传数据,Interrupt传状态信息,

而后来计算机行业的发展了,Floppy类的设置很少用了,存储数据的话,多数开始用Flash Memory了,再加上通过合理规划,可以用同一种端点,即Bulk端点,传输上述三种信息,即命令块,数据,状态,因此,只需要物理上实现一个Bulk端点,节省掉了其他两个端点:Control端点和Interrupt端点,达到了物理上实现起来方便和节省资源,而达到同样的信息传输的目的。

此部分理解,有待进一步考证。 

【总结】USB MSC Bulk-Only (BBB) 协议,是我们要重点关注的对象。因为我们的U盘和USB主机(PC端)直接信息交互,主要是用此协议。

 

2.1.1.3. USB MSC UFI Command Specification

UFI,即Universal Floppy Interface,因此看名字就知道,是关于软盘的。此USB MSC UFI规范,定义了UFI命令集合(Command Set),设计出来此规范,就是用于软盘的。此UFI命令集合,是基于SCSI-2 和SFF-8070i命令集合的。 

【总结】看完上面的解释,就明白了,我们此处关心的是U盘,是USB Flash Memory类型的,不是Floppy Disk类型的,所以,此处也可以不关心,暂忽略之。

 

2.1.1.4. USB MSC Bootability Specification

目前常见的电脑启动,很多都是从MSC大容量存储设备中启动的,比如硬盘。因此,设计了这个规范,以使得操作系统可以从USB MSC设备上启动。关于此规范的具体内容,主要是定义了一些命令和相关的一些数据的定义。即,如果你想要实现让操作系统从你的这个MSC设备启动,那么你就要实现对应的CDB(Command Descriptor Block,命令描述符块)或者Data数据。 

【总结】我们主要关心U盘如何和主机数据交互,暂不关心是否能否从此U盘启动,所以也可不太关心,暂忽略之。

 

2.1.1.5. USB MSC Compliance Test Specification 

【总结】无须多解释,看名字就知道,是一个关于兼容性测试的规范,和我们此处所关心的U盘和主机的数据交互,关系不大,暂忽略之。

 

2.1.1.6. USB Lockable Storage Devices Feature Specification

“Lockable Storage Devices Feature Specification”,简称为 LSD FS。“Lockable”的意思是,可锁定,即锁定以防止其他人访问或者写入,即变成只读,甚至不允许其他人再访问。说白了就是对USB存储设备的安全控制方面的规范。

而基于目前还没有一个标准的规范去定义,如何去控制那些对于USB存储设备的访问,所以此处才定义了一个这么个和访问控制相关的协议。此协议可实现允许主机Host或者设备Device去锁定Lock或者解锁Unlock 对应的存储设备。 

【总结】和安全存储和权限控制相关的协议,我们此处也是暂不关心,可忽略之。

 

2.1.1.7. USB MSC USB Attached SCSI Protocol (UASP)

“Attached”顾名思义,是附在某个上面的,此处即附在SCSI协议的上面的,即SCSI协议的补充部分。UASP规范,定义了关于如何在USB 2.0和USB 3.0中,UAS的传输标准是如何实现的,并且给出了一些范例和一些推荐的做法。

2.1.1.7.1. 已有SCSI协议,为何还要再弄一个UASP

既然已经有了对应的SCSI协议,用于发送对应命令,实现对应功能。作为U盘等应用的话,直接实现对应的协议,符合对应的规范,不是也就可以实现对应功能了吗,为何还要另外再弄出一个SSCI的附属协议UASP?

那是因为,原先的BOT(Bulk Only Transport),虽然协议简单已实现,适合用于大容量存储设备中,但其就像一个单线程,不能同时并行执行多个传输。即,对于BOT,每一个由Host发起数据传输(transaction),都必须等待设备完成,然后设备再返回对应的已完成状态信息,然后才能开始下一次数据传输。这样的话,对于整个数据传输过程的话,就造成了一个很大(大概有20%)的浪费(overhead)。

而对于USB 3.0来说,速度从USB 2.0的480Mb/s变成了 5.0Gb/s,而如果继续用BOT的话,那么相对来说CPU性能的利用率很低,USB传输速度也不太高,例如,有研究表明,2.4 GHz Core Duo™的CPU,利用率只要大概12%,CPU传输速度只有大约250MB/s,而USB 3.0的理论速度是5.0Gb/s=640MB/s,即还不到理论最大速度的一半。

因此,才有了这个UASP,对于SCSI协议进行了补充,以提高USB 2.0的USB总线利用率,和充分利用USB 3.0的全双工能力,可以使得传输速度达到大约400MB/s。此新的协议UASP的实现,也需要对应的新的Host端的软件,新的Device端的固件(Firmware)。

为了实现设备的向后兼容性,Device同时支持BOT和UAS。而此UASP规范,定义了就是如何在USB 2.0和USB 3.0上实现对应的UAS协议。

当Host和Device都实现了此UAS协议的话,那么Host将通过Host端的SCSI Software Stack去访问Device,而USB的Interface也将从功能上看,变成Host Stack中的另外一个SCSI Host Adapter。Device需要实现SAM4的架构模型,这样Host也就可以查询(Queue)Device中的命令了,以及对应性能的提升。 

【总结】为了克服旧的BOT协议的总线利用率不高的缺点,所以定义了新的UAS协议,即UASP,来提升USB的传输效率,提升USB速度。当然,我们此处为了实现U盘功能的话,当然希望性能越高越好了,所以,这个协议也是我们应该好好研究的。

 

2.1.2. USB MSC的各个协议之间关系总结

为了说明清楚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)

直接用图来表示USB MSC各个协议之间的关系,显得更加直观:

图 2.7. USB Storage Class Protocol Relation

技术分享

如上图,我们U盘实现的功能,主要就是数据的读写,而Device和Host之间的数据通信,主要有两种:

  1. CBI:主要用于Floppy设备,所以新的设备,都很少用此协议
  2. BOT:Bulk-Only Transport,也称BBB(Bulk/Bulk/Bulk),

而对于BOT/BBB来说,对其提高USB总线利用率,提高了USB速度后,就是对应的UASP协议,故此处称UASP为BOT的增强版的协议。

协议方面说完了,再来看看USB Device这一端。

而USB的Device端,根据内部数据存储的介质类型不同,又分两种:

  1. 一种是Floppy设备,对应用的是UFI Command Set;
  2. 而另外一种,就是我们常见的Flash Memory,对应的是用SCSI Command Set。

而SCSI协议,本身就是有的了,所以不是属于USB MSC协议范畴,即SCSI只是和USB MSC相关的协议。

同样的,对于USB Device本身,如果需要一些用到其他的特性,比如可启动性,兼容性,可锁定性等等,那么分别对应的规范是

④USB Mass Storage Class Bootability Specification

⑤USB Mass Storage Class Compliance Test Specification

⑥USB Lockable Storage Devices Feature Specification (LSD FS) 

【总结】至此,各个协议和规范之间的关系,就很容易理解了。上面这么多协议中,其中我们所要关心的,只有三个规范,如前面的图中,已经用星号标识出来了:

  1. 最需要关心的是BOT,即Host和Device间数据通讯的协议

    ★★★ ②USB Mass Storage Class Bulk-Only (BBB) Transport

  2. 其次,需要关心USB Device内部和数据存储介质之间通信的协议

    ★★ SCSI - Small Computer System Interface

  3. 最后,对于,如果要实现更好的性能,那么需要关心BOT的升级版

    ★⑦USB Mass Storage Class USB Attached SCSI Protocol (UASP)

 

2.1.3. U盘与USB中的Class,Subclass和Protocol的对应关系

对应的,了解USB的都知道,每个设备的描述符中,都有对应下面这几个域:

  • bInterfaceClass
  • bInterfaceSubClass
  • bInterfaceProtocol

分别对应着USB的Class,Subclass,Protocol。

而对于我们此处的U盘:

2.1.3.1. bInterfaceClass=0x08=Mass Storage

Class就是USB Mass Storage Class,

2.1.3.2. bInterfaceSubClass=0x06=SCSI Transparent

Subclass,所支持的列表如下:

图 2.8. SubClass Codes Mapped to Command Block Specifications

技术分享

2.1.3.3. bInterfaceProtocol=0x50=Bulk Only Transport

Protocol,所支持的列表如下:

图 2.9. Mass Storage Transport Protocol

技术分享

从上面这些规范中所定义的支持的协议来看,加上颜色框的那几个,也就是我们前面所解释过的,需要我们关心和研究的协议,即SCSI,BBB和UAS。

USB Mass Storage大容量存储的基本知识

标签:

原文地址:http://www.cnblogs.com/heiyue/p/4377192.html

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!