前面总结了usb mass storage的枚举过程,如果所有枚举正常,那么会进入bulkonly协议定义的数据交流,在这个数据包里面还包含了SCSI的协议。

Bulkonly协议usbmassbulk_10.pdf,网上搜搜就可以找到了,里面其实就是讲了标准的命令等东西,在这个文件里最需要关注的是CBW和CSW.

CBW:Command Block Wrapper,协议里面的文字描述就不多讲了,自己看看。

dCBWSignature:Signature that helps identify this data packet as a CBW. The signature field shall contain the value 43425355h (little endian), indicating a CBW.说白了这里就是一个标志,标志这是一个CBW包。

dCBWTag:A Command Block Tag sent by the host. The device shall echo the contents of this field back to the host in the dCSWTagfield of the associated CSW. The dCSWTagpositively associates a CSW with the corresponding CBW.上面说的很清楚,这个是host发出的一个Tag,这个Tag在slave向host发送数据时也是这个Tag,不用变化的,host给了什么,咱们就会给他什么。

dCBWDataTransferLength:不在复制英文了,太多了,这个讲的是host期望收到的数据或者发出的数据,但是作为slave我们不一定host需要多少就发回去多少。

bmCBWFlags:   这些位如下定义:

Bit 7定义方向–如果dCBWDataTransferLength是0,那么设备忽略这个位,否则:

0 = Data-Out from host to the device,

1 = Data-In from the device to the host.

Bit 6 Obsolete. The host shall set this bit to zero.

Bits 5..0 Reserved - the host shall set these bits to zero.

bCBWLUN:Logical Unit Number (LUN),咱们在前面提到过,fudan_abc里面也讲过,一个u盘只有一个LUN,当然一般而言。

bCBWCBLength:This defines the valid length of the command block. The only legal values are 1 through 16 (01h through 10h). 这里就是command block,并且有效的是1-16。这个东东是什么?下面就是SCSI命令就登场了,这里面就是SCSI命令,slave就是按照这些命令来回答host。这里就是说了这个SCSI的命令有多长。

CBWCB:SCSI的命令块,bCBWCBLength说明了这个命令有多长。

  举一个例子来讲,看对不对。

      2e               USBCp...$.......
                                  ...$...........                 

           6f          .... ...eCos
            4d       6f             Mass Storage
             2e                                                    

      2e                     USBSp........ 

  知道这个数据包是bus hound抓的包吧,现在来看看。

                                                                     

  这里25.3表示25是第25号设备,3是表示这里是通过3端点进入的数据,前面确实定义了3端点为bulk out,LEN长度0x1f,意思是host给slave发送了31个字节。

      2e               USBCp...$.......
                                  ...$...........              

  25.3就不讲了,从端点3发送了31个字节给slave,DO:data out,余下的就是数据了,

55 53 42 43看看CBWSignature是不是很像,只不过一个是little endian,一个是big endian,大小端这就不讲了。

70 2e 96 88看看dCBWTag,前面协议说了这个是host生成的,这个没必要关注。但是在CSW里面需要回填这个字段。

24 00 00 00这个就是dCBWDataTransferLength,表示接下来host想slave回发36个数据。SCSI协议的第一个命令是Inquiry,里面一个36个字节,正好合适是不。

80 00 06 12里面就包含的东西多了,首先是bmCBWFlags,其值是0x80,这里第7位是1表示Data-in,host是希望数据发入。bCBWLUN其值是0x00,这里只有一个Lun,当然就是0了哦。bCBWCBLength其值是0x06,也就是说这里接下来是6个数据,既将有SCSI命令过来,这个命令长度为6。其实这个命令就是Inquiry。这6的数据是12 00 00 00 24 00,第一个是0x12就是SCSI协议里面定义的Inquiry命令。

  好了CBW终于说完了,也引入了SCSI协议了。

  至于CSW,还是总结了吧。

dCSWSignature:第一个数据还是一个标志,主要用来向大家表明自己的身份。53425355h (little endian)。

dCSWTag:这个Tag就是前面CBW来的Tag,把前面那个直接写在这里就好了。

dCSWDataResidue:这个字段是告诉host还有多少数据还没发完。有时间数据量很大,所以需要分批次来发送。

bCSWStatus:这个字段是告诉host是否发送正确,正确与否查表就好,下图表明0x00成功。

好了CSW也总结完了,咋发现总结出来还没怎么涉及SCSI协议,下次接着总结SCSI。

USB-CSW之旅的更多相关文章

  1. CentOS6.5菜鸟之旅:VirtualBox4.3识别USB设备

    一.前言 VirtualBox默认是不能识别USB设备的,但可以通过Oracle VM VirtualBox Extension Pack来增强VirtualBox的功能,增强的功能如下: 1. US ...

  2. usb mass storage之旅

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

  3. Linux USB摄像头驱动【转】

    本文转载自:http://www.itdadao.com/articles/c15a509940p0.html 在 cortex-a8 中,可接入摄像头的接口通常可以分为两种, CAMERA 接口和 ...

  4. USB -- BULK_ONLY和UFI协议

    2 BULK_ONLY和UFI协议 Bulk—Only协议是USB组织针对大容量存储设备制定的一种块存储类协议,目前已经普遍应用于各种移动存储设备. USB设备分为5大类,即显示器.通信设备.音频设备 ...

  5. 电子工程师名片——UFI Command,USB盘符的显示

    USB Mass Storage类规范概述        USB Mass storage Device协议即海量存储设备协议适用于硬盘,U盘等大容量存储设备.协议使用的接口端点有BulkIn.Bul ...

  6. USB系列之三:从你的U盘里读出更多的内容

    U盘是我们最常使用的一种USB设备,本文继续使用DOSUSB做驱动,试图以读取扇区的方式读取你的U盘.本文可能涉及的协议可能会比较多. 一.了解你的U盘    首先我们用上一篇文章介绍的程序usbvi ...

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

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

  8. usb开发笔记

    U盘应属于海量存储类. USB海量存储设备,又包括通用海量存储子类,CDROM,Tape等,U盘实际上属于海量存储类中通用海量存储子类.通用海量存储设备实现上是基于块/扇区存储的设备. USB组织定义 ...

  9. 嵌入式系统USB CDROM虚拟光驱驱动程序开发

    带U盘功能的的USB接口设备已经越来越常见了.如果能够把产品说明书或者产品设备驱动程序做成一个USB CDROM,那该多方便.假设:你已经有了USB mass storage驱动.你的任务是在此基础上 ...

随机推荐

  1. windows下将隐藏文件通过命令行改变为普通的显示文件

    attrib -h -s *.* /s /d 不懂的看下 attrib /? 帮助.保存为bat也可以.

  2. log4j日志分模块打印,同时不打印到控制台上

    由于定时刷新程序的启用,导致catalina.out配置文件中打入大量日志,致使程序调试困难.          无法正常查看日志.所以客户要求将性能流量配置日志迁移出catalina.out目录.修 ...

  3. mysql 中 LIMIT的简单用法

    mysql--语法: SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset --举例: select * from table l ...

  4. Largest Rectangle in Histogram 解答

    Question Given n non-negative integers representing the histogram's bar height where the width of ea ...

  5. 本地plsqldev.exe连接远端oracle数据库

    先看百度经验:http://jingyan.baidu.com/article/48b558e3540ecf7f38c09a3c.html 这里如果我们只有安装plsql工具,下载oracle精简版本 ...

  6. QString转换为char*

    QString在Qt里相当于C++里的std::string,或者是C里的c style string.不过,QString跟编码相关,在低层想把一个QString发送出去相当麻烦,尤其对方用的不是Q ...

  7. EasyUI 两个日期比较

    两个日期进行比较,后一个日期不能早于晚一个日期.需要自己去扩展validatebox的方法 1.对比2个密码是否相同 $.extend($.fn.validatebox.defaults.rules, ...

  8. POJ 1469 ZOJ1140 二分匹配裸题

    很裸,左点阵n,右点阵m 问最大匹配是否为n #include <cstdio> #include <cstring> #include <vector> usin ...

  9. fedora 20下安装vim的C++补全插件clang_complete

    1.安装clang yum install clang 2.安装clang_complete插件 git clone https://github.com/Rip-Rip/clang_complete ...

  10. 包含深度学习常用框架的Docker环境

    相关的代码都在Github上,请参见我的Github,https://github.com/lijingpeng/deep-learning-notes 敬请多多关注哈~~~ All in one d ...