Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
269 memcpy(data+16, us->unusual_dev->productName,<br />
270 strlen(us->unusual_dev->productName) > 16 ? 16 :<br />
271 strlen(us->unusual_dev->productName));<br />
272 data[32] = 0x30 + ((us->pusb_dev->descriptor.bcdDevice>>12)<br />
& 0x0F);<br />
273 data[33] = 0x30 + ((us->pusb_dev->descriptor.bcdDevice>>8) &<br />
0x0F);<br />
274 data[34] = 0x30 + ((us->pusb_dev->descriptor.bcdDevice>>4) &<br />
0x0F);<br />
275 data[35] = 0x30 + ((us->pusb_dev->descriptor.bcdDevice) &<br />
0x0F);<br />
276 }<br />
277<br />
278 usb_stor_set_xfer_buf(data, data_len, us->srb);<br />
279 }<br />
故事发生的太突然,会让人产生幻觉. 本来我们正儿八经用来处理scsi 命令的函数是后面将要讲的<br />
proto_handler(),但想不到我们在这里开始接触scsi 命令了.理由正是因为像Sony 这几款PEG 产品做<br />
的<br />
不好,连最基本的scsi 命令INQUIRY 都不支持,完了又想在Linux 中使用,那没办法了,Sony 毕竟是大公<br />
司,连欧洲冠军杯都是他们家和喜力给赞助的,开源社区没有必要得罪他们,所以就准备一个函数来fix 这个<br />
问题吧,毫无疑问,这属于硬件上的一个bug.<br />
那么什么是INQUIRY 命令?曾经也提过,INQUIRY 命令是最最基本的一个SCSI 命令,比如主机第一<br />
次探测设备的时候就要用INQUIRY命令来了解这是一个什么设备,比如scsi 总线上有一个插槽插了一个设<br />
备,那么scsi 主机就问它,你是scsi 磁盘呢,还是scsi 磁带,又或是scsi 的CD ROM 呢?作为设备,它内部<br />
一<br />
定有一段固件程序,即所谓的firmware.它就在接收到主机的INQUIRY 命令之后作出回答.具体应该怎么<br />
回答?当然是依据scsi 协议里规定的格式了.不仅仅INQUIRY 命令,对于每一个命令都应该如此.只要对方<br />
问:天王盖地虎.你作为设备就该回答,宝塔镇河妖.这其实就好比我们对对联,人家问天恢弘,地恢弘,天地恢<br />
弘,就得对你妈的,他妈的,你他妈的.这都是不成文的规矩,而开发scsi 的人把这些写成了规范,它就变成了<br />
成文的规矩了.具体来说, 设备在受到INQUIRY 命令查询时,她的相应遵从scsi 协议里面规定的标准格<br />
式,<br />
标准格式规定了,响应数据必须至少包含36 个字节,所以252 行,如果data_len 小于36,那就甭往下走了,<br />
返回吧.您违规了.<br />
如果你对scsi 协议很陌生,还是没有明白INQUIRY 命令究竟是做什么,那么推荐一个工具给你,你可以<br />
试一试,以便有个直观的印象,其实INQUIRY 命令就是如其字面意思一样,查询,查询设备的一些基本信息,<br />
从软件的角度来说,在主机扫描的时候,或者说枚举的时候,向每一个设备发送这个命令,并且获得回答,驱动<br />
程序从此就会保存这些信息,因为这些信息之后可能都会用到或者说其中的一部分会被用到.这里推荐的工<br />
具是sg_utils3,这是一个软件包,Linux 中可以使用的软件包,到处都有下,下了之后安装上,然后它包含一<br />
个应用程序sg_inq,这其实就是给设备发送INQUIRY 命令用的,用法如下所示:<br />
130<br />
[root@localhost ~]# sg_inq -36 /dev/sda<br />
standard INQUIRY:<br />
PQual=0 Device_type=0 RMB=1 version=0x02 [SCSI-2]<br />
[AERC=0] [TrmTsk=0] NormACA=0 HiSUP=0 Resp_data_format=2