USB通信程序设计 第6页
图3.9 USB 设备所执行的操作
USB Host 按照下面的格式向设备端发送CBW,
图3.10 CBW
其中dCBWSignature的值为43425355h(LSB),表示当前发送的是一个CBW;dCBWTag的内容需要原样作为dCSWTag再发送给Host;dCBWDataTransferLength为本次CBW需要传输的数据长度,bmCBWFlags反映数据传输的方向,0表示来自Host,1表示发至Host;bCBWLUN一般为零,但当设备有多个逻辑单元时,用此位指定本次命令是发给谁的;bCBWCBLength为本次命令字的长度;CBWCB即为真正的传输命令集的命令。设备得到一个CBW后,解析出CBWCD中所代表的命令,然后按照SCSI命令集中的定义来执行相应的操作,或是需要接收下一个Bulk-Out发来的数据,或是需要向Host传送数据,完成以后需要向USB Host发送CSW,反映命令执行的状态。USB也是通过此来了解设备的工作情况的。USB设备按照下面的格式向主机端发送CBW,
图3.11 CSW
其中dCSWSignature的值为53425355h(LSB),表示当前发送的是一个CSW;dCSWTag的内容为dCBWTag的内容,dCSWDataResidue为还需要传送的数据,此数据根据dCBWDataTransferLength减去本次已经传送的数据得到。Host端根据此值决定下一次CBW的内容,如果没有完成则继续;如果命令正确执行,则bCSWStatus返回0。设备按这个规则组装好CSW后,通过Bulk-In端点将其发送给主机。
3.3 SCSI指令集
Bulk-Only的CBW中的CBWCB中的内容即为如下格式的命令块描述符(Command Block Descriptor)。SCSI-2有三种字长的命令,6位、10位和12位,Microsoft Windows环境下支持12 位字长的命令。
图3.12 命令块描述符(Command Block Descriptor)
Operation Code是操作代码,表示特定的命令。高3位为Group Code,共有8 种组合,即8个组,低5五位为Command Code,可以有32种命令。Logicol unit Number是为了兼容SCSI-1而设的。Logical block address为高位在前,低位在后的逻辑块地址,即扇区地址。Transfer length为需要从逻辑块地址处开始传输的扇区数(比如在Read 和Write 命令中);Parameter list length为需要传输的数据长度(比如在Mode Sense 命令中);Allocation length为初始程序为返回数据所分配的最大字节数,此值可以为零,表示不需要传送数据。SCSI指令集的Direct Accesss类型存储介质的传输命令有许多,所幸运的是Mass Storage协议只用到了其中的一些。下面黑体部分即为需要USB设备作出响应的请求,一般是要求向Host发送一些有关设备的数据:表3.1 SCSI指令集
对于不同的命令,其命令块描述符略有不同,其要求的返回内容也有所不同,根据相应的文档,可以对每种请求作出适当的回应。下面以INQUIRY请求为例,给出该命令块的命令块描述符和其返回内容的数据格式,其它命令块格式和返回内容请参考Information technology - SCSI Primary Commands - 2(SPC-2)。
图3.13 INQUIRY命令块描述符
图3.14 INQUIRY命令返回数据格式
Host会依次发出INQUIRY、READ CAPACITY、UFI MODE SENSE请求,如果上述请求的返回结果都正确,则Host会发出READ命令,读取文件系统0簇0扇区的MBR数据,进入文件系统识别阶段。对于PREVENT-ALLOW MEDIUM REMOVAL 和TEST UNIT READY命令,只需直接返回CSW即可,对于后者,由于Flash盘总是处于READY状态,故可直接返回CSW。
3.4 FAT16 文件系统
3.4.1 FAT 文件系统结构
一个FAT(FAT12/FAT16/FAT32)文件系统卷(卷可以理解为是一张软盘、一个硬盘或是一个Flas电子盘)由四个部分组成:
3.4.1.1 保留区(Reserved Region)
分区的保留区(Reserved Region)中的第一个扇区必须是BPB(BIOS Parameter Block),