Commit 2c2d264b authored by Laurent Pinchart's avatar Laurent Pinchart Committed by Mauro Carvalho Chehab

V4L/DVB (10197): uvcvideo: Whitespace and comments cleanup, copyright updates.

Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart@skynet.be>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent bb1b082e
/* /*
* uvc_ctrl.c -- USB Video Class driver - Controls * uvc_ctrl.c -- USB Video Class driver - Controls
* *
* Copyright (C) 2005-2008 * Copyright (C) 2005-2009
* Laurent Pinchart (laurent.pinchart@skynet.be) * Laurent Pinchart (laurent.pinchart@skynet.be)
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
#define UVC_CTRL_DATA_BACKUP 1 #define UVC_CTRL_DATA_BACKUP 1
/* ------------------------------------------------------------------------ /* ------------------------------------------------------------------------
* Control, formats, ... * Controls
*/ */
static struct uvc_control_info uvc_ctrls[] = { static struct uvc_control_info uvc_ctrls[] = {
...@@ -634,7 +634,7 @@ static __s32 uvc_get_le_value(struct uvc_control_mapping *mapping, ...@@ -634,7 +634,7 @@ static __s32 uvc_get_le_value(struct uvc_control_mapping *mapping,
mask = (1 << bits) - 1; mask = (1 << bits) - 1;
} }
/* Sign-extend the value if needed */ /* Sign-extend the value if needed. */
if (mapping->data_type == UVC_CTRL_DATA_TYPE_SIGNED) if (mapping->data_type == UVC_CTRL_DATA_TYPE_SIGNED)
value |= -(value & (1 << (mapping->size - 1))); value |= -(value & (1 << (mapping->size - 1)));
......
/* /*
* uvc_driver.c -- USB Video Class driver * uvc_driver.c -- USB Video Class driver
* *
* Copyright (C) 2005-2008 * Copyright (C) 2005-2009
* Laurent Pinchart (laurent.pinchart@skynet.be) * Laurent Pinchart (laurent.pinchart@skynet.be)
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
...@@ -48,7 +48,7 @@ static unsigned int uvc_quirks_param; ...@@ -48,7 +48,7 @@ static unsigned int uvc_quirks_param;
unsigned int uvc_trace_param; unsigned int uvc_trace_param;
/* ------------------------------------------------------------------------ /* ------------------------------------------------------------------------
* Control, formats, ... * Video formats
*/ */
static struct uvc_format_desc uvc_fmts[] = { static struct uvc_format_desc uvc_fmts[] = {
...@@ -473,7 +473,7 @@ static int uvc_parse_format(struct uvc_device *dev, ...@@ -473,7 +473,7 @@ static int uvc_parse_format(struct uvc_device *dev,
/* Several UVC chipsets screw up dwMaxVideoFrameBufferSize /* Several UVC chipsets screw up dwMaxVideoFrameBufferSize
* completely. Observed behaviours range from setting the * completely. Observed behaviours range from setting the
* value to 1.1x the actual frame size of hardwiring the * value to 1.1x the actual frame size to hardwiring the
* 16 low bits to 0. This results in a higher than necessary * 16 low bits to 0. This results in a higher than necessary
* memory usage as well as a wrong image size information. For * memory usage as well as a wrong image size information. For
* uncompressed formats this can be fixed by computing the * uncompressed formats this can be fixed by computing the
...@@ -486,7 +486,7 @@ static int uvc_parse_format(struct uvc_device *dev, ...@@ -486,7 +486,7 @@ static int uvc_parse_format(struct uvc_device *dev,
/* Some bogus devices report dwMinFrameInterval equal to /* Some bogus devices report dwMinFrameInterval equal to
* dwMaxFrameInterval and have dwFrameIntervalStep set to * dwMaxFrameInterval and have dwFrameIntervalStep set to
* zero. Setting all null intervals to 1 fixes the problem and * zero. Setting all null intervals to 1 fixes the problem and
* some other divisions by zero which could happen. * some other divisions by zero that could happen.
*/ */
for (i = 0; i < n; ++i) { for (i = 0; i < n; ++i) {
interval = get_unaligned_le32(&buffer[26+4*i]); interval = get_unaligned_le32(&buffer[26+4*i]);
...@@ -1199,13 +1199,13 @@ static void uvc_unregister_video(struct uvc_device *dev) ...@@ -1199,13 +1199,13 @@ static void uvc_unregister_video(struct uvc_device *dev)
* Scan the UVC descriptors to locate a chain starting at an Output Terminal * Scan the UVC descriptors to locate a chain starting at an Output Terminal
* and containing the following units: * and containing the following units:
* *
* - a USB Streaming Output Terminal * - one Output Terminal (USB Streaming or Display)
* - zero or one Processing Unit * - zero or one Processing Unit
* - zero, one or mode single-input Selector Units * - zero, one or mode single-input Selector Units
* - zero or one multiple-input Selector Units, provided all inputs are * - zero or one multiple-input Selector Units, provided all inputs are
* connected to input terminals * connected to input terminals
* - zero, one or mode single-input Extension Units * - zero, one or mode single-input Extension Units
* - one Camera Input Terminal, or one or more External terminals. * - one or more Input Terminals (Camera, External or USB Streaming)
* *
* A side forward scan is made on each detected entity to check for additional * A side forward scan is made on each detected entity to check for additional
* extension units. * extension units.
...@@ -1530,10 +1530,6 @@ static int uvc_register_video(struct uvc_device *dev) ...@@ -1530,10 +1530,6 @@ static int uvc_register_video(struct uvc_device *dev)
/* Set the driver data before calling video_register_device, otherwise /* Set the driver data before calling video_register_device, otherwise
* uvc_v4l2_open might race us. * uvc_v4l2_open might race us.
*
* FIXME: usb_set_intfdata hasn't been called so far. Is that a
* problem ? Does any function which could be called here get
* a pointer to the usb_interface ?
*/ */
dev->video.vdev = vdev; dev->video.vdev = vdev;
video_set_drvdata(vdev, &dev->video); video_set_drvdata(vdev, &dev->video);
...@@ -1568,7 +1564,7 @@ void uvc_delete(struct kref *kref) ...@@ -1568,7 +1564,7 @@ void uvc_delete(struct kref *kref)
struct uvc_device *dev = container_of(kref, struct uvc_device, kref); struct uvc_device *dev = container_of(kref, struct uvc_device, kref);
struct list_head *p, *n; struct list_head *p, *n;
/* Unregister the video device */ /* Unregister the video device. */
uvc_unregister_video(dev); uvc_unregister_video(dev);
usb_put_intf(dev->intf); usb_put_intf(dev->intf);
usb_put_dev(dev->udev); usb_put_dev(dev->udev);
...@@ -1611,7 +1607,7 @@ static int uvc_probe(struct usb_interface *intf, ...@@ -1611,7 +1607,7 @@ static int uvc_probe(struct usb_interface *intf,
uvc_trace(UVC_TRACE_PROBE, "Probing generic UVC device %s\n", uvc_trace(UVC_TRACE_PROBE, "Probing generic UVC device %s\n",
udev->devpath); udev->devpath);
/* Allocate memory for the device and initialize it */ /* Allocate memory for the device and initialize it. */
if ((dev = kzalloc(sizeof *dev, GFP_KERNEL)) == NULL) if ((dev = kzalloc(sizeof *dev, GFP_KERNEL)) == NULL)
return -ENOMEM; return -ENOMEM;
...@@ -1632,7 +1628,7 @@ static int uvc_probe(struct usb_interface *intf, ...@@ -1632,7 +1628,7 @@ static int uvc_probe(struct usb_interface *intf,
le16_to_cpu(udev->descriptor.idVendor), le16_to_cpu(udev->descriptor.idVendor),
le16_to_cpu(udev->descriptor.idProduct)); le16_to_cpu(udev->descriptor.idProduct));
/* Parse the Video Class control descriptor */ /* Parse the Video Class control descriptor. */
if (uvc_parse_control(dev) < 0) { if (uvc_parse_control(dev) < 0) {
uvc_trace(UVC_TRACE_PROBE, "Unable to parse UVC " uvc_trace(UVC_TRACE_PROBE, "Unable to parse UVC "
"descriptors.\n"); "descriptors.\n");
...@@ -1652,18 +1648,18 @@ static int uvc_probe(struct usb_interface *intf, ...@@ -1652,18 +1648,18 @@ static int uvc_probe(struct usb_interface *intf,
"linux-uvc-devel mailing list.\n"); "linux-uvc-devel mailing list.\n");
} }
/* Initialize controls */ /* Initialize controls. */
if (uvc_ctrl_init_device(dev) < 0) if (uvc_ctrl_init_device(dev) < 0)
goto error; goto error;
/* Register the video devices */ /* Register the video devices. */
if (uvc_register_video(dev) < 0) if (uvc_register_video(dev) < 0)
goto error; goto error;
/* Save our data pointer in the interface data */ /* Save our data pointer in the interface data. */
usb_set_intfdata(intf, dev); usb_set_intfdata(intf, dev);
/* Initialize the interrupt URB */ /* Initialize the interrupt URB. */
if ((ret = uvc_status_init(dev)) < 0) { if ((ret = uvc_status_init(dev)) < 0) {
uvc_printk(KERN_INFO, "Unable to initialize the status " uvc_printk(KERN_INFO, "Unable to initialize the status "
"endpoint (%d), status interrupt will not be " "endpoint (%d), status interrupt will not be "
...@@ -1838,24 +1834,24 @@ static struct usb_device_id uvc_ids[] = { ...@@ -1838,24 +1834,24 @@ static struct usb_device_id uvc_ids[] = {
.bInterfaceSubClass = 1, .bInterfaceSubClass = 1,
.bInterfaceProtocol = 0 }, .bInterfaceProtocol = 0 },
/* Apple Built-In iSight */ /* Apple Built-In iSight */
{ .match_flags = USB_DEVICE_ID_MATCH_DEVICE { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
| USB_DEVICE_ID_MATCH_INT_INFO, | USB_DEVICE_ID_MATCH_INT_INFO,
.idVendor = 0x05ac, .idVendor = 0x05ac,
.idProduct = 0x8501, .idProduct = 0x8501,
.bInterfaceClass = USB_CLASS_VIDEO, .bInterfaceClass = USB_CLASS_VIDEO,
.bInterfaceSubClass = 1, .bInterfaceSubClass = 1,
.bInterfaceProtocol = 0, .bInterfaceProtocol = 0,
.driver_info = UVC_QUIRK_PROBE_MINMAX .driver_info = UVC_QUIRK_PROBE_MINMAX
| UVC_QUIRK_BUILTIN_ISIGHT }, | UVC_QUIRK_BUILTIN_ISIGHT },
/* Genesys Logic USB 2.0 PC Camera */ /* Genesys Logic USB 2.0 PC Camera */
{ .match_flags = USB_DEVICE_ID_MATCH_DEVICE { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
| USB_DEVICE_ID_MATCH_INT_INFO, | USB_DEVICE_ID_MATCH_INT_INFO,
.idVendor = 0x05e3, .idVendor = 0x05e3,
.idProduct = 0x0505, .idProduct = 0x0505,
.bInterfaceClass = USB_CLASS_VIDEO, .bInterfaceClass = USB_CLASS_VIDEO,
.bInterfaceSubClass = 1, .bInterfaceSubClass = 1,
.bInterfaceProtocol = 0, .bInterfaceProtocol = 0,
.driver_info = UVC_QUIRK_STREAM_NO_FID }, .driver_info = UVC_QUIRK_STREAM_NO_FID },
/* MT6227 */ /* MT6227 */
{ .match_flags = USB_DEVICE_ID_MATCH_DEVICE { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
| USB_DEVICE_ID_MATCH_INT_INFO, | USB_DEVICE_ID_MATCH_INT_INFO,
......
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
* *
* Copyright (C) 2006-2007 * Copyright (C) 2006-2007
* Ivan N. Zlatev <contact@i-nz.net> * Ivan N. Zlatev <contact@i-nz.net>
* Copyright (C) 2008-2009
* Laurent Pinchart <laurent.pinchart@skynet.be>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
......
/* /*
* uvc_queue.c -- USB Video Class driver - Buffers management * uvc_queue.c -- USB Video Class driver - Buffers management
* *
* Copyright (C) 2005-2008 * Copyright (C) 2005-2009
* Laurent Pinchart (laurent.pinchart@skynet.be) * Laurent Pinchart (laurent.pinchart@skynet.be)
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
...@@ -36,22 +36,22 @@ ...@@ -36,22 +36,22 @@
* to user space will return -EBUSY. * to user space will return -EBUSY.
* *
* Video buffers are managed using two queues. However, unlike most USB video * Video buffers are managed using two queues. However, unlike most USB video
* drivers which use an in queue and an out queue, we use a main queue which * drivers that use an in queue and an out queue, we use a main queue to hold
* holds all queued buffers (both 'empty' and 'done' buffers), and an irq * all queued buffers (both 'empty' and 'done' buffers), and an irq queue to
* queue which holds empty buffers. This design (copied from video-buf) * hold empty buffers. This design (copied from video-buf) minimizes locking
* minimizes locking in interrupt, as only one queue is shared between * in interrupt, as only one queue is shared between interrupt and user
* interrupt and user contexts. * contexts.
* *
* Use cases * Use cases
* --------- * ---------
* *
* Unless stated otherwise, all operations which modify the irq buffers queue * Unless stated otherwise, all operations that modify the irq buffers queue
* are protected by the irq spinlock. * are protected by the irq spinlock.
* *
* 1. The user queues the buffers, starts streaming and dequeues a buffer. * 1. The user queues the buffers, starts streaming and dequeues a buffer.
* *
* The buffers are added to the main and irq queues. Both operations are * The buffers are added to the main and irq queues. Both operations are
* protected by the queue lock, and the latert is protected by the irq * protected by the queue lock, and the later is protected by the irq
* spinlock as well. * spinlock as well.
* *
* The completion handler fetches a buffer from the irq queue and fills it * The completion handler fetches a buffer from the irq queue and fills it
...@@ -59,7 +59,7 @@ ...@@ -59,7 +59,7 @@
* returns immediately. * returns immediately.
* *
* When the buffer is full, the completion handler removes it from the irq * When the buffer is full, the completion handler removes it from the irq
* queue, marks it as ready (UVC_BUF_STATE_DONE) and wake its wait queue. * queue, marks it as ready (UVC_BUF_STATE_DONE) and wakes its wait queue.
* At that point, any process waiting on the buffer will be woken up. If a * At that point, any process waiting on the buffer will be woken up. If a
* process tries to dequeue a buffer after it has been marked ready, the * process tries to dequeue a buffer after it has been marked ready, the
* dequeing will succeed immediately. * dequeing will succeed immediately.
...@@ -90,8 +90,8 @@ void uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type) ...@@ -90,8 +90,8 @@ void uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type)
/* /*
* Allocate the video buffers. * Allocate the video buffers.
* *
* Pages are reserved to make sure they will not be swaped, as they will be * Pages are reserved to make sure they will not be swapped, as they will be
* filled in URB completion handler. * filled in the URB completion handler.
* *
* Buffers will be individually mapped, so they must all be page aligned. * Buffers will be individually mapped, so they must all be page aligned.
*/ */
...@@ -209,8 +209,8 @@ int uvc_query_buffer(struct uvc_video_queue *queue, ...@@ -209,8 +209,8 @@ int uvc_query_buffer(struct uvc_video_queue *queue,
__uvc_query_buffer(&queue->buffer[v4l2_buf->index], v4l2_buf); __uvc_query_buffer(&queue->buffer[v4l2_buf->index], v4l2_buf);
done: done:
mutex_unlock(&queue->mutex); mutex_unlock(&queue->mutex);
return ret; return ret;
} }
/* /*
...@@ -235,7 +235,7 @@ int uvc_queue_buffer(struct uvc_video_queue *queue, ...@@ -235,7 +235,7 @@ int uvc_queue_buffer(struct uvc_video_queue *queue,
} }
mutex_lock(&queue->mutex); mutex_lock(&queue->mutex);
if (v4l2_buf->index >= queue->count) { if (v4l2_buf->index >= queue->count) {
uvc_trace(UVC_TRACE_CAPTURE, "[E] Out of range index.\n"); uvc_trace(UVC_TRACE_CAPTURE, "[E] Out of range index.\n");
ret = -EINVAL; ret = -EINVAL;
goto done; goto done;
...@@ -428,7 +428,7 @@ int uvc_queue_enable(struct uvc_video_queue *queue, int enable) ...@@ -428,7 +428,7 @@ int uvc_queue_enable(struct uvc_video_queue *queue, int enable)
* Cancel the video buffers queue. * Cancel the video buffers queue.
* *
* Cancelling the queue marks all buffers on the irq queue as erroneous, * Cancelling the queue marks all buffers on the irq queue as erroneous,
* wakes them up and remove them from the queue. * wakes them up and removes them from the queue.
* *
* If the disconnect parameter is set, further calls to uvc_queue_buffer will * If the disconnect parameter is set, further calls to uvc_queue_buffer will
* fail with -ENODEV. * fail with -ENODEV.
......
/* /*
* uvc_status.c -- USB Video Class driver - Status endpoint * uvc_status.c -- USB Video Class driver - Status endpoint
* *
* Copyright (C) 2007-2008 * Copyright (C) 2007-2009
* Laurent Pinchart (laurent.pinchart@skynet.be) * Laurent Pinchart (laurent.pinchart@skynet.be)
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
......
/* /*
* uvc_v4l2.c -- USB Video Class driver - V4L2 API * uvc_v4l2.c -- USB Video Class driver - V4L2 API
* *
* Copyright (C) 2005-2008 * Copyright (C) 2005-2009
* Laurent Pinchart (laurent.pinchart@skynet.be) * Laurent Pinchart (laurent.pinchart@skynet.be)
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
* must be grouped (for instance the Red Balance, Blue Balance and Do White * must be grouped (for instance the Red Balance, Blue Balance and Do White
* Balance V4L2 controls use the White Balance Component UVC control) or * Balance V4L2 controls use the White Balance Component UVC control) or
* otherwise translated. The approach we take here is to use a translation * otherwise translated. The approach we take here is to use a translation
* table for the controls which can be mapped directly, and handle the others * table for the controls that can be mapped directly, and handle the others
* manually. * manually.
*/ */
static int uvc_v4l2_query_menu(struct uvc_video_device *video, static int uvc_v4l2_query_menu(struct uvc_video_device *video,
...@@ -189,7 +189,7 @@ static int uvc_v4l2_try_format(struct uvc_video_device *video, ...@@ -189,7 +189,7 @@ static int uvc_v4l2_try_format(struct uvc_video_device *video,
probe->dwMaxVideoFrameSize = probe->dwMaxVideoFrameSize =
video->streaming->ctrl.dwMaxVideoFrameSize; video->streaming->ctrl.dwMaxVideoFrameSize;
/* Probe the device */ /* Probe the device. */
if ((ret = uvc_probe_video(video, probe)) < 0) if ((ret = uvc_probe_video(video, probe)) < 0)
goto done; goto done;
...@@ -354,11 +354,11 @@ static int uvc_v4l2_set_streamparm(struct uvc_video_device *video, ...@@ -354,11 +354,11 @@ static int uvc_v4l2_set_streamparm(struct uvc_video_device *video,
* *
* Each open instance of a UVC device can either be in a privileged or * Each open instance of a UVC device can either be in a privileged or
* unprivileged state. Only a single instance can be in a privileged state at * unprivileged state. Only a single instance can be in a privileged state at
* a given time. Trying to perform an operation which requires privileges will * a given time. Trying to perform an operation that requires privileges will
* automatically acquire the required privileges if possible, or return -EBUSY * automatically acquire the required privileges if possible, or return -EBUSY
* otherwise. Privileges are dismissed when closing the instance. * otherwise. Privileges are dismissed when closing the instance.
* *
* Operations which require privileges are: * Operations that require privileges are:
* *
* - VIDIOC_S_INPUT * - VIDIOC_S_INPUT
* - VIDIOC_S_PARM * - VIDIOC_S_PARM
......
/* /*
* uvc_video.c -- USB Video Class driver - Video handling * uvc_video.c -- USB Video Class driver - Video handling
* *
* Copyright (C) 2005-2008 * Copyright (C) 2005-2009
* Laurent Pinchart (laurent.pinchart@skynet.be) * Laurent Pinchart (laurent.pinchart@skynet.be)
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
...@@ -159,7 +159,7 @@ static int uvc_get_video_ctrl(struct uvc_video_device *video, ...@@ -159,7 +159,7 @@ static int uvc_get_video_ctrl(struct uvc_video_device *video,
} }
/* Some broken devices return a null or wrong dwMaxVideoFrameSize. /* Some broken devices return a null or wrong dwMaxVideoFrameSize.
* Try to get the value from the format and frame descriptor. * Try to get the value from the format and frame descriptors.
*/ */
uvc_fixup_buffer_size(video, ctrl); uvc_fixup_buffer_size(video, ctrl);
ret = 0; ret = 0;
...@@ -190,9 +190,6 @@ static int uvc_set_video_ctrl(struct uvc_video_device *video, ...@@ -190,9 +190,6 @@ static int uvc_set_video_ctrl(struct uvc_video_device *video,
*(__le16 *)&data[12] = cpu_to_le16(ctrl->wCompQuality); *(__le16 *)&data[12] = cpu_to_le16(ctrl->wCompQuality);
*(__le16 *)&data[14] = cpu_to_le16(ctrl->wCompWindowSize); *(__le16 *)&data[14] = cpu_to_le16(ctrl->wCompWindowSize);
*(__le16 *)&data[16] = cpu_to_le16(ctrl->wDelay); *(__le16 *)&data[16] = cpu_to_le16(ctrl->wDelay);
/* Note: Some of the fields below are not required for IN devices (see
* UVC spec, 4.3.1.1), but we still copy them in case support for OUT
* devices is added in the future. */
put_unaligned_le32(ctrl->dwMaxVideoFrameSize, &data[18]); put_unaligned_le32(ctrl->dwMaxVideoFrameSize, &data[18]);
put_unaligned_le32(ctrl->dwMaxPayloadTransferSize, &data[22]); put_unaligned_le32(ctrl->dwMaxPayloadTransferSize, &data[22]);
...@@ -399,7 +396,7 @@ static int uvc_video_decode_start(struct uvc_video_device *video, ...@@ -399,7 +396,7 @@ static int uvc_video_decode_start(struct uvc_video_device *video,
* *
* Empty buffers (bytesused == 0) don't trigger end of frame detection * Empty buffers (bytesused == 0) don't trigger end of frame detection
* as it doesn't make sense to return an empty buffer. This also * as it doesn't make sense to return an empty buffer. This also
* avoids detecting and of frame conditions at FID toggling if the * avoids detecting end of frame conditions at FID toggling if the
* previous payload had the EOF bit set. * previous payload had the EOF bit set.
*/ */
if (fid != video->last_fid && buf->buf.bytesused != 0) { if (fid != video->last_fid && buf->buf.bytesused != 0) {
...@@ -452,6 +449,17 @@ static void uvc_video_decode_end(struct uvc_video_device *video, ...@@ -452,6 +449,17 @@ static void uvc_video_decode_end(struct uvc_video_device *video,
} }
} }
/* Video payload encoding is handled by uvc_video_encode_header() and
* uvc_video_encode_data(). Only bulk transfers are currently supported.
*
* uvc_video_encode_header is called at the start of a payload. It adds header
* data to the transfer buffer and returns the header size. As the only known
* UVC output device transfers a whole frame in a single payload, the EOF bit
* is always set in the header.
*
* uvc_video_encode_data is called for every URB and copies the data from the
* video buffer to the transfer buffer.
*/
static int uvc_video_encode_header(struct uvc_video_device *video, static int uvc_video_encode_header(struct uvc_video_device *video,
struct uvc_buffer *buf, __u8 *data, int len) struct uvc_buffer *buf, __u8 *data, int len)
{ {
...@@ -952,7 +960,7 @@ int uvc_video_suspend(struct uvc_video_device *video) ...@@ -952,7 +960,7 @@ int uvc_video_suspend(struct uvc_video_device *video)
} }
/* /*
* Reconfigure the video interface and restart streaming if it was enable * Reconfigure the video interface and restart streaming if it was enabled
* before suspend. * before suspend.
* *
* If an error occurs, disable the video queue. This will wake all pending * If an error occurs, disable the video queue. This will wake all pending
...@@ -984,8 +992,8 @@ int uvc_video_resume(struct uvc_video_device *video) ...@@ -984,8 +992,8 @@ int uvc_video_resume(struct uvc_video_device *video)
*/ */
/* /*
* Initialize the UVC video device by retrieving the default format and * Initialize the UVC video device by switching to alternate setting 0 and
* committing it. * retrieve the default format.
* *
* Some cameras (namely the Fuji Finepix) set the format and frame * Some cameras (namely the Fuji Finepix) set the format and frame
* indexes to zero. The UVC standard doesn't clearly make this a spec * indexes to zero. The UVC standard doesn't clearly make this a spec
...@@ -1013,7 +1021,7 @@ int uvc_video_init(struct uvc_video_device *video) ...@@ -1013,7 +1021,7 @@ int uvc_video_init(struct uvc_video_device *video)
*/ */
usb_set_interface(video->dev->udev, video->streaming->intfnum, 0); usb_set_interface(video->dev->udev, video->streaming->intfnum, 0);
/* Some webcams don't suport GET_DEF request on the probe control. We /* Some webcams don't suport GET_DEF requests on the probe control. We
* fall back to GET_CUR if GET_DEF fails. * fall back to GET_CUR if GET_DEF fails.
*/ */
if ((ret = uvc_get_video_ctrl(video, probe, 1, GET_DEF)) < 0 && if ((ret = uvc_get_video_ctrl(video, probe, 1, GET_DEF)) < 0 &&
......
...@@ -72,149 +72,149 @@ struct uvc_xu_control { ...@@ -72,149 +72,149 @@ struct uvc_xu_control {
* UVC constants * UVC constants
*/ */
#define SC_UNDEFINED 0x00 #define SC_UNDEFINED 0x00
#define SC_VIDEOCONTROL 0x01 #define SC_VIDEOCONTROL 0x01
#define SC_VIDEOSTREAMING 0x02 #define SC_VIDEOSTREAMING 0x02
#define SC_VIDEO_INTERFACE_COLLECTION 0x03 #define SC_VIDEO_INTERFACE_COLLECTION 0x03
#define PC_PROTOCOL_UNDEFINED 0x00 #define PC_PROTOCOL_UNDEFINED 0x00
#define CS_UNDEFINED 0x20 #define CS_UNDEFINED 0x20
#define CS_DEVICE 0x21 #define CS_DEVICE 0x21
#define CS_CONFIGURATION 0x22 #define CS_CONFIGURATION 0x22
#define CS_STRING 0x23 #define CS_STRING 0x23
#define CS_INTERFACE 0x24 #define CS_INTERFACE 0x24
#define CS_ENDPOINT 0x25 #define CS_ENDPOINT 0x25
/* VideoControl class specific interface descriptor */ /* VideoControl class specific interface descriptor */
#define VC_DESCRIPTOR_UNDEFINED 0x00 #define VC_DESCRIPTOR_UNDEFINED 0x00
#define VC_HEADER 0x01 #define VC_HEADER 0x01
#define VC_INPUT_TERMINAL 0x02 #define VC_INPUT_TERMINAL 0x02
#define VC_OUTPUT_TERMINAL 0x03 #define VC_OUTPUT_TERMINAL 0x03
#define VC_SELECTOR_UNIT 0x04 #define VC_SELECTOR_UNIT 0x04
#define VC_PROCESSING_UNIT 0x05 #define VC_PROCESSING_UNIT 0x05
#define VC_EXTENSION_UNIT 0x06 #define VC_EXTENSION_UNIT 0x06
/* VideoStreaming class specific interface descriptor */ /* VideoStreaming class specific interface descriptor */
#define VS_UNDEFINED 0x00 #define VS_UNDEFINED 0x00
#define VS_INPUT_HEADER 0x01 #define VS_INPUT_HEADER 0x01
#define VS_OUTPUT_HEADER 0x02 #define VS_OUTPUT_HEADER 0x02
#define VS_STILL_IMAGE_FRAME 0x03 #define VS_STILL_IMAGE_FRAME 0x03
#define VS_FORMAT_UNCOMPRESSED 0x04 #define VS_FORMAT_UNCOMPRESSED 0x04
#define VS_FRAME_UNCOMPRESSED 0x05 #define VS_FRAME_UNCOMPRESSED 0x05
#define VS_FORMAT_MJPEG 0x06 #define VS_FORMAT_MJPEG 0x06
#define VS_FRAME_MJPEG 0x07 #define VS_FRAME_MJPEG 0x07
#define VS_FORMAT_MPEG2TS 0x0a #define VS_FORMAT_MPEG2TS 0x0a
#define VS_FORMAT_DV 0x0c #define VS_FORMAT_DV 0x0c
#define VS_COLORFORMAT 0x0d #define VS_COLORFORMAT 0x0d
#define VS_FORMAT_FRAME_BASED 0x10 #define VS_FORMAT_FRAME_BASED 0x10
#define VS_FRAME_FRAME_BASED 0x11 #define VS_FRAME_FRAME_BASED 0x11
#define VS_FORMAT_STREAM_BASED 0x12 #define VS_FORMAT_STREAM_BASED 0x12
/* Endpoint type */ /* Endpoint type */
#define EP_UNDEFINED 0x00 #define EP_UNDEFINED 0x00
#define EP_GENERAL 0x01 #define EP_GENERAL 0x01
#define EP_ENDPOINT 0x02 #define EP_ENDPOINT 0x02
#define EP_INTERRUPT 0x03 #define EP_INTERRUPT 0x03
/* Request codes */ /* Request codes */
#define RC_UNDEFINED 0x00 #define RC_UNDEFINED 0x00
#define SET_CUR 0x01 #define SET_CUR 0x01
#define GET_CUR 0x81 #define GET_CUR 0x81
#define GET_MIN 0x82 #define GET_MIN 0x82
#define GET_MAX 0x83 #define GET_MAX 0x83
#define GET_RES 0x84 #define GET_RES 0x84
#define GET_LEN 0x85 #define GET_LEN 0x85
#define GET_INFO 0x86 #define GET_INFO 0x86
#define GET_DEF 0x87 #define GET_DEF 0x87
/* VideoControl interface controls */ /* VideoControl interface controls */
#define VC_CONTROL_UNDEFINED 0x00 #define VC_CONTROL_UNDEFINED 0x00
#define VC_VIDEO_POWER_MODE_CONTROL 0x01 #define VC_VIDEO_POWER_MODE_CONTROL 0x01
#define VC_REQUEST_ERROR_CODE_CONTROL 0x02 #define VC_REQUEST_ERROR_CODE_CONTROL 0x02
/* Terminal controls */ /* Terminal controls */
#define TE_CONTROL_UNDEFINED 0x00 #define TE_CONTROL_UNDEFINED 0x00
/* Selector Unit controls */ /* Selector Unit controls */
#define SU_CONTROL_UNDEFINED 0x00 #define SU_CONTROL_UNDEFINED 0x00
#define SU_INPUT_SELECT_CONTROL 0x01 #define SU_INPUT_SELECT_CONTROL 0x01
/* Camera Terminal controls */ /* Camera Terminal controls */
#define CT_CONTROL_UNDEFINED 0x00 #define CT_CONTROL_UNDEFINED 0x00
#define CT_SCANNING_MODE_CONTROL 0x01 #define CT_SCANNING_MODE_CONTROL 0x01
#define CT_AE_MODE_CONTROL 0x02 #define CT_AE_MODE_CONTROL 0x02
#define CT_AE_PRIORITY_CONTROL 0x03 #define CT_AE_PRIORITY_CONTROL 0x03
#define CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x04 #define CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x04
#define CT_EXPOSURE_TIME_RELATIVE_CONTROL 0x05 #define CT_EXPOSURE_TIME_RELATIVE_CONTROL 0x05
#define CT_FOCUS_ABSOLUTE_CONTROL 0x06 #define CT_FOCUS_ABSOLUTE_CONTROL 0x06
#define CT_FOCUS_RELATIVE_CONTROL 0x07 #define CT_FOCUS_RELATIVE_CONTROL 0x07
#define CT_FOCUS_AUTO_CONTROL 0x08 #define CT_FOCUS_AUTO_CONTROL 0x08
#define CT_IRIS_ABSOLUTE_CONTROL 0x09 #define CT_IRIS_ABSOLUTE_CONTROL 0x09
#define CT_IRIS_RELATIVE_CONTROL 0x0a #define CT_IRIS_RELATIVE_CONTROL 0x0a
#define CT_ZOOM_ABSOLUTE_CONTROL 0x0b #define CT_ZOOM_ABSOLUTE_CONTROL 0x0b
#define CT_ZOOM_RELATIVE_CONTROL 0x0c #define CT_ZOOM_RELATIVE_CONTROL 0x0c
#define CT_PANTILT_ABSOLUTE_CONTROL 0x0d #define CT_PANTILT_ABSOLUTE_CONTROL 0x0d
#define CT_PANTILT_RELATIVE_CONTROL 0x0e #define CT_PANTILT_RELATIVE_CONTROL 0x0e
#define CT_ROLL_ABSOLUTE_CONTROL 0x0f #define CT_ROLL_ABSOLUTE_CONTROL 0x0f
#define CT_ROLL_RELATIVE_CONTROL 0x10 #define CT_ROLL_RELATIVE_CONTROL 0x10
#define CT_PRIVACY_CONTROL 0x11 #define CT_PRIVACY_CONTROL 0x11
/* Processing Unit controls */ /* Processing Unit controls */
#define PU_CONTROL_UNDEFINED 0x00 #define PU_CONTROL_UNDEFINED 0x00
#define PU_BACKLIGHT_COMPENSATION_CONTROL 0x01 #define PU_BACKLIGHT_COMPENSATION_CONTROL 0x01
#define PU_BRIGHTNESS_CONTROL 0x02 #define PU_BRIGHTNESS_CONTROL 0x02
#define PU_CONTRAST_CONTROL 0x03 #define PU_CONTRAST_CONTROL 0x03
#define PU_GAIN_CONTROL 0x04 #define PU_GAIN_CONTROL 0x04
#define PU_POWER_LINE_FREQUENCY_CONTROL 0x05 #define PU_POWER_LINE_FREQUENCY_CONTROL 0x05
#define PU_HUE_CONTROL 0x06 #define PU_HUE_CONTROL 0x06
#define PU_SATURATION_CONTROL 0x07 #define PU_SATURATION_CONTROL 0x07
#define PU_SHARPNESS_CONTROL 0x08 #define PU_SHARPNESS_CONTROL 0x08
#define PU_GAMMA_CONTROL 0x09 #define PU_GAMMA_CONTROL 0x09
#define PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x0a #define PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x0a
#define PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x0b #define PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x0b
#define PU_WHITE_BALANCE_COMPONENT_CONTROL 0x0c #define PU_WHITE_BALANCE_COMPONENT_CONTROL 0x0c
#define PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL 0x0d #define PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL 0x0d
#define PU_DIGITAL_MULTIPLIER_CONTROL 0x0e #define PU_DIGITAL_MULTIPLIER_CONTROL 0x0e
#define PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x0f #define PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x0f
#define PU_HUE_AUTO_CONTROL 0x10 #define PU_HUE_AUTO_CONTROL 0x10
#define PU_ANALOG_VIDEO_STANDARD_CONTROL 0x11 #define PU_ANALOG_VIDEO_STANDARD_CONTROL 0x11
#define PU_ANALOG_LOCK_STATUS_CONTROL 0x12 #define PU_ANALOG_LOCK_STATUS_CONTROL 0x12
#define LXU_MOTOR_PANTILT_RELATIVE_CONTROL 0x01 #define LXU_MOTOR_PANTILT_RELATIVE_CONTROL 0x01
#define LXU_MOTOR_PANTILT_RESET_CONTROL 0x02 #define LXU_MOTOR_PANTILT_RESET_CONTROL 0x02
#define LXU_MOTOR_FOCUS_MOTOR_CONTROL 0x03 #define LXU_MOTOR_FOCUS_MOTOR_CONTROL 0x03
/* VideoStreaming interface controls */ /* VideoStreaming interface controls */
#define VS_CONTROL_UNDEFINED 0x00 #define VS_CONTROL_UNDEFINED 0x00
#define VS_PROBE_CONTROL 0x01 #define VS_PROBE_CONTROL 0x01
#define VS_COMMIT_CONTROL 0x02 #define VS_COMMIT_CONTROL 0x02
#define VS_STILL_PROBE_CONTROL 0x03 #define VS_STILL_PROBE_CONTROL 0x03
#define VS_STILL_COMMIT_CONTROL 0x04 #define VS_STILL_COMMIT_CONTROL 0x04
#define VS_STILL_IMAGE_TRIGGER_CONTROL 0x05 #define VS_STILL_IMAGE_TRIGGER_CONTROL 0x05
#define VS_STREAM_ERROR_CODE_CONTROL 0x06 #define VS_STREAM_ERROR_CODE_CONTROL 0x06
#define VS_GENERATE_KEY_FRAME_CONTROL 0x07 #define VS_GENERATE_KEY_FRAME_CONTROL 0x07
#define VS_UPDATE_FRAME_SEGMENT_CONTROL 0x08 #define VS_UPDATE_FRAME_SEGMENT_CONTROL 0x08
#define VS_SYNC_DELAY_CONTROL 0x09 #define VS_SYNC_DELAY_CONTROL 0x09
#define TT_VENDOR_SPECIFIC 0x0100 #define TT_VENDOR_SPECIFIC 0x0100
#define TT_STREAMING 0x0101 #define TT_STREAMING 0x0101
/* Input Terminal types */ /* Input Terminal types */
#define ITT_VENDOR_SPECIFIC 0x0200 #define ITT_VENDOR_SPECIFIC 0x0200
#define ITT_CAMERA 0x0201 #define ITT_CAMERA 0x0201
#define ITT_MEDIA_TRANSPORT_INPUT 0x0202 #define ITT_MEDIA_TRANSPORT_INPUT 0x0202
/* Output Terminal types */ /* Output Terminal types */
#define OTT_VENDOR_SPECIFIC 0x0300 #define OTT_VENDOR_SPECIFIC 0x0300
#define OTT_DISPLAY 0x0301 #define OTT_DISPLAY 0x0301
#define OTT_MEDIA_TRANSPORT_OUTPUT 0x0302 #define OTT_MEDIA_TRANSPORT_OUTPUT 0x0302
/* External Terminal types */ /* External Terminal types */
#define EXTERNAL_VENDOR_SPECIFIC 0x0400 #define EXTERNAL_VENDOR_SPECIFIC 0x0400
#define COMPOSITE_CONNECTOR 0x0401 #define COMPOSITE_CONNECTOR 0x0401
#define SVIDEO_CONNECTOR 0x0402 #define SVIDEO_CONNECTOR 0x0402
#define COMPONENT_CONNECTOR 0x0403 #define COMPONENT_CONNECTOR 0x0403
#define UVC_TERM_INPUT 0x0000 #define UVC_TERM_INPUT 0x0000
#define UVC_TERM_OUTPUT 0x8000 #define UVC_TERM_OUTPUT 0x8000
...@@ -541,11 +541,11 @@ struct uvc_streaming { ...@@ -541,11 +541,11 @@ struct uvc_streaming {
}; };
enum uvc_buffer_state { enum uvc_buffer_state {
UVC_BUF_STATE_IDLE = 0, UVC_BUF_STATE_IDLE = 0,
UVC_BUF_STATE_QUEUED = 1, UVC_BUF_STATE_QUEUED = 1,
UVC_BUF_STATE_ACTIVE = 2, UVC_BUF_STATE_ACTIVE = 2,
UVC_BUF_STATE_DONE = 3, UVC_BUF_STATE_DONE = 3,
UVC_BUF_STATE_ERROR = 4, UVC_BUF_STATE_ERROR = 4,
}; };
struct uvc_buffer { struct uvc_buffer {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment