关于USB bulk设备中的CBW和CSW

BOT 协议解析 简介 USB Mass storage Device协议即海量存储设备协议适用于硬盘,U盘等大容量存储设备。协议使用的接口端点有BulkIn、BulkOut端点。 BOT 的传输流程如下: CBW指令格式 CBW(Command Block Wrapper)的长度为31个字节,具体定义如下图: dCBWSignature: CBW的标识,固定值:43425355h (little endian)。 dCBWTag: 主机发送的一个命令块标识,设备需要原样作为dCSWTag(CSW中的一部分)再发送给Ho 阅读详情
AI摘要

本文详细介绍了USB Mass Storage协议的工作原理,包括其在烧写工具中的应用、USB通信中的CBW和CSW概念、以及如何通过Windows编程实现对存储介质的操作。

          网上关于USB的讲解很多,讲的好的大家可以参见《linux那些事儿之我是USB》,非常具有趣味性。此处恕我才疏学浅只能记录一些皮毛。因为在做烧写工具,所以涉及到这部分的知识。在之前的经验教训中明白了一个道理:对待工作要严谨认真,对待知识不能浅尝辄止。

        在学习一个新知识的时候,最难的就是有人能用最简单的文字描述它。而通常的概述也会因为太晦涩而难懂。当然也不可能有哪项技术能够用简单的几句话来描述清楚。因此要有耐心,在理论看到一定程度之后一定要转入实践,最后再回归到理论。

        在做烧写工具的时候,最简单的模型就是window PC通过数据线将数据传输到存储介质上。其中用到了USB  Mass Storage协议,完成命令和数据的传输。而SCSI是存储介质遵循的协议。亦即:

           ⑴Host和Device间数据通讯协议是Bulk-only Transport。也称为BBB协议,这是与CBI对应的一种说法。因为CBI是指Commond、Bulk和Interrupt。而对于Bulk-only所有的传输都是通过BULK EP完成。

          ⑵USB Device内部和数据存储介质之间通信协议为SCSI(Small Computer System Interface)。

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

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

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

       在平板电脑设备的烧写过程中,平板电脑的ROM中存在USB的驱动程序,并且在USB的驱动中注册了SCSI设备的初始化函数。当SCSI命令通过USB协议传送到目标板上之后,会通过对USB数据包的解析完成对存储介质的读写擦除等的操作。

        Microsoft Windows 中提供对Mass Storage 协议的支持,因此USB 移动设备只需要遵循 Mass Storage 协议来组织数据和处理命令,即可实现与PC 机交换数据。而Flash 的存储单元组织形式采用FAT16 文件系统,这样,就可以直接在Windows的浏览器中通过可移动磁盘来交换数据了,Windows 负责对FAT16 文件系统的管理,USB 设备不需要干预FAT16 文件系统操作的具体细节。 
       USB(Host)唯一通过描述符了解设备的有关信息,根据这些信息,建立起通信,在这 些描述符中,规定了设备所使用的协议、端点情况等。因此,正确地提供描述符,是USB 设备正常工作的先决条件。 

         按照上面的描述,在存储设备工作的过程中,USB的协议就成了关注的焦点。而在USB通信的过程中最重要的两个概念就是CBW和CSW。

        设备插入到USB后,USB即对设备进行搜索,并要求设备提供相应的描述符。在USB Host得到上述描述符后,即完成了设备的配置,识别出为Bulk-Only的Mass Storage设备,然后即进入Bulk-Only传输方式。在此方式下,USB与设备间的所有数据均通过Bulk-In和Bulk-Out来进行传输,不再通过控制端点传输任何数据。 
        在这种传输方式下,有三种类型的数据在USB和设备之间传送,CBW、CSW和普通数据。CBW(Command Block Wrapper,即命令块包)是从USB Host发送到设备的命令,命令格式遵从接口中的bInterfaceSubClass所指定的命令块,这里为SCSI传输命令集。USB设备需要将SCSI命令从CBW中提取出来,执行相应的命令,完成以后,向Host发出反映当前命令执行状态的CSW(Command Status Wrapper),Host根据CSW来决定是否继续发送下一个CBW或是数据。Host要求USB设备执行的命令可能为发送数据,则此时需要将特定数据传送出去,完毕后发出CSW,以使Host进行下一步的操作。USB设备所执行的操作可用下图描述:

        USB协议能够在启动或是当设备插入系统时对设备进行配置,这就是USB设备为什么可以执插拨的原因。USB协议能够在启动或是当设备插入系统时对设备进行配置,这就是USB设备为什么可以执插拨的原因。

        按照上面的描述,对于PC端烧写工具而言,板子上的存储设备就相当于只是一个SCSI设备。它只负责按照USB协议封装USB传输所需要的数据。

        
      在windows编程的时候,只需要按照要求发送SCSI命令操作就能够通过驱动完成对目标机上存储介质的操作。而这个过程是如何进行操作的呢?
      了解USB之后,会知道USB的描述符机制,在每个设备的描述符中,都存在如下几个域:
           bInterfaceClass
           bInterfaceSubClass
           bInterfaceProtocol
       分别对应着USB的Class,Subclass.protocol。
   bInterfaceClass=0x08=Mass Storage

          Class就是USB Mass Storage Class

  bInterfaceSubClass=0x06=SCSI Transparent

        Subclass,所支持的列表如下

   SubClass Codes Mapped to Command Block Specifications

