Scsi - Index of

Scsi - Index of Scsi - Index of

07.06.2013 Views

121 static struct usb_device_id storage_usb_ids [] = { 122 123 # include "unusual_devs.h" 124 #undef UNUSUAL_DEV 125 /* Control/Bulk transport for all SubClass values */ 126 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_RBC, US_PR_CB) }, 127 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_8020, US_PR_CB) }, 128 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_QIC, US_PR_CB) }, 129 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_UFI, US_PR_CB) }, 130 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_8070, US_PR_CB) }, 131 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_SCSI, US_PR_CB) }, 132 133 /* Control/Bulk/Interrupt transport for all SubClass values */ 134 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_RBC, US_PR_CBI) }, 135 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_8020, US_PR_CBI) }, 136 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_QIC, US_PR_CBI) }, 137 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_UFI, US_PR_CBI) }, 138 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_8070, US_PR_CBI) }, 139 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_SCSI, US_PR_CBI) }, 140 141 /* Bulk-only transport for all SubClass values */ 142 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_RBC, US_PR_BULK) }, 143 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_8020, US_PR_BULK) }, 144 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_QIC, US_PR_BULK) }, 145 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_UFI, US_PR_BULK) }, 146 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_8070, 30 US_PR_BULK) },

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

121 static struct usb_device_id storage_usb_ids [] = {<br />

122<br />

123 # include "unusual_devs.h"<br />

124 #undef UNUSUAL_DEV<br />

125 /* Control/Bulk transport for all SubClass values */<br />

126 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_RBC,<br />

US_PR_CB) },<br />

127 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_8020,<br />

US_PR_CB) },<br />

128 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_QIC,<br />

US_PR_CB) },<br />

129 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_UFI,<br />

US_PR_CB) },<br />

130 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_8070,<br />

US_PR_CB) },<br />

131 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_SCSI,<br />

US_PR_CB) },<br />

132<br />

133 /* Control/Bulk/Interrupt transport for all SubClass values */<br />

134 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_RBC,<br />

US_PR_CBI) },<br />

135 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_8020,<br />

US_PR_CBI) },<br />

136 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_QIC,<br />

US_PR_CBI) },<br />

137 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_UFI,<br />

US_PR_CBI) },<br />

138 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_8070,<br />

US_PR_CBI) },<br />

139 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_SCSI,<br />

US_PR_CBI) },<br />

140<br />

141 /* Bulk-only transport for all SubClass values */<br />

142 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_RBC,<br />

US_PR_BULK) },<br />

143 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_8020,<br />

US_PR_BULK) },<br />

144 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_QIC,<br />

US_PR_BULK) },<br />

145 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_UFI,<br />

US_PR_BULK) },<br />

146 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_8070,<br />

30<br />

US_PR_BULK) },

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

Saved successfully!

Ooh no, something went wrong!