USB Mass Storage协议

USB Mass Storage 设备协议解析:从 SCSI 到 CBW/CSW 的实战指南 本文深入解析USB Mass Storage设备的核心通信协议,详细阐述了从SCSI命令集到Bulk-Only Transport传输机制的工作原理。重点剖析了CBW(命令块包)和CSW(命令状态包)的结构与交互流程,并通过实战案例演示了U盘识别与数据读写的完整底层对话,为嵌入式USB存储设备开发和调试提供清晰指南。 阅读详情

USB Mass Storage协议

简介

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

bInterfaceSubClass命令集描述
01hRBC通常,FlashDevice使用RBC,事实上所有大容量存储设备都可使用RBC
02hSFF-8020i,MMC-2(ATAPI)适用硬盘,C/DVD
03hQIC-157适用磁盘
04hUFI适用软盘
05hSFF-8070i适用移动存储设备
06hSCSI目前绝大多数USB Mass Storage设备都使用SCSI指令集

bInterfaceProtocol协议实现描述
00hControl/Bulk/Interrupt protocol(含命令完成中断)USB海量存储类CBI传输,只适用于全速
01hControl/Bulk/Interrupt protocol(不含命令完成中断)USB海量存储类CBI传输,只适用于全速
50hBulk-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

USB_SCSI之旅 现在总结一下scsi,scsi协议有很多,所以只总结这次在usb mass storage里面用到的协议,主要包括inquiry,format , read write等等命令。   下面会一个一个总结。   U盘需要处理的命令如下:   1:inquiry:设备的一个描述,告诉host你的设备是什么,名字叫什么,用的什么协议,这里用的SCSI协议—SPC2 2:READ FORMA 阅读详情

相关推荐

U盘写流程USB协议抓包分析

u盘写流程usb协议抓包分析

暗推中... 3860

SCSI协议-SAM4/SPC4/SBC3

SCSI协议-SAM4/SPC4/SBC3

qq_41720028的博客 1001

SCSI详解 大容量存储

SCSI详解 SCSI详解 SCSI详解 SCSI详解 SCSI详解 SCSI详解 SCSI详解 SCSI详解 SCSI详解 SCSI详解

USB mass storage协议

作者:plauajoke 转自:http://blog.youkuaiyun.com/plauajoke/article/details/8537937 这一节主要把在实现“linux模拟U盘功能”过程中的一些调试过程记录下来,并加以解析。 一、背景知识      1、USB Mass Storage类规范概述         USB 组织在universal Serial

老瓦的笔记本 1924

H无穷控制学习笔记——加权灵敏度H无穷控制问题

一、加权灵敏度H无穷问题 系统结构如上图所示。被控对象P的状态空间方程为(Ap,Bp,Cp,DpA_p,B_p,C_p,D_pAp​,Bp​,Cp​,Dp​),加权函数W1的状态空间方程为(A1,B1,C1,D1A_1,B_1,C_1,D_1A1​,B1​,C1​,D1​),加权函数W2的状态空间方程为(A2,B2,C2,D2A_2,B_2,C_2,D_2A2​,B2​,C2​,D2​),加权函数W3的状态空间方程为(A3,B3,C3,D3A_3,B_3,C_3,D_3A3​,B3​,C3​,D3​)。

一饮丶一啄的博客 4350

组态王|组态王通过选择日期实现历史数据的查询

②在弹出的【插入通用控件】对话框选择【Calender Control】控件,然后点击【确定】按钮,关闭对话框,然后在画面上适当的位置按住鼠标左键并拖动,绘制出一个矩形框,放开鼠标,就完成了控件的绘制。此函数将指定的时间格式(年,月,日,时,分,秒)转换为以秒为单位的长整型数,转换的时间基准是UTC(格林尼治)1970年1月1日00:00:00。实现内容,通过两个日历控件选择开始日期和结束日期,然后点击【历史数据查询】按钮,在报表中显示对应时间段的数据集。另外你用过哪些组态软件?

做有价值的事,积累有价值的笔记! 4565

深入USB Mass Storage协议栈:用逻辑分析仪抓包分析STM32与电脑的每一次‘对话’

本文深入解析USB Mass Storage协议栈,通过逻辑分析仪抓包技术详细分析STM32与电脑的通信过程。从硬件调试环境搭建到关键通信阶段抓包,再到典型故障诊断与性能优化,提供了一套完整的USB Mass Storage协议分析方法论,特别适合STM32开发者解决U盘项目中的通信问题。

weixin_33681778的博客 429

在Ubuntu上通过Wine完美运行企业微信的详细指南

本文提供了在Ubuntu系统上通过Wine兼容层安装和运行企业微信的详细教程。针对官方未提供Linux版本的痛点,指南推荐使用Ubuntu Kylin团队优化打包的Wine环境,通过简单的命令行步骤即可完成部署,并涵盖启动、中文输入法配置、文件管理等常见问题的解决方案,帮助用户实现高效、稳定的办公沟通。

