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:

USB Mass Storage大容量存储 The Thirteen Class章节的理解的更多相关文章

  1. USB Mass Storage大容量存储的基本知识

    http://www.crifan.com/files/doc/docbook/usb_disk_driver/release/htmls/ch02_msc_basic.html 目录 2.1. US ...

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

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

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

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

  4. USB Mass Storage协议分析

    目录 简介 指令数据和状态协议 CBW指令格式 CSWCommand Status Wrapper状态格式 SCSI命令集 Format Unit Inquiry MODE SELECT 简介 USB ...

  5. Android USB Connections Explained: MTP, PTP, and USB Mass Storage

    Android USB Connections Explained: MTP, PTP, and USB Mass Storage Older Android devices support USB ...

  6. usb mass storage device

    Problem adding USB host device to KVM Windows guest machine. Status: CLOSED CURRENTRELEASE   Aliases ...

  7. USB Mass Storage学习笔记-STM32+FLASH实现U盘

    一.内容概述  采用STM32内部自带USB控制器外加大页NAND FLASH K9F1G08U0A实现一个128M的U盘. 1.STM32的USB控制器 STM32F103的MCU自带USB从控制器 ...

  8. usb mass storage之旅

    前面总结了usb hid keyboard,现在总结usb mass storage,在枚举阶段没什么好总结的,hid和mass storage差不多,都是同样的枚举过程,但是在他们的配置描述符.接口 ...

  9. USB mass storage协议

    这一节主要把在实现“linux模拟U盘功能”过程中的一些调试过程记录下来,并加以解析. 一.背景知识     1.USB Mass Storage类规范概述        USB 组织在univers ...

随机推荐

  1. Hadoop(二):MapReduce程序(Java)

    Java版本程序开发过程主要包含三个步骤,一是map.reduce程序开发:第二是将程序编译成JAR包:第三使用Hadoop jar命令进行任务提交. 下面拿一个具体的例子进行说明,一个简单的词频统计 ...

  2. 监听 手机back键和顶部的回退

    // 回退事件,监听 手机back键和顶部的回退 pushHistory(); window.addEventListener("popstate", function(e) { ...

  3. java基础73 dom4j修改xml里面的内容(网页知识)

    1.DOM4J对XML文件进行增删改操作 实现代码 package com.shore.code; import java.io.File; import java.io.FileOutputStre ...

  4. Effective STL 学习笔记 Item 17: Swap Trick

    假设有若干对象存于一个 vector 中: class Widget; vector<Widget> vw; 后来由于某些原因,从该容器中删除了若干对象(参考erase-remove id ...

  5. CentOS6.5配置rsyslog

    如何在RHEL 6.5安装和配置rsyslog现在7.6版本/ CentOS的6.5 .The情况是,安装和RHEL / CentOS的6.5安装rsyslog现在集中式日志服务器上.所有的客户端服务 ...

  6. oracle centos 静默安装

    http://blog.csdn.net/tongzidane/article/details/43852705 静默安装Oracle 11G过程中提示:Exception in thread &qu ...

  7. 【LOJ】#2244. 「NOI2014」起床困难综合症

    题解 写水题放松一下心情 二进制有个很好的性质是每一位是独立的,我们按位贪心,先看这一位能不能填1,然后看看如果这一位填0那么运算后最后这一位是不是1,是的话就退出,然后看看这一位如果填1最后是1这一 ...

  8. hdoj2191 珍惜现在,感恩生活(01背包 || 多重背包)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2191 思路 由于每种大米可能不止一袋,所以是多重背包问题,可以直接使用解决多重背包问题的方法,也可以将 ...

  9. nodejs mongoose populate 多层模型

    参考地址:http://ronaldroe.com/populating-multiple-fields-and-levels-with-mongoose/ 文字版本 Mongoose, the po ...

  10. PHP的exec()函数无返回值排查方法[转]

    在安全imagemagic时 需要用到 exec很多服务器上安装失败 exec()执行外部命令失败,但没有任何错误信息. exec执行某命令在命令行下没有问题,但是在PHP中就出错.这个问题99.99 ...