文章内容来源于http://en.wikipedia.org/
Bulk Transfer中CBW (Command block wraper)里会包装SCSI的CDB。
每个CDB长度可以为6, 10, 12 or 16 (根据不同的命令). 最新也可以规定是变长的。
如下图,为Request sense命令的格式
SCSI会返回Status code (状态码)判断命令执行的状态
如00 OK
02 Check condition
08 Busy...
但Bulk transfer一般不用,Bulk Transfer的CSW有自己的状态码
但在执行错误时, 也用Request sense来查询具体错误代码
Request Sense: 返回上一个命令的错误码
数据格式见SCSI命令格式 (OP=03) 见上图
返回的数据格式:
Response code:
70h: 当前的所有错误,固定格式
71h: 延后的所有错误,固定格式
72h: 当前错误,描述符格式
73h: 延后错误,描述符格式
ILI: Incorrect length indicator
ILI=1 请求块的长度与设备block 长度不一致
Sense Key: 错误代码
0h: No Sense没有特殊的代码,有可能是成功的,也有可能ILI=1
1h: Recovered Error已恢复的错误
2h: Not Ready设备没有准备好,此时不能访问
3h: Medium Error设备有问题
4h: Hardware Error硬件错误
5h: Illegal Request不合法的请求, 在Request时参数有可能不对
6h: Unit Attention设备被Reset
7h: Data Protect数据被保护
9h: Firmware Error
Bh: Aborted command
Ch: Equal, 用于Search时表示正确返回
Dh: Volume Overflow
Eh: Miscompare从磁盘读出来的数据与Cache数据不一致
Sense key, Additional sense code and Additional sense key qualifier一起组成特殊的错误码,其中00000h表示没有错误, 具体信息见
http://en.wikipedia.org/wiki/KCQ
如下图为Request sense的命令和返回的数据
Test Unit Ready: 判断一个设备(Device)是否准备好(Ready)传输数据(读或写)
设备返回0 (Good Status) 或通过Request Sense 查询状态 (Status)
Inquiry用来查询一个设备的基本信息
Read Capacity: 返回设备的容量
RelAdr: 表明LBA(logical block Address)是相对地址
PMI (Partial Medium indicator):
0: 最后一个LBA
1: 当前读到的最后一个LBA(由于某些读写延时造成)
返回的数据格式:
如读到的数据为: 00 EC DF FF 00 00 02 00
表示最后一个逻辑块号为15523839,块长512, 由此计算出该设备的容量
(15523839+1)*512/1024=7761920KB