USB Mass Storage协议分析

目录

  1. 简介
  2. 指令数据和状态协议
    1. CBW指令格式
    2. CSWCommand Status Wrapper状态格式
  3. SCSI命令集
    1. Format Unit
    2. Inquiry
    3. MODE SELECT

简介

USB Mass storage Device协议即海量存储设备协议适用于硬盘,U盘等大容量存储设备。协议使用的接口端点有BulkIn、BulkOut和Interrupt端点。该设备类又包含6个独立的子类以及3种传输协议。

bInterfaceSubClass 命令集 描述
01h RBC 通常,FlashDevice使用RBC,事实上所有大容量存储设备都可使用RBC
02h SFF-8020i,MMC-2(ATAPI) 适用硬盘,C/DVD
03h QIC-157 适用磁盘
04h UFI 适用软盘
05h SFF-8070i 适用移动存储设备
06h SCSI 目前绝大多数USB Mass Storage设备都使用SCSI指令集
bInterfaceProtocol 协议实现 描述
00h Control/Bulk/Interrupt protocol(含命令完成中断) USB海量存储类CBI传输,只适用于全速
01h Control/Bulk/Interrupt protocol(不含命令完成中断) USB海量存储类CBI传输,只适用于全速
50h Bulk-Only传输 Bulk-Only传输

本文仅介绍SCSI子类下Bulk-Only的传输协议,我们手中的U盘就是遵循SCSI协议的。要知道U盘不仅仅是USB设备,它还是一种存储设备,类似硬盘,USB协议本身没有定义对存储设备操作的指令,所以需要通过SCSI来完成读写等操作。关于此类设备的描述符不再赘述,需要注意的是在interface描述符中:

  • bInterfaceClass = 0x08
  • bInterfaceSubClass = 0x06
  • bInterfaceProtocol = 0x50

指令、数据和状态协议

CBW指令格式

CBW(Command Block Wrapper)的长度为31个字节,具体定义如下图:

  • dCBWSignature: 
            CBW的标识,固定值:43425355h (little endian)。
  • dCBWTag: 
            主机发送的一个命令块标识,设备需要原样作为dCSWTag(CSW中的一部分)再发送给Host;主要用于关联CSW到对应的CBW。 
  • dCBWDataTransferLength: 
            本次CBW命令要求在命令与回应之间传输的字节数。如果为0,则不传输数据。
  • bmCBWFlags: 
            反映数据传输的方向,0x00 表示来自Host,0x80 表示发至Host; 
  • bCBWLUN: 
            对于有多个LUN逻辑单元的设备,用来选择具体目标。如果没有多个LUN,则写0。
  • bCBWCBLength: 
            命令的长度,范围在0~16.
  • CBWCB: 
            传输的具体命令,符合bInterfaceSubClass.中定义的命令规范,此处是SCSI指令集
CSW(Command Status Wrapper)状态格式

CSW的长度为13个字节,是对应CBW指令的状态返回,它指示了上一条指令执行是否成功,具体定义如下:

  • dCSWSignature: 
            CSW的标识,固定值:53425355h (little endian)
  • dCSWTag: 
            设置这个标识和CBW中的dCBWTag一致,参照上面关于dCBWTag的解释
  • dCSWDataResidue: 
            还需要传送的数据,此数据根据dCBWDataTransferLength-本次已经传送的数据得到 
  • bCSWStatus: 
            指示命令的执行状态。如果命令正确执行,bCSWStatus 返回0 ,不正确返回1,phase错返回2(当HOST收到此错误时需要对Device复位)

SCSI命令集

SCSI(Small Computer System Interface)的指令集有很多,参考http://en.wikipedia.org/wiki/SCSI_command ,其中USB Mass Storage主要用到的指令有:

  • 04H Format Unit:格式化存储设备
  • 12H Inquiry:获取设备信息
  • 55H Mode Select:HOST用来设置外设参数
  • 5AH Mode Sense:返回参数
  • 28H/A8H Read(10)/Read(12):从设备读取数据
  • 25H Read Capacity:读取设备容量
  • 23H Read Format Capacity:读取当前设备容量和可格式化的容量
  • 1EH Prevent/Allow Medium Removal:写保护
  • 03H Request Sense:获取状态信息
  • 2BH Seek(10):为设备分配地址
  • 1DH Send Diagnostic:硬件复位并执行诊断
  • 00H Test Unit Ready:查询设备是否ready
  • 2AH/AA Write(10)/Write(12):写数据到存储设备
  • 2EH Write and Verify:写数据到存储设备并校验
