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/*
   9 * Dynamic controls
  10 */
  11
  12/* Data types for UVC control data */
  13#define UVC_CTRL_DATA_TYPE_RAW          0
  14#define UVC_CTRL_DATA_TYPE_SIGNED       1
  15#define UVC_CTRL_DATA_TYPE_UNSIGNED     2
  16#define UVC_CTRL_DATA_TYPE_BOOLEAN      3
  17#define UVC_CTRL_DATA_TYPE_ENUM         4
  18#define UVC_CTRL_DATA_TYPE_BITMASK      5
  19
  20/* Control flags */
  21#define UVC_CONTROL_SET_CUR     (1 << 0)
  22#define UVC_CONTROL_GET_CUR     (1 << 1)
  23#define UVC_CONTROL_GET_MIN     (1 << 2)
  24#define UVC_CONTROL_GET_MAX     (1 << 3)
  25#define UVC_CONTROL_GET_RES     (1 << 4)
  26#define UVC_CONTROL_GET_DEF     (1 << 5)
  27/* Control should be saved at suspend and restored at resume. */
  28#define UVC_CONTROL_RESTORE     (1 << 6)
  29/* Control can be updated by the camera. */
  30#define UVC_CONTROL_AUTO_UPDATE (1 << 7)
  31
  32#define UVC_CONTROL_GET_RANGE   (UVC_CONTROL_GET_CUR | UVC_CONTROL_GET_MIN | \
  33                                 UVC_CONTROL_GET_MAX | UVC_CONTROL_GET_RES | \
  34                                 UVC_CONTROL_GET_DEF)
  35
  36struct uvc_xu_control_info {
  37        __u8 entity[16];
  38        __u8 index;
  39        __u8 selector;
  40        __u16 size;
  41        __u32 flags;
  42};
  43
  44struct uvc_xu_control_mapping {
  45        __u32 id;
  46        __u8 name[32];
  47        __u8 entity[16];
  48        __u8 selector;
  49
  50        __u8 size;
  51        __u8 offset;
  52        enum v4l2_ctrl_type v4l2_type;
  53        __u32 data_type;
  54};
  55
  56struct uvc_xu_control {
  57        __u8 unit;
  58        __u8 selector;
  59        __u16 size;
  60        __u8 __user *data;
  61};
  62
  63#define UVCIOC_CTRL_ADD         _IOW('U', 1, struct uvc_xu_control_info)
  64#define UVCIOC_CTRL_MAP         _IOWR('U', 2, struct uvc_xu_control_mapping)
  65#define UVCIOC_CTRL_GET         _IOWR('U', 3, struct uvc_xu_control)
  66#define UVCIOC_CTRL_SET         _IOW('U', 4, struct uvc_xu_control)
  67
  68#ifdef __KERNEL__
  69
  70#include <linux/poll.h>
  71
  72/* --------------------------------------------------------------------------
  73 * UVC constants
  74 */
  75
  76#define SC_UNDEFINED                    0x00
  77#define SC_VIDEOCONTROL                 0x01
  78#define SC_VIDEOSTREAMING               0x02
  79#define SC_VIDEO_INTERFACE_COLLECTION   0x03
  80
  81#define PC_PROTOCOL_UNDEFINED           0x00
  82
  83#define CS_UNDEFINED                    0x20
  84#define CS_DEVICE                       0x21
  85#define CS_CONFIGURATION                0x22
  86#define CS_STRING                       0x23
  87#define CS_INTERFACE                    0x24
  88#define CS_ENDPOINT                     0x25
  89
  90/* VideoControl class specific interface descriptor */
  91#define VC_DESCRIPTOR_UNDEFINED         0x00
  92#define VC_HEADER                       0x01
  93#define VC_INPUT_TERMINAL               0x02
  94#define VC_OUTPUT_TERMINAL              0x03
  95#define VC_SELECTOR_UNIT                0x04
  96#define VC_PROCESSING_UNIT              0x05
  97#define VC_EXTENSION_UNIT               0x06
  98
  99/* VideoStreaming class specific interface descriptor */
 100#define VS_UNDEFINED                    0x00
 101#define VS_INPUT_HEADER                 0x01
 102#define VS_OUTPUT_HEADER                0x02
 103#define VS_STILL_IMAGE_FRAME            0x03
 104#define VS_FORMAT_UNCOMPRESSED          0x04
 105#define VS_FRAME_UNCOMPRESSED           0x05
 106#define VS_FORMAT_MJPEG                 0x06
 107#define VS_FRAME_MJPEG                  0x07
 108#define VS_FORMAT_MPEG2TS               0x0a
 109#define VS_FORMAT_DV                    0x0c
 110#define VS_COLORFORMAT                  0x0d
 111#define VS_FORMAT_FRAME_BASED           0x10
 112#define VS_FRAME_FRAME_BASED            0x11
 113#define VS_FORMAT_STREAM_BASED          0x12
 114
 115/* Endpoint type */
 116#define EP_UNDEFINED                    0x00
 117#define EP_GENERAL                      0x01
 118#define EP_ENDPOINT                     0x02
 119#define EP_INTERRUPT                    0x03
 120
 121/* Request codes */
 122#define RC_UNDEFINED                    0x00
 123#define SET_CUR                         0x01
 124#define GET_CUR                         0x81
 125#define GET_MIN                         0x82
 126#define GET_MAX                         0x83
 127#define GET_RES                         0x84
 128#define GET_LEN                         0x85
 129#define GET_INFO                        0x86
 130#define GET_DEF                         0x87
 131
 132/* VideoControl interface controls */
 133#define VC_CONTROL_UNDEFINED            0x00
 134#define VC_VIDEO_POWER_MODE_CONTROL     0x01
 135#define VC_REQUEST_ERROR_CODE_CONTROL   0x02
 136
 137/* Terminal controls */
 138#define TE_CONTROL_UNDEFINED            0x00
 139
 140/* Selector Unit controls */
 141#define SU_CONTROL_UNDEFINED            0x00
 142#define SU_INPUT_SELECT_CONTROL         0x01
 143
 144/* Camera Terminal controls */
 145#define CT_CONTROL_UNDEFINED                            0x00
 146#define CT_SCANNING_MODE_CONTROL                        0x01
 147#define CT_AE_MODE_CONTROL                              0x02
 148#define CT_AE_PRIORITY_CONTROL                          0x03
 149#define CT_EXPOSURE_TIME_ABSOLUTE_CONTROL               0x04
 150#define CT_EXPOSURE_TIME_RELATIVE_CONTROL               0x05
 151#define CT_FOCUS_ABSOLUTE_CONTROL                       0x06
 152#define CT_FOCUS_RELATIVE_CONTROL                       0x07
 153#define CT_FOCUS_AUTO_CONTROL                           0x08
 154#define CT_IRIS_ABSOLUTE_CONTROL                        0x09
 155#define CT_IRIS_RELATIVE_CONTROL                        0x0a
 156#define CT_ZOOM_ABSOLUTE_CONTROL                        0x0b
 157#define CT_ZOOM_RELATIVE_CONTROL                        0x0c
 158#define CT_PANTILT_ABSOLUTE_CONTROL                     0x0d
 159#define CT_PANTILT_RELATIVE_CONTROL                     0x0e
 160#define CT_ROLL_ABSOLUTE_CONTROL                        0x0f
 161#define CT_ROLL_RELATIVE_CONTROL                        0x10
 162#define CT_PRIVACY_CONTROL                              0x11
 163
 164/* Processing Unit controls */
 165#define PU_CONTROL_UNDEFINED                            0x00
 166#define PU_BACKLIGHT_COMPENSATION_CONTROL               0x01
 167#define PU_BRIGHTNESS_CONTROL                           0x02
 168#define PU_CONTRAST_CONTROL                             0x03
 169#define PU_GAIN_CONTROL                                 0x04
 170#define PU_POWER_LINE_FREQUENCY_CONTROL                 0x05
 171#define PU_HUE_CONTROL                                  0x06
 172#define PU_SATURATION_CONTROL                           0x07
 173#define PU_SHARPNESS_CONTROL                            0x08
 174#define PU_GAMMA_CONTROL                                0x09
 175#define PU_WHITE_BALANCE_TEMPERATURE_CONTROL            0x0a
 176#define PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL       0x0b
 177#define PU_WHITE_BALANCE_COMPONENT_CONTROL              0x0c
 178#define PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL         0x0d
 179#define PU_DIGITAL_MULTIPLIER_CONTROL                   0x0e
 180#define PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL             0x0f
 181#define PU_HUE_AUTO_CONTROL                             0x10
 182#define PU_ANALOG_VIDEO_STANDARD_CONTROL                0x11
 183#define PU_ANALOG_LOCK_STATUS_CONTROL                   0x12
 184
 185#define LXU_MOTOR_PANTILT_RELATIVE_CONTROL              0x01
 186#define LXU_MOTOR_PANTILT_RESET_CONTROL                 0x02
 187#define LXU_MOTOR_FOCUS_MOTOR_CONTROL                   0x03
 188
 189/* VideoStreaming interface controls */
 190#define VS_CONTROL_UNDEFINED            0x00
 191#define VS_PROBE_CONTROL                0x01
 192#define VS_COMMIT_CONTROL               0x02
 193#define VS_STILL_PROBE_CONTROL          0x03
 194#define VS_STILL_COMMIT_CONTROL         0x04
 195#define VS_STILL_IMAGE_TRIGGER_CONTROL  0x05
 196#define VS_STREAM_ERROR_CODE_CONTROL    0x06
 197#define VS_GENERATE_KEY_FRAME_CONTROL   0x07
 198#define VS_UPDATE_FRAME_SEGMENT_CONTROL 0x08
 199#define VS_SYNC_DELAY_CONTROL           0x09
 200
 201#define TT_VENDOR_SPECIFIC              0x0100
 202#define TT_STREAMING                    0x0101
 203
 204/* Input Terminal types */
 205#define ITT_VENDOR_SPECIFIC             0x0200
 206#define ITT_CAMERA                      0x0201
 207#define ITT_MEDIA_TRANSPORT_INPUT       0x0202
 208
 209/* Output Terminal types */
 210#define OTT_VENDOR_SPECIFIC             0x0300
 211#define OTT_DISPLAY                     0x0301
 212#define OTT_MEDIA_TRANSPORT_OUTPUT      0x0302
 213
 214/* External Terminal types */
 215#define EXTERNAL_VENDOR_SPECIFIC        0x0400
 216#define COMPOSITE_CONNECTOR             0x0401
 217#define SVIDEO_CONNECTOR                0x0402
 218#define COMPONENT_CONNECTOR             0x0403
 219
 220#define UVC_TERM_INPUT                  0x0000
 221#define UVC_TERM_OUTPUT                 0x8000
 222
 223#define UVC_ENTITY_TYPE(entity)         ((entity)->type & 0x7fff)
 224#define UVC_ENTITY_IS_UNIT(entity)      (((entity)->type & 0xff00) == 0)
 225#define UVC_ENTITY_IS_TERM(entity)      (((entity)->type & 0xff00) != 0)
 226#define UVC_ENTITY_IS_ITERM(entity) \
 227        (((entity)->type & 0x8000) == UVC_TERM_INPUT)
 228#define UVC_ENTITY_IS_OTERM(entity) \
 229        (((entity)->type & 0x8000) == UVC_TERM_OUTPUT)
 230
 231#define UVC_STATUS_TYPE_CONTROL         1
 232#define UVC_STATUS_TYPE_STREAMING       2
 233
 234/* ------------------------------------------------------------------------
 235 * GUIDs
 236 */
 237#define UVC_GUID_UVC_CAMERA \
 238        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
 239         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}
 240#define UVC_GUID_UVC_OUTPUT \
 241        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
 242         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}
 243#define UVC_GUID_UVC_MEDIA_TRANSPORT_INPUT \
 244        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
 245         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03}
 246#define UVC_GUID_UVC_PROCESSING \
 247        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
 248         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01}
 249#define UVC_GUID_UVC_SELECTOR \
 250        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
 251         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02}
 252
 253#define UVC_GUID_LOGITECH_DEV_INFO \
 254        {0x82, 0x06, 0x61, 0x63, 0x70, 0x50, 0xab, 0x49, \
 255         0xb8, 0xcc, 0xb3, 0x85, 0x5e, 0x8d, 0x22, 0x1e}
 256#define UVC_GUID_LOGITECH_USER_HW \
 257        {0x82, 0x06, 0x61, 0x63, 0x70, 0x50, 0xab, 0x49, \
 258         0xb8, 0xcc, 0xb3, 0x85, 0x5e, 0x8d, 0x22, 0x1f}
 259#define UVC_GUID_LOGITECH_VIDEO \
 260        {0x82, 0x06, 0x61, 0x63, 0x70, 0x50, 0xab, 0x49, \
 261         0xb8, 0xcc, 0xb3, 0x85, 0x5e, 0x8d, 0x22, 0x50}
 262#define UVC_GUID_LOGITECH_MOTOR \
 263        {0x82, 0x06, 0x61, 0x63, 0x70, 0x50, 0xab, 0x49, \
 264         0xb8, 0xcc, 0xb3, 0x85, 0x5e, 0x8d, 0x22, 0x56}
 265
 266#define UVC_GUID_FORMAT_MJPEG \
 267        { 'M',  'J',  'P',  'G', 0x00, 0x00, 0x10, 0x00, \
 268         0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
 269#define UVC_GUID_FORMAT_YUY2 \
 270        { 'Y',  'U',  'Y',  '2', 0x00, 0x00, 0x10, 0x00, \
 271         0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
 272#define UVC_GUID_FORMAT_NV12 \
 273        { 'N',  'V',  '1',  '2', 0x00, 0x00, 0x10, 0x00, \
 274         0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
 275#define UVC_GUID_FORMAT_YV12 \
 276        { 'Y',  'V',  '1',  '2', 0x00, 0x00, 0x10, 0x00, \
 277         0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
 278#define UVC_GUID_FORMAT_I420 \
 279        { 'I',  '4',  '2',  '0', 0x00, 0x00, 0x10, 0x00, \
 280         0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
 281#define UVC_GUID_FORMAT_UYVY \
 282        { 'U',  'Y',  'V',  'Y', 0x00, 0x00, 0x10, 0x00, \
 283         0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
 284#define UVC_GUID_FORMAT_Y800 \
 285        { 'Y',  '8',  '0',  '0', 0x00, 0x00, 0x10, 0x00, \
 286         0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
 287#define UVC_GUID_FORMAT_BY8 \
 288        { 'B',  'Y',  '8',  ' ', 0x00, 0x00, 0x10, 0x00, \
 289         0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
 290
 291
 292/* ------------------------------------------------------------------------
 293 * Driver specific constants.
 294 */
 295
 296#define DRIVER_VERSION_NUMBER   KERNEL_VERSION(0, 1, 0)
 297
 298/* Number of isochronous URBs. */
 299#define UVC_URBS                5
 300/* Maximum number of packets per isochronous URB. */
 301#define UVC_MAX_ISO_PACKETS     40
 302/* Maximum frame size in bytes, for sanity checking. */
 303#define UVC_MAX_FRAME_SIZE      (16*1024*1024)
 304/* Maximum number of video buffers. */
 305#define UVC_MAX_VIDEO_BUFFERS   32
 306/* Maximum status buffer size in bytes of interrupt URB. */
 307#define UVC_MAX_STATUS_SIZE     16
 308
 309#define UVC_CTRL_CONTROL_TIMEOUT        300
 310#define UVC_CTRL_STREAMING_TIMEOUT      1000
 311
 312/* Devices quirks */
 313#define UVC_QUIRK_STATUS_INTERVAL       0x00000001
 314#define UVC_QUIRK_PROBE_MINMAX          0x00000002
 315#define UVC_QUIRK_PROBE_EXTRAFIELDS     0x00000004
 316#define UVC_QUIRK_BUILTIN_ISIGHT        0x00000008
 317#define UVC_QUIRK_STREAM_NO_FID         0x00000010
 318#define UVC_QUIRK_IGNORE_SELECTOR_UNIT  0x00000020
 319
 320/* Format flags */
 321#define UVC_FMT_FLAG_COMPRESSED         0x00000001
 322#define UVC_FMT_FLAG_STREAM             0x00000002
 323
 324/* ------------------------------------------------------------------------
 325 * Structures.
 326 */
 327
 328struct uvc_device;
 329
 330/* TODO: Put the most frequently accessed fields at the beginning of
 331 * structures to maximize cache efficiency.
 332 */
 333struct uvc_streaming_control {
 334        __u16 bmHint;
 335        __u8  bFormatIndex;
 336        __u8  bFrameIndex;
 337        __u32 dwFrameInterval;
 338        __u16 wKeyFrameRate;
 339        __u16 wPFrameRate;
 340        __u16 wCompQuality;
 341        __u16 wCompWindowSize;
 342        __u16 wDelay;
 343        __u32 dwMaxVideoFrameSize;
 344        __u32 dwMaxPayloadTransferSize;
 345        __u32 dwClockFrequency;
 346        __u8  bmFramingInfo;
 347        __u8  bPreferedVersion;
 348        __u8  bMinVersion;
 349        __u8  bMaxVersion;
 350};
 351
 352struct uvc_menu_info {
 353        __u32 value;
 354        __u8 name[32];
 355};
 356
 357struct uvc_control_info {
 358        struct list_head list;
 359        struct list_head mappings;
 360
 361        __u8 entity[16];
 362        __u8 index;
 363        __u8 selector;
 364
 365        __u16 size;
 366        __u32 flags;
 367};
 368
 369struct uvc_control_mapping {
 370        struct list_head list;
 371
 372        struct uvc_control_info *ctrl;
 373
 374        __u32 id;
 375        __u8 name[32];
 376        __u8 entity[16];
 377        __u8 selector;
 378
 379        __u8 size;
 380        __u8 offset;
 381        enum v4l2_ctrl_type v4l2_type;
 382        __u32 data_type;
 383
 384        struct uvc_menu_info *menu_info;
 385        __u32 menu_count;
 386};
 387
 388struct uvc_control {
 389        struct uvc_entity *entity;
 390        struct uvc_control_info *info;
 391
 392        __u8 index;     /* Used to match the uvc_control entry with a
 393                           uvc_control_info. */
 394        __u8 dirty : 1,
 395             loaded : 1,
 396             modified : 1;
 397
 398        __u8 *data;
 399};
 400
 401struct uvc_format_desc {
 402        char *name;
 403        __u8 guid[16];
 404        __u32 fcc;
 405};
 406
 407/* The term 'entity' refers to both UVC units and UVC terminals.
 408 *
 409 * The type field is either the terminal type (wTerminalType in the terminal
 410 * descriptor), or the unit type (bDescriptorSubtype in the unit descriptor).
 411 * As the bDescriptorSubtype field is one byte long, the type value will
 412 * always have a null MSB for units. All terminal types defined by the UVC
 413 * specification have a non-null MSB, so it is safe to use the MSB to
 414 * differentiate between units and terminals as long as the descriptor parsing
 415 * code makes sure terminal types have a non-null MSB.
 416 *
 417 * For terminals, the type's most significant bit stores the terminal
 418 * direction (either UVC_TERM_INPUT or UVC_TERM_OUTPUT). The type field should
 419 * always be accessed with the UVC_ENTITY_* macros and never directly.
 420 */
 421
 422struct uvc_entity {
 423        struct list_head list;          /* Entity as part of a UVC device. */
 424        struct list_head chain;         /* Entity as part of a video device
 425                                         * chain. */
 426        __u8 id;
 427        __u16 type;
 428        char name[64];
 429
 430        union {
 431                struct {
 432                        __u16 wObjectiveFocalLengthMin;
 433                        __u16 wObjectiveFocalLengthMax;
 434                        __u16 wOcularFocalLength;
 435                        __u8  bControlSize;
 436                        __u8  *bmControls;
 437                } camera;
 438
 439                struct {
 440                        __u8  bControlSize;
 441                        __u8  *bmControls;
 442                        __u8  bTransportModeSize;
 443                        __u8  *bmTransportModes;
 444                } media;
 445
 446                struct {
 447                        __u8  bSourceID;
 448                } output;
 449
 450                struct {
 451                        __u8  bSourceID;
 452                        __u16 wMaxMultiplier;
 453                        __u8  bControlSize;
 454                        __u8  *bmControls;
 455                        __u8  bmVideoStandards;
 456                } processing;
 457
 458                struct {
 459                        __u8  bNrInPins;
 460                        __u8  *baSourceID;
 461                } selector;
 462
 463                struct {
 464                        __u8  guidExtensionCode[16];
 465                        __u8  bNumControls;
 466                        __u8  bNrInPins;
 467                        __u8  *baSourceID;
 468                        __u8  bControlSize;
 469                        __u8  *bmControls;
 470                        __u8  *bmControlsType;
 471                } extension;
 472        };
 473
 474        unsigned int ncontrols;
 475        struct uvc_control *controls;
 476};
 477
 478struct uvc_frame {
 479        __u8  bFrameIndex;
 480        __u8  bmCapabilities;
 481        __u16 wWidth;
 482        __u16 wHeight;
 483        __u32 dwMinBitRate;
 484        __u32 dwMaxBitRate;
 485        __u32 dwMaxVideoFrameBufferSize;
 486        __u8  bFrameIntervalType;
 487        __u32 dwDefaultFrameInterval;
 488        __u32 *dwFrameInterval;
 489};
 490
 491struct uvc_format {
 492        __u8 type;
 493        __u8 index;
 494        __u8 bpp;
 495        __u8 colorspace;
 496        __u32 fcc;
 497        __u32 flags;
 498
 499        char name[32];
 500
 501        unsigned int nframes;
 502        struct uvc_frame *frame;
 503};
 504
 505struct uvc_streaming_header {
 506        __u8 bNumFormats;
 507        __u8 bEndpointAddress;
 508        __u8 bTerminalLink;
 509        __u8 bControlSize;
 510        __u8 *bmaControls;
 511        /* The following fields are used by input headers only. */
 512        __u8 bmInfo;
 513        __u8 bStillCaptureMethod;
 514        __u8 bTriggerSupport;
 515        __u8 bTriggerUsage;
 516};
 517
 518struct uvc_streaming {
 519        struct list_head list;
 520
 521        struct usb_interface *intf;
 522        int intfnum;
 523        __u16 maxpsize;
 524
 525        struct uvc_streaming_header header;
 526
 527        unsigned int nformats;
 528        struct uvc_format *format;
 529
 530        struct uvc_streaming_control ctrl;
 531        struct uvc_format *cur_format;
 532        struct uvc_frame *cur_frame;
 533
 534        struct mutex mutex;
 535};
 536
 537enum uvc_buffer_state {
 538        UVC_BUF_STATE_IDLE       = 0,
 539        UVC_BUF_STATE_QUEUED     = 1,
 540        UVC_BUF_STATE_ACTIVE     = 2,
 541        UVC_BUF_STATE_DONE       = 3,
 542        UVC_BUF_STATE_ERROR      = 4,
 543};
 544
 545struct uvc_buffer {
 546        unsigned long vma_use_count;
 547        struct list_head stream;
 548
 549        /* Touched by interrupt handler. */
 550        struct v4l2_buffer buf;
 551        struct list_head queue;
 552        wait_queue_head_t wait;
 553        enum uvc_buffer_state state;
 554};
 555
 556#define UVC_QUEUE_STREAMING             (1 << 0)
 557#define UVC_QUEUE_DISCONNECTED          (1 << 1)
 558#define UVC_QUEUE_DROP_INCOMPLETE       (1 << 2)
 559
 560struct uvc_video_queue {
 561        void *mem;
 562        unsigned int flags;
 563        __u32 sequence;
 564
 565        unsigned int count;
 566        unsigned int buf_size;
 567        struct uvc_buffer buffer[UVC_MAX_VIDEO_BUFFERS];
 568        struct mutex mutex;     /* protects buffers and mainqueue */
 569        spinlock_t irqlock;     /* protects irqqueue */
 570
 571        struct list_head mainqueue;
 572        struct list_head irqqueue;
 573};
 574
 575struct uvc_video_device {
 576        struct uvc_device *dev;
 577        struct video_device *vdev;
 578        atomic_t active;
 579        unsigned int frozen : 1;
 580
 581        struct list_head iterms;
 582        struct uvc_entity *oterm;
 583        struct uvc_entity *processing;
 584        struct uvc_entity *selector;
 585        struct list_head extensions;
 586        struct mutex ctrl_mutex;
 587
 588        struct uvc_video_queue queue;
 589
 590        /* Video streaming object, must always be non-NULL. */
 591        struct uvc_streaming *streaming;
 592
 593        void (*decode) (struct urb *urb, struct uvc_video_device *video,
 594                        struct uvc_buffer *buf);
 595
 596        /* Context data used by the bulk completion handler. */
 597        struct {
 598                __u8 header[256];
 599                unsigned int header_size;
 600                int skip_payload;
 601                __u32 payload_size;
 602                __u32 max_payload_size;
 603        } bulk;
 604
 605        struct urb *urb[UVC_URBS];
 606        char *urb_buffer[UVC_URBS];
 607        dma_addr_t urb_dma[UVC_URBS];
 608        unsigned int urb_size;
 609
 610        __u8 last_fid;
 611};
 612
 613enum uvc_device_state {
 614        UVC_DEV_DISCONNECTED = 1,
 615};
 616
 617struct uvc_device {
 618        struct usb_device *udev;
 619        struct usb_interface *intf;
 620        __u32 quirks;
 621        int intfnum;
 622        char name[32];
 623
 624        enum uvc_device_state state;
 625        struct kref kref;
 626        struct list_head list;
 627
 628        /* Video control interface */
 629        __u16 uvc_version;
 630        __u32 clock_frequency;
 631
 632        struct list_head entities;
 633
 634        struct uvc_video_device video;
 635
 636        /* Status Interrupt Endpoint */
 637        struct usb_host_endpoint *int_ep;
 638        struct urb *int_urb;
 639        __u8 *status;
 640        struct input_dev *input;
 641
 642        /* Video Streaming interfaces */
 643        struct list_head streaming;
 644};
 645
 646enum uvc_handle_state {
 647        UVC_HANDLE_PASSIVE      = 0,
 648        UVC_HANDLE_ACTIVE       = 1,
 649};
 650
 651struct uvc_fh {
 652        struct uvc_video_device *device;
 653        enum uvc_handle_state state;
 654};
 655
 656struct uvc_driver {
 657        struct usb_driver driver;
 658
 659        struct mutex open_mutex;        /* protects from open/disconnect race */
 660
 661        struct list_head devices;       /* struct uvc_device list */
 662        struct list_head controls;      /* struct uvc_control_info list */
 663        struct mutex ctrl_mutex;        /* protects controls and devices
 664                                           lists */
 665};
 666
 667/* ------------------------------------------------------------------------
 668 * Debugging, printing and logging
 669 */
 670
 671#define UVC_TRACE_PROBE         (1 << 0)
 672#define UVC_TRACE_DESCR         (1 << 1)
 673#define UVC_TRACE_CONTROL       (1 << 2)
 674#define UVC_TRACE_FORMAT        (1 << 3)
 675#define UVC_TRACE_CAPTURE       (1 << 4)
 676#define UVC_TRACE_CALLS         (1 << 5)
 677#define UVC_TRACE_IOCTL         (1 << 6)
 678#define UVC_TRACE_FRAME         (1 << 7)
 679#define UVC_TRACE_SUSPEND       (1 << 8)
 680#define UVC_TRACE_STATUS        (1 << 9)
 681
 682extern unsigned int uvc_trace_param;
 683
 684#define uvc_trace(flag, msg...) \
 685        do { \
 686                if (uvc_trace_param & flag) \
 687                        printk(KERN_DEBUG "uvcvideo: " msg); \
 688        } while (0)
 689
 690#define uvc_printk(level, msg...) \
 691        printk(level "uvcvideo: " msg)
 692
 693#define UVC_GUID_FORMAT "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-" \
 694                        "%02x%02x%02x%02x%02x%02x"
 695#define UVC_GUID_ARGS(guid) \
 696        (guid)[3],  (guid)[2],  (guid)[1],  (guid)[0], \
 697        (guid)[5],  (guid)[4], \
 698        (guid)[7],  (guid)[6], \
 699        (guid)[8],  (guid)[9], \
 700        (guid)[10], (guid)[11], (guid)[12], \
 701        (guid)[13], (guid)[14], (guid)[15]
 702
 703/* --------------------------------------------------------------------------
 704 * Internal functions.
 705 */
 706
 707/* Core driver */
 708extern struct uvc_driver uvc_driver;
 709extern void uvc_delete(struct kref *kref);
 710
 711/* Video buffers queue management. */
 712extern void uvc_queue_init(struct uvc_video_queue *queue);
 713extern int uvc_alloc_buffers(struct uvc_video_queue *queue,
 714                unsigned int nbuffers, unsigned int buflength);
 715extern int uvc_free_buffers(struct uvc_video_queue *queue);
 716extern int uvc_query_buffer(struct uvc_video_queue *queue,
 717                struct v4l2_buffer *v4l2_buf);
 718extern int uvc_queue_buffer(struct uvc_video_queue *queue,
 719                struct v4l2_buffer *v4l2_buf);
 720extern int uvc_dequeue_buffer(struct uvc_video_queue *queue,
 721                struct v4l2_buffer *v4l2_buf, int nonblocking);
 722extern int uvc_queue_enable(struct uvc_video_queue *queue, int enable);
 723extern void uvc_queue_cancel(struct uvc_video_queue *queue, int disconnect);
 724extern struct uvc_buffer *uvc_queue_next_buffer(struct uvc_video_queue *queue,
 725                struct uvc_buffer *buf);
 726extern unsigned int uvc_queue_poll(struct uvc_video_queue *queue,
 727                struct file *file, poll_table *wait);
 728static inline int uvc_queue_streaming(struct uvc_video_queue *queue)
 729{
 730        return queue->flags & UVC_QUEUE_STREAMING;
 731}
 732
 733/* V4L2 interface */
 734extern struct file_operations uvc_fops;
 735
 736/* Video */
 737extern int uvc_video_init(struct uvc_video_device *video);
 738extern int uvc_video_suspend(struct uvc_video_device *video);
 739extern int uvc_video_resume(struct uvc_video_device *video);
 740extern int uvc_video_enable(struct uvc_video_device *video, int enable);
 741extern int uvc_probe_video(struct uvc_video_device *video,
 742                struct uvc_streaming_control *probe);
 743extern int uvc_query_ctrl(struct uvc_device *dev, __u8 query, __u8 unit,
 744                __u8 intfnum, __u8 cs, void *data, __u16 size);
 745extern int uvc_set_video_ctrl(struct uvc_video_device *video,
 746                struct uvc_streaming_control *ctrl, int probe);
 747
 748/* Status */
 749extern int uvc_status_init(struct uvc_device *dev);
 750extern void uvc_status_cleanup(struct uvc_device *dev);
 751extern int uvc_status_suspend(struct uvc_device *dev);
 752extern int uvc_status_resume(struct uvc_device *dev);
 753
 754/* Controls */
 755extern struct uvc_control *uvc_find_control(struct uvc_video_device *video,
 756                __u32 v4l2_id, struct uvc_control_mapping **mapping);
 757extern int uvc_query_v4l2_ctrl(struct uvc_video_device *video,
 758                struct v4l2_queryctrl *v4l2_ctrl);
 759
 760extern int uvc_ctrl_add_info(struct uvc_control_info *info);
 761extern int uvc_ctrl_add_mapping(struct uvc_control_mapping *mapping);
 762extern int uvc_ctrl_init_device(struct uvc_device *dev);
 763extern void uvc_ctrl_cleanup_device(struct uvc_device *dev);
 764extern int uvc_ctrl_resume_device(struct uvc_device *dev);
 765extern void uvc_ctrl_init(void);
 766
 767extern int uvc_ctrl_begin(struct uvc_video_device *video);
 768extern int __uvc_ctrl_commit(struct uvc_video_device *video, int rollback);
 769static inline int uvc_ctrl_commit(struct uvc_video_device *video)
 770{
 771        return __uvc_ctrl_commit(video, 0);
 772}
 773static inline int uvc_ctrl_rollback(struct uvc_video_device *video)
 774{
 775        return __uvc_ctrl_commit(video, 1);
 776}
 777
 778extern int uvc_ctrl_get(struct uvc_video_device *video,
 779                struct v4l2_ext_control *xctrl);
 780extern int uvc_ctrl_set(struct uvc_video_device *video,
 781                struct v4l2_ext_control *xctrl);
 782
 783extern int uvc_xu_ctrl_query(struct uvc_video_device *video,
 784                struct uvc_xu_control *ctrl, int set);
 785
 786/* Utility functions */
 787extern void uvc_simplify_fraction(uint32_t *numerator, uint32_t *denominator,
 788                unsigned int n_terms, unsigned int threshold);
 789extern uint32_t uvc_fraction_to_interval(uint32_t numerator,
 790                uint32_t denominator);
 791extern struct usb_host_endpoint *uvc_find_endpoint(
 792                struct usb_host_interface *alts, __u8 epaddr);
 793
 794/* Quirks support */
 795void uvc_video_decode_isight(struct urb *urb, struct uvc_video_device *video,
 796                struct uvc_buffer *buf);
 797
 798#endif /* __KERNEL__ */
 799
 800#endif
 801
 802
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.