linux/drivers/media/video/uvc/uvcvideo.h
<<
>>
Prefs
   1#ifndef _USB_VIDEO_H_
   2#define _USB_VIDEO_H_
   3
   4#include <linux/kernel.h>
   5#include <linux/videodev2.h>
   6
   7/*
   8 * Dynamic controls
   9 */
  10
  11/* Data types for UVC control data */
  12#define UVC_CTRL_DATA_TYPE_RAW          0
  13#define UVC_CTRL_DATA_TYPE_SIGNED       1
  14#define UVC_CTRL_DATA_TYPE_UNSIGNED     2
  15#define UVC_CTRL_DATA_TYPE_BOOLEAN      3
  16#define UVC_CTRL_DATA_TYPE_ENUM         4
  17#define UVC_CTRL_DATA_TYPE_BITMASK      5
  18
  19/* Control flags */
  20#define UVC_CONTROL_SET_CUR     (1 << 0)
  21#define UVC_CONTROL_GET_CUR     (1 << 1)
  22#define UVC_CONTROL_GET_MIN     (1 << 2)
  23#define UVC_CONTROL_GET_MAX     (1 << 3)
  24#define UVC_CONTROL_GET_RES     (1 << 4)
  25#define UVC_CONTROL_GET_DEF     (1 << 5)
  26/* Control should be saved at suspend and restored at resume. */
  27#define UVC_CONTROL_RESTORE     (1 << 6)
  28/* Control can be updated by the camera. */
  29#define UVC_CONTROL_AUTO_UPDATE (1 << 7)
  30
  31#define UVC_CONTROL_GET_RANGE   (UVC_CONTROL_GET_CUR | UVC_CONTROL_GET_MIN | \
  32                                 UVC_CONTROL_GET_MAX | UVC_CONTROL_GET_RES | \
  33                                 UVC_CONTROL_GET_DEF)
  34
  35struct uvc_xu_control_info {
  36        __u8 entity[16];
  37        __u8 index;
  38        __u8 selector;
  39        __u16 size;
  40        __u32 flags;
  41};
  42
  43struct uvc_xu_control_mapping {
  44        __u32 id;
  45        __u8 name[32];
  46        __u8 entity[16];
  47        __u8 selector;
  48
  49        __u8 size;
  50        __u8 offset;
  51        enum v4l2_ctrl_type v4l2_type;
  52        __u32 data_type;
  53};
  54
  55struct uvc_xu_control {
  56        __u8 unit;
  57        __u8 selector;
  58        __u16 size;
  59        __u8 __user *data;
  60};
  61
  62#define UVCIOC_CTRL_ADD         _IOW('U', 1, struct uvc_xu_control_info)
  63#define UVCIOC_CTRL_MAP         _IOWR('U', 2, struct uvc_xu_control_mapping)
  64#define UVCIOC_CTRL_GET         _IOWR('U', 3, struct uvc_xu_control)
  65#define UVCIOC_CTRL_SET         _IOW('U', 4, struct uvc_xu_control)
  66
  67#ifdef __KERNEL__
  68
  69#include <linux/poll.h>
  70#include <linux/usb/video.h>
  71
  72/* --------------------------------------------------------------------------
  73 * UVC constants
  74 */
  75
  76#define UVC_TERM_INPUT                  0x0000
  77#define UVC_TERM_OUTPUT                 0x8000
  78#define UVC_TERM_DIRECTION(term)        ((term)->type & 0x8000)
  79
  80#define UVC_ENTITY_TYPE(entity)         ((entity)->type & 0x7fff)
  81#define UVC_ENTITY_IS_UNIT(entity)      (((entity)->type & 0xff00) == 0)
  82#define UVC_ENTITY_IS_TERM(entity)      (((entity)->type & 0xff00) != 0)
  83#define UVC_ENTITY_IS_ITERM(entity) \
  84        (UVC_ENTITY_IS_TERM(entity) && \
  85        ((entity)->type & 0x8000) == UVC_TERM_INPUT)
  86#define UVC_ENTITY_IS_OTERM(entity) \
  87        (UVC_ENTITY_IS_TERM(entity) && \
  88        ((entity)->type & 0x8000) == UVC_TERM_OUTPUT)
  89
  90
  91/* ------------------------------------------------------------------------
  92 * GUIDs
  93 */
  94#define UVC_GUID_UVC_CAMERA \
  95        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
  96         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}
  97#define UVC_GUID_UVC_OUTPUT \
  98        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
  99         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}
 100#define UVC_GUID_UVC_MEDIA_TRANSPORT_INPUT \
 101        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
 102         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03}
 103#define UVC_GUID_UVC_PROCESSING \
 104        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
 105         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01}
 106#define UVC_GUID_UVC_SELECTOR \
 107        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
 108         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02}
 109
 110#define UVC_GUID_FORMAT_MJPEG \
 111        { 'M',  'J',  'P',  'G', 0x00, 0x00, 0x10, 0x00, \
 112         0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
 113#define UVC_GUID_FORMAT_YUY2 \
 114        { 'Y',  'U',  'Y',  '2', 0x00, 0x00, 0x10, 0x00, \
 115         0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
 116#define UVC_GUID_FORMAT_YUY2_ISIGHT \
 117        { 'Y',  'U',  'Y',  '2', 0x00, 0x00, 0x10, 0x00, \
 118         0x80, 0x00, 0x00, 0x00, 0x00, 0x38, 0x9b, 0x71}
 119#define UVC_GUID_FORMAT_NV12 \
 120        { 'N',  'V',  '1',  '2', 0x00, 0x00, 0x10, 0x00, \
 121         0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
 122#define UVC_GUID_FORMAT_YV12 \
 123        { 'Y',  'V',  '1',  '2', 0x00, 0x00, 0x10, 0x00, \
 124         0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
 125#define UVC_GUID_FORMAT_I420 \
 126        { 'I',  '4',  '2',  '0', 0x00, 0x00, 0x10, 0x00, \
 127         0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
 128#define UVC_GUID_FORMAT_UYVY \
 129        { 'U',  'Y',  'V',  'Y', 0x00, 0x00, 0x10, 0x00, \
 130         0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
 131#define UVC_GUID_FORMAT_Y800 \
 132        { 'Y',  '8',  '0',  '0', 0x00, 0x00, 0x10, 0x00, \
 133         0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
 134#define UVC_GUID_FORMAT_BY8 \
 135        { 'B',  'Y',  '8',  ' ', 0x00, 0x00, 0x10, 0x00, \
 136         0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
 137
 138
 139/* ------------------------------------------------------------------------
 140 * Driver specific constants.
 141 */
 142
 143#define DRIVER_VERSION_NUMBER   KERNEL_VERSION(0, 1, 0)
 144
 145/* Number of isochronous URBs. */
 146#define UVC_URBS                5
 147/* Maximum number of packets per URB. */
 148#define UVC_MAX_PACKETS         32
 149/* Maximum number of video buffers. */
 150#define UVC_MAX_VIDEO_BUFFERS   32
 151/* Maximum status buffer size in bytes of interrupt URB. */
 152#define UVC_MAX_STATUS_SIZE     16
 153
 154#define UVC_CTRL_CONTROL_TIMEOUT        300
 155#define UVC_CTRL_STREAMING_TIMEOUT      5000
 156
 157/* Devices quirks */
 158#define UVC_QUIRK_STATUS_INTERVAL       0x00000001
 159#define UVC_QUIRK_PROBE_MINMAX          0x00000002
 160#define UVC_QUIRK_PROBE_EXTRAFIELDS     0x00000004
 161#define UVC_QUIRK_BUILTIN_ISIGHT        0x00000008
 162#define UVC_QUIRK_STREAM_NO_FID         0x00000010
 163#define UVC_QUIRK_IGNORE_SELECTOR_UNIT  0x00000020
 164#define UVC_QUIRK_FIX_BANDWIDTH         0x00000080
 165#define UVC_QUIRK_PROBE_DEF             0x00000100
 166
 167/* Format flags */
 168#define UVC_FMT_FLAG_COMPRESSED         0x00000001
 169#define UVC_FMT_FLAG_STREAM             0x00000002
 170
 171/* ------------------------------------------------------------------------
 172 * Structures.
 173 */
 174
 175struct uvc_device;
 176
 177/* TODO: Put the most frequently accessed fields at the beginning of
 178 * structures to maximize cache efficiency.
 179 */
 180struct uvc_streaming_control {
 181        __u16 bmHint;
 182        __u8  bFormatIndex;
 183        __u8  bFrameIndex;
 184        __u32 dwFrameInterval;
 185        __u16 wKeyFrameRate;
 186        __u16 wPFrameRate;
 187        __u16 wCompQuality;
 188        __u16 wCompWindowSize;
 189        __u16 wDelay;
 190        __u32 dwMaxVideoFrameSize;
 191        __u32 dwMaxPayloadTransferSize;
 192        __u32 dwClockFrequency;
 193        __u8  bmFramingInfo;
 194        __u8  bPreferedVersion;
 195        __u8  bMinVersion;
 196        __u8  bMaxVersion;
 197};
 198
 199struct uvc_menu_info {
 200        __u32 value;
 201        __u8 name[32];
 202};
 203
 204struct uvc_control_info {
 205        struct list_head list;
 206        struct list_head mappings;
 207
 208        __u8 entity[16];
 209        __u8 index;
 210        __u8 selector;
 211
 212        __u16 size;
 213        __u32 flags;
 214};
 215
 216struct uvc_control_mapping {
 217        struct list_head list;
 218
 219        struct uvc_control_info *ctrl;
 220
 221        __u32 id;
 222        __u8 name[32];
 223        __u8 entity[16];
 224        __u8 selector;
 225
 226        __u8 size;
 227        __u8 offset;
 228        enum v4l2_ctrl_type v4l2_type;
 229        __u32 data_type;
 230
 231        struct uvc_menu_info *menu_info;
 232        __u32 menu_count;
 233
 234        __s32 (*get) (struct uvc_control_mapping *mapping, __u8 query,
 235                      const __u8 *data);
 236        void (*set) (struct uvc_control_mapping *mapping, __s32 value,
 237                     __u8 *data);
 238};
 239
 240struct uvc_control {
 241        struct uvc_entity *entity;
 242        struct uvc_control_info *info;
 243
 244        __u8 index;     /* Used to match the uvc_control entry with a
 245                           uvc_control_info. */
 246        __u8 dirty : 1,
 247             loaded : 1,
 248             modified : 1,
 249             cached : 1;
 250
 251        __u8 *data;
 252};
 253
 254struct uvc_format_desc {
 255        char *name;
 256        __u8 guid[16];
 257        __u32 fcc;
 258};
 259
 260/* The term 'entity' refers to both UVC units and UVC terminals.
 261 *
 262 * The type field is either the terminal type (wTerminalType in the terminal
 263 * descriptor), or the unit type (bDescriptorSubtype in the unit descriptor).
 264 * As the bDescriptorSubtype field is one byte long, the type value will
 265 * always have a null MSB for units. All terminal types defined by the UVC
 266 * specification have a non-null MSB, so it is safe to use the MSB to
 267 * differentiate between units and terminals as long as the descriptor parsing
 268 * code makes sure terminal types have a non-null MSB.
 269 *
 270 * For terminals, the type's most significant bit stores the terminal
 271 * direction (either UVC_TERM_INPUT or UVC_TERM_OUTPUT). The type field should
 272 * always be accessed with the UVC_ENTITY_* macros and never directly.
 273 */
 274
 275struct uvc_entity {
 276        struct list_head list;          /* Entity as part of a UVC device. */
 277        struct list_head chain;         /* Entity as part of a video device
 278                                         * chain. */
 279        __u8 id;
 280        __u16 type;
 281        char name[64];
 282
 283        union {
 284                struct {
 285                        __u16 wObjectiveFocalLengthMin;
 286                        __u16 wObjectiveFocalLengthMax;
 287                        __u16 wOcularFocalLength;
 288                        __u8  bControlSize;
 289                        __u8  *bmControls;
 290                } camera;
 291
 292                struct {
 293                        __u8  bControlSize;
 294                        __u8  *bmControls;
 295                        __u8  bTransportModeSize;
 296                        __u8  *bmTransportModes;
 297                } media;
 298
 299                struct {
 300                } output;
 301
 302                struct {
 303                        __u16 wMaxMultiplier;
 304                        __u8  bControlSize;
 305                        __u8  *bmControls;
 306                        __u8  bmVideoStandards;
 307                } processing;
 308
 309                struct {
 310                } selector;
 311
 312                struct {
 313                        __u8  guidExtensionCode[16];
 314                        __u8  bNumControls;
 315                        __u8  bControlSize;
 316                        __u8  *bmControls;
 317                        __u8  *bmControlsType;
 318                } extension;
 319        };
 320
 321        __u8 bNrInPins;
 322        __u8 *baSourceID;
 323
 324        unsigned int ncontrols;
 325        struct uvc_control *controls;
 326};
 327
 328struct uvc_frame {
 329        __u8  bFrameIndex;
 330        __u8  bmCapabilities;
 331        __u16 wWidth;
 332        __u16 wHeight;
 333        __u32 dwMinBitRate;
 334        __u32 dwMaxBitRate;
 335        __u32 dwMaxVideoFrameBufferSize;
 336        __u8  bFrameIntervalType;
 337        __u32 dwDefaultFrameInterval;
 338        __u32 *dwFrameInterval;
 339};
 340
 341struct uvc_format {
 342        __u8 type;
 343        __u8 index;
 344        __u8 bpp;
 345        __u8 colorspace;
 346        __u32 fcc;
 347        __u32 flags;
 348
 349        char name[32];
 350
 351        unsigned int nframes;
 352        struct uvc_frame *frame;
 353};
 354
 355struct uvc_streaming_header {
 356        __u8 bNumFormats;
 357        __u8 bEndpointAddress;
 358        __u8 bTerminalLink;
 359        __u8 bControlSize;
 360        __u8 *bmaControls;
 361        /* The following fields are used by input headers only. */
 362        __u8 bmInfo;
 363        __u8 bStillCaptureMethod;
 364        __u8 bTriggerSupport;
 365        __u8 bTriggerUsage;
 366};
 367
 368enum uvc_buffer_state {
 369        UVC_BUF_STATE_IDLE      = 0,
 370        UVC_BUF_STATE_QUEUED    = 1,
 371        UVC_BUF_STATE_ACTIVE    = 2,
 372        UVC_BUF_STATE_READY     = 3,
 373        UVC_BUF_STATE_DONE      = 4,
 374        UVC_BUF_STATE_ERROR     = 5,
 375};
 376
 377struct uvc_buffer {
 378        unsigned long vma_use_count;
 379        struct list_head stream;
 380
 381        /* Touched by interrupt handler. */
 382        struct v4l2_buffer buf;
 383        struct list_head queue;
 384        wait_queue_head_t wait;
 385        enum uvc_buffer_state state;
 386};
 387
 388#define UVC_QUEUE_STREAMING             (1 << 0)
 389#define UVC_QUEUE_DISCONNECTED          (1 << 1)
 390#define UVC_QUEUE_DROP_INCOMPLETE       (1 << 2)
 391
 392struct uvc_video_queue {
 393        enum v4l2_buf_type type;
 394
 395        void *mem;
 396        unsigned int flags;
 397        __u32 sequence;
 398
 399        unsigned int count;
 400        unsigned int buf_size;
 401        unsigned int buf_used;
 402        struct uvc_buffer buffer[UVC_MAX_VIDEO_BUFFERS];
 403        struct mutex mutex;     /* protects buffers and mainqueue */
 404        spinlock_t irqlock;     /* protects irqqueue */
 405
 406        struct list_head mainqueue;
 407        struct list_head irqqueue;
 408};
 409
 410struct uvc_video_chain {
 411        struct uvc_device *dev;
 412        struct list_head list;
 413
 414        struct list_head entities;              /* All entities */
 415        struct uvc_entity *processing;          /* Processing unit */
 416        struct uvc_entity *selector;            /* Selector unit */
 417
 418        struct mutex ctrl_mutex;
 419};
 420
 421struct uvc_streaming {
 422        struct list_head list;
 423        struct uvc_device *dev;
 424        struct video_device *vdev;
 425        struct uvc_video_chain *chain;
 426        atomic_t active;
 427
 428        struct usb_interface *intf;
 429        int intfnum;
 430        __u16 maxpsize;
 431
 432        struct uvc_streaming_header header;
 433        enum v4l2_buf_type type;
 434
 435        unsigned int nformats;
 436        struct uvc_format *format;
 437
 438        struct uvc_streaming_control ctrl;
 439        struct uvc_format *cur_format;
 440        struct uvc_frame *cur_frame;
 441
 442        struct mutex mutex;
 443
 444        unsigned int frozen : 1;
 445        struct uvc_video_queue queue;
 446        void (*decode) (struct urb *urb, struct uvc_streaming *video,
 447                        struct uvc_buffer *buf);
 448
 449        /* Context data used by the bulk completion handler. */
 450        struct {
 451                __u8 header[256];
 452                unsigned int header_size;
 453                int skip_payload;
 454                __u32 payload_size;
 455                __u32 max_payload_size;
 456        } bulk;
 457
 458        struct urb *urb[UVC_URBS];
 459        char *urb_buffer[UVC_URBS];
 460        dma_addr_t urb_dma[UVC_URBS];
 461        unsigned int urb_size;
 462
 463        __u8 last_fid;
 464};
 465
 466enum uvc_device_state {
 467        UVC_DEV_DISCONNECTED = 1,
 468};
 469
 470struct uvc_device {
 471        struct usb_device *udev;
 472        struct usb_interface *intf;
 473        unsigned long warnings;
 474        __u32 quirks;
 475        int intfnum;
 476        char name[32];
 477
 478        enum uvc_device_state state;
 479        struct list_head list;
 480        atomic_t users;
 481
 482        /* Video control interface */
 483        __u16 uvc_version;
 484        __u32 clock_frequency;
 485
 486        struct list_head entities;
 487        struct list_head chains;
 488
 489        /* Video Streaming interfaces */
 490        struct list_head streams;
 491        atomic_t nstreams;
 492
 493        /* Status Interrupt Endpoint */
 494        struct usb_host_endpoint *int_ep;
 495        struct urb *int_urb;
 496        __u8 *status;
 497        struct input_dev *input;
 498        char input_phys[64];
 499};
 500
 501enum uvc_handle_state {
 502        UVC_HANDLE_PASSIVE      = 0,
 503        UVC_HANDLE_ACTIVE       = 1,
 504};
 505
 506struct uvc_fh {
 507        struct uvc_video_chain *chain;
 508        struct uvc_streaming *stream;
 509        enum uvc_handle_state state;
 510};
 511
 512struct uvc_driver {
 513        struct usb_driver driver;
 514
 515        struct list_head devices;       /* struct uvc_device list */
 516        struct list_head controls;      /* struct uvc_control_info list */
 517        struct mutex ctrl_mutex;        /* protects controls and devices
 518                                           lists */
 519};
 520
 521/* ------------------------------------------------------------------------
 522 * Debugging, printing and logging
 523 */
 524
 525#define UVC_TRACE_PROBE         (1 << 0)
 526#define UVC_TRACE_DESCR         (1 << 1)
 527#define UVC_TRACE_CONTROL       (1 << 2)
 528#define UVC_TRACE_FORMAT        (1 << 3)
 529#define UVC_TRACE_CAPTURE       (1 << 4)
 530#define UVC_TRACE_CALLS         (1 << 5)
 531#define UVC_TRACE_IOCTL         (1 << 6)
 532#define UVC_TRACE_FRAME         (1 << 7)
 533#define UVC_TRACE_SUSPEND       (1 << 8)
 534#define UVC_TRACE_STATUS        (1 << 9)
 535#define UVC_TRACE_VIDEO         (1 << 10)
 536
 537#define UVC_WARN_MINMAX         0
 538#define UVC_WARN_PROBE_DEF      1
 539
 540extern unsigned int uvc_clock_param;
 541extern unsigned int uvc_no_drop_param;
 542extern unsigned int uvc_trace_param;
 543extern unsigned int uvc_timeout_param;
 544
 545#define uvc_trace(flag, msg...) \
 546        do { \
 547                if (uvc_trace_param & flag) \
 548                        printk(KERN_DEBUG "uvcvideo: " msg); \
 549        } while (0)
 550
 551#define uvc_warn_once(dev, warn, msg...) \
 552        do { \
 553                if (!test_and_set_bit(warn, &dev->warnings)) \
 554                        printk(KERN_INFO "uvcvideo: " msg); \
 555        } while (0)
 556
 557#define uvc_printk(level, msg...) \
 558        printk(level "uvcvideo: " msg)
 559
 560/* --------------------------------------------------------------------------
 561 * Internal functions.
 562 */
 563
 564/* Core driver */
 565extern struct uvc_driver uvc_driver;
 566
 567/* Video buffers queue management. */
 568extern void uvc_queue_init(struct uvc_video_queue *queue,
 569                enum v4l2_buf_type type);
 570extern int uvc_alloc_buffers(struct uvc_video_queue *queue,
 571                unsigned int nbuffers, unsigned int buflength);
 572extern int uvc_free_buffers(struct uvc_video_queue *queue);
 573extern int uvc_query_buffer(struct uvc_video_queue *queue,
 574                struct v4l2_buffer *v4l2_buf);
 575extern int uvc_queue_buffer(struct uvc_video_queue *queue,
 576                struct v4l2_buffer *v4l2_buf);
 577extern int uvc_dequeue_buffer(struct uvc_video_queue *queue,
 578                struct v4l2_buffer *v4l2_buf, int nonblocking);
 579extern int uvc_queue_enable(struct uvc_video_queue *queue, int enable);
 580extern void uvc_queue_cancel(struct uvc_video_queue *queue, int disconnect);
 581extern struct uvc_buffer *uvc_queue_next_buffer(struct uvc_video_queue *queue,
 582                struct uvc_buffer *buf);
 583extern unsigned int uvc_queue_poll(struct uvc_video_queue *queue,
 584                struct file *file, poll_table *wait);
 585extern int uvc_queue_allocated(struct uvc_video_queue *queue);
 586static inline int uvc_queue_streaming(struct uvc_video_queue *queue)
 587{
 588        return queue->flags & UVC_QUEUE_STREAMING;
 589}
 590
 591/* V4L2 interface */
 592extern const struct v4l2_file_operations uvc_fops;
 593
 594/* Video */
 595extern int uvc_video_init(struct uvc_streaming *stream);
 596extern int uvc_video_suspend(struct uvc_streaming *stream);
 597extern int uvc_video_resume(struct uvc_streaming *stream);
 598extern int uvc_video_enable(struct uvc_streaming *stream, int enable);
 599extern int uvc_probe_video(struct uvc_streaming *stream,
 600                struct uvc_streaming_control *probe);
 601extern int uvc_commit_video(struct uvc_streaming *stream,
 602                struct uvc_streaming_control *ctrl);
 603extern int uvc_query_ctrl(struct uvc_device *dev, __u8 query, __u8 unit,
 604                __u8 intfnum, __u8 cs, void *data, __u16 size);
 605
 606/* Status */
 607extern int uvc_status_init(struct uvc_device *dev);
 608extern void uvc_status_cleanup(struct uvc_device *dev);
 609extern int uvc_status_start(struct uvc_device *dev);
 610extern void uvc_status_stop(struct uvc_device *dev);
 611extern int uvc_status_suspend(struct uvc_device *dev);
 612extern int uvc_status_resume(struct uvc_device *dev);
 613
 614/* Controls */
 615extern struct uvc_control *uvc_find_control(struct uvc_video_chain *chain,
 616                __u32 v4l2_id, struct uvc_control_mapping **mapping);
 617extern int uvc_query_v4l2_ctrl(struct uvc_video_chain *chain,
 618                struct v4l2_queryctrl *v4l2_ctrl);
 619
 620extern int uvc_ctrl_add_info(struct uvc_control_info *info);
 621extern int uvc_ctrl_add_mapping(struct uvc_control_mapping *mapping);
 622extern int uvc_ctrl_init_device(struct uvc_device *dev);
 623extern void uvc_ctrl_cleanup_device(struct uvc_device *dev);
 624extern int uvc_ctrl_resume_device(struct uvc_device *dev);
 625extern void uvc_ctrl_init(void);
 626
 627extern int uvc_ctrl_begin(struct uvc_video_chain *chain);
 628extern int __uvc_ctrl_commit(struct uvc_video_chain *chain, int rollback);
 629static inline int uvc_ctrl_commit(struct uvc_video_chain *chain)
 630{
 631        return __uvc_ctrl_commit(chain, 0);
 632}
 633static inline int uvc_ctrl_rollback(struct uvc_video_chain *chain)
 634{
 635        return __uvc_ctrl_commit(chain, 1);
 636}
 637
 638extern int uvc_ctrl_get(struct uvc_video_chain *chain,
 639                struct v4l2_ext_control *xctrl);
 640extern int uvc_ctrl_set(struct uvc_video_chain *chain,
 641                struct v4l2_ext_control *xctrl);
 642
 643extern int uvc_xu_ctrl_query(struct uvc_video_chain *chain,
 644                struct uvc_xu_control *ctrl, int set);
 645
 646/* Utility functions */
 647extern void uvc_simplify_fraction(uint32_t *numerator, uint32_t *denominator,
 648                unsigned int n_terms, unsigned int threshold);
 649extern uint32_t uvc_fraction_to_interval(uint32_t numerator,
 650                uint32_t denominator);
 651extern struct usb_host_endpoint *uvc_find_endpoint(
 652                struct usb_host_interface *alts, __u8 epaddr);
 653
 654/* Quirks support */
 655void uvc_video_decode_isight(struct urb *urb, struct uvc_streaming *stream,
 656                struct uvc_buffer *buf);
 657
 658#endif /* __KERNEL__ */
 659
 660#endif
 661
 662
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.