USB 大容量存储 BOT 调试:CBW、CSW、Sense 数据与失败传输分析

讲解 USB Mass Storage Bulk-Only Transport 失败的排查方法,从 CBW、CSW、Sense 数据三个关键结构还原 SCSI 命令链路。

USB 大容量存储, BOT 协议, CBW, CSW, Sense 数据, 固件调试, SCSI 命令, USB 抓包

USB 大容量存储设备用起来很简单——插上 U 盘、数据记录器、固件更新器、嵌入式存储小工具,盘符就出来了。一旦出问题,错误信息往往含糊:设备未就绪、I/O 错误、提示格式化、挂载失败,或者盘符干脆消失了。

底层来看,很多设备用的是 Bulk-Only Transport(BOT)。BOT 有一个特征非常明显的命令流:Command Block Wrapper(CBW)→ 数据阶段 → Command Status Wrapper(CSW)。这个链路在哪一环断了,抓包通常能直接看出来。

把 BOT 的流程理清楚

正常的模式是:

  • 主机通过 Bulk OUT 发 CBW
  • 可选的数据阶段,Bulk IN 或 Bulk OUT
  • 设备通过 Bulk IN 回 CSW

CBW 携带一条 SCSI 命令,CSW 上报命令执行结果。如果命令失败,主机可能会发 REQUEST SENSE 进一步问原因。

有用的证据包括:

  • CBW 签名
  • Command Tag
  • Data Transfer Length
  • Direction 标志
  • SCSI 命令字节
  • 数据阶段长度
  • CSW 签名
  • CSW Status
  • Residue
  • 失败后的 Sense 数据

Tag 对不上,主机就不能信任状态;数据长度对不上行为,后面就会出现超时或 STALL。

Sense 数据能解释大多数失败

一条 SCSI 命令失败,并不意味着诊断结束。Sense 数据通常会给出真正的根因:

  • Not Ready
  • Medium Error
  • Illegal Request
  • Write Protected
  • Logical Block Address 越界
  • 复位后的 Unit Attention

固件团队应该把失败的那条命令和紧随其后的 Sense 响应一起抓下来。主机那边挂载失败,很可能就是固件如实上报了一个存储状态。

端点 STALL 与复位恢复

BOT 有明确的恢复行为。如果端点 STALL,或者命令彻底失败,主机可能会发 Clear Feature(Halt)或者发起 Mass Storage Reset。设备如果不能正确恢复,就会表现为"消失"或者必须重新插拔。

要看的证据:

  • 哪个端点 STALL 了?
  • 主机有没有发 Clear Feature?
  • 有没有触发 BOT Reset?
  • 后续的 CBW/CSW 流有没有恢复?
  • Tag 是不是仍然一致?

这些证据比靠猜固件状态机靠谱得多。

Bus Scope 在这个场景里做什么

Bus Scope 是一款 USB 检查工作台。在大容量存储场景下,光有原始字节远远不够;把 BOT 结构解码出来、把传输状态标清楚,能让工程师更快定位故障。

一份合格的 BOT 调试报告,应该回答:

  • 哪条 SCSI 命令失败了?
  • 数据阶段的方向和长度是不是和 CBW 声明的一致?
  • CSW 有没有正常回来?
  • CSW 的 Tag 是不是和 CBW 的 Tag 匹配?
  • 后面跟的 Sense 数据是什么?
  • 复位恢复有没有起作用?

当你搜 "USB 大容量存储 BOT 失败"、"CBW CSW 不匹配"、"U 盘 I/O 错误 固件" 的时候,这就是从用户现象走到总线证据的路径。