介紹USB設備結構體和設備描述符結構體。
<!-- more -->linux
usb_device位於/linux/include/usb.h
less
/** * 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 { int devnum; //設備號,還記得上一篇USB命名"設備號-端口號:配置.接口"命名方式,每插入一個新設備,USBCore會爲其設置一個設備號 char devpath[16]; //該設備在SysFS中的路徑,通常爲"/sys/devices/pci0000:00/0000:00:12.2/_usb_1" u32 route; enum usb_device_state state; //該設備的狀態,如剛插上時爲Attached enum usb_device_speed speed; //速度級別 high full low struct usb_tt *tt; //咱們知道高速USB以前還存在全速和低速USB,那麼高速USB設備怎麼兼容其餘 int ttport; //低速設備,經過使用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中的device struct 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; #endif 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; }; #define to_usb_device(d) container_of(d, struct usb_device, dev)
usb_device_descriptor位於``ui
/* USB_DT_DEVICE: Device descriptor */ struct usb_device_descriptor { __u8 bLength; //該設備描述符的長度 __u8 bDescriptorType; // USB_DT_DEVICE = 0x01 __le16 bcdUSB; //版本號 __u8 bDeviceClass; // __u8 bDeviceSubClass; __u8 bDeviceProtocol; __u8 bMaxPacketSize0; //端點0一次能夠處理的最大字節數 __le16 idVendor; //廠商號 __le16 idProduct; //產品號 __le16 bcdDevice; //版本號 __u8 iManufacturer; //分別對應上面的索引值 index __u8 iProduct; __u8 iSerialNumber; __u8 bNumConfigurations; //設備在當前速度級別下支持的配置數量 } __attribute__ ((packed));