USB大容量存储设备Bulk Only传输过程

来源:互联网 发布:西安高新区软件新城 编辑:程序博客网 时间:2024/05/16 15:31

1、根据Universal Serial BusMass Storage ClassBulk-Only Transport数据手册中可以得知usb大容量存储设备的传输过程如下如所示:
Bulk-Only传输过程

CBW(Command Block Wrapper)命令块包的格式如下:
CBW

typedef unsigned char BYTE;typedef unsigned short WORD;typedef unsigned long DWORD;struct CBW{    DWORD dCBWSignature;    //CBW的标识,固定值:43425355h (小端模式)。    DWORD dCBWTag;     //主机发送的一个命令块标识,设备需要原样作为dCSWTag(CSW中的一部分)再发送给Host;主要用于关联CSW到对应的CBW。    DWORD dCBWDataTransferLength;     //CBW命令要求在命令与回应之间传输的字节数。如果为0,则不传输数据。    BYTE bmCBWFlags;     //反映数据传输的方向,0x00 表示来自Host,0x80 表示发至Host。    BYTE bCBWLUN;     //对于有多个LUN逻辑单元的设备,用来选择具体目标。如果没有多个LUN,则写0。    BYTE bCBWCBLength;     // 命令的长度,范围在0~16。    BYTE CBWCB[16];     //传输的具体命令};

CSW(Command Status Wrapper)命令状态包的格式如下:
CSW

struct CSW{    DWORD dCSWSignature;    // CSW的标识,固定值:53425355h (小端模式)    DWORD dCSWTag;    //主机发送的一个命令块标识,设备需要原样作为dCSWTag(CSW中的一部分)再发送给Host;主要用于关联CSW到对应的CBW    DWORD dCSWDataResidue;    //还需要传送的数据,此数据根据dCBWDataTransferLength-本次已经传送的数据得到     BYTE bCSWStatus;     //指示命令的执行状态。如果命令正确执行,bCSWStatus 返回0};

接下来,我们使用USB分析仪分析如下USB传输数据包:
usb一个命令的传输过程

1:OUTtxn 输出事务:输出 31 B 的 命令块包(CBW)
2: OUTtxn 输出事务:输出 dCBWDataTransferLength B 的 数据
3: INTxn 输入事务:输入 13 B 的 命令传输状态包(CSW)

4: OUTtxn 输出事务:输出 31 B 的 命令块包(CBW)
5: INtxn 输入事务:输入 dCBWDataTransferLength B 的 数据
6: INTxn 输入事务:输入 13 B 的 命令传输状态包(CSW)

2、其次我们还要了解USB传输中:每一个传输包含一笔或多笔事物,每一笔事务又包含一个、两个或三个信息包。
事 务:Setup(设置)事务、IN(输入)事务、OUT(输出)事务
信息包:令牌信息包、数据信息包、联络信息包

传输 |——>事务——>令牌信息包+数据信息包+联络信息包
|——>事务——>令牌信息包+数据信息包+联络信息包
|——>事务——>令牌信息包+数据信息包+联络信息包

于是我们将数据包展开如下图所示:
这里写图片描述
这里写图片描述

由上图可以看出,要想完成一个USB大容量存储设备的传输即输入或输出事务,
就必然伴随着
1:OUTtxn输出事务:CBW
2: 根据CBW中的 bmCBWFlags来确定数据传输的方向:OUTtxn/INtxn事务
3:INtxn输入事务:CSW

0 0
原创粉丝点击