weixin_29306317的博客 232

Mass Storage

1.1        Mass Storage 1.1.1       请求过程(setup端点) 1)主机发送标准请求 2)发出两个类请求:Bulk-Only Mass Storage Reset请求、GetMaxLUN请求。   Bulk-Only Mass Storage Reset没有数据阶段,只在状态阶段告诉主机设备的Reset过程完成与否。如果在状态阶段返回ACK,那么主机就

wangww2012的博客 1547

告别软件轮询!用STM32G474的COMP比较器实现纳秒级硬件过压保护(CubeMX配置详解)

本文详细介绍了如何利用STM32G474的COMP比较器实现纳秒级硬件过压保护,通过CubeMX配置详解,展示了硬件比较器相比传统软件轮询方案在响应时间、CPU占用和可靠性等方面的显著优势。文章还提供了实战配置流程和优化技巧,帮助工程师快速构建高效的硬件保护系统。

weixin_28683689的博客 351

Codex 实战 Skills:用 Skill 自动识别并提取 PDF/图片表格数据,效率提升 10 倍

本文介绍如何构建一个多模态文件解析 Skill,用于自动识别和提取 PDF/图片中的表格数据,提升 AI 智能体处理非结构化文档的效率。文章分析了传统方法的局限性,提出分层解析架构(预处理、检测、提取推理、后处理),推荐技术栈包括 pdfplumber、OpenCV 和多模态大模型。详细说明了 Skill 的元数据定义、数据模型设计(使用 Pydantic)和核心实现流程,通过混合策略实现从复杂文档到结构化 JSON/Markdown 的转换,使 AI 代理具备"阅读"多模态文档的能力。

yueyeguzhuo的专栏 306

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 ...

weixin_30273763的博客 555

USB 网卡——RNDIS 控制消息流程

在其控制端点上获取控制消息时,设备必须在通信类接口的中断 IN 端点上返回通知,每当设备可以返回控制消息时,主机就会轮询该通知。需要注意的是,如果设备由于某种原因收到GET_ENCAPSULATED_RESPONSE,并且无法使用控制端点上的有效数据做出响应,则应返回设置为 0x00 的单字节数据包,而不是 stall 控制端点。下表中定义了此传输。收到 RESPONSE_AVAILABLE 通知后,主机使用下表中定义的GET_ENCAPSULATED_RESPONSE 传输从控制端点读取控制消息。

tyustli 371

深入USB Mass Storage协议栈:用逻辑分析仪抓包分析STM32与电脑的U盘通信全过程

本文深入解析USB Mass Storage协议栈,通过逻辑分析仪抓包分析STM32与电脑的U盘通信全过程。从设备枚举到SCSI命令集解析,详细介绍了逆向工程工具链搭建、协议层深度解析及典型故障诊断案例,帮助开发者快速定位和解决USB通信问题。

weixin_42531886的博客 236

从零开始讲PCIe(8)——PCIe拓扑与组件

从软件角度来看,根复合体内部的总线结构会被认为是一个标准的PCI总线,尽管实际上可能并不是物理的PCI总线,但它被设计为对软件呈现为PCI拓扑的一部分,以保持与旧版PCI软件的兼容性。这是由于其使用了非常高的传输速度。无论是根复合体内部的总线,还是交换机的多个端口,系统会通过与PCI相似的方式将其呈现给软件,使得传统的PCI枚举和配置流程能够继续使用。总体而言,根复合体不仅在物理上位于PCIe拓扑的顶部,而且在逻辑上也是整个PCIe系统的控制中心,它与系统中的所有PCIe设备建立连接,协调它们之间的通信。

apple_53311083的博客 2987

BAT007:批量为当前目录下的文件夹添加前缀或后缀

摘要:编写批处理程序,实现批量为当前目录下的文件夹添加前缀或后缀。

qq_31762031的博客 4052

基于OHCI的USB主机 —— UFI命令 USB Mass Storage Class Bulk-Only Transport协议介绍

USB Mass Storage Class Bulk-Only Transport Microsoft公司至Windows98后,USB主机都支持Bulk-Only标准,所以现在的大容量存储类设备几乎都采用或支持Bulk-Only标准。 Bulk-Only传输规范是系统通过默认管道(地址0、端点0)进行枚举后,仅仅使用批量(Bulk...

weixin_34238642的博客 581

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

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

Lassewang的成长历程 5237

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

上一篇: 用vim+ctags+taglist+cscope打造文本模式下的Kscope
下一篇: KEIL+JLINK+Small2440下的SDRAM调试配置
孜孜不倦
博客等级 码龄16年 3粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值