当
USB
设备刚接入
USB
主机后,主机会对
USB
设备进行枚举,在此过程中获取设备的描述符信息,并据此加载合适的驱动程序等。
USB
枚举过程如下:
①
当
Host
检测到
Device
接入后,发出总线复位信号,使
Device
的地址复位为
0
,然后主机向地址
0
的端点
0
发送获取设备描述符的请求,用于确认
USB
通讯是否正常。
Device
响应请求后发送设备描述符给
Host
,
Host
确认设备描述符无误后向
Device
回复一个
ACK
包。
②
Host
再次复位设备,目的是使
Device
进入确定的状态,然后向地址
0
的端点
0
发送
设置地址请求
来向
Device
分配一个地址,
Device
确认后,
Host
使用新地址与之通讯。
③
Host
向
Device
的新地址的端点
0
发送
获取设备描述符
的请求这一次是为了获取整个设备描述符的内容,成功后再发送获取配置描述符请求来获取配置描述符、接口描述符、端点描述符等信息
④
Host
根据描述符匹配一个最合适的驱动程序给
Device
,然后驱动根据描述符内容
确定
Device
当前的使用配置
。
匹配的过程:
![](https://img-blog.csdnimg.cn/direct/13cc3cc5ea8146318fa347d505794e45.png)
-
USB控制器或Hub识别出USB设备后,会创建、注册usb_deive
-
usb_device被"drivers\usb\core\generic.c"驱动认领后,会选择、设置某个配置
-
这个配置下面的接口,都会分配、设置、注册一个usb_interface
-
左边的usb_driver的id_table和右边的usb_interface如果匹配,则调用usb_driver.probe
static struct usb_device_id myuvc_ids[] = {
/* Generic USB Video Class */
{ USB_INTERFACE_INFO(USB_CLASS_VIDEO, 1, 0) }, /**< VideoControl interface */
{ USB_INTERFACE_INFO(USB_CLASS_VIDEO, 2, 0) }, /**< VideoStreaming interface */
{}
};