USB 大容量存储 BOT 调试:CBW、CSW、Sense 数据与失败传输分析
讲解 USB Mass Storage Bulk-Only Transport 失败的排查方法,从 CBW、CSW、Sense 数据三个关键结构还原 SCSI 命令链路。
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 错误 固件" 的时候,这就是从用户现象走到总线证据的路径。