You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
147 #if !defined(CONFIG_BLK_DEV_UB) && !defined(CONFIG_BLK_DEV_UB_MODULE)<br />
148 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_SCSI,<br />
US_PR_BULK) },<br />
149 #endif<br />
150<br />
151 /* Terminating entry */<br />
152 { }<br />
153 };<br />
注意到这是一个struct usb_device_id 结构体的数组,所以即使我们用下半身思考也能知道,其中每一项<br />
必然是一个struct usb_device_id 的结构体变量.我们先来看USB_INTERFACE_INFO 这个咚咚,很显<br />
然这是一个宏,来自include/linux/usb.h,<br />
473 /**<br />
474 * USB_INTERFACE_INFO - macro used to describe a class <strong>of</strong> usb interfaces<br />
475 * @cl: bInterfaceClass value<br />
476 * @sc: bInterfaceSubClass value<br />
477 * @pr: bInterfaceProtocol value<br />
478 *<br />
479 * This macro is used to create a struct usb_device_id that matches a<br />
480 * specific class <strong>of</strong> interfaces.<br />
481 */<br />
482 #define USB_INTERFACE_INFO(cl,sc,pr) \<br />
483 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO, .bInterfaceClass =<br />
(cl), .bInterfaceSubClass = (sc), .bInterfaceProtocol = (pr)<br />
每一个USB_INTERFACE_INFO 就是构造一个struct usb_device_id 的结构体变量,回顾一下我们之<br />
前<br />
给出的struct usb_device_id 的定义,这里实际上就是为其中的四个元素赋了值,它们是<br />
match_flags,bInterfaceClass,bInterfaceSubClass,bInterfaceProtocol.这里不得不说的是,这个世<br />
界上有许许多多的usb 设备,它们各有各的特点,为了区分它们,usb 规范,或者说usb 协议,把usb 设备分<br />
成了很多类,然而每个类又分成子类,这很好理解,我们一个大学也是如此,先是分成很多个学院,比如我们复<br />
旦大学,信息学院,经济学院,管理学院,外文学院,等等.然后每个学院又被分为很多个系,比如信息学院,下面<br />
分了电子工程系,微电子系,计算机系,通信工程系,然后可能每个系下边又分了各个专业,usb 协议也是这样<br />
干的,首先每个Interface 属于一个Class,(为什么是把Interface 分类,而不把Device 分类?前面讲过了,<br />
在usb 设备驱动中,不用再提Device,因为每个设备驱动对应的是一种Interface,而不是一种Device),然<br />
后Class 下面又分了SubClass,完了SubClass 下面又按各种设备所遵循的不同的通信协议继续细<br />
分.usb<br />
协议里边为每一种Class,每一种SubClass,每一种Protocol 定义一个数值,比如mass storage 的Class<br />
就是0x08,而这里USB_CLASS_MASS_STORAGE这个宏在include/linux/usb_ch9.h 中定义,其值正<br />
是8.<br />
我们拿第126 行来举例,<br />
{ USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_RBC, US_PR_CB) },<br />
把这个宏展开,就是说定义了这么一个usb_device_id 结构体变量,其<br />
match_flags=USB_DEVICE_ID_MATCH_INT_INFO,而<br />
31<br />
bInterfaceClass=USB_CLASS_MASS_STORAGE,bInterfaceSubClass=US_SC_RBC,而