USB-CSW之旅
前面总结了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之旅的更多相关文章
- CentOS6.5菜鸟之旅:VirtualBox4.3识别USB设备
一.前言 VirtualBox默认是不能识别USB设备的,但可以通过Oracle VM VirtualBox Extension Pack来增强VirtualBox的功能,增强的功能如下: 1. US ...
- usb mass storage之旅
前面总结了usb hid keyboard,现在总结usb mass storage,在枚举阶段没什么好总结的,hid和mass storage差不多,都是同样的枚举过程,但是在他们的配置描述符.接口 ...
- Linux USB摄像头驱动【转】
本文转载自:http://www.itdadao.com/articles/c15a509940p0.html 在 cortex-a8 中,可接入摄像头的接口通常可以分为两种, CAMERA 接口和 ...
- USB -- BULK_ONLY和UFI协议
2 BULK_ONLY和UFI协议 Bulk—Only协议是USB组织针对大容量存储设备制定的一种块存储类协议,目前已经普遍应用于各种移动存储设备. USB设备分为5大类,即显示器.通信设备.音频设备 ...
- 电子工程师名片——UFI Command,USB盘符的显示
USB Mass Storage类规范概述 USB Mass storage Device协议即海量存储设备协议适用于硬盘,U盘等大容量存储设备.协议使用的接口端点有BulkIn.Bul ...
- USB系列之三:从你的U盘里读出更多的内容
U盘是我们最常使用的一种USB设备,本文继续使用DOSUSB做驱动,试图以读取扇区的方式读取你的U盘.本文可能涉及的协议可能会比较多. 一.了解你的U盘 首先我们用上一篇文章介绍的程序usbvi ...
- USB Mass Storage学习笔记-STM32+FLASH实现U盘
一.内容概述 采用STM32内部自带USB控制器外加大页NAND FLASH K9F1G08U0A实现一个128M的U盘. 1.STM32的USB控制器 STM32F103的MCU自带USB从控制器 ...
- usb开发笔记
U盘应属于海量存储类. USB海量存储设备,又包括通用海量存储子类,CDROM,Tape等,U盘实际上属于海量存储类中通用海量存储子类.通用海量存储设备实现上是基于块/扇区存储的设备. USB组织定义 ...
- 嵌入式系统USB CDROM虚拟光驱驱动程序开发
带U盘功能的的USB接口设备已经越来越常见了.如果能够把产品说明书或者产品设备驱动程序做成一个USB CDROM,那该多方便.假设:你已经有了USB mass storage驱动.你的任务是在此基础上 ...
随机推荐
- 膜拜一个神奇的女人——Hedy Lamarr
她演绎了首部露点电影.经历了六次婚姻.出版了首本自曝隐私的自传,还曾入室行窃过两次——在这样一个饱受争议的大环境下,她还能在60多年前提出“跳频”技术和一系列无线信号技术的全新概念,其中,“跳频”技术 ...
- Keil "RECURSIVE CALL TO SEGMENT"彻底解决
我们在做菜单程序或通过函数指针调用函数时,如果被调用的函数中有包含了常量字符串,那么经常会出现这样的的错误提示:"RECURSIVE CALL TO SEGMENT"意思是&quo ...
- openssl对数组加密解密的完整实现代码
本例是用C实现的对一个数组进行加密,加密到第二个数组,然后解密到另一个数组的完整实现代码. #include <stdio.h> #include <string.h> #in ...
- 深入浅出CChart 每日一课——第十八课 女神的套娃,玩转对话框
前面笨笨已经给大家展示了CChart编程的N个例子.这些例子中,我们的CChart图像都是绘制在程序的主窗口中的. 在很多情况下,我们面对的情形不是这样的.这节课笨笨就给大家介绍一下怎样在对话框中用C ...
- VM虚拟机安装苹果雪豹操作系统
1.win xp虚拟机安装Mac OSX 一.用VM8安装mac os x10.6 ,然后升级到的10.6.8,如何安装vm大家自己百度吧.这里指列出了如何安装雪豹操作系统. DMG是mac os x ...
- 高仿qq聊天界面
高仿qq聊天界面,给有需要的人,界面效果如下: 真心觉得做界面非常痛苦,给有需要的朋友. chat.xml <?xml version="1.0" encoding=&quo ...
- ASP.NET网站与ASP.NET应用程序的区别
我们使用VS做ASP.NET的时候,可以选择新建ASP.NET应用程序,同时也可以新建ASP.NET网站,两者有什么具体区别呢?今天真是很幸运,比别人多上了老师一节课,讲的是这两者之间的一些区别.我学 ...
- hadoop启动守护进程报JAVA_HOME is not set and could not be found
hadoop启动守护进程 sbin/start-dfs.sh 报如下错误:JAVA_HOME is not set and could not be found 解决办法(JAVA_HOME修改为具体 ...
- 简单实用的HTML代码
简单实用的HTML代码 一.HTML各种命令的代码: 1.文本标签(命令) <pre></pre> 创建预格式化文本 <h1></h1> 创建最大的标题 ...
- TCP的流量控制(转载)
1.TCP的滑动窗口 为了提高信道的利用率TCP协议不使用停止等待协议,而是使用连续ARQ协议,意思就是可以连续发出若干个分组然后等待确认,而不是发送一个分组就停止并等待该分组的确认. TCP的两端都 ...