Linux 下USB 驱动之skeleton 分析 1.结构体 内核其实就是一坨坨的数据结构,加上一根根链表
对于初学者,如果直接看 USB 驱动代码,大概会被那些名字相近的结构体弄得晕头转向,比如 usb_host_interface 和 usb_interface,看着看着就把两个混淆了
所以,在学习 USB 驱动之前,建议把相关结构体都拎出来看一下,其实,也就那么几个结构体在那装神弄鬼
USB skeleton 驱动中用到的主要字段已用蓝色标出: endpoint: struct usb_host_endpoint { struct usb_endpoint_descriptor desc; struct list_head urb_list; void *hcpriv; unsigned char *extra; int extralen; }; struct usb_endpoint_descriptor { __u8 bLength; __u8 bDescriptorType; __u8 bEndpointAddress; __u8 bmAttributes; __le16 wMaxPacketSize; __u8 bInterval; __u8 bRefresh; __u8 bSynchAddress; } __attribute__ ((packed)); bEndpointAddress,最高位用来判断传输方向: #define USB_ENDPOINT_NUMBER_MASK 0x0f #define USB_ENDPOINT_DIR_MASK 0x80 #define USB_DIR_OUT 0 #define USB_DIR_IN 0x80 bmAttributes,表示endpoint 的类型: #define USB_ENDPOINT_XFER