Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
124 #define USB_DEVICE_ID_MATCH_DEV_LO 0x0004<br />
125 #define USB_DEVICE_ID_MATCH_DEV_HI 0x0008<br />
126 #define USB_DEVICE_ID_MATCH_DEV_CLASS 0x0010<br />
127 #define USB_DEVICE_ID_MATCH_DEV_SUBCLASS 0x0020<br />
128 #define USB_DEVICE_ID_MATCH_DEV_PROTOCOL 0x0040<br />
129 #define USB_DEVICE_ID_MATCH_INT_CLASS 0x0080<br />
130 #define USB_DEVICE_ID_MATCH_INT_SUBCLASS 0x0100<br />
131 #define USB_DEVICE_ID_MATCH_INT_PROTOCOL 0x0200<br />
回去对比一下struct usb_device_id 就知道这些宏是什么意思了.<br />
然后我们再看storage_usb_ids 中那个#include "unusual_devs.h",实际上这个文件也是在我们这个<br />
drivers/usb/storage/目录下面,它里边定义了一些特殊的设备,也是以struct usb_device_id 结构体变<br />
量的形式,这些设备或者是有一些别的设备不具备的特性,或者是他们遵循的通信协议有些与众不同,比如,<br />
它既不是Bulk-Only 也不是CBI,像这些不按常理出牌的设备,写代码的同志们把他们单独给列了出来.整<br />
理在这个文件中.当然,从大的类来分,它们依然是属于usb mass storage 这个类别的,否则也没必要放在<br />
这个目录下面了.<br />
至此,我们可以知道storage_usb_ids 这个表是怎么回事了.usb core 为每个设备在这张表里查找,如果<br />
找<br />
到了某一行和这个设备相匹配,那么该行就是我们前面提到的那个storage_probe()的参数id.所以<br />
id_index=id-storage_usb_ids 就是如其字面意义那样,在表中的编号.至于这个编号有什么用,那我们<br />
骑<br />
驴看唱本.总之,费这么大劲干了这么一件事,总是有它的意义的.<br />
最后,总结陈词,这个所谓的花名册,就好比我们大学生申请国外学校,每个人都会事先搜集一大批学校名单,<br />
然后结合各方面,比如师资力量,是否牛的导师够多,比如经济实力,是否能给够多的奖学金,比如教授本人资<br />
历,是否获得过重大奖项,取得过何种成绩,比如学校声望, 是否是名校,综合这些来看最终确定一份名单,就<br />
是自己真正心仪的学校花名册.那么那个match_flags 是什么意思呢,而有的同学嫌这样太麻烦,又或者他<br />
们可能只是需要一个能发学历的,像杨澜老公吴征所获得博士学位的那个巴林顿大学那样卖假文凭的学校<br />
也许就能满足他们了,那么他们就不必去评估那么多项,反正他们心中的match_flags 就是能够和吴征成<br />
为<br />
校友就可以了,管它是否因为该学校被取缔以后他们也会像吴征那样痛失母校呢.<br />
冰冻三尺非一日之寒<br />
罗马不是一天建成的.在让U 盘工作之前,其实我们的驱动作了很多准备工作.<br />
我们继续跟着感觉走,storage_probe(),943 行至948 行,一系列的以init_*命名的函数在此刻被调用,<br />
这<br />
里涉及了一些锁机制,等待机制,不过只是初始化,暂且不理睬,到后面用到的时候再细说,不过请记住,这几<br />
行每一行都是有用的.后面自然会用得着.<br />
此时,我们先往下走,951 行associate_dev()和962 行get_device_info(),这两个函数是我们目前需要<br />
看的,一个一个来.<br />
33<br />
先看associate_dev(),定义于drivers/usb/storage/usb.c,<br />
429 /* Associate our private data with the USB device */<br />
430 static int associate_dev(struct us_data *us, struct usb_interface *intf)<br />
431 {