USB Mass Storage大容量存储 The Thirteen Class章节的理解
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章节的理解的更多相关文章
- USB Mass Storage大容量存储的基本知识
http://www.crifan.com/files/doc/docbook/usb_disk_driver/release/htmls/ch02_msc_basic.html 目录 2.1. US ...
- 实现Linux下的U盘(USB Mass Storage)驱动
如何实现Linux下的U盘(USB Mass Storage)驱动 版本:v0.7 How to Write Linux USB MSC (Mass Storage Class) Driver Cri ...
- 如何实现Linux下的U盘(USB Mass Storage)驱动
如何实现Linux下的U盘(USB Mass Storage)驱动 版本:v0.7 How to Write Linux USB MSC (Mass Storage Class) Driver Cri ...
- USB Mass Storage协议分析
目录 简介 指令数据和状态协议 CBW指令格式 CSWCommand Status Wrapper状态格式 SCSI命令集 Format Unit Inquiry MODE SELECT 简介 USB ...
- 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 ...
- usb mass storage device
Problem adding USB host device to KVM Windows guest machine. Status: CLOSED CURRENTRELEASE Aliases ...
- USB Mass Storage学习笔记-STM32+FLASH实现U盘
一.内容概述 采用STM32内部自带USB控制器外加大页NAND FLASH K9F1G08U0A实现一个128M的U盘. 1.STM32的USB控制器 STM32F103的MCU自带USB从控制器 ...
- usb mass storage之旅
前面总结了usb hid keyboard,现在总结usb mass storage,在枚举阶段没什么好总结的,hid和mass storage差不多,都是同样的枚举过程,但是在他们的配置描述符.接口 ...
- USB mass storage协议
这一节主要把在实现“linux模拟U盘功能”过程中的一些调试过程记录下来,并加以解析. 一.背景知识 1.USB Mass Storage类规范概述 USB 组织在univers ...
随机推荐
- 字体格式类型(.eot/.otf/.woff/.svg)
@font-face语句是css中的一个功能模块,用于实现网页字体多样性的模块(设计者可随意指定字体,不需要考虑浏览者电脑上是否安装). @font-face文件 而由于网页中使用的字体类型,也是各浏 ...
- Zookeeper安装以及配置说明(三)
Zookeeper的安装和配置非常的简单,既可以配置成单机模式,也可以配置成集群模式.如下图所示: 下面将分别进行介绍: 单机模式 下载最新稳定版本zookeeper的安装包之后(看第一篇博文), 解 ...
- Java工程师知识图谱
一.Java工程师知识图谱(思维导图版) 二.Java工程师知识图谱(图文版) 三.Java工程师知识图谱(文字版) http://note.youdao.com/noteshare?id=615da ...
- MySQL学习笔记:三种组内排序方法
由于MySQ没有提供像Oracle的dense_rank()或者row_number() over(partition by)等函数,来实现组内排序,想实现这个功能,还是得自己想想办法,最终通过创建行 ...
- iOS图片缓存
iOS的内存管理始终是开发者面临的大问题,内存占用过大时,很容易会被系统kill掉,开发者需要尽可能的优化内存占用问题. 现在的App界面做的越来越精致,里面集成了大量的图片,笔者首先想到的就是如何减 ...
- 【58沈剑架构系列】微服务架构之RPC-client序列化细节
第一章聊了[“为什么要进行服务化,服务化究竟解决什么问题”] 第二章聊了[“微服务的服务粒度选型”] 上一篇聊了[“为什么说要搞定微服务架构,先搞定RPC框架?”] 通过上篇文章的介绍,知道了要实施微 ...
- LoadRunner如何获得参数化中每个关键字的搜索响应时间
LoadRunner如何获得参数化中每个关键字的搜索响应时间 在测试搜索引擎时我们一般采用大量的搜索关键字,有时有必要了解在并发访问的情况下每个关键字的响应时间,一般如果不对脚本进行处理的话你可以获得 ...
- 命令:less
与more的区别 more在man手册中的英文原文是文件熟读过滤器(file perusal filter),其实可以理解为一种文本查看器. 它存在一些缺点: 必须事先加载完整个文件.因此在遇到大文件 ...
- (视频)asp.net core系列之k8s集群部署视频
0.前言 应许多网友的要求,特此录制一下k8s集群部署的视频.在录制完成后发现视频的声音存在一点瑕疵,不过不影响大家的观感. 一.视频说明 1.视频地址: 如果有不懂,或者有疑问的欢迎留言.视频分为两 ...
- Swift2.0语言教程之类的嵌套与可选链接
Swift2.0语言教程之类的嵌套与可选链接 Swift2.0语言类的嵌套 在一个类中可以嵌套一个或者多个类.它们的嵌套形式也是不同的,大致分为了两种:直接嵌套和多次嵌套.下面依次讲解这两种方式. S ...