You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
InterfaceProtocol=US_PR_CB.<br />
USB_CLASS_MASS_STORAGE 就不用再说了,咱们这个驱动程序所支持的每一种设备都是属于这个<br />
类,<br />
或者说这个Class.但是这个Class 里边包含不同的SubClass,比如subclass 02 为CD-ROM 设备,04 为<br />
软盘驱动器,06 为通用SCSI 类设备.而通信协议则主要有CBI 协议和Bulk-Only 协议.<br />
像US_SC_RBC 这些关于sub class 的宏的定义是在文件drivers/usb/storage/protocol.h 中:<br />
47 /* Sub Classes */<br />
48<br />
49 #define US_SC_RBC 0x01 /* Typically, flash devices */<br />
50 #define US_SC_8020 0x02 /* CD-ROM */<br />
51 #define US_SC_QIC 0x03 /* QIC-157 Tapes */<br />
52 #define US_SC_UFI 0x04 /* Floppy */<br />
53 #define US_SC_8070 0x05 /* Removable media */<br />
54 #define US_SC_SCSI 0x06 /* Transparent */<br />
55 #define US_SC_ISD200 0x07 /* ISD200 ATA */<br />
而像US_PR_CB 这些关于传输协议的宏则在另一个文件中,drivers/usb/storage/transport.h<br />
/* Protocols */<br />
#define US_PR_CBI 0x00 /* Control/Bulk/Interrupt */<br />
#define US_PR_CB 0x01 /* Control/Bulk w/o interrupt */<br />
#define US_PR_BULK 0x50 /* bulk only */<br />
这个文件中还定义了更多的协议,不过我们暂时只需要知道这三种,因为其她协议都是专门针对一些特殊设<br />
备的,在storage_usb_ids 数组中使用宏USB_INTERFACE_INFO 定义的usb_device_id 都只是用的<br />
这三种协议.(US_PR_CBI 和US_PR_CB 这两种协议在usb 协议中都唤作CBI,不过之间有点差别.)而<br />
对<br />
于一些特殊的设备,则还在unusual_devs.h 文件中有专门的一些变量定义,我们暂且不去关注它们.<br />
说了这许多,U 盘属于其中的哪一种呢?usb 协议中规定,U 盘的Subclass 是属于US_SC_SCSI 的.而<br />
其通<br />
信协议使用的是Bulk-Only 的.显然这些东西我们后来都会用得上.<br />
那么这里还有一个match_flag,它又是表示什么意思?USB_INTERFACE_INFO 这个宏貌似把所有的设<br />
备的match_flag 都给设成了USB_DEVICE_ID_MATCH_INT_INFO,这是为啥?这个宏来自<br />
include/linux/usb.h,<br />
435 #define USB_DEVICE_ID_MATCH_INT_INFO \<br />
436 (USB_DEVICE_ID_MATCH_INT_CLASS |<br />
USB_DEVICE_ID_MATCH_INT_SUBCLASS | USB_DEVICE_ID_MATCH_INT_PROTOCOL)<br />
match_flag 这个咚咚是给usb core 去用的,usb core 负责给设备寻找适合她的driver,负责给driver<br />
寻找适合他的device,它所比较的就是struct usb_device_id 的变量,而struct usb_device_id 结构体<br />
中有许多成员,那么是不是一定要把每一个成员都给比较一下呢,其实没有必要那么细,差不多就行了,比如<br />
咱们这里,就是告诉usb core,你只要比较bInterfaceClass,bInterfaceSubClass,bInterfaceProtocol<br />
即可.include/linux/mod_devicetable.h 中针对struct usb_device_id 中的每一个要比较的项定义了<br />
一个宏:<br />
32<br />
121 /* Some useful macros to use to create struct usb_device_id */<br />
122 #define USB_DEVICE_ID_MATCH_VENDOR 0x0001<br />
123 #define USB_DEVICE_ID_MATCH_PRODUCT 0x0002