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:

最新文章

  1. D3.js学习(一)
  2. RadioButtonFor绑定值
  3. Ubuntu 16.04 下使用Xampp
  4. 带你走进rsync的世界
  5. Jquery~$when_done_then的用法
  6. 如何解决修改AzureVM默认RDP端口后,连不上的问题
  7. 积累jquery一些有意思的函数
  8. WebService访问oracle数据库本地调试
  9. SqlServer高版本数据备份还原到低版本(转)
  10. 设计node.js搭建多人博客的思路(不讲数据库)
  11. Natural Language Generation/Abstractive Summarization
  12. Linux的僵尸进程及其解决方法
  13. tcpdump-抓包工具-Linux
  14. 调用组件的C++代码
  15. [HEOI2016/TJOI2016]求和(第二类斯特林数)
  16. Python 内置函数 day4
  17. 洛谷 P1855 榨取kkksc03 (二维费用背包)
  18. 【JS学习】-利用谷歌浏览器调试JS代码(转)
  19. 利用C#与AE调用GP工具
  20. 正则与sed,grep,awk三剑客

热门文章

  1. Git简明教程二、开始进行版本管理
  2. Linux学习笔记:crontab定时任务
  3. MySQL学习笔记:Engine存储引擎
  4. KDE 下 U 盘挂载失败
  5. day7面向对象--反射
  6. PHP session 写入数据库中的方法
  7. oracle配置ODBC
  8. 006 python的面向对象基础
  9. caffe for python
  10. 关于CSRF的那点事儿