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".