参照元

説明

引数

返り値

参考

実装

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 (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);
        /* Allocate memory for the device and initialize it. */
        if ((dev = kzalloc(sizeof *dev, GFP_KERNEL)) == NULL)
                return -ENOMEM;
        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);
        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;
        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));
        /* 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;
        }
        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));
        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
        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;
        dev->vdev.mdev = &dev->mdev;
#endif
        if (v4l2_device_register(&intf->dev, &dev->vdev) < 0)
                goto error;
        /* Initialize controls. */
        if (uvc_ctrl_init_device(dev) < 0)
                goto error;
        /* Scan the device for video chains. */
        if (uvc_scan_device(dev) < 0)
                goto error;
        /* Register video device nodes. */
        if (uvc_register_chains(dev) < 0)
                goto error;
        /* Save our data pointer in the interface data. */
        usb_set_intfdata(intf, dev);
        /* 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);
        }
        uvc_trace(UVC_TRACE_PROBE, "UVC device initialized.\n");
        usb_enable_autosuspend(udev);
        return 0;
error:
        uvc_unregister_video(dev);
        return -ENODEV;
}

コメント


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-02-09 (火) 19:27:38