SubClass Codes Mapped to Command Block Specifications
bInterfaceProtocol=0x50=Bulk Only Transport

Protocol,所支持的列表如下:Mass Storage Transport Protocol



Mass Storage Transport Protocol

           从上面的描述中,就能够更清晰直观的感受到,设备的两种协议在工作方式上的协作与独立性。


下面这幅图片就是CBW包的各个字段信息。他是一个31B的包,这个是在USB仿真器抓包之后进行分析的依据。


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


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

相关推荐

USB -- STM32F103 U盘(MassStorage)SDIO接口SCSI协议Bulk传输讲解(五)

USB STM32F103 设备U盘(MassStorage),SDIO接口,SCSI协议,CBW协议,CSW协议

binhao002的博客 6234

基于STM32F103的USB学习笔记34 - Mass Storage之CBW、CSW和数据的处理

将HOST发送过来的数据拷贝到CBW结构体中。 uint8_t i; for(i = 0; i < gMscBotData.len; i++) { *((uint8_t *)&gMscCBW + i) = gMscBotData.dat[i]; } 把CBW中的Tag值和数据长度赋值给CSW。 gMscCSW.dTag = gMscCBW.dTag; gMscCSW.dDataResidue = gMscCBW.dDataL...

pq的博客 1928

USB海量传输类单批量传输

usb海量传输类单批量传输的规范描述,定义了CBW,CSW各个字段的意义

USB bulk设备中的CBW和CSW

网上关于USB的讲解很多,讲的好的大家可以参见《Linux那些事儿之我是USB》,非常具有趣味性。此处恕我才疏学浅只能记录一些皮毛。因为在做烧写工具,所以涉及到这部分的知识。在之前的经验教训中明白了一个道理:对待工作要严谨认真,对待知识不能浅尝辄止。         在学习一个新知识的时候,最难的就是有人能用最简单的文字描述它。而通常的概述也会因为太晦涩而难懂。当然也不可能有哪项技术能够用简

zhizhuodewo6的博客 2717

Bulk—Only协议及其实现

Bulk—Only协议及其实现

USB应用开发宝典--part5

USB应用开发宝典--完整清晰版 共5个分包,这是分包5 优快云的开发人员:为什么最后一个分包“上传成功”之后,在我的资源里面老是看不到?都重复好几次了。

USB Bulk-Only Transport 批量传输协议规范

一、规格概述及范围 1.1 Scope 范围 A familiarity with the USB 1.0 and 1.1 Specifications and the USB Mass Storage Class Specification Overview is assumed. 假定熟悉 USB 1.0 和 1.1 规范和 USB 大容量存储类规范概述。 This specification addresses Bulk-Only Transport, or in other words, tran

weixin_42109053的博客 3211

U盘基本工作原理归类.pdf

U盘基本工作原理归类.pdf

BULK传输过程

