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.

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

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

Saved successfully!

Ooh no, something went wrong!