这一篇学习分析USB设备驱动程序,主要涉及到USB子系统概览、USB总线驱动框架、USB总线-设备-驱动模型。最后模拟实现一个USB设备驱动程序。
版本 | 理论最大速率 | 花名 |
---|---|---|
USB 1.0 | 1.5Mbps | 低速(Low-Speed) |
USB 1.1 | 12Mbps | 全速(Full-Speed) |
USB 2.0 | 480Mbps | 高速(High-Speed) |
USB 3.0 | 5Gbps | 超高速(Super-Speed) |
USB 3.1 | 10Gbps | 超高速+(Super-speed+) |
USB 4.0 | 40Gbps |
USB分为USB 主机(USB Host)和USB device(USB设备)。比如USB鼠标插入到电脑,电脑就是USB Host,鼠标就是USB device。所有的USB传输,都是从USB主机这方发起的;USB设备没有"主动"通知USB主机的能力。
/* USB_DT_DEVICE: Device descriptor */
struct usb_device_descriptor {
__u8 bLength; //该结构体大小
__u8 bDescriptorType; //描述符类型
__le16 bcdUSB; //usb版本号 200->USB2.0
__u8 bDeviceClass; //设备类
__u8 bDeviceSubClass; //设备类子类
__u8 bDeviceProtocol; //设备协议,以上三点都是USB官方定义
__u8 bMaxPacketSize0; //端点0最大包大小
__le16 idVendor; //厂家id
__le16 idProduct; //产品id
__le16 bcdDevice; //设备出厂编号
__u8 iManufacturer; //设备厂商字符串索引
__u8 iProduct; //产品描述
__u8 iSerialNumber; //设备序列号字符串索引
__u8 bNumConfigurations; //配置的个数
} __attribute__ ((packed));
struct usb_config_descriptor {
__u8 bLength; //该结构体大小
__u8 bDescriptorType;//描述符类型(本结构体中固定为0x02)
__le16 wTotalLength; //该配置下,信息的总长度(包括接口描述符)
__u8 bNumInterfaces; //接口的个数
__u8 bConfigurationValue; //Set_Configuration命令所需要的参数值
__u8 iConfiguration; //描述该配置的字符串的索引值
__u8 bmAttributes;//供电模式的选择
__u8 bMaxPower;//设备从总线提取的最大电流
} __attribute__ ((packed));
struct usb_interface_descriptor {
__u8 bLength; //该结构体大小
__u8 bDescriptorType;//接口描述符的类型编号(0x04)
__u8 bInterfaceNumber; //该接口的编号
__u8 bAlternateSetting; //备用的接口描述符编号
__u8 bNumEndpoints; //该接口使用的端点数,不包括端点0
__u8 bInterfaceClass; //接口类
__u8 bInterfaceSubClass; //子类
__u8 bInterfaceProtocol; //协议
__u8 iInterface;//描述该接口的字符串索引值
} __attribute__ ((packed));
/* USB_DT_ENDPOINT: Endpoint descriptor */
struct usb_endpoint_descriptor {
__u8 bLength; //端点描述符字节数大小(7个字节)
__u8 bDescriptorType;//端点描述符类型编号(0x05)
__u8 bEndpointAddress; //端点地址及输入输出属性
__u8 bmAttributes; //属性,包含端点的传输类型,控制,中断...
__le16 wMaxPacketSize; //端点收、发的最大包大小
__u8 bInterval; //中断传输模式中主机查询端点的时间间隔
/* NOTE: these two are _only_ in audio endpoints. */
/* use USB_DT_ENDPOINT*_SIZE in bLength, not sizeof. */
__u8 bRefresh;
__u8 bSynchAddress;
} __attribute__ ((packed));
端点,一个USB设备可以有多个端点,和主机间的数据传输称为到设备端点的数据传输。比如说,对于一个U盘,可以细分为两个端点,把数据写到U盘的端点1、从U盘的端点2读取数据。
linux-2.6.22.6/drivers/usb/core/usb.c
linux-2.6.22.6/drivers/usb/core/hub.c
待梳理
linux-2.6.22.6/drivers/usb/host/ohci-hcd.c
linux-2.6.22.6/drivers/usb/host/ohci-s3c2410.c
待梳理
linux-2.6.22.6/drivers/hid/usbhid/usbmouse.c
static struct usb_driver usb_mouse_driver = {
.name = "usbmouse",
.probe = usb_mouse_probe,
.disconnect = usb_mouse_disconnect,
.id_table = usb_mouse_id_table,
};
static int __init usb_mouse_init(void)
{
int retval = usb_register(&usb_mouse_driver);
if (retval == 0)
info(DRIVER_VERSION ":" DRIVER_DESC);
return retval;
}