07.06.2013 Views

Scsi - Index of

Scsi - Index of

Scsi - Index of

SHOW MORE
SHOW LESS

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,而

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

Saved successfully!

Ooh no, something went wrong!