SETUP in: [ 80 06 00 01 00 00 08 00 ][ 12 01 00 02 00 00 00 40 ] : ACK SETUP in: [ 80 06 00 01 00 00 12 00 ][ 12 01 00 02 00 00 00 40 A9 23 18 EF 00 01 01 02 00 01 ] : ACK 01-> 表示该设备支持一种configuration Host->Device Device->Host SET...

学习笔记 2695

深入解析STM32F103R6的USB OTG_FS双重角色设备(DRD)设计与应用

本文深入解析了STM32F103R6的USB OTG_FS双重角色设备(DRD)设计与应用。详细阐述了其作为USB主机和设备双重角色的硬件设计要点,包括VBUS电源管理与ID引脚配置,并提供了设备模式(如虚拟串口CDC)与主机模式(如读取U盘文件)的软件实现实战指南,帮助开发者充分发挥该芯片的OTG潜力。

weixin_29195615的博客 265

【论文阅读】LIME:Low-light Image Enhancement via Illumination Map Estimation(笔记最全篇)

文章目录AbstractIntroductionContributionMethodSpeed-up Method(1):ALM子问题 T子问题 G子问题 Z和μ\muμSpeed-up Method(2):权重变量实验conclusion 今天要整理的一篇论文是使用传统的方法解决低照度的问题,Guo等人于2016年发表在IEEE上,论文《LIME:Low-light Image Enhance...

florrie 2万+

bulk only

Bulk-Only:USB与设备之间的数据传输都是通过Bulk-In和Bulk-Out来实现的。有三种类型数据在USB和设备传送,它们是命令块包(CBW),命令执行状态包(CSW)和普通数据包。当设备从主机收到CBW块以后,它会把SCSI命令从CBW中分离出来,然后根据要求执行,执行的结果又以CSW的形式发给主机。在Bulk-Only的命令块包(CBW)中,有一段CBECB内容,是SCSI命令块描述符http://blog.sina.com.cn/s/blog_4ec8232f0100rp57.html。

weixin_43490398的博客 409

【ANSYS APDL】提取结构刚度矩阵完整过程--附Python代码实现

ANSYS的结构刚度矩阵提取中一些操作技巧

m0_61038364的博客 1万+

USB大容量存储设备Bulk Only传输过程

1、根据Universal Serial BusMass Storage ClassBulk-Only Transport数据手册中可以得知usb大容量存储设备的传输过程

cuihuan2222的专栏 7023

HAL库:中断处理函数 及 weak弱声明中断回调函数 详解

HAL库中断处理函数 及 weak弱声明中断回调函数

L_Z_J_I的博客 5170

100天精通Python(基础篇)——第4天:数据类型全解析_从基础到转换

数据类型全解析_从基础到转换

努力让自己发光,对的人才能迎着光而来 11万+

usb旅途之SCSI

转载:  http://blog.chinaunix.net/uid-23247212-id-309145.html       usb旅途之SCSI     前面总结了usb mass storage的枚举过程,如果所有枚举正常,那么会进入bulkonly协议定义的数据交流,在这个数据包里面还包含了SCSI的协议 Bulkonly协议usbmassbulk_10.pdf,网上搜搜

LBO4031的专栏 5272

核磁共振常用的文件格式介绍:NIfTI volume 格式 (*.nii), GIFTI 格式 (*.gii), CIFTI 格式 (*.nii)

NIfTI volume 格式 (*.nii)GIFTI 格式 (*.gii)CIFTI 格式 (*.nii)Scene file文件 (*.scene)规格文件 (*.spec)解剖 (*.annot)一个场景文件包含一个或多个场景;每个场景实际上是保存时 wb_view 内部状态的快照。这包括有关加载哪些文件、如何显示、如何配置选项卡的信息(选择了哪些表面、在每个层中选择了哪些文件、打开了哪些层、哪些视图旋转、调色板设置、平铺选项卡等),以及在它们上面添加了哪些注释(文本、箭头、圆圈等)。

从事脑科学核磁共振方法学研究,在Nature communications等权威期刊发表研究论文,熟练掌握磁共振处理方法和统计学方法,欢迎大家和我交流。 3043

