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.

175 .useProtocol = use_protocol, \<br />

176 .useTransport = use_transport, \<br />

177 .initFunction = init_function, \<br />

178 .flags = Flags, \<br />

179 }<br />

Ok.这样这个宏的意思又是令vendorName 为"Samsung",令productName 为"Digimax 410",<br />

而useProtocol 为US_SC_DEVICE, useTransport 为US_PR_DEVICE,initFunction 为NULL,flag<br />

为US_FL_FIX_INQUIRY.<br />

看明白了吗?首先不去管各项的具体含义,至少我们看出来,针对同一个文件,我们使用两次定义<br />

UNUSUAL_DEV 这个宏的方法,两次利用了它的不同元素,换言之,UNUSUAL_DEV 这个宏本来可以设<br />

定<br />

10 个参数,而storage_usb_ids 中需要使用其中的前4 个参数,同时us_unusual_dev_list 中需要使用<br />

其中的后6 个参数,所以在unusual_devs.h 中定义的一行起了两个作用.我们注意到不管是<br />

storage_usb_ids 数组还是us_unusual_dev_list,其中都通过这么一行把unusual_devs.h 文件给包<br />

含了进来.storage_usb_ids 中:<br />

121 static struct usb_device_id storage_usb_ids [] = {<br />

122<br />

123 # include "unusual_devs.h"<br />

124 #undef UNUSUAL_DEV<br />

us_unusual_dev_list 中:<br />

181 static struct us_unusual_dev us_unusual_dev_list[] = {<br />

182 # include "unusual_devs.h"<br />

183 # undef UNUSUAL_DEV<br />

而我们之所以使用两个数组的原因是,storage_usb_ids 是提供给usb core 的,它需要比较driver 和<br />

device 从而确定设备是被这个driver 所支持的,我们只需要比较四项就可以了,因为这四项已经足以确定<br />

一个设备了,厂商,产品,序列号.比较这些就够了,而us_unusual_dev_list 这个数组中的元素是我们接下<br />

来的代码要用的,比如它用什么协议,它有什么初始化函数,所以我们使用了两个数组.而我们需要注意的是,<br />

这两个数组中元素的顺序是一样的,所以我们从storage_usb_ids 中得到的id_index 用于<br />

us_unusual_dev_list 也是可以的,表示的还是同一个设备.而这也就是我们刚才在get_device_info 中<br />

看到的.<br />

44<br />

472 struct us_unusual_dev *unusual_dev = &us_unusual_dev_list[id_index];<br />

473 struct usb_device_id *id = &storage_usb_ids[id_index];<br />

这样,unusual_dev 和id 就各取所需了.下面我们将会用到这两个指针.暂_________且不表.<br />

总结陈词,最后具体解释一下这行为三星这款数码相机写的语句,<br />

1. 关于match_flags,它的值是USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION,这<br />

是一个宏,它就告诉usb core,要比较这样几个方<br />

面,idVendor,idProduct,bcdDevice_lo,bcdDevice_hi,<br />

其中idVendor 和下面的vendorName 是对应的,而idProduct 和下面的productName 是对应的,业内<br />

为每家公司编一个号,这样便于管理,比如三星的编号就是0x0839,那么三星的产品中就会在其设备描述符<br />

中idVendor 的烙上0x0839.而三星自己的每种产品也会有个编号,和Digimax 410 对应的编号就是<br />

0x000a,而bcdDevice_lo 和bcdDevice_hi 共同组成一个具体设备的编号(device release<br />

number),bcd 就意味着这个编号是二进制的格式.<br />

2. vendorName 和productName 不用再说了, "Samsung"和"Digimax 410".

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

Saved successfully!

Ooh no, something went wrong!