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
- };
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;
- };
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 *);
- };
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))));
- };
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;
- };
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;
- };
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;
- };
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];
- };
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; //驱动信息
- };
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));
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));
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));
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));