【转】Linux那些事儿之我是U盘(45)迷雾重重的Bulk传输(三)

在usb_stor_Bulk_transport()中, 古人一针见血的为我们指出了这个函数中调用的第一个最重要的函数,那就是usb_stor_bulk_transfer_buf().仍然是来自drivers/usb/stroage/transport.c.     409 /*    410  * Transfer one buffer via bulk pipe, without time

aaronychen的专栏 1459

巡检机器人的基于ROS系统的任务管理架构设计总结

本文探讨了基于ROS(机器人操作系统)的工业巡检机器人任务管理架构设计,提出分层闭环方案。架构围绕稳、准、活、扩四大目标,分为感知层(多源数据融合)、调度层(智能决策)、执行层(动作控制)和数据层(存储交互)。关键技术包括ROS2实时性优化、功能包复用和多机器人协同调度。实践案例显示,该架构在电力巡检中使任务完成率达99%,在化工园区实现95%覆盖率。当前挑战包括SLAM地图漂移和多机通信延迟,未来可通过语义SLAM和区域通信优化。

start_up_go的博客 475

基于工作流的低代码AI应用开发:Flock平台核心架构与实战指南

在AI应用开发领域,工作流编排正成为连接大语言模型(LLM)能力与复杂业务逻辑的关键技术。其核心原理是将任务分解为模块化节点,通过可视化方式定义执行顺序与数据流向,从而实现灵活可控的自动化流程。这种范式极大地提升了开发效率,降低了技术门槛,使得开发者能够聚焦于业务设计而非底层代码。在技术价值层面,工作流编排支持检索增强生成(RAG)、多智能体协作等高级模式,并能通过人工干预节点确保关键流程的可靠性与合规性。其典型应用场景包括智能客服、自动化办公、数据分析助手等。本文以Flock平台为例,深入解析了如何利用其

weixin_26848497的博客 381

Linux那些事儿之我是U盘(45)迷雾重重的Bulk传输(三)

   在usb_stor_Bulk_transport()中, 古人一针见血的为我们指出了这个函数中调用的第一个最重要的函数,那就是usb_stor_bulk_transfer_buf().仍然是来自drivers/usb/stroage/transport.c.     409 /*    410  * Transfer one buffer via bulk pipe, without t

7252

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

USB Mass Storage协议

转载自:http://blog.youkuaiyun.com/leo_wonty 简介 USB Mass storage Device协议即海量存储设备协议适用于硬盘,U盘等大容量存储设备。协议使用的接口端点有BulkIn、BulkOut和Interrupt端点。该设备类又包含6个独立的子类以及3种传输协议。 bInterfaceSubClass 命令集 描述 01

parasoft的专栏 1315

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

bulk_only传输协议和UFI命令规范

USB设备分为5大类,即显示器、通信设备、音频设备、人机输入和海量存储。通常所用的U盘、移动硬盘均属于海量存储类。海量存储类的规范中包括4个独立的子规范,即CBI传输、Bulk-Only传输、ATA命令块、UFI命令规范。前两个协议定义了数据/命令/状态在USB总线上的传输方法,Bulk-Only传输协议仅仅使用Bulk端点传送数据/命令/状态,CBI传输协议则使用Control/bulk/int

robin-wei 专注于linux嵌入式 1259

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

基于STM32F103的USB学习笔记33 - Mass Storage之BOT

BOT就是Bulk Only Transport的缩写。数据、命令、状态都通过Bulk端点传输(没有使用到中断、控制端点),这里用到的是EP1和EP2,2个端点都是Bulk的模式,这就是所谓的Bulk Only。 命令/数据/状态的协议如下图所示: 【CBW】 CBW是Command Block Wrapper的缩写。一个CBW包结构如下图所示: dCBWSignature: 固定为43425355h(小端),表示这段数据是CBW。 dCBWTag: HOST发送的命令标记。设备在CSW.

pq的博客 1573
上一篇: VMware10.0+winDBG+win7 x64环境搭建
下一篇: win7 64bit系统上VMWare10.0安装MAC OS10.8
野-百-合
博客等级 码龄17年 308粉丝 118原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值