07.06.2013 Views

Scsi - Index of

Scsi - Index of

Scsi - Index of

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

SCCS=0 ACC=0 TGPS=0 3PC=0 Protect=0 BQue=0<br />

EncServ=0 MultiP=0 [MChngr=0] [ACKREQQ=0] Addr16=0<br />

[RelAdr=0] WBus16=0 Sync=0 Linked=0 [TranDis=0] CmdQue=0<br />

length=36 (0x24) Peripheral device type: disk<br />

Vendor identification: Intel<br />

Product identification: Flash Disk<br />

Product revision level: 2.00<br />

这里我使用的是我们Intel 自己生产的一块U盘,去年过年的时候我们大老板发的,使用sg_inq 命令可以<br />

查询到关于我的这块U 盘的基本信息,实际上sg_inq 可以查询所有的scsi 设备的信息,因为INQUIRY 本<br />

来就是一个标准的SCSI 命令嘛.当然以上这些信息中,我们之后用得到的大概也就是Vendor ID,Product<br />

ID,Product revision,以及那个length,device type--disk,还有那个中括号里的SCSI-2,这代表遵守的<br />

SCSI 的版本,scsi 协议也发展了这么多年,当然也有不同的版本了.<br />

Ok,有了直观的印象了我们就继续看代码,255 行,判断data[0]是否是20h,20h 有什么特别的吗?当<br />

然.scsi 协议里规定了,标准的INQUIRY data 的data[0],总共8 个bit 嘛不是,其中bit7~bi5 被称为<br />

peripheral qualifier(三位),而bit4~bit0 被称为perpheral device type(五位),这俩家伙代表了不同的<br />

含义,但是20h 就表示peripheral qualifier 这个外围设备限定符为001b,而peripheral device type<br />

这个外围设备类型则为00h,查阅scsi 协议可知,后者代表的是设备类型为磁盘,或者说直接访问设备,前者<br />

代表的是目标设备的当前lun 支持这种类型,然而,实际的物理设备并没有连接在当前lun 上.在data[36]<br />

中,从data[8]一直到data[35]这28 个字节都是保存的vendor 和product 的信息.scsi 协议里边写了,<br />

如果设备里有保存这些信息,那么她可以暂时先返回0x20h,因为现在是系统power on 时期或者是reset<br />

期间,要尽量减少延时,于是fill_inquiry_response()就会把data[8]到data[35]都给设置成0.等到保存<br />

在设备上的这些信息可以读了再去读.<br />

如果不是20h,比如我们这里传递进来的data[0]就是0,那么看266 行,data[8]开始的8 个字节可以保<br />

存vendor 相关的信息,对于,us->unusual_dev,我们早已不陌生,struct us_data 结构体中的成员<br />

struct us_unusual_dev *unusual_dev, 想当年, 咱们在storage_probe() 时曾经把<br />

us_unusual_dev_list[] 数组中的对应元素赋给了她, 而us_unusua_dev_list[] 又来自<br />

unusual_devs.h,都是预先定义好了的.所以这里就是把其中的vendorName复制到data数组中来,但是<br />

如果vendorName 超过8 个字符了那可不行,只取前8 个就ok 了,当然像我家Intel 就不存在这个问题<br />

了,<br />

只有5 个字符,大多数公司也都是八个字符以内,比如长一点的名字有Motorola,Sansung 也都没问题.同<br />

样productName 也是一样的方法,复制到data 数组中来,协议里规定了,从16 开始存放productName,<br />

不能超过16 个字符,那么”Flash Disk”也没有问题.(注:正式版此处将插入图片,Standard INQUIRY<br />

data format)<br />

然后可以看272 行,us->pusb_dev->descriptor.bcdDevice,struct us_data 中有一个成员struct<br />

usb_device *pusb_dev, 而struct usb_device 中有一个成员struct usb_device_descriptor<br />

descriptor,而struct usb_device_descriptor 中的成员__u16 bcdDevice,表示的是制造商指定的产<br />

品<br />

的版本号,道上的规矩是用版本号,制造商id 和产品id 来标志一个设备.bcdDevice 一共16 位,是以bcd<br />

131<br />

码的方式保存的信息,也就是说,每4 位代表一个十进制的数,比如0011 0110 1001 0111 就代表的<br />

3697.<br />

而在scsi 标准的INQUIRY data 中,data[32]到data[35]被定义为保存这四个数,并且要求以ASCII 码<br />

的方式保存,ASCII 码中48 对应咱们日常的0,49 对应1,50 对应2,也就是说得在现有数字的基础上加上<br />

48,或者说加上0x30.这就是272 到275 行所表达的意思.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!