Format Unit

Bit Byte


7


6


5


4


3


2


1


0


0


04H


1


LUN


FmtData


CmpList


Defect List Format


2


Vendor-specific


3


Interleave (MSB)


4


Interleave (LSB)


5—6


保留


7


Parameter List Length (MSB)


8


Parameter List Length (LSB)

  • Interleave:默认为0,对于USB-FDU此值为1
  • Parameter List Length:参数列表长度,典型值为12bytes,Host发出Format命令后紧接着发参数

Parameter List


Bit Byte


7


6


5


4


3


2


1


0


0


Reserved


1


FOV


Extend(0)


DCRT(1)


SingleTrack


Reserved


Immediate


Side


2


Defect List Length (MSB) (0)


3


Defect List Length (LSB) (8)


4—7


MSB                        Number of Blocks


8


Reserved


9—11


MSB                        Block Length

  • FOV:当DCRT或Immediate置1时,此位也须置1
  • DCRT:置1表示无需对盘符进行认证,须置1
  • SingleTrack:置1表示只对指定Format Unit命令指定的Track格式化
  • Immediate:置1时,device必须立刻返回状态信息,不支持UFI设备
  • Side:对SingleTrack有效,置1从顶部开始格式化,置0从底部开始格式化

注意:Number of Block和Block Length的值要与Read Format Capacity的返回相匹配

Inquiry

Bit

Byte


7


6


5


4


3


2


1


0


0


12H


1


LUN


Reserved


EVPD(0)


2


Page Code


3


Reserved


4


MSB                        Allocation Length


5—11


Reserved

  • Page Code:需要查询的页码,对于UFI设备仅支持00H
  • Allocation Length:定义了需要查询和返回的最大字节数

标准INQUIRY返回数据


Bit

Byte


7


6


5


4


3


2


1


0


0


Reserved


Peripheral Device Type


1


RMB


Reserved


2


ISO Version(00h)


ECMA Version(00h)


ANSI Version (00h)


3


Reserved


Response Data Format


4


Additional Length (31)


5—7


Reserved


8—15


Vendor Information


16—31


Product Identification


32—35


Product Revision Level

  • Peripheral Device Type:标识当前连接逻辑单元的类型,00H为直接存储设备,05H为光盘
  • RMB(Removable Media Bit):置1表示是可移除设备
  • Response Data Format:UFI设备置1
  • Additional Length:参数长度,UFI设备此值为1FH
MODE SELECT

Bit

Byte


7


6


5


4


3


2


1


0


0


55H


1


LUN


PF


Reserved


SP


2—6


Reserved


7—8


MSB                       Parameter List Length


9—11


Reserved

  • PF:UFI设备置1
  • SP(Save Pages):UFI设备不支持
  • Parameter List Length:参数长度

MODE SENSE


Bit

Byte


7


6


5


4


3


2


1


0


0


5AH


1


LUN


Reserved


DBD


Reserved


2


PC


Page Code


3—6


Reserved


7—8


MSB                       Parameter List Length


9—11


