*参照元 [#c0f0fce9] #backlinks *説明 [#d2dad11d] -パス: [[linux-4.4.1/drivers/media/usb/uvc/uvc_driver.c]] -FIXME: これは何? --説明 **引数 [#e56d5a84] -struct usb_interface *intf -- --[[linux-4.4.1/usb_interface]] -const struct usb_device_id *id -- --[[linux-4.4.1/usb_device_id]] **返り値 [#p1fe4ba3] -int -- **参考 [#cb0eab22] *実装 [#w804a66c] 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; - --[[linux-4.4.1/usb_device]] --[[linux-4.4.1/interface_to_usbdev()]] --[[linux-4.4.1/uvc_device]] if (id->idVendor && id->idProduct) uvc_trace(UVC_TRACE_PROBE, "Probing known UVC device %s " "(%04x:%04x)\n", udev->devpath, id->idVendor, id->idProduct); else uvc_trace(UVC_TRACE_PROBE, "Probing generic UVC device %s\n", udev->devpath); - --[[linux-4.4.1/uvc_trace()]] /* Allocate memory for the device and initialize it. */ if ((dev = kzalloc(sizeof *dev, GFP_KERNEL)) == NULL) return -ENOMEM; - --[[linux-4.4.1/kzalloc()]] INIT_LIST_HEAD(&dev->entities); INIT_LIST_HEAD(&dev->chains); INIT_LIST_HEAD(&dev->streams); atomic_set(&dev->nstreams, 0); atomic_set(&dev->nmappings, 0); mutex_init(&dev->lock); - --[[linux-4.4.1/INIT_LIST_HEAD()]] --[[linux-4.4.1/atomic_set()]] --[[linux-4.4.1/mutex_init()]] dev->udev = usb_get_dev(udev); 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; - --[[linux-4.4.1/usb_get_dev()]] --[[linux-4.4.1/usb_get_intf()]] if (udev->product != NULL) strlcpy(dev->name, udev->product, sizeof dev->name); else snprintf(dev->name, sizeof dev->name, "UVC Camera (%04x:%04x)", le16_to_cpu(udev->descriptor.idVendor), le16_to_cpu(udev->descriptor.idProduct)); - --[[linux-4.4.1/strlcpy()]] --[[linux-4.4.1/snprintf()]] --[[linux-4.4.1/le16_to_cpu()]] /* Parse the Video Class control descriptor. */ if (uvc_parse_control(dev) < 0) { uvc_trace(UVC_TRACE_PROBE, "Unable to parse UVC " "descriptors.\n"); goto error; } - --[[linux-4.4.1/uvc_parse_control()]] 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>", le16_to_cpu(udev->descriptor.idVendor), le16_to_cpu(udev->descriptor.idProduct)); - --[[linux-4.4.1/uvc_printk()]] if (dev->quirks != id->driver_info) { uvc_printk(KERN_INFO, "Forcing device quirks to 0x%x by module " "parameter for testing purpose.\n", dev->quirks); uvc_printk(KERN_INFO, "Please report required quirks to the " "linux-uvc-devel mailing list.\n"); } /* Register the media and V4L2 devices. */ #ifdef CONFIG_MEDIA_CONTROLLER - --[[linux-4.4.1/CONFIG_MEDIA_CONTROLLER]] dev->mdev.dev = &intf->dev; strlcpy(dev->mdev.model, dev->name, sizeof(dev->mdev.model)); if (udev->serial) strlcpy(dev->mdev.serial, udev->serial, sizeof(dev->mdev.serial)); strcpy(dev->mdev.bus_info, udev->devpath); dev->mdev.hw_revision = le16_to_cpu(udev->descriptor.bcdDevice); dev->mdev.driver_version = LINUX_VERSION_CODE; if (media_device_register(&dev->mdev) < 0) goto error; - --[[linux-4.4.1/media_device_register()]] dev->vdev.mdev = &dev->mdev; #endif if (v4l2_device_register(&intf->dev, &dev->vdev) < 0) goto error; - --[[linux-4.4.1/v4l2_device_register()]] /* Initialize controls. */ if (uvc_ctrl_init_device(dev) < 0) goto error; - --[[linux-4.4.1/uvc_ctrl_init_device()]] /* Scan the device for video chains. */ if (uvc_scan_device(dev) < 0) goto error; - --[[linux-4.4.1/uvc_scan_device()]] /* Register video device nodes. */ if (uvc_register_chains(dev) < 0) goto error; - --[[linux-4.4.1/uvc_register_chains()]] /* Save our data pointer in the interface data. */ usb_set_intfdata(intf, dev); - --[[linux-4.4.1/usb_set_intfdata()]] /* Initialize the interrupt URB. */ if ((ret = uvc_status_init(dev)) < 0) { uvc_printk(KERN_INFO, "Unable to initialize the status " "endpoint (%d), status interrupt will not be " "supported.\n", ret); } - --[[linux-4.4.1/uvc_status_init()]] uvc_trace(UVC_TRACE_PROBE, "UVC device initialized.\n"); usb_enable_autosuspend(udev); return 0; - --[[linux-4.4.1/usb_enable_autosuspend()]] error: uvc_unregister_video(dev); - --[[linux-4.4.1/uvc_unregister_video()]] return -ENODEV; } *コメント [#r3eaed8a]