1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * USB Video Class definitions. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2009 Laurent Pinchart <laurent.pinchart@skynet.be> 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * This file holds USB constants and structures defined by the USB Device 8*4882a593Smuzhiyun * Class Definition for Video Devices. Unless otherwise stated, comments 9*4882a593Smuzhiyun * below reference relevant sections of the USB Video Class 1.1 specification 10*4882a593Smuzhiyun * available at 11*4882a593Smuzhiyun * 12*4882a593Smuzhiyun * http://www.usb.org/developers/devclass_docs/USB_Video_Class_1_1.zip 13*4882a593Smuzhiyun */ 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #ifndef __LINUX_USB_VIDEO_H 16*4882a593Smuzhiyun #define __LINUX_USB_VIDEO_H 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #include <linux/types.h> 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun /* -------------------------------------------------------------------------- 21*4882a593Smuzhiyun * UVC constants 22*4882a593Smuzhiyun */ 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun /* A.2. Video Interface Subclass Codes */ 25*4882a593Smuzhiyun #define UVC_SC_UNDEFINED 0x00 26*4882a593Smuzhiyun #define UVC_SC_VIDEOCONTROL 0x01 27*4882a593Smuzhiyun #define UVC_SC_VIDEOSTREAMING 0x02 28*4882a593Smuzhiyun #define UVC_SC_VIDEO_INTERFACE_COLLECTION 0x03 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun /* A.3. Video Interface Protocol Codes */ 31*4882a593Smuzhiyun #define UVC_PC_PROTOCOL_UNDEFINED 0x00 32*4882a593Smuzhiyun #define UVC_PC_PROTOCOL_15 0x01 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun /* A.5. Video Class-Specific VC Interface Descriptor Subtypes */ 35*4882a593Smuzhiyun #define UVC_VC_DESCRIPTOR_UNDEFINED 0x00 36*4882a593Smuzhiyun #define UVC_VC_HEADER 0x01 37*4882a593Smuzhiyun #define UVC_VC_INPUT_TERMINAL 0x02 38*4882a593Smuzhiyun #define UVC_VC_OUTPUT_TERMINAL 0x03 39*4882a593Smuzhiyun #define UVC_VC_SELECTOR_UNIT 0x04 40*4882a593Smuzhiyun #define UVC_VC_PROCESSING_UNIT 0x05 41*4882a593Smuzhiyun #define UVC_VC_EXTENSION_UNIT 0x06 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun /* A.6. Video Class-Specific VS Interface Descriptor Subtypes */ 44*4882a593Smuzhiyun #define UVC_VS_UNDEFINED 0x00 45*4882a593Smuzhiyun #define UVC_VS_INPUT_HEADER 0x01 46*4882a593Smuzhiyun #define UVC_VS_OUTPUT_HEADER 0x02 47*4882a593Smuzhiyun #define UVC_VS_STILL_IMAGE_FRAME 0x03 48*4882a593Smuzhiyun #define UVC_VS_FORMAT_UNCOMPRESSED 0x04 49*4882a593Smuzhiyun #define UVC_VS_FRAME_UNCOMPRESSED 0x05 50*4882a593Smuzhiyun #define UVC_VS_FORMAT_MJPEG 0x06 51*4882a593Smuzhiyun #define UVC_VS_FRAME_MJPEG 0x07 52*4882a593Smuzhiyun #define UVC_VS_FORMAT_MPEG2TS 0x0a 53*4882a593Smuzhiyun #define UVC_VS_FORMAT_DV 0x0c 54*4882a593Smuzhiyun #define UVC_VS_COLORFORMAT 0x0d 55*4882a593Smuzhiyun #define UVC_VS_FORMAT_FRAME_BASED 0x10 56*4882a593Smuzhiyun #define UVC_VS_FRAME_FRAME_BASED 0x11 57*4882a593Smuzhiyun #define UVC_VS_FORMAT_STREAM_BASED 0x12 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun /* A.7. Video Class-Specific Endpoint Descriptor Subtypes */ 60*4882a593Smuzhiyun #define UVC_EP_UNDEFINED 0x00 61*4882a593Smuzhiyun #define UVC_EP_GENERAL 0x01 62*4882a593Smuzhiyun #define UVC_EP_ENDPOINT 0x02 63*4882a593Smuzhiyun #define UVC_EP_INTERRUPT 0x03 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun /* A.8. Video Class-Specific Request Codes */ 66*4882a593Smuzhiyun #define UVC_RC_UNDEFINED 0x00 67*4882a593Smuzhiyun #define UVC_SET_CUR 0x01 68*4882a593Smuzhiyun #define UVC_GET_CUR 0x81 69*4882a593Smuzhiyun #define UVC_GET_MIN 0x82 70*4882a593Smuzhiyun #define UVC_GET_MAX 0x83 71*4882a593Smuzhiyun #define UVC_GET_RES 0x84 72*4882a593Smuzhiyun #define UVC_GET_LEN 0x85 73*4882a593Smuzhiyun #define UVC_GET_INFO 0x86 74*4882a593Smuzhiyun #define UVC_GET_DEF 0x87 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun /* A.9.1. VideoControl Interface Control Selectors */ 77*4882a593Smuzhiyun #define UVC_VC_CONTROL_UNDEFINED 0x00 78*4882a593Smuzhiyun #define UVC_VC_VIDEO_POWER_MODE_CONTROL 0x01 79*4882a593Smuzhiyun #define UVC_VC_REQUEST_ERROR_CODE_CONTROL 0x02 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun /* A.9.2. Terminal Control Selectors */ 82*4882a593Smuzhiyun #define UVC_TE_CONTROL_UNDEFINED 0x00 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun /* A.9.3. Selector Unit Control Selectors */ 85*4882a593Smuzhiyun #define UVC_SU_CONTROL_UNDEFINED 0x00 86*4882a593Smuzhiyun #define UVC_SU_INPUT_SELECT_CONTROL 0x01 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun /* A.9.4. Camera Terminal Control Selectors */ 89*4882a593Smuzhiyun #define UVC_CT_CONTROL_UNDEFINED 0x00 90*4882a593Smuzhiyun #define UVC_CT_SCANNING_MODE_CONTROL 0x01 91*4882a593Smuzhiyun #define UVC_CT_AE_MODE_CONTROL 0x02 92*4882a593Smuzhiyun #define UVC_CT_AE_PRIORITY_CONTROL 0x03 93*4882a593Smuzhiyun #define UVC_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x04 94*4882a593Smuzhiyun #define UVC_CT_EXPOSURE_TIME_RELATIVE_CONTROL 0x05 95*4882a593Smuzhiyun #define UVC_CT_FOCUS_ABSOLUTE_CONTROL 0x06 96*4882a593Smuzhiyun #define UVC_CT_FOCUS_RELATIVE_CONTROL 0x07 97*4882a593Smuzhiyun #define UVC_CT_FOCUS_AUTO_CONTROL 0x08 98*4882a593Smuzhiyun #define UVC_CT_IRIS_ABSOLUTE_CONTROL 0x09 99*4882a593Smuzhiyun #define UVC_CT_IRIS_RELATIVE_CONTROL 0x0a 100*4882a593Smuzhiyun #define UVC_CT_ZOOM_ABSOLUTE_CONTROL 0x0b 101*4882a593Smuzhiyun #define UVC_CT_ZOOM_RELATIVE_CONTROL 0x0c 102*4882a593Smuzhiyun #define UVC_CT_PANTILT_ABSOLUTE_CONTROL 0x0d 103*4882a593Smuzhiyun #define UVC_CT_PANTILT_RELATIVE_CONTROL 0x0e 104*4882a593Smuzhiyun #define UVC_CT_ROLL_ABSOLUTE_CONTROL 0x0f 105*4882a593Smuzhiyun #define UVC_CT_ROLL_RELATIVE_CONTROL 0x10 106*4882a593Smuzhiyun #define UVC_CT_PRIVACY_CONTROL 0x11 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun /* A.9.5. Processing Unit Control Selectors */ 109*4882a593Smuzhiyun #define UVC_PU_CONTROL_UNDEFINED 0x00 110*4882a593Smuzhiyun #define UVC_PU_BACKLIGHT_COMPENSATION_CONTROL 0x01 111*4882a593Smuzhiyun #define UVC_PU_BRIGHTNESS_CONTROL 0x02 112*4882a593Smuzhiyun #define UVC_PU_CONTRAST_CONTROL 0x03 113*4882a593Smuzhiyun #define UVC_PU_GAIN_CONTROL 0x04 114*4882a593Smuzhiyun #define UVC_PU_POWER_LINE_FREQUENCY_CONTROL 0x05 115*4882a593Smuzhiyun #define UVC_PU_HUE_CONTROL 0x06 116*4882a593Smuzhiyun #define UVC_PU_SATURATION_CONTROL 0x07 117*4882a593Smuzhiyun #define UVC_PU_SHARPNESS_CONTROL 0x08 118*4882a593Smuzhiyun #define UVC_PU_GAMMA_CONTROL 0x09 119*4882a593Smuzhiyun #define UVC_PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x0a 120*4882a593Smuzhiyun #define UVC_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x0b 121*4882a593Smuzhiyun #define UVC_PU_WHITE_BALANCE_COMPONENT_CONTROL 0x0c 122*4882a593Smuzhiyun #define UVC_PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL 0x0d 123*4882a593Smuzhiyun #define UVC_PU_DIGITAL_MULTIPLIER_CONTROL 0x0e 124*4882a593Smuzhiyun #define UVC_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x0f 125*4882a593Smuzhiyun #define UVC_PU_HUE_AUTO_CONTROL 0x10 126*4882a593Smuzhiyun #define UVC_PU_ANALOG_VIDEO_STANDARD_CONTROL 0x11 127*4882a593Smuzhiyun #define UVC_PU_ANALOG_LOCK_STATUS_CONTROL 0x12 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun /* A.9.7. VideoStreaming Interface Control Selectors */ 130*4882a593Smuzhiyun #define UVC_VS_CONTROL_UNDEFINED 0x00 131*4882a593Smuzhiyun #define UVC_VS_PROBE_CONTROL 0x01 132*4882a593Smuzhiyun #define UVC_VS_COMMIT_CONTROL 0x02 133*4882a593Smuzhiyun #define UVC_VS_STILL_PROBE_CONTROL 0x03 134*4882a593Smuzhiyun #define UVC_VS_STILL_COMMIT_CONTROL 0x04 135*4882a593Smuzhiyun #define UVC_VS_STILL_IMAGE_TRIGGER_CONTROL 0x05 136*4882a593Smuzhiyun #define UVC_VS_STREAM_ERROR_CODE_CONTROL 0x06 137*4882a593Smuzhiyun #define UVC_VS_GENERATE_KEY_FRAME_CONTROL 0x07 138*4882a593Smuzhiyun #define UVC_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x08 139*4882a593Smuzhiyun #define UVC_VS_SYNC_DELAY_CONTROL 0x09 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun /* B.1. USB Terminal Types */ 142*4882a593Smuzhiyun #define UVC_TT_VENDOR_SPECIFIC 0x0100 143*4882a593Smuzhiyun #define UVC_TT_STREAMING 0x0101 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun /* B.2. Input Terminal Types */ 146*4882a593Smuzhiyun #define UVC_ITT_VENDOR_SPECIFIC 0x0200 147*4882a593Smuzhiyun #define UVC_ITT_CAMERA 0x0201 148*4882a593Smuzhiyun #define UVC_ITT_MEDIA_TRANSPORT_INPUT 0x0202 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun /* B.3. Output Terminal Types */ 151*4882a593Smuzhiyun #define UVC_OTT_VENDOR_SPECIFIC 0x0300 152*4882a593Smuzhiyun #define UVC_OTT_DISPLAY 0x0301 153*4882a593Smuzhiyun #define UVC_OTT_MEDIA_TRANSPORT_OUTPUT 0x0302 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun /* B.4. External Terminal Types */ 156*4882a593Smuzhiyun #define UVC_EXTERNAL_VENDOR_SPECIFIC 0x0400 157*4882a593Smuzhiyun #define UVC_COMPOSITE_CONNECTOR 0x0401 158*4882a593Smuzhiyun #define UVC_SVIDEO_CONNECTOR 0x0402 159*4882a593Smuzhiyun #define UVC_COMPONENT_CONNECTOR 0x0403 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun /* 2.4.2.2. Status Packet Type */ 162*4882a593Smuzhiyun #define UVC_STATUS_TYPE_CONTROL 1 163*4882a593Smuzhiyun #define UVC_STATUS_TYPE_STREAMING 2 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun /* 2.4.3.3. Payload Header Information */ 166*4882a593Smuzhiyun #define UVC_STREAM_EOH (1 << 7) 167*4882a593Smuzhiyun #define UVC_STREAM_ERR (1 << 6) 168*4882a593Smuzhiyun #define UVC_STREAM_STI (1 << 5) 169*4882a593Smuzhiyun #define UVC_STREAM_RES (1 << 4) 170*4882a593Smuzhiyun #define UVC_STREAM_SCR (1 << 3) 171*4882a593Smuzhiyun #define UVC_STREAM_PTS (1 << 2) 172*4882a593Smuzhiyun #define UVC_STREAM_EOF (1 << 1) 173*4882a593Smuzhiyun #define UVC_STREAM_FID (1 << 0) 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun /* 4.1.2. Control Capabilities */ 176*4882a593Smuzhiyun #define UVC_CONTROL_CAP_GET (1 << 0) 177*4882a593Smuzhiyun #define UVC_CONTROL_CAP_SET (1 << 1) 178*4882a593Smuzhiyun #define UVC_CONTROL_CAP_DISABLED (1 << 2) 179*4882a593Smuzhiyun #define UVC_CONTROL_CAP_AUTOUPDATE (1 << 3) 180*4882a593Smuzhiyun #define UVC_CONTROL_CAP_ASYNCHRONOUS (1 << 4) 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun /* ------------------------------------------------------------------------ 183*4882a593Smuzhiyun * UVC structures 184*4882a593Smuzhiyun */ 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun /* All UVC descriptors have these 3 fields at the beginning */ 187*4882a593Smuzhiyun struct uvc_descriptor_header { 188*4882a593Smuzhiyun __u8 bLength; 189*4882a593Smuzhiyun __u8 bDescriptorType; 190*4882a593Smuzhiyun __u8 bDescriptorSubType; 191*4882a593Smuzhiyun } __attribute__((packed)); 192*4882a593Smuzhiyun 193*4882a593Smuzhiyun /* 3.7.2. Video Control Interface Header Descriptor */ 194*4882a593Smuzhiyun struct uvc_header_descriptor { 195*4882a593Smuzhiyun __u8 bLength; 196*4882a593Smuzhiyun __u8 bDescriptorType; 197*4882a593Smuzhiyun __u8 bDescriptorSubType; 198*4882a593Smuzhiyun __le16 bcdUVC; 199*4882a593Smuzhiyun __le16 wTotalLength; 200*4882a593Smuzhiyun __le32 dwClockFrequency; 201*4882a593Smuzhiyun __u8 bInCollection; 202*4882a593Smuzhiyun __u8 baInterfaceNr[]; 203*4882a593Smuzhiyun } __attribute__((__packed__)); 204*4882a593Smuzhiyun 205*4882a593Smuzhiyun #define UVC_DT_HEADER_SIZE(n) (12+(n)) 206*4882a593Smuzhiyun 207*4882a593Smuzhiyun #define UVC_HEADER_DESCRIPTOR(n) \ 208*4882a593Smuzhiyun uvc_header_descriptor_##n 209*4882a593Smuzhiyun 210*4882a593Smuzhiyun #define DECLARE_UVC_HEADER_DESCRIPTOR(n) \ 211*4882a593Smuzhiyun struct UVC_HEADER_DESCRIPTOR(n) { \ 212*4882a593Smuzhiyun __u8 bLength; \ 213*4882a593Smuzhiyun __u8 bDescriptorType; \ 214*4882a593Smuzhiyun __u8 bDescriptorSubType; \ 215*4882a593Smuzhiyun __le16 bcdUVC; \ 216*4882a593Smuzhiyun __le16 wTotalLength; \ 217*4882a593Smuzhiyun __le32 dwClockFrequency; \ 218*4882a593Smuzhiyun __u8 bInCollection; \ 219*4882a593Smuzhiyun __u8 baInterfaceNr[n]; \ 220*4882a593Smuzhiyun } __attribute__ ((packed)) 221*4882a593Smuzhiyun 222*4882a593Smuzhiyun /* 3.7.2.1. Input Terminal Descriptor */ 223*4882a593Smuzhiyun struct uvc_input_terminal_descriptor { 224*4882a593Smuzhiyun __u8 bLength; 225*4882a593Smuzhiyun __u8 bDescriptorType; 226*4882a593Smuzhiyun __u8 bDescriptorSubType; 227*4882a593Smuzhiyun __u8 bTerminalID; 228*4882a593Smuzhiyun __le16 wTerminalType; 229*4882a593Smuzhiyun __u8 bAssocTerminal; 230*4882a593Smuzhiyun __u8 iTerminal; 231*4882a593Smuzhiyun } __attribute__((__packed__)); 232*4882a593Smuzhiyun 233*4882a593Smuzhiyun #define UVC_DT_INPUT_TERMINAL_SIZE 8 234*4882a593Smuzhiyun 235*4882a593Smuzhiyun /* 3.7.2.2. Output Terminal Descriptor */ 236*4882a593Smuzhiyun struct uvc_output_terminal_descriptor { 237*4882a593Smuzhiyun __u8 bLength; 238*4882a593Smuzhiyun __u8 bDescriptorType; 239*4882a593Smuzhiyun __u8 bDescriptorSubType; 240*4882a593Smuzhiyun __u8 bTerminalID; 241*4882a593Smuzhiyun __le16 wTerminalType; 242*4882a593Smuzhiyun __u8 bAssocTerminal; 243*4882a593Smuzhiyun __u8 bSourceID; 244*4882a593Smuzhiyun __u8 iTerminal; 245*4882a593Smuzhiyun } __attribute__((__packed__)); 246*4882a593Smuzhiyun 247*4882a593Smuzhiyun #define UVC_DT_OUTPUT_TERMINAL_SIZE 9 248*4882a593Smuzhiyun 249*4882a593Smuzhiyun /* 3.7.2.3. Camera Terminal Descriptor */ 250*4882a593Smuzhiyun struct uvc_camera_terminal_descriptor { 251*4882a593Smuzhiyun __u8 bLength; 252*4882a593Smuzhiyun __u8 bDescriptorType; 253*4882a593Smuzhiyun __u8 bDescriptorSubType; 254*4882a593Smuzhiyun __u8 bTerminalID; 255*4882a593Smuzhiyun __le16 wTerminalType; 256*4882a593Smuzhiyun __u8 bAssocTerminal; 257*4882a593Smuzhiyun __u8 iTerminal; 258*4882a593Smuzhiyun __le16 wObjectiveFocalLengthMin; 259*4882a593Smuzhiyun __le16 wObjectiveFocalLengthMax; 260*4882a593Smuzhiyun __le16 wOcularFocalLength; 261*4882a593Smuzhiyun __u8 bControlSize; 262*4882a593Smuzhiyun __u8 bmControls[3]; 263*4882a593Smuzhiyun } __attribute__((__packed__)); 264*4882a593Smuzhiyun 265*4882a593Smuzhiyun #define UVC_DT_CAMERA_TERMINAL_SIZE(n) (15+(n)) 266*4882a593Smuzhiyun 267*4882a593Smuzhiyun /* 3.7.2.4. Selector Unit Descriptor */ 268*4882a593Smuzhiyun struct uvc_selector_unit_descriptor { 269*4882a593Smuzhiyun __u8 bLength; 270*4882a593Smuzhiyun __u8 bDescriptorType; 271*4882a593Smuzhiyun __u8 bDescriptorSubType; 272*4882a593Smuzhiyun __u8 bUnitID; 273*4882a593Smuzhiyun __u8 bNrInPins; 274*4882a593Smuzhiyun __u8 baSourceID[0]; 275*4882a593Smuzhiyun __u8 iSelector; 276*4882a593Smuzhiyun } __attribute__((__packed__)); 277*4882a593Smuzhiyun 278*4882a593Smuzhiyun #define UVC_DT_SELECTOR_UNIT_SIZE(n) (6+(n)) 279*4882a593Smuzhiyun 280*4882a593Smuzhiyun #define UVC_SELECTOR_UNIT_DESCRIPTOR(n) \ 281*4882a593Smuzhiyun uvc_selector_unit_descriptor_##n 282*4882a593Smuzhiyun 283*4882a593Smuzhiyun #define DECLARE_UVC_SELECTOR_UNIT_DESCRIPTOR(n) \ 284*4882a593Smuzhiyun struct UVC_SELECTOR_UNIT_DESCRIPTOR(n) { \ 285*4882a593Smuzhiyun __u8 bLength; \ 286*4882a593Smuzhiyun __u8 bDescriptorType; \ 287*4882a593Smuzhiyun __u8 bDescriptorSubType; \ 288*4882a593Smuzhiyun __u8 bUnitID; \ 289*4882a593Smuzhiyun __u8 bNrInPins; \ 290*4882a593Smuzhiyun __u8 baSourceID[n]; \ 291*4882a593Smuzhiyun __u8 iSelector; \ 292*4882a593Smuzhiyun } __attribute__ ((packed)) 293*4882a593Smuzhiyun 294*4882a593Smuzhiyun /* 3.7.2.5. Processing Unit Descriptor */ 295*4882a593Smuzhiyun struct uvc_processing_unit_descriptor { 296*4882a593Smuzhiyun __u8 bLength; 297*4882a593Smuzhiyun __u8 bDescriptorType; 298*4882a593Smuzhiyun __u8 bDescriptorSubType; 299*4882a593Smuzhiyun __u8 bUnitID; 300*4882a593Smuzhiyun __u8 bSourceID; 301*4882a593Smuzhiyun __le16 wMaxMultiplier; 302*4882a593Smuzhiyun __u8 bControlSize; 303*4882a593Smuzhiyun __u8 bmControls[2]; 304*4882a593Smuzhiyun __u8 iProcessing; 305*4882a593Smuzhiyun __u8 bmVideoStandards; 306*4882a593Smuzhiyun } __attribute__((__packed__)); 307*4882a593Smuzhiyun 308*4882a593Smuzhiyun #define UVC_DT_PROCESSING_UNIT_SIZE(n) (10+(n)) 309*4882a593Smuzhiyun 310*4882a593Smuzhiyun /* 3.7.2.6. Extension Unit Descriptor */ 311*4882a593Smuzhiyun struct uvc_extension_unit_descriptor { 312*4882a593Smuzhiyun __u8 bLength; 313*4882a593Smuzhiyun __u8 bDescriptorType; 314*4882a593Smuzhiyun __u8 bDescriptorSubType; 315*4882a593Smuzhiyun __u8 bUnitID; 316*4882a593Smuzhiyun __u8 guidExtensionCode[16]; 317*4882a593Smuzhiyun __u8 bNumControls; 318*4882a593Smuzhiyun __u8 bNrInPins; 319*4882a593Smuzhiyun __u8 baSourceID[0]; 320*4882a593Smuzhiyun __u8 bControlSize; 321*4882a593Smuzhiyun __u8 bmControls[0]; 322*4882a593Smuzhiyun __u8 iExtension; 323*4882a593Smuzhiyun } __attribute__((__packed__)); 324*4882a593Smuzhiyun 325*4882a593Smuzhiyun #define UVC_DT_EXTENSION_UNIT_SIZE(p, n) (24+(p)+(n)) 326*4882a593Smuzhiyun 327*4882a593Smuzhiyun #define UVC_EXTENSION_UNIT_DESCRIPTOR(p, n) \ 328*4882a593Smuzhiyun uvc_extension_unit_descriptor_##p_##n 329*4882a593Smuzhiyun 330*4882a593Smuzhiyun #define DECLARE_UVC_EXTENSION_UNIT_DESCRIPTOR(p, n) \ 331*4882a593Smuzhiyun struct UVC_EXTENSION_UNIT_DESCRIPTOR(p, n) { \ 332*4882a593Smuzhiyun __u8 bLength; \ 333*4882a593Smuzhiyun __u8 bDescriptorType; \ 334*4882a593Smuzhiyun __u8 bDescriptorSubType; \ 335*4882a593Smuzhiyun __u8 bUnitID; \ 336*4882a593Smuzhiyun __u8 guidExtensionCode[16]; \ 337*4882a593Smuzhiyun __u8 bNumControls; \ 338*4882a593Smuzhiyun __u8 bNrInPins; \ 339*4882a593Smuzhiyun __u8 baSourceID[p]; \ 340*4882a593Smuzhiyun __u8 bControlSize; \ 341*4882a593Smuzhiyun __u8 bmControls[n]; \ 342*4882a593Smuzhiyun __u8 iExtension; \ 343*4882a593Smuzhiyun } __attribute__ ((packed)) 344*4882a593Smuzhiyun 345*4882a593Smuzhiyun /* 3.8.2.2. Video Control Interrupt Endpoint Descriptor */ 346*4882a593Smuzhiyun struct uvc_control_endpoint_descriptor { 347*4882a593Smuzhiyun __u8 bLength; 348*4882a593Smuzhiyun __u8 bDescriptorType; 349*4882a593Smuzhiyun __u8 bDescriptorSubType; 350*4882a593Smuzhiyun __le16 wMaxTransferSize; 351*4882a593Smuzhiyun } __attribute__((__packed__)); 352*4882a593Smuzhiyun 353*4882a593Smuzhiyun #define UVC_DT_CONTROL_ENDPOINT_SIZE 5 354*4882a593Smuzhiyun 355*4882a593Smuzhiyun /* 3.9.2.1. Input Header Descriptor */ 356*4882a593Smuzhiyun struct uvc_input_header_descriptor { 357*4882a593Smuzhiyun __u8 bLength; 358*4882a593Smuzhiyun __u8 bDescriptorType; 359*4882a593Smuzhiyun __u8 bDescriptorSubType; 360*4882a593Smuzhiyun __u8 bNumFormats; 361*4882a593Smuzhiyun __le16 wTotalLength; 362*4882a593Smuzhiyun __u8 bEndpointAddress; 363*4882a593Smuzhiyun __u8 bmInfo; 364*4882a593Smuzhiyun __u8 bTerminalLink; 365*4882a593Smuzhiyun __u8 bStillCaptureMethod; 366*4882a593Smuzhiyun __u8 bTriggerSupport; 367*4882a593Smuzhiyun __u8 bTriggerUsage; 368*4882a593Smuzhiyun __u8 bControlSize; 369*4882a593Smuzhiyun __u8 bmaControls[]; 370*4882a593Smuzhiyun } __attribute__((__packed__)); 371*4882a593Smuzhiyun 372*4882a593Smuzhiyun #define UVC_DT_INPUT_HEADER_SIZE(n, p) (13+(n*p)) 373*4882a593Smuzhiyun 374*4882a593Smuzhiyun #define UVC_INPUT_HEADER_DESCRIPTOR(n, p) \ 375*4882a593Smuzhiyun uvc_input_header_descriptor_##n_##p 376*4882a593Smuzhiyun 377*4882a593Smuzhiyun #define DECLARE_UVC_INPUT_HEADER_DESCRIPTOR(n, p) \ 378*4882a593Smuzhiyun struct UVC_INPUT_HEADER_DESCRIPTOR(n, p) { \ 379*4882a593Smuzhiyun __u8 bLength; \ 380*4882a593Smuzhiyun __u8 bDescriptorType; \ 381*4882a593Smuzhiyun __u8 bDescriptorSubType; \ 382*4882a593Smuzhiyun __u8 bNumFormats; \ 383*4882a593Smuzhiyun __le16 wTotalLength; \ 384*4882a593Smuzhiyun __u8 bEndpointAddress; \ 385*4882a593Smuzhiyun __u8 bmInfo; \ 386*4882a593Smuzhiyun __u8 bTerminalLink; \ 387*4882a593Smuzhiyun __u8 bStillCaptureMethod; \ 388*4882a593Smuzhiyun __u8 bTriggerSupport; \ 389*4882a593Smuzhiyun __u8 bTriggerUsage; \ 390*4882a593Smuzhiyun __u8 bControlSize; \ 391*4882a593Smuzhiyun __u8 bmaControls[p][n]; \ 392*4882a593Smuzhiyun } __attribute__ ((packed)) 393*4882a593Smuzhiyun 394*4882a593Smuzhiyun /* 3.9.2.2. Output Header Descriptor */ 395*4882a593Smuzhiyun struct uvc_output_header_descriptor { 396*4882a593Smuzhiyun __u8 bLength; 397*4882a593Smuzhiyun __u8 bDescriptorType; 398*4882a593Smuzhiyun __u8 bDescriptorSubType; 399*4882a593Smuzhiyun __u8 bNumFormats; 400*4882a593Smuzhiyun __le16 wTotalLength; 401*4882a593Smuzhiyun __u8 bEndpointAddress; 402*4882a593Smuzhiyun __u8 bTerminalLink; 403*4882a593Smuzhiyun __u8 bControlSize; 404*4882a593Smuzhiyun __u8 bmaControls[]; 405*4882a593Smuzhiyun } __attribute__((__packed__)); 406*4882a593Smuzhiyun 407*4882a593Smuzhiyun #define UVC_DT_OUTPUT_HEADER_SIZE(n, p) (9+(n*p)) 408*4882a593Smuzhiyun 409*4882a593Smuzhiyun #define UVC_OUTPUT_HEADER_DESCRIPTOR(n, p) \ 410*4882a593Smuzhiyun uvc_output_header_descriptor_##n_##p 411*4882a593Smuzhiyun 412*4882a593Smuzhiyun #define DECLARE_UVC_OUTPUT_HEADER_DESCRIPTOR(n, p) \ 413*4882a593Smuzhiyun struct UVC_OUTPUT_HEADER_DESCRIPTOR(n, p) { \ 414*4882a593Smuzhiyun __u8 bLength; \ 415*4882a593Smuzhiyun __u8 bDescriptorType; \ 416*4882a593Smuzhiyun __u8 bDescriptorSubType; \ 417*4882a593Smuzhiyun __u8 bNumFormats; \ 418*4882a593Smuzhiyun __le16 wTotalLength; \ 419*4882a593Smuzhiyun __u8 bEndpointAddress; \ 420*4882a593Smuzhiyun __u8 bTerminalLink; \ 421*4882a593Smuzhiyun __u8 bControlSize; \ 422*4882a593Smuzhiyun __u8 bmaControls[p][n]; \ 423*4882a593Smuzhiyun } __attribute__ ((packed)) 424*4882a593Smuzhiyun 425*4882a593Smuzhiyun /* 3.9.2.6. Color matching descriptor */ 426*4882a593Smuzhiyun struct uvc_color_matching_descriptor { 427*4882a593Smuzhiyun __u8 bLength; 428*4882a593Smuzhiyun __u8 bDescriptorType; 429*4882a593Smuzhiyun __u8 bDescriptorSubType; 430*4882a593Smuzhiyun __u8 bColorPrimaries; 431*4882a593Smuzhiyun __u8 bTransferCharacteristics; 432*4882a593Smuzhiyun __u8 bMatrixCoefficients; 433*4882a593Smuzhiyun } __attribute__((__packed__)); 434*4882a593Smuzhiyun 435*4882a593Smuzhiyun #define UVC_DT_COLOR_MATCHING_SIZE 6 436*4882a593Smuzhiyun 437*4882a593Smuzhiyun /* 4.3.1.1. Video Probe and Commit Controls */ 438*4882a593Smuzhiyun struct uvc_streaming_control { 439*4882a593Smuzhiyun __u16 bmHint; 440*4882a593Smuzhiyun __u8 bFormatIndex; 441*4882a593Smuzhiyun __u8 bFrameIndex; 442*4882a593Smuzhiyun __u32 dwFrameInterval; 443*4882a593Smuzhiyun __u16 wKeyFrameRate; 444*4882a593Smuzhiyun __u16 wPFrameRate; 445*4882a593Smuzhiyun __u16 wCompQuality; 446*4882a593Smuzhiyun __u16 wCompWindowSize; 447*4882a593Smuzhiyun __u16 wDelay; 448*4882a593Smuzhiyun __u32 dwMaxVideoFrameSize; 449*4882a593Smuzhiyun __u32 dwMaxPayloadTransferSize; 450*4882a593Smuzhiyun __u32 dwClockFrequency; 451*4882a593Smuzhiyun __u8 bmFramingInfo; 452*4882a593Smuzhiyun __u8 bPreferedVersion; 453*4882a593Smuzhiyun __u8 bMinVersion; 454*4882a593Smuzhiyun __u8 bMaxVersion; 455*4882a593Smuzhiyun } __attribute__((__packed__)); 456*4882a593Smuzhiyun 457*4882a593Smuzhiyun /* Uncompressed Payload - 3.1.1. Uncompressed Video Format Descriptor */ 458*4882a593Smuzhiyun struct uvc_format_uncompressed { 459*4882a593Smuzhiyun __u8 bLength; 460*4882a593Smuzhiyun __u8 bDescriptorType; 461*4882a593Smuzhiyun __u8 bDescriptorSubType; 462*4882a593Smuzhiyun __u8 bFormatIndex; 463*4882a593Smuzhiyun __u8 bNumFrameDescriptors; 464*4882a593Smuzhiyun __u8 guidFormat[16]; 465*4882a593Smuzhiyun __u8 bBitsPerPixel; 466*4882a593Smuzhiyun __u8 bDefaultFrameIndex; 467*4882a593Smuzhiyun __u8 bAspectRatioX; 468*4882a593Smuzhiyun __u8 bAspectRatioY; 469*4882a593Smuzhiyun __u8 bmInterfaceFlags; 470*4882a593Smuzhiyun __u8 bCopyProtect; 471*4882a593Smuzhiyun } __attribute__((__packed__)); 472*4882a593Smuzhiyun 473*4882a593Smuzhiyun #define UVC_DT_FORMAT_UNCOMPRESSED_SIZE 27 474*4882a593Smuzhiyun 475*4882a593Smuzhiyun /* Uncompressed Payload - 3.1.2. Uncompressed Video Frame Descriptor */ 476*4882a593Smuzhiyun struct uvc_frame_uncompressed { 477*4882a593Smuzhiyun __u8 bLength; 478*4882a593Smuzhiyun __u8 bDescriptorType; 479*4882a593Smuzhiyun __u8 bDescriptorSubType; 480*4882a593Smuzhiyun __u8 bFrameIndex; 481*4882a593Smuzhiyun __u8 bmCapabilities; 482*4882a593Smuzhiyun __le16 wWidth; 483*4882a593Smuzhiyun __le16 wHeight; 484*4882a593Smuzhiyun __le32 dwMinBitRate; 485*4882a593Smuzhiyun __le32 dwMaxBitRate; 486*4882a593Smuzhiyun __le32 dwMaxVideoFrameBufferSize; 487*4882a593Smuzhiyun __le32 dwDefaultFrameInterval; 488*4882a593Smuzhiyun __u8 bFrameIntervalType; 489*4882a593Smuzhiyun __le32 dwFrameInterval[]; 490*4882a593Smuzhiyun } __attribute__((__packed__)); 491*4882a593Smuzhiyun 492*4882a593Smuzhiyun #define UVC_DT_FRAME_UNCOMPRESSED_SIZE(n) (26+4*(n)) 493*4882a593Smuzhiyun 494*4882a593Smuzhiyun #define UVC_FRAME_UNCOMPRESSED(n) \ 495*4882a593Smuzhiyun uvc_frame_uncompressed_##n 496*4882a593Smuzhiyun 497*4882a593Smuzhiyun #define DECLARE_UVC_FRAME_UNCOMPRESSED(n) \ 498*4882a593Smuzhiyun struct UVC_FRAME_UNCOMPRESSED(n) { \ 499*4882a593Smuzhiyun __u8 bLength; \ 500*4882a593Smuzhiyun __u8 bDescriptorType; \ 501*4882a593Smuzhiyun __u8 bDescriptorSubType; \ 502*4882a593Smuzhiyun __u8 bFrameIndex; \ 503*4882a593Smuzhiyun __u8 bmCapabilities; \ 504*4882a593Smuzhiyun __le16 wWidth; \ 505*4882a593Smuzhiyun __le16 wHeight; \ 506*4882a593Smuzhiyun __le32 dwMinBitRate; \ 507*4882a593Smuzhiyun __le32 dwMaxBitRate; \ 508*4882a593Smuzhiyun __le32 dwMaxVideoFrameBufferSize; \ 509*4882a593Smuzhiyun __le32 dwDefaultFrameInterval; \ 510*4882a593Smuzhiyun __u8 bFrameIntervalType; \ 511*4882a593Smuzhiyun __le32 dwFrameInterval[n]; \ 512*4882a593Smuzhiyun } __attribute__ ((packed)) 513*4882a593Smuzhiyun 514*4882a593Smuzhiyun /* MJPEG Payload - 3.1.1. MJPEG Video Format Descriptor */ 515*4882a593Smuzhiyun struct uvc_format_mjpeg { 516*4882a593Smuzhiyun __u8 bLength; 517*4882a593Smuzhiyun __u8 bDescriptorType; 518*4882a593Smuzhiyun __u8 bDescriptorSubType; 519*4882a593Smuzhiyun __u8 bFormatIndex; 520*4882a593Smuzhiyun __u8 bNumFrameDescriptors; 521*4882a593Smuzhiyun __u8 bmFlags; 522*4882a593Smuzhiyun __u8 bDefaultFrameIndex; 523*4882a593Smuzhiyun __u8 bAspectRatioX; 524*4882a593Smuzhiyun __u8 bAspectRatioY; 525*4882a593Smuzhiyun __u8 bmInterfaceFlags; 526*4882a593Smuzhiyun __u8 bCopyProtect; 527*4882a593Smuzhiyun } __attribute__((__packed__)); 528*4882a593Smuzhiyun 529*4882a593Smuzhiyun #define UVC_DT_FORMAT_MJPEG_SIZE 11 530*4882a593Smuzhiyun 531*4882a593Smuzhiyun /* MJPEG Payload - 3.1.2. MJPEG Video Frame Descriptor */ 532*4882a593Smuzhiyun struct uvc_frame_mjpeg { 533*4882a593Smuzhiyun __u8 bLength; 534*4882a593Smuzhiyun __u8 bDescriptorType; 535*4882a593Smuzhiyun __u8 bDescriptorSubType; 536*4882a593Smuzhiyun __u8 bFrameIndex; 537*4882a593Smuzhiyun __u8 bmCapabilities; 538*4882a593Smuzhiyun __le16 wWidth; 539*4882a593Smuzhiyun __le16 wHeight; 540*4882a593Smuzhiyun __le32 dwMinBitRate; 541*4882a593Smuzhiyun __le32 dwMaxBitRate; 542*4882a593Smuzhiyun __le32 dwMaxVideoFrameBufferSize; 543*4882a593Smuzhiyun __le32 dwDefaultFrameInterval; 544*4882a593Smuzhiyun __u8 bFrameIntervalType; 545*4882a593Smuzhiyun __le32 dwFrameInterval[]; 546*4882a593Smuzhiyun } __attribute__((__packed__)); 547*4882a593Smuzhiyun 548*4882a593Smuzhiyun #define UVC_DT_FRAME_MJPEG_SIZE(n) (26+4*(n)) 549*4882a593Smuzhiyun 550*4882a593Smuzhiyun #define UVC_FRAME_MJPEG(n) \ 551*4882a593Smuzhiyun uvc_frame_mjpeg_##n 552*4882a593Smuzhiyun 553*4882a593Smuzhiyun #define DECLARE_UVC_FRAME_MJPEG(n) \ 554*4882a593Smuzhiyun struct UVC_FRAME_MJPEG(n) { \ 555*4882a593Smuzhiyun __u8 bLength; \ 556*4882a593Smuzhiyun __u8 bDescriptorType; \ 557*4882a593Smuzhiyun __u8 bDescriptorSubType; \ 558*4882a593Smuzhiyun __u8 bFrameIndex; \ 559*4882a593Smuzhiyun __u8 bmCapabilities; \ 560*4882a593Smuzhiyun __le16 wWidth; \ 561*4882a593Smuzhiyun __le16 wHeight; \ 562*4882a593Smuzhiyun __le32 dwMinBitRate; \ 563*4882a593Smuzhiyun __le32 dwMaxBitRate; \ 564*4882a593Smuzhiyun __le32 dwMaxVideoFrameBufferSize; \ 565*4882a593Smuzhiyun __le32 dwDefaultFrameInterval; \ 566*4882a593Smuzhiyun __u8 bFrameIntervalType; \ 567*4882a593Smuzhiyun __le32 dwFrameInterval[n]; \ 568*4882a593Smuzhiyun } __attribute__ ((packed)) 569*4882a593Smuzhiyun 570*4882a593Smuzhiyun /* Frame Based Payload - 3.1.1. Frame Based Video Format Descriptor */ 571*4882a593Smuzhiyun struct uvc_format_framebased { 572*4882a593Smuzhiyun __u8 bLength; 573*4882a593Smuzhiyun __u8 bDescriptorType; 574*4882a593Smuzhiyun __u8 bDescriptorSubType; 575*4882a593Smuzhiyun __u8 bFormatIndex; 576*4882a593Smuzhiyun __u8 bNumFrameDescriptors; 577*4882a593Smuzhiyun __u8 guidFormat[16]; 578*4882a593Smuzhiyun __u8 bBitsPerPixel; 579*4882a593Smuzhiyun __u8 bDefaultFrameIndex; 580*4882a593Smuzhiyun __u8 bAspectRatioX; 581*4882a593Smuzhiyun __u8 bAspectRatioY; 582*4882a593Smuzhiyun __u8 bmInterfaceFlags; 583*4882a593Smuzhiyun __u8 bCopyProtect; 584*4882a593Smuzhiyun __u8 bVariableSize; 585*4882a593Smuzhiyun } __attribute__((__packed__)); 586*4882a593Smuzhiyun 587*4882a593Smuzhiyun #define UVC_DT_FORMAT_FRAMEBASED_SIZE 28 588*4882a593Smuzhiyun 589*4882a593Smuzhiyun /* Frame Based Payload - 3.1.2. Frame Based Video Frame Descriptor */ 590*4882a593Smuzhiyun struct uvc_frame_framebased { 591*4882a593Smuzhiyun __u8 bLength; 592*4882a593Smuzhiyun __u8 bDescriptorType; 593*4882a593Smuzhiyun __u8 bDescriptorSubType; 594*4882a593Smuzhiyun __u8 bFrameIndex; 595*4882a593Smuzhiyun __u8 bmCapabilities; 596*4882a593Smuzhiyun __u16 wWidth; 597*4882a593Smuzhiyun __u16 wHeight; 598*4882a593Smuzhiyun __u32 dwMinBitRate; 599*4882a593Smuzhiyun __u32 dwMaxBitRate; 600*4882a593Smuzhiyun __u32 dwDefaultFrameInterval; 601*4882a593Smuzhiyun __u8 bFrameIntervalType; 602*4882a593Smuzhiyun __u32 dwBytesPerLine; 603*4882a593Smuzhiyun __u32 dwFrameInterval[]; 604*4882a593Smuzhiyun } __attribute__((__packed__)); 605*4882a593Smuzhiyun 606*4882a593Smuzhiyun #define UVC_DT_FRAME_FRAMEBASED_SIZE(n) (26+4*(n)) 607*4882a593Smuzhiyun 608*4882a593Smuzhiyun #define UVC_FRAME_FRAMEBASED(n) \ 609*4882a593Smuzhiyun uvc_frame_framebased_##n 610*4882a593Smuzhiyun 611*4882a593Smuzhiyun #define DECLARE_UVC_FRAME_FRAMEBASED(n) \ 612*4882a593Smuzhiyun struct UVC_FRAME_FRAMEBASED(n) { \ 613*4882a593Smuzhiyun __u8 bLength; \ 614*4882a593Smuzhiyun __u8 bDescriptorType; \ 615*4882a593Smuzhiyun __u8 bDescriptorSubType; \ 616*4882a593Smuzhiyun __u8 bFrameIndex; \ 617*4882a593Smuzhiyun __u8 bmCapabilities; \ 618*4882a593Smuzhiyun __u16 wWidth; \ 619*4882a593Smuzhiyun __u16 wHeight; \ 620*4882a593Smuzhiyun __u32 dwMinBitRate; \ 621*4882a593Smuzhiyun __u32 dwMaxBitRate; \ 622*4882a593Smuzhiyun __u32 dwDefaultFrameInterval; \ 623*4882a593Smuzhiyun __u8 bFrameIntervalType; \ 624*4882a593Smuzhiyun __u32 dwBytesPerLine; \ 625*4882a593Smuzhiyun __u32 dwFrameInterval[n]; \ 626*4882a593Smuzhiyun } __attribute__ ((packed)) 627*4882a593Smuzhiyun 628*4882a593Smuzhiyun #endif /* __LINUX_USB_VIDEO_H */ 629*4882a593Smuzhiyun 630