Reserved

    • DBD - Disable Block Descriptors - if "1" then the target must not return any block descriptors
    • PC - Page control -
      • 00 - return current values
      • 01 - return changeable values
      • 10 - return default values
      • 11 - return saved values
    • Page Code - 参考 SCSI mode pages

      PREVENT-ALLOW MEDIUM REMOVAL


      Bit

      Byte


      7


      6


      5


      4


      3


      2


      1


      0


      0


      1EH


      1


      LUN


      Reserved


      2-3


      Reserved


      4


      Reserved


      Prevent


      5-11


      Reserved

      Prevent:置1表示禁止移除设备

      READ(10)


      Bit

      Byte


      7


      6


      5


      4


      3


      2


      1


      0


      0


      28H


      1


      LUN


      DPO(0)


      FUA(0)


      Reserved


      RelAdr(0)


      2-5


      Logical Block Address


      6


      Reserved


      7—8


      MSB                       Transfer Length


      9—11


      Reserved

      READ(12) A8H的Transfer Length为32位,从6-9字节

      READ CAPACITY


      Bit

      Byte


      7


      6


      5


      4


      3


      2


      1


      0


      0


      25H


      1


      LUN


      Reserved


      RelAdr(0)


      2-5


      Logical Block Address(0)


      6-7


      Reserved


      8


      Reserved


      PMI(0)


      9—11


      Reserved

      此命令返回8个字节,0-3表示最后一个逻辑块的地址,4-7表示每个逻辑块的长度

      READ FORMAT CAPACITIES


      Bit

      Byte


      7


      6


      5


      4


      3


      2


      1


      0


      0


      23H


      1


      LUN


      Reserved


      2-6


      Reserved


      7-8


      Allocation Length


      9-11


      Reserved

      Allocation Length:定义了HOST能够接收的最大格式化数据长度

      REQUEST SENSE


      Bit

      Byte


      7


      6


      5


      4


      3


      2


      1


      0


      0


      03H


      1


      LUN


      Reserved


      2-3


      Reserved


      4


      Allocation Length


      5-11


      Reserved

      Allocation Length:定义了HOST能够接收的最大格式化数据长度

      HOST每发送完一个命令,device都会通过REQUEST SENSE返回该条指令的执行结果,sense data的长度为18字节。

      标准sense data


      Bit Byte


      7


      6


      5


      4


      3


      2


      1


      0


      0


      Valid


      Error Code (70h)


      1


      Reserved


      2


      Reserved


      Sense Key


      3-6


      Information


      7


      Additional Sense Length (0AH)


      8-11


      Reserved


      12


      Additional Sense Code (Mandatory)


      13


      Additional Sense Code Qualifier (Mandatory)


      14-17


      Reserved

      Valid:表示Information域是否有效

      Information:表示出错的逻辑块地址

      SEEK


      Bit

      Byte


      7


      6


      5


      4


      3


      2


      1


      0


      0


      2BH


      1


      LUN


      Reserved


      2-5


      Logical Block Address


      6-11


      Reserved

      SEND DIAGNOSTIC


      Bit

      Byte


      7


      6


      5


      4


      3


      2


      1


      0


      0


      1DH


      1


      LUN


      PF


      Reserved


      SelfTest


      DefOfl


      UnitOfl


      2-11


      Reserved

      SelfTest:置1表示执行默认的自检,置0表示执行特殊的自检

      TEST UNIT READY


      Bit

      Byte


      7


      6


      5


      4


      3


      2


      1


      0


      0


      00H


      1


      LUN


      Reserved


      2-11


      Reserved

      VERIFY


      Bit

      Byte


      7


      6


      5


      4


      3


      2


      1


      0


      0


      2FH


      1


      LUN


      DPO(0)


      Reserved


      ByteChk(0)


      RelAdr(0)


      2-5


      Logical Block Address


      6


      Reserved


      7-8


      Verification Length


      9-11


      Reserved

      Logical Block Address:验证的起始地址

      Verification Length:验证数据的长度

      WRITE(10)


      Bit

      Byte


      7


      6


      5


      4


      3


      2


      1


      0


      0


      2AH


      1


      LUN


      DPO(0)


      FUA(0)


      Reserved


      RelAdr(0)


      2-5


      Logical Block Address


      6


      Reserved


      7-8


      Transfer Length


      9-11


      Reserved

      WRITE(12) AAH的Transfer Length为32位,从6-9字节

      WRITE AND VERIFY


      Bit

      Byte


      7


      6


      5


      4


      3


      2


      1


      0


      0


      2EH


      1


      LUN


      DPO(0)


      Reserved


      ByteChk

      (0)


      RelAdr(0)


      2-5


      Logical Block Address


      6


      Reserved


      7-8


      Transfer Length


      9-11


      Reserved

时间: 2024-10-09 16:45:38

USB Mass Storage协议分析的相关文章

USB mass storage协议

这一节主要把在实现“linux模拟U盘功能”过程中的一些调试过程记录下来,并加以解析. 一.背景知识     1.USB Mass Storage类规范概述        USB 组织在universal Serial Bus Mass Storage Class Spaceification 1.1版本中定义了海量存储设备类(Mass Storage Class)的规范,这个类规范包括四个         独立的子类规范,即:        1. USB Mass Storage Class

如何实现Linux下的U盘(USB Mass Storage)驱动

摘要 本文主要介绍了USB Mass Storage的相关的各种协议之间的关系,以及如何在Linux的USB驱动框架下实现U盘驱动 本文提供多种格式供: 在线阅读 HTML HTMLs PDF CHM TXT RTF 下载(7zip压缩包) HTML HTMLs PDF CHM TXT RTF HTML版本的在线地址为: http://www.crifan.com/files/doc/docbook/usb_disk_driver/release/html/usb_disk_driver.htm

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

http://www.crifan.com/files/doc/docbook/usb_disk_driver/release/htmls/ch02_msc_basic.html 目录 2.1. USB Mass Storage相关的协议 2.1.1. USB Mass Storage相关协议简介 2.1.1.1. USB MSC Control/Bulk/Interrupt (CBI) Transport 2.1.1.2. USB MSC Bulk-Only (BBB) Transport 2

USB Mass Storage学习笔记-STM32+FLASH实现U盘

一.内容概述 采用STM32内部自带USB控制器外加大页NAND FLASH K9F1G08U0A实现一个128M的U盘. 1.STM32的USB控制器 STM32F103的MCU自带USB从控制器,符合USB规范的通信连接:PC主机和微控制器之间的数据传输是通过共享一专用的数据缓冲区来完成的,该数据缓冲区能被USB外设直接访问.这块专用数据缓冲区的大小由所使用的端点数目和每个端点最大的数据分组大小所决定,每个端点最大可使用512字节缓冲区,最多可用于16个单向或8个双向端点.USB模块同PC主

实现Linux下的U盘(USB Mass Storage)驱动

如何实现Linux下的U盘(USB Mass Storage)驱动 版本:v0.7 How to Write Linux USB MSC (Mass Storage Class) Driver Crifan Li 摘要 本文主要介绍了USB Mass Storage的相关的各种协议之间的关系,以及如何在Linux的USB驱动框架下实现U盘驱动 本文提供多种格式供: 在线阅读 HTML HTMLs PDF CHM TXT RTF WEBHELP 下载(7zip压缩包) HTML HTMLs PDF

Android USB Connections Explained: MTP, PTP, and USB Mass Storage

Android USB Connections Explained: MTP, PTP, and USB Mass Storage Older Android devices support USB mass storage for transferring files back and forth with a computer. Modern Android devices use the MTP or PTP protocols — you can choose which one you

LINUX USB MASS STORAGE DRIVER流程图

USB storage drivers分析之一

/drivers/usb/storage/Makefile ## Makefile for the USB Mass Storage device drivers.## 15 Aug 2000, Christoph Hellwig <[email protected]># Rewritten to use lists instead of if-statements.# ccflags-y := -Idrivers/scsi obj-$(CONFIG_USB_UAS) += uas.oobj-

利用mass storage class 做免驱动usb设备.

当需要使用usb bulk传输,想让设备像串口通讯那样和PC主机通信, 通常需要自己做一个PC端的驱动,比较麻烦. 为避免在pc上编写usb设备驱动的麻烦,可以将设备做成mass storage 类的设备,使用通用的驱动. 在通讯之前设备端需要先做两件事: 1,实现mass storage 类的描述符和类请求. 2,实现必要的SCSI命令,让PC认为该设备已正常运作. 我利用修改linux中的gadget zero设备做了一个简单的设备. 如果是在裸机程序下面做,应该也差不多,直接拿芯片厂商BS