http://blog.csdn.net/xgbing/article/details/7002558

USB Mass Storage 6.7 The Thirteen Class章节的理解

Case(1), case(6), case(12)状态下是正常的数据传输,被称为“The thin diagonal”。其它的状态是协议外的内容,是一些判断。

6.7.1 主机期望发起一次无数据传输的命令

CBW包中的dCBWDataTransferLength字段=0,Direction位不考虑。

主机做的工作:

(1)       发送一个CBW

(2)       偿试接收CSW

(3)       如果在STALL状态下接收到CSW:先清空BULK—IN端口数据,再接收CSW

(4)       判断CSW,如果“bCSWStatus = 00h or 01h, and the dCSWDataResidue is 0.”,它是CASE(1),
           其它是一个相位错误,需要主机发送一个复位来清除错误。

设备做的工作:

(1)       等待接收一个CBW

(2)       CBW有效,则执行命令

(3)       分析包,如果是CASE(1),说明无数据传输,设置bCSWStatus to 00h or 01h.,bCSWStatus to 00h or 01h.。
           如果是CASE(2)或CASE(3),设置bCSWStatus to 02h.

(4)       发送CSW。

6.7.2 主机期望从设备接收数据

这种情况下CBW中的dCBWDataTransferLength为非0并且Direction为1(Data-In)。

主机做的工作:

(1)       发送CBW

(2)       偿试接收数据

(3)       如果在STALL状态下接收到数据:1)主将接收数据2)主机将清空BULK_IN端口

(4)       偿试接收CSW

(5)       如果在STALL状态下接收到CSW:1)主机将清空bulk_in端口2)主机将偿试再次接收CSW。

(6)       分析CSW,如果是CASE(4),CASE(5),CASE(6), bCSWStatus = 00h or 01h,
           接收数据的大小应等于dCBWDataTransferLength – dCSWDataResidue。
           如果是CASE(7),CASE(8),且bCSWStatus = 02h,主机需要发送复位来清除错误。

设备做的工作:

(1)       等待并接收CBW

(2)       CBW有效则执行命令。如果是CASE(6),发送dCBWDataTransferLength字节数据给主机,
           设置bCSWStatus to 00h or 01h,dCSWDataResidue to zero。

CASE(4),CASE(5):说明设备发送的数据长度比主机要求的数据长度小。有两种处理方法:

1)发送实际数据后再发送填充数据使用总长度等于dCBWDataTransferLength,设置dCSWDataResidue=dCBWDataTransferLength;

2)发送实际数据长度,设置dCSWDataResidue=dCBWDataTransferLength-发送数据的长度。

CASE(7),CASE(8):说明设备要发送的数据超出主机要求的数据长度。两种处理:

1)发送主机要求的数据长度,(下一句不知怎么翻译)

2)发送设备的数据长度(超出主机要求的数据长度)。

这两种处理后均设置bulk_in端口为STALL状态,并设置CSW包相位错误(bCSWStatus to 02h)。

(3)       发送CSW。

6.7.3 主机期望发送数据到设备

这种情况下CBW中的dCBWDataTransferLength为非0并且Direction为0(Data-In)。

主机做的工作:

(1)       发送CBW

(2)       发送数据到设备,在数据传输结尾,主机将发送一个短包。

(3)       在STALL状态下发送数据,主机将清空bulk_out端口

(4)       偿试接收CSW

(5)       在STALL状态下接收CSW,主机清空bulk_in端口,再偿试接收CSW

(6)       CSW有效,如果是CASE(9),CASE(11),CASE(12),设备实际接收的数据等于
           dCBWDataTransferLength – dCSWDataResidue。
           如果是CASE(9),(13),主机需要发送复位来清除错误。

设备做的工作

(1)       接收CBW

(2)       CBW有效:

如果是CASE(9),CASE(11),CASE(12),有可能设备需要的数据小于主机发送的长度:

1)       设备接收它需要的数据长度,并设置dCSWDataResidue = dCBWDataTransferLength – 实际接收数据的长度。
         之后设置bulk_out端口为STALL状态。

2)       设备接收主机发送的所有数据。

3)       发送CSW。

The Thirteen Cases

There are basically three actions that should be performed depending on the case:

• STALL the Bulk-IN endpoint
• STALL the Bulk-OUT endpoint
• Report a Phase Error in the CSW

The table below lists all cases along with the actions which must be taken after the command,
including the correct length/direction of the transfer.

The following notation is used to characterize host and device expectations:

转载于:https://www.cnblogs.com/shangdawei/p/3151185.html

USB Mass Storage大容量存储 The Thirteen Class章节的理解相关推荐

  1. Linux下大容量存储,第 2 章 USB Mass Storage大容量存储的基本知识

    第 2 章 USB Mass Storage大容量存储的基本知识 摘要 USB Mass Storage所对应的层次和要实现哪些东西: 图 2.1. USB Mass Storage Framewor ...

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

    如何实现Linux下的U盘(USB Mass Storage)驱动 版本:v0.7 How to Write LinuxUSB MSC (Mass Storage Class) Driver Crif ...

  3. ZYNQ裸机实现 USB MASS STORAGE (usb+sd卡 实现U盘功能)

    ZYNQ裸机实现 USB MASS STORAGE (usb+sd卡 实现U盘功能) 之所以写裸机,也就是没有操作系统的实现方法是因为linux系统下的实现方法网上已经有很多了,之前使用的STM32实 ...

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

    USB Mass Storage Class Bulk-Only Transport Microsoft公司至Windows98后,USB主机 都支持Bulk-Only标准,所以现在的大容量存储类设备 ...

  5. USB Mass Storage协议

    简介 USB Mass storage Device协议即海量存储设备协议适用于硬盘,U盘等大容量存储设备.协议使用的接口端点有BulkIn.BulkOut和Interrupt端点.该设备类又包含6个 ...

  6. usb mass storage设备枚举过程

    8月份从PC开发岗位换到底层嵌入式驱动开发来了.接到的第二个活,是在高通8650平台上实现驻留支持SCSI指令.8650平台是高通推出的EVDO RevB的双核平台,和之前6085相比性能更强,软件结 ...

  7. USB Mass Storage Class

    编辑博客时,回车的意思是切换段落,shift+回车才是换行. SCSI Interface Controller: AMD am5380 1 U盘量产工具 - 主控芯片私有的SCSI命令 ChipEa ...

  8. USB Mass Storage

    参见:USB Mass StorageClass Bulk-Only Transport 1 规范概述和范围 前提条件:熟悉USB协议规范和USB海量存储类规范概述. 本规范只描述块传输,也就是仅通过 ...

  9. USB mass storage驱动分析

    1. USB驱动代码在/drivers/usb/gadget下,有文件:android.c,其他驱动文件f_adb.c,f_mass_storage.c:其中android.c 依赖于f_adb.c ...

最新文章

  1. 开发一个大型后台管理系统,应该用前后端分离的技术方案吗?
  2. 二周第三次课(3月28日)
  3. 还在懵懂状态?给处于初/中级阶段的数据分析师的两三点建议
  4. JZOJ 3813. 【NOIP2014模拟9.7】我要的幸福
  5. 服务器iis自动停止,IIS应用程序池老是自动停止
  6. mysql blgg__MySQL_exceptions.ProgrammingError:(2014,“命令不同步;您现在无法运行此命令”)?...
  7. 计算机组成原理 试讲,常州信息职业技术学院-试讲ppt-计算机组成原理-信息表示.ppt...
  8. rust模组服如何切换标准服_资讯DNF手游将于3月20日发放10000个体验服资格(附申请方法)...
  9. docker快速搭建数据库测试环境
  10. oracle中插入一个blob数据
  11. PHP大转盘中奖概率算法实例
  12. 【问题记录】mysql设置任意ip访问
  13. 【编译原理】理解BNF
  14. Scratch-贪吃蛇小游戏
  15. vector详解以及一些问题(C++)
  16. 安利几个实用且有趣的Excel实用技巧给你
  17. C++笔记--Linux网络编程(15-0)-socket(供自查,文档说明)
  18. 讯飞智能录音笔SR502:支持OCR识别功能的职场礼物
  19. 计算机主机电源故障分析检测维修,电源故障:台式机电脑电源故障检修
  20. stream之group分组

热门文章

  1. C/C++里面的左移和右移
  2. 用Log Explorer恢复数据的基本操作
  3. Python之isinstance
  4. L3-023 计算图 (30 分)--PAT 团体程序设计天梯赛 GPLT
  5. CCCC-GPLT L1-038. 新世界 团体程序设计天梯赛
  6. 【软件测试】边界测试中所选择的输入测试数据一定是有效数据(错)
  7. 未名湖边的烦恼-蓝桥杯算法训练题-递推/递归
  8. 1048. 数字加密(20)-浙大PAT乙级真题
  9. 蓝桥杯 BASIC-18 基础练习 矩形面积交
  10. flash传值给javascript,并在html页面输出,javascript向flash swf文件传递参数值注意细节...