前言
USB video class又称为USB video device class or UVC就是USB device class视频产品在不需要安装任何的驱动程序下即插即用,包括摄像头,数字摄影机,模拟视频转换器,电视卡及静态视频相机,V4L2就是用来管理UVC设备的并且能够提供视频相关的一些API
摄像头插入后内核打印出此信息,这是UVC机制的支持,即插即用不用我们自己写usb的驱动程序根据此信息可以定位到
drivers\media\usb\uvc\uvc_driver.c文件,该层为硬件相关层,根据以往的经验和平台设备驱动模型,该层肯定会分配,设置一个driver结构体,然后向上层核心层注册
struct uvc_driver uvc_driver = {
.driver = {
.name = "uvcvideo",
.probe = uvc_probe,//支持的video设备插入就会进入
.disconnect = uvc_disconnect,
.suspend = uvc_suspend,
.resume = uvc_resume,
.reset_resume = uvc_reset_resume,
.id_table = uvc_ids,//表示能够支持哪一些usb设备
.supports_autosuspend = 1,
},
};
该文件会去注册一个名字为uvc_driver的结构体,当匹配到usb设备时就会调用里面的uvc_probe函数
static int uvc_probe(struct usb_interface *intf,
const struct usb_device_id *id)
{
struct usb_device *udev = interface_to_usbdev(intf);
struct uvc_device *dev;
int ret;
/*省略部分内容*/
if ((dev = kzalloc(sizeof *dev, GFP_KERNEL)) == NULL)//【1】
return -ENOMEM;
/*省略部分内容*/
dev->udev = usb_get_dev(udev);//【2】
dev->intf = usb_get_intf(intf);
dev->intfnum = intf->cur_altsetting->desc.bInterfaceNumber;
dev->quirks = (uvc_quirks_param == -1)
? id->driver_info : uvc_quirks_param;
/*省略部分内容*/
/* Parse the Video Class control descriptor. */
if (uvc_parse_control(dev) < 0) {
//【3】
uvc_trace(UVC_TRACE_PROBE, "Unable to parse UVC "
"descriptors.\n");
goto error;
}
uvc_printk(KERN_INFO, "Found UVC %u.%02x device %s (%04x:%04x)\n",
dev->uvc_version >> 8, dev->uvc_version & 0xff,
udev->product ? udev->product : "<unnamed>",【8】
/*省略部分内容*/
if (v4l2_device_register(&intf->dev, &dev->vdev) < 0)//【4】
goto error;
/* Initialize controls. */
if (uvc_ctrl_init_device(dev) < 0)//【5】
goto error