*参照元 [#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]


トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS