You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
233 .owner = THIS_MODULE,<br />
234 .name = "usb-storage",<br />
235 .probe = storage_probe,<br />
236 .disconnect = storage_disconnect,<br />
237 .id_table = storage_usb_ids,<br />
238 };<br />
可以看到这里定义了一个struct usb_driver 的结构体变量,usb_storage_driver,关于usb_driver 我<br />
们<br />
上节已经说过了,当时主要说的是其中的成员driver,而眼下要讲的则是另外几个成员.首先,.owner<br />
和.name 这两个没啥好多说的,owner 这玩艺是用来给模块计数的,每个模块都这么用,赋值总是<br />
THIS_MODULE,而name 就是这个模块的名字,usb core 会处理它,所以如果这个模块正常被加载了的<br />
话,<br />
使用lsmod 命令能看到一个叫做usb-storage 的模块名.重点要讲一讲,.probe 和.disconnect 以及这<br />
个<br />
id_table.<br />
我是谁的他?<br />
probe,disconnect,id_table,这三个咚咚中首先要登场亮相的是id_table,它是干嘛用的呢?<br />
我们说过,一个device 只能绑定一个driver,但driver 并非只能支持一种设备,道理很简单,比如<br />
我有两块U盘,那么我可以一起都插入,但是我只需要加载一个模块,usb-storage,没听说过插入<br />
两块U 盘就得加载两次驱动程序的,除非这两块U 盘本身就得使用不同的驱动程序.也正是因为<br />
一个模块可以被多个设备共用,才会有模块计数这么一个说法.<br />
ok,既然一个driver 可以支持多个device,那么当发现一个device 的时候,如何知道哪个driver<br />
才是她的Mr.Right 呢?这就是id_table 的用处,让每一个struct usb_driver 准备一张表,里边<br />
注明该driver 支持哪些设备,这总可以了吧.如果你这个设备属于这张表里的,那么ok,绑定吧,如<br />
果不属于这张表里的,那么不好意思,您请便.哪凉快上哪去.<br />
来自struct usb_driver 中的id_table,<br />
const struct usb_device_id *id_table;<br />
实际上是一个指针,一个struct usb_device_id 结构体的指针,当然赋了值以后就是代表一个数<br />
组名了,正如我们在定义struct usb_driver usb_storage_driver 中所赋的值那<br />
样,.id_table=storage_usb_ids,那好,我们来看一下usb_device_id 这究竟是怎样一个结构<br />
体.<br />
struct usb_device_id 来自include/linux/mod_devicetable.h,<br />
40 /*<br />
41 * Device table entry for "new style" table-driven USB drivers.<br />
42 * User mode code can read these tables to choose which modules to load.<br />
43 * Declare the table as a MODULE_DEVICE_TABLE.<br />
44 *<br />
45 * A probe() parameter will point to a matching entry from this table.<br />
46 * Use the driver_info field for each match to hold information tied<br />
17<br />
47 * to that match: device quirks, etc.<br />
48 *