Scsi - Index of
Scsi - Index of Scsi - Index of
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,而
- Page 1 and 2: 摘要 ............................
- Page 3 and 4: 迷雾重重的Bulk 传输(二)....
- Page 5 and 6: 引子 也许是在复旦养成了
- Page 7 and 8: usb.h datafab.h dpcm.h initializers
- Page 9 and 10: 的Linux 内核划分为许许多
- Page 11 and 12: 目录下执行make 了.Ok,make 之
- Page 13 and 14: 只 是一个usb 接口.这些口
- Page 15 and 16: 中也定义了这么一些数据
- Page 17 and 18: 511 * @driver: the driver model cor
- Page 19 and 20: 233 .owner = THIS_MODULE, 234 .name
- Page 21 and 22: 91 * construct these entries. Each
- Page 23 and 24: 324 struct usb_host_config *actconf
- Page 25 and 26: 22 88 * @class_dev: driver model's
- Page 27 and 28: 必须给各个地方取名,完了
- Page 29 and 30: 26 136 trans_cmnd transport; /* tra
- Page 31: 944 init_MUTEX_LOCKED(&(us->sema));
- Page 35 and 36: 124 #define USB_DEVICE_ID_MATCH_DEV
- Page 37 and 38: intf 来代替. us 之所以重要,
- Page 39 and 40: 睡眠,那就得用GPF_ATOMIC,这
- Page 41 and 42: 504 if (msg >= 0 && !(unusual_dev->
- Page 43 and 44: 179 } 180 181 static struct us_unus
- Page 45 and 46: 711 /* Submitted by Hartmut Wahl */
- Page 47 and 48: 3. useProtocol 为US_SC_DEVICE, use
- Page 49 and 50: Bus 004 Device 001: ID 0000:0000 Bu
- Page 51 and 52: 993 result = get_pipes(us); 994 if
- Page 53 and 54: 631 us->transport_reset = usb_stor_
- Page 55 and 56: 659 us->max_lun = 0; 660 break; 661
- Page 57 and 58: 740 /* Calculate and store the pipe
- Page 59 and 60: storage 会有两个bulk 端点,用
- Page 61 and 62: 比如说,复旦大学,有一个主
- Page 63 and 64: 1079 #define PIPE_ISOCHRONOUS 0 108
- Page 65 and 66: 782 us->unusual_dev->initFunction(u
- Page 67 and 68: 630 * each frame is in the fields o
- Page 69 and 70: 716 * Bulk URBs may 717 * use the U
- Page 71 and 72: 802 int number_of_packets; /* (in)
- Page 73 and 74: 先说互斥锁.它诞生于这样
- Page 75 and 76: 920 US_DEBUGP("GetMaxLUN command re
- Page 77 and 78: 148 /* set up data structures for t
- Page 79 and 80: 90 * @wValue: matches the USB wValu
- Page 81 and 82: 830 void *transfer_buffer, 831 int
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) },