1. usb总线
struct usb_bus { struct device *controller; int busnum; //总线号 const char *bus_name; //总线名 u8 uses_dma; u8 uses_pio_for_control; u8 otg_port; unsigned is_b_host:1; unsigned b_hnp_enable:1; unsigned sg_tablesize; int devnum_next; //下一个地址 struct usb_devmap devmap; //usb设备地址表 struct usb_device *root_hub; //根hub struct usb_bus *hs_companion; struct list_head bus_list; //总线链表 int bandwidth_allocated; int bandwidth_int_reqs; int bandwidth_isoc_reqs; #ifdef CONFIG_USB_DEVICEFS struct dentry *usbfs_dentry; #endif #if defined(CONFIG_USB_MON) || defined(CONFIG_USB_MON_MODULE) struct mon_bus *mon_bus; int monitored; #endif };
2. usb hub
struct usb_hub { struct device *intfdev; struct usb_device *hdev; //usb设备 struct kref kref; struct urb *urb; char (*buffer)[8]; union { struct usb_hub_status hub; struct usb_port_status port; }*status; struct mutex status_mutex; int error; //出错标志 int nerrors; struct list_head event_list; //事件链表 unsigned long event_bits[1]; unsigned long change_bits[1]; unsigned long busy_bits[1]; unsigned long removed_bits[1]; #if USB_MAXCHILDREN > 31 #error event_bits[] is too short! #endif struct usb_hub_descriptor *descriptor; //hub描述符 struct usb_tt tt; unsigned mA_per_port; //每个端口电流量 unsigned limited_power:1; unsigned quiescing:1; unsigned disconnected:1; unsigned has_indicators:1; u8 indicator[USB_MAXCHILDREN]; struct delayed_work leds; struct delayed_work init_work; void **port_owners; };
3. usb主控器驱动
struct hc_driver { const char *description; //主控器类型 const char *product_desc; //厂商字串 size_t hcd_priv_size; //私有数据大小 irqreturn_t (*irq) (struct usb_hcd *hcd); int flags; //版本标志 int (*reset) (struct usb_hcd *hcd); //重置 int (*start) (struct usb_hcd *hcd); //启动 int (*pci_suspend)(struct usb_hcd *hcd, bool do_wakeup); int (*pci_resume)(struct usb_hcd *hcd, bool hibernated); void (*stop) (struct usb_hcd *hcd); //停止 void (*shutdown) (struct usb_hcd *hcd); //关闭 int (*get_frame_number) (struct usb_hcd *hcd); int (*urb_enqueue)(struct usb_hcd *hcd,struct urb *urb, gfp_t mem_flags); int (*urb_dequeue)(struct usb_hcd *hcd,struct urb *urb, int status); void (*endpoint_disable)(struct usb_hcd *hcd,struct usb_host_endpoint *ep); void (*endpoint_reset)(struct usb_hcd *hcd,struct usb_host_endpoint *ep); int (*hub_status_data) (struct usb_hcd *hcd, char *buf); int (*hub_control) (struct usb_hcd *hcd,u16 typeReq, u16 wValue, u16 wIndex,char *buf, u16 wLength); int (*bus_suspend)(struct usb_hcd *); //总线挂起 int (*bus_resume)(struct usb_hcd *); int (*start_port_reset)(struct usb_hcd *, unsigned port_num); void (*relinquish_port)(struct usb_hcd *, int); int (*port_handed_over)(struct usb_hcd *, int); void (*clear_tt_buffer_complete)(struct usb_hcd *,struct usb_host_endpoint *); void (*recover_hcd)(struct work_struct *data); int (*alloc_dev)(struct usb_hcd *, struct usb_device *); void (*free_dev)(struct usb_hcd *, struct usb_device *); int (*alloc_streams)(struct usb_hcd *hcd, struct usb_device *udev,struct usb_host_endpoint **eps, unsigned int num_eps,unsigned int num_streams, gfp_t mem_flags); int (*free_streams)(struct usb_hcd *hcd, struct usb_device *udev,struct usb_host_endpoint **eps, unsigned int num_eps,gfp_t mem_flags); int (*add_endpoint)(struct usb_hcd *, struct usb_device *,struct usb_host_endpoint *); int (*drop_endpoint)(struct usb_hcd *, struct usb_device *,struct usb_host_endpoint *); int (*check_bandwidth)(struct usb_hcd *, struct usb_device *); void (*reset_bandwidth)(struct usb_hcd *, struct usb_device *); int (*address_device)(struct usb_hcd *, struct usb_device *udev); int (*update_hub_device)(struct usb_hcd *, struct usb_device *hdev,struct usb_tt *tt, gfp_t mem_flags); int (*reset_device)(struct usb_hcd *, struct usb_device *); int (*update_device)(struct usb_hcd *, struct usb_device *); };
4. usb主控器设备
struct usb_hcd { struct usb_bus self; struct kref kref; const char *product_desc; //厂商字串 char irq_descr[24]; struct timer_list rh_timer; //轮询定时器 struct urb *status_urb; //urb状态 #ifdef CONFIG_USB_SUSPEND struct work_struct wakeup_work; #endif struct work_struct ehci_omap_work; const struct hc_driver *driver; unsigned long flags; unsigned rh_registered:1; unsigned rh_pollable:1; unsigned uses_new_polling:1; unsigned wireless:1; unsigned authorized_default:1; unsigned has_tt:1; int irq; //中断号 void __iomem *regs; //设备内存 u64 rsrc_start; //设备内存资源起始地址 u64 rsrc_len; //设备内存资源长度 unsigned power_budget; struct mutex bandwidth_mutex; struct dma_pool *pool[HCD_BUFFER_POOLS]; int state; unsigned long hcd_priv[0] __attribute__ ((aligned(sizeof(unsigned long)))); };
5. usb设备驱动
struct usb_driver { const char *name; //usb驱动名 int (*probe) (struct usb_interface *intf,const struct usb_device_id *id); //插入 void (*disconnect) (struct usb_interface *intf); //拔出 int (*unlocked_ioctl) (struct usb_interface *intf, unsigned int code,void *buf); //控制 int (*suspend) (struct usb_interface *intf, pm_message_t message); //挂起 int (*resume) (struct usb_interface *intf); //唤醒 int (*reset_resume)(struct usb_interface *intf); //复位唤醒 int (*pre_reset)(struct usb_interface *intf); //预复位 int (*post_reset)(struct usb_interface *intf); const struct usb_device_id *id_table; //支持设备id表 struct usb_dynids dynids; struct usbdrv_wrap drvwrap; //设备驱动的一个封装 unsigned int no_dynamic_id:1; unsigned int supports_autosuspend:1; unsigned int soft_unbind:1; };
6. usb设备
struct usb_device { int devnum; //usb设备地址 char devpath[16]; //usb树中的路径 u32 route; enum usb_device_state state; //usb设备状态 enum usb_device_speed speed; //usb速度 struct usb_tt *tt; int ttport; unsigned int toggle[2]; struct usb_device *parent; //父设备hub struct usb_bus *bus; //总线 struct usb_host_endpoint ep0; //端点0 struct device dev; //设备文件 struct usb_device_descriptor descriptor; //设备描述符 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; //所处hub层数 unsigned can_submit:1; unsigned persist_enabled:1; unsigned have_langid:1; unsigned authorized:1; unsigned authenticated:1; unsigned wusb:1; int string_langid; char *product; //产品id char *manufacturer; //厂商id char *serial; struct list_head filelist; #ifdef CONFIG_USB_DEVICE_CLASS struct device *usb_classdev; #endif #ifdef CONFIG_USB_DEVICEFS struct dentry *usbfs_dentry; //usbfs入口 #endif int maxchild; //最大子设备个数 struct usb_device *children[USB_MAXCHILDREN]; //子设备数组 u32 quirks; atomic_t urbnum; unsigned long active_duration; #ifdef CONFIG_PM unsigned long last_busy; int autosuspend_delay; unsigned long connect_time; unsigned do_remote_wakeup:1; unsigned reset_resume:1; #endif struct wusb_dev *wusb_dev; int slot_id; };
7. usb接口
struct usb_interface { struct usb_host_interface *altsetting; struct usb_host_interface *cur_altsetting; unsigned num_altsetting; struct usb_interface_assoc_descriptor *intf_assoc; int minor; enum usb_interface_condition condition; unsigned sysfs_files_created:1; unsigned ep_devs_created:1; unsigned unregistering:1; unsigned needs_remote_wakeup:1; unsigned needs_altsetting0:1; unsigned needs_binding:1; unsigned reset_running:1; unsigned resetting_device:1; struct device dev; struct device *usb_dev; atomic_t pm_usage_cnt; struct work_struct reset_ws; };
8. usb请求块urb
struct urb { struct kref kref; //参考计数 void *hcpriv; atomic_t use_count; atomic_t reject; int unlinked; struct list_head urb_list; //urb链表头 struct list_head anchor_list; struct list_head giveback_list; struct usb_anchor *anchor; struct usb_device *dev; //usb设备 struct usb_host_endpoint *ep; unsigned int pipe; //pipe unsigned int stream_id; int status; unsigned int transfer_flags; void *transfer_buffer; //传输缓冲区 dma_addr_t transfer_dma; struct scatterlist *sg; int num_sgs; u32 transfer_buffer_length; //缓冲区长度 u32 actual_length; unsigned char *setup_packet; //setup包 dma_addr_t setup_dma; int start_frame; int number_of_packets; //包数 int interval; int error_count; void *context; usb_complete_t complete; //回调函数 struct usb_iso_packet_descriptor iso_frame_desc[0]; };
9. usb设备id
struct usb_device_id { __u16 match_flags; //匹配标志 __u16 idVendor; //厂商id __u16 idProduct; //产品id __u16 bcdDevice_lo; //usb版本信息低位 __u16 bcdDevice_hi; //usb版本信息高位 __u8 bDeviceClass; //设备类 __u8 bDeviceSubClass; //子设备类 __u8 bDeviceProtocol; //设备协议 __u8 bInterfaceClass; //接口类 __u8 bInterfaceSubClass; //接口之类 __u8 bInterfaceProtocol; //接口协议 kernel_ulong_t driver_info; //驱动信息 };
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1.usb设备描述符
struct usb_device_descriptor { __u8 bLength; __u8 bDescriptorType; __le16 bcdUSB; __u8 bDeviceClass; __u8 bDeviceSubClass; __u8 bDeviceProtocol; __u8 bMaxPacketSize0; __le16 idVendor; __le16 idProduct; __le16 bcdDevice; __u8 iManufacturer; __u8 iProduct; __u8 iSerialNumber; __u8 bNumConfigurations; } __attribute__ ((packed));
2.usb配置描述符
struct usb_config_descriptor { __u8 bLength; __u8 bDescriptorType; __le16 wTotalLength; __u8 bNumInterfaces; __u8 bConfigurationValue; __u8 iConfiguration; __u8 bmAttributes; __u8 bMaxPower; } __attribute__ ((packed));
3.usb端点描述符
struct usb_endpoint_descriptor { __u8 bLength; __u8 bDescriptorType; __u8 bEndpointAddress; __u8 bmAttributes; __le16 wMaxPacketSize; __u8 bInterval; __u8 bRefresh; __u8 bSynchAddress; } __attribute__ ((packed));
4.usb接口描述符
struct usb_interface_descriptor { __u8 bLength; __u8 bDescriptorType; __u8 bInterfaceNumber; __u8 bAlternateSetting; __u8 bNumEndpoints; __u8 bInterfaceClass; __u8 bInterfaceSubClass; __u8 bInterfaceProtocol; __u8 iInterface; } __attribute__ ((packed));
--->usb子系统初始化