前面总结了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. poj2484--A Funny♂Game

    题意:n个硬币围成环,每次可以取相邻两个硬币或者一个,不能取者负. Ans:n<=2的时候先手必胜,其他任意情况后手必胜,因为不论我先手取什么,我后手总有中心对称与它配对. #include&l ...

  2. C语言中的声明解析规则——数组,指针与函数

    摘要:C语言的申明存在的最大问题是:你无法以一种人们所习惯的自然方式和从左向右阅读一个声明,在引入voliatile和const关键字以后,情况更加糟糕了.由于这些关键字只能出现在声明中,是的声明形式 ...

  3. VC++ 2013 开发windows窗体程序

    开发工具版本:Visual Studio Express 2013 for Windows Desktop 1. 新建Visual C++下面的"Win32 Project" 2. ...

  4. 使用jQuery来检测远程图片文件是否存在

    使用jQuery来检测远程图片文件是否存在 最近为我的憨豆人笑园添加图片功能时,遇到了这个问题,用户可以填写一个远程的图片地址,也可以上传一个本地图片.为了不浪费服务器的资源,我们需要在客户端先对用户 ...

  5. Paint House 解答

    Question There are a row of n houses, each house can be painted with one of the three colors: red, b ...

  6. 《Algorithms 4th Edition》读书笔记——2.4 优先队列(priority queue)-Ⅰ

    许多应用程序都需要处理有序的元素,但不一定要求他们全部有序,或者是不一定要以此就将他们排序.很多情况下我们会手机一些元素,处理当前键值最大的元素,然后再收集更多的元素,再处理当前键值最大的元素.如此这 ...

  7. ubuntu 14.04 下试用Sublime Text 3

    很多源代码都没有IDE支持的,尤其是开源的源代码.从github上下载的,很多也不用IDE.包括我自己公司的代码,基本都是脚本,也不用IDE.通常情况下,都是用notepad++.UE之类的文本编辑器 ...

  8. GridView动态构建OrderBy进行排序

    废话不说,直接上例子: 前台代码: <asp:GridView ID="GridView1" runat="server" AllowSorting=&q ...

  9. Oracle静默安装-简单记录

    一.与图形界面安装一样,检查如下条件:新建用户.组创建安装目录配置环境变量检查安装依赖包修改内核参数……前面这些操作都属于常规操作,不管是图形还是静默都需要处理. 二./home/oracle/dat ...

  10. SQLLoader7(只导入数据文件的其中几行记录)

    数据文件: D:\oracletest\test1.txt SMITH CLERK ALLEN SALESMAN WARD SALESMAN JONES MANAGER MARTIN SALESMAN ...