分类: LINUX
2011-05-12 21:48:54
前面总结了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 dCSWTag field of the associated CSW. The dCSWTag positively 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说明了这个命令有多长。
举一个例子来讲,看对不对。
25.3 LEN 1f 00 00 00 31 62.1.0
25.3 DO 55 53 42 43 70 2e 96 88 24 00 00 00 80 00 06 12 USBCp...$....... 62.2.0
00 00 00 24 00 00 00 00 00 00 00 00 00 00 00 ...$........... 62.2.16
25.2 LEN 24 00 00 00 36 63.1.0
25.2 DI 00 80 04 02 20 00 00 00 65 43 6f 73 20 20 20 20 .... ...eCos 63.2.0
4d 61 73 73 20 53 74 6f 72 61 67 65 20 20 20 20 Mass Storage 63.2.16
30 2e 30 31 0.01 63.2.32
25.2 LEN 0d 00 00 00 13 64.1.0
25.2 DI 55 53 42 53 70 2e 96 88 00 00 00 00 00 USBSp........
知道这个数据包是bus hound抓的包吧,现在来看看。
25.3 LEN 1f 00 00 00 31 62.1.0
这里25.3表示25是第25号设备,3是表示这里是通过3端点进入的数据,前面确实定义了3端点为bulk out
LEN长度0x1f,意思是host给slave发送了31个字节。
25.3 DO 55 53 42 43 70 2e 96 88 24 00 00 00 80 00 06 12 USBCp...$....... 62.2.0
00 00 00 24 00 00 00 00 00 00 00 00 00 00 00 ...$........... 62.2.16
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。