2018-01-12 11:13:55来源:segmentfault作者:CoderDock人点击


<!-- more -->

1. USB设备结构体


* struct usb_device - kernel's representation of a USB device
* @devnum: device number; address on a USB bus
* @devpath: device ID string for use in messages (e.g., /port/...)
* @route: tree topology hex string for use with xHCI
* @state: device state: configured, not attached, etc.
* @speed: device speed: high/full/low (or error)
* @tt: Transaction Translator info; used with low/full speed dev, highspeed hub
* @ttport: device port on that tt hub
* @toggle: one bit for each endpoint, with ([0] = IN, [1] = OUT) endpoints
* @parent: our hub, unless we're the root
* @bus: bus we're part of
* @ep0: endpoint 0 data (default control pipe)
* @dev: generic device interface
* @descriptor: USB device descriptor
* @bos: USB device BOS descriptor set
* @config: all of the device's configs
* @actconfig: the active configuration
* @ep_in: array of IN endpoints
* @ep_out: array of OUT endpoints
* @rawdescriptors: raw descriptors for each config
* @bus_mA: Current available from the bus
* @portnum: parent port number (origin 1)
* @level: number of USB hub ancestors
* @can_submit: URBs may be submitted
* @persist_enabled:USB_PERSIST enabled for this device
* @have_langid: whether string_langid is valid
* @authorized: policy has said we can use it;
*(user space) policy determines if we authorize this device to be
*used or not. By default, wired USB devices are authorized.
*WUSB devices are not, until we authorize them from user space.
*FIXME -- complete doc
* @authenticated: Crypto authentication passed
* @wusb: device is Wireless USB
* @lpm_capable: device supports LPM
* @usb2_hw_lpm_capable: device can perform USB2 hardware LPM
* @usb2_hw_lpm_besl_capable: device can perform USB2 hardware BESL LPM
* @usb2_hw_lpm_enabled: USB2 hardware LPM is enabled
* @usb2_hw_lpm_allowed: Userspace allows USB 2.0 LPM to be enabled
* @usb3_lpm_u1_enabled: USB3 hardware U1 LPM enabled
* @usb3_lpm_u2_enabled: USB3 hardware U2 LPM enabled
* @string_langid: language ID for strings
* @product: iProduct string, if present (static)
* @manufacturer: iManufacturer string, if present (static)
* @serial: iSerialNumber string, if present (static)
* @filelist: usbfs files that are open to this device
* @maxchild: number of ports if hub
* @quirks: quirks of the whole device
* @urbnum: number of URBs submitted for the whole device
* @active_duration: total time device is not suspended
* @connect_time: time device was first connected
* @do_remote_wakeup:remote wakeup should be enabled
* @reset_resume: needs reset instead of resume
* @port_is_suspended: the upstream port is suspended (L2 or U3)
* @wusb_dev: if this is a Wireless USB device, link to the WUSB
*specific data for the device.
* @slot_id: Slot ID assigned by xHCI
* @removable: Device can be physically removed from this port
* @l1_params: best effor service latency for USB2 L1 LPM state, and L1 timeout.
* @u1_params: exit latencies for USB3 U1 LPM state, and hub-initiated timeout.
* @u2_params: exit latencies for USB3 U2 LPM state, and hub-initiated timeout.
* @lpm_disable_count: Ref count used by usb_disable_lpm() and usb_enable_lpm()
*to keep track of the number of functions that require USB 3.0 Link Power
*Management to be disabled for this usb_device.This count should only
*be manipulated by those functions, with the bandwidth_mutex is held.
* Notes:
* Usbcore drivers should not set usbdev->state directly.Instead use
* usb_set_device_state().
struct usb_device {
chardevpath[16]; //该设备在SysFS中的路径,一般为"/sys/devices/pci0000:00/0000:00:12.2/_usb_1"
enum usb_device_statestate;//该设备的状态,如刚插上时为Attached
enum usb_device_speedspeed;//速度级别 high full lowstruct usb_tt*tt;//我们知道高速USB之前还存在全速和低速USB,那么高速USB设备怎么兼容其他
intttport;//低速设备,通过使用TT(Transaction Translator)--高速USB中的转换电路unsigned int toggle[2];//对于中断传输、批量传输、和控制传输,传输数据时,需要DATA0和DATA1交
//替进行,toggle就是标识0端点的IN 和 OUT的DATAx的状态
struct usb_device *parent;//父hub,如果是roothub,就是NULL
struct usb_bus *bus;//设备所在的总线
struct usb_host_endpoint ep0;//端点0被特殊对待,在结构体中静态存在struct device dev;//嵌入到usb_device中的devicestruct usb_device_descriptor descriptor;//设备描述符,描述该设备信息,后面会分析
struct usb_host_bos *bos;
struct usb_host_config *config;//所有的配置信息列表struct usb_host_config *actconfig;//当前活跃的信息
struct usb_host_endpoint *ep_in[16];//该设备的输入端点
struct usb_host_endpoint *ep_out[16];//输出端点char **rawdescriptors;unsigned short bus_mA;//能够从总线得到的电流值
u8 portnum;
u8 level;unsigned can_submit:1;
unsigned persist_enabled:1;
unsigned have_langid:1;
unsigned authorized:1;
unsigned authenticated:1;
unsigned wusb:1;
unsigned lpm_capable:1;
unsigned usb2_hw_lpm_capable:1;
unsigned usb2_hw_lpm_besl_capable:1;
unsigned usb2_hw_lpm_enabled:1;
unsigned usb2_hw_lpm_allowed:1;
unsigned usb3_lpm_u1_enabled:1;
unsigned usb3_lpm_u2_enabled:1;
int string_langid;/* static strings from the device */
char *product;
char *manufacturer;
char *serial;struct list_head filelist;int maxchild;u32 quirks;
atomic_t urbnum;unsigned long active_duration;#ifdef CONFIG_PM
unsigned long connect_time;unsigned do_remote_wakeup:1;
unsigned reset_resume:1;
unsigned port_is_suspended:1;
struct wusb_dev *wusb_dev;
int slot_id;
enum usb_device_removable removable;
struct usb2_lpm_parameters l1_params;
struct usb3_lpm_parameters u1_params;
struct usb3_lpm_parameters u2_params;
unsigned lpm_disable_count;
#defineto_usb_device(d) container_of(d, struct usb_device, dev)
2 USB设备描述符结构体


/* USB_DT_DEVICE: Device descriptor */
struct usb_device_descriptor {
__u8bDescriptorType;// USB_DT_DEVICE = 0x01__le16 bcdUSB;//版本号
__le16 idVendor;//厂商号
__le16 idProduct;//产品号
__le16 bcdDevice;//版本号
__u8iManufacturer;//分别对应上面的索引值 index
} __attribute__ ((packed));