16f52b16cSGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 25e1ddb48SDavid Howells /* 35e1ddb48SDavid Howells * USB Video Class definitions. 45e1ddb48SDavid Howells * 55e1ddb48SDavid Howells * Copyright (C) 2009 Laurent Pinchart <laurent.pinchart@skynet.be> 65e1ddb48SDavid Howells * 75e1ddb48SDavid Howells * This file holds USB constants and structures defined by the USB Device 85e1ddb48SDavid Howells * Class Definition for Video Devices. Unless otherwise stated, comments 95e1ddb48SDavid Howells * below reference relevant sections of the USB Video Class 1.1 specification 105e1ddb48SDavid Howells * available at 115e1ddb48SDavid Howells * 125e1ddb48SDavid Howells * http://www.usb.org/developers/devclass_docs/USB_Video_Class_1_1.zip 135e1ddb48SDavid Howells */ 145e1ddb48SDavid Howells 155e1ddb48SDavid Howells #ifndef __LINUX_USB_VIDEO_H 165e1ddb48SDavid Howells #define __LINUX_USB_VIDEO_H 175e1ddb48SDavid Howells 185e1ddb48SDavid Howells #include <linux/types.h> 195e1ddb48SDavid Howells 205e1ddb48SDavid Howells /* -------------------------------------------------------------------------- 215e1ddb48SDavid Howells * UVC constants 225e1ddb48SDavid Howells */ 235e1ddb48SDavid Howells 245e1ddb48SDavid Howells /* A.2. Video Interface Subclass Codes */ 255e1ddb48SDavid Howells #define UVC_SC_UNDEFINED 0x00 265e1ddb48SDavid Howells #define UVC_SC_VIDEOCONTROL 0x01 275e1ddb48SDavid Howells #define UVC_SC_VIDEOSTREAMING 0x02 285e1ddb48SDavid Howells #define UVC_SC_VIDEO_INTERFACE_COLLECTION 0x03 295e1ddb48SDavid Howells 305e1ddb48SDavid Howells /* A.3. Video Interface Protocol Codes */ 315e1ddb48SDavid Howells #define UVC_PC_PROTOCOL_UNDEFINED 0x00 328afe97beSLaurent Pinchart #define UVC_PC_PROTOCOL_15 0x01 335e1ddb48SDavid Howells 345e1ddb48SDavid Howells /* A.5. Video Class-Specific VC Interface Descriptor Subtypes */ 355e1ddb48SDavid Howells #define UVC_VC_DESCRIPTOR_UNDEFINED 0x00 365e1ddb48SDavid Howells #define UVC_VC_HEADER 0x01 375e1ddb48SDavid Howells #define UVC_VC_INPUT_TERMINAL 0x02 385e1ddb48SDavid Howells #define UVC_VC_OUTPUT_TERMINAL 0x03 395e1ddb48SDavid Howells #define UVC_VC_SELECTOR_UNIT 0x04 405e1ddb48SDavid Howells #define UVC_VC_PROCESSING_UNIT 0x05 415e1ddb48SDavid Howells #define UVC_VC_EXTENSION_UNIT 0x06 425e1ddb48SDavid Howells 435e1ddb48SDavid Howells /* A.6. Video Class-Specific VS Interface Descriptor Subtypes */ 445e1ddb48SDavid Howells #define UVC_VS_UNDEFINED 0x00 455e1ddb48SDavid Howells #define UVC_VS_INPUT_HEADER 0x01 465e1ddb48SDavid Howells #define UVC_VS_OUTPUT_HEADER 0x02 475e1ddb48SDavid Howells #define UVC_VS_STILL_IMAGE_FRAME 0x03 485e1ddb48SDavid Howells #define UVC_VS_FORMAT_UNCOMPRESSED 0x04 495e1ddb48SDavid Howells #define UVC_VS_FRAME_UNCOMPRESSED 0x05 505e1ddb48SDavid Howells #define UVC_VS_FORMAT_MJPEG 0x06 515e1ddb48SDavid Howells #define UVC_VS_FRAME_MJPEG 0x07 525e1ddb48SDavid Howells #define UVC_VS_FORMAT_MPEG2TS 0x0a 535e1ddb48SDavid Howells #define UVC_VS_FORMAT_DV 0x0c 545e1ddb48SDavid Howells #define UVC_VS_COLORFORMAT 0x0d 555e1ddb48SDavid Howells #define UVC_VS_FORMAT_FRAME_BASED 0x10 565e1ddb48SDavid Howells #define UVC_VS_FRAME_FRAME_BASED 0x11 575e1ddb48SDavid Howells #define UVC_VS_FORMAT_STREAM_BASED 0x12 585e1ddb48SDavid Howells 595e1ddb48SDavid Howells /* A.7. Video Class-Specific Endpoint Descriptor Subtypes */ 605e1ddb48SDavid Howells #define UVC_EP_UNDEFINED 0x00 615e1ddb48SDavid Howells #define UVC_EP_GENERAL 0x01 625e1ddb48SDavid Howells #define UVC_EP_ENDPOINT 0x02 635e1ddb48SDavid Howells #define UVC_EP_INTERRUPT 0x03 645e1ddb48SDavid Howells 655e1ddb48SDavid Howells /* A.8. Video Class-Specific Request Codes */ 665e1ddb48SDavid Howells #define UVC_RC_UNDEFINED 0x00 675e1ddb48SDavid Howells #define UVC_SET_CUR 0x01 685e1ddb48SDavid Howells #define UVC_GET_CUR 0x81 695e1ddb48SDavid Howells #define UVC_GET_MIN 0x82 705e1ddb48SDavid Howells #define UVC_GET_MAX 0x83 715e1ddb48SDavid Howells #define UVC_GET_RES 0x84 725e1ddb48SDavid Howells #define UVC_GET_LEN 0x85 735e1ddb48SDavid Howells #define UVC_GET_INFO 0x86 745e1ddb48SDavid Howells #define UVC_GET_DEF 0x87 755e1ddb48SDavid Howells 765e1ddb48SDavid Howells /* A.9.1. VideoControl Interface Control Selectors */ 775e1ddb48SDavid Howells #define UVC_VC_CONTROL_UNDEFINED 0x00 785e1ddb48SDavid Howells #define UVC_VC_VIDEO_POWER_MODE_CONTROL 0x01 795e1ddb48SDavid Howells #define UVC_VC_REQUEST_ERROR_CODE_CONTROL 0x02 805e1ddb48SDavid Howells 815e1ddb48SDavid Howells /* A.9.2. Terminal Control Selectors */ 825e1ddb48SDavid Howells #define UVC_TE_CONTROL_UNDEFINED 0x00 835e1ddb48SDavid Howells 845e1ddb48SDavid Howells /* A.9.3. Selector Unit Control Selectors */ 855e1ddb48SDavid Howells #define UVC_SU_CONTROL_UNDEFINED 0x00 865e1ddb48SDavid Howells #define UVC_SU_INPUT_SELECT_CONTROL 0x01 875e1ddb48SDavid Howells 885e1ddb48SDavid Howells /* A.9.4. Camera Terminal Control Selectors */ 895e1ddb48SDavid Howells #define UVC_CT_CONTROL_UNDEFINED 0x00 905e1ddb48SDavid Howells #define UVC_CT_SCANNING_MODE_CONTROL 0x01 915e1ddb48SDavid Howells #define UVC_CT_AE_MODE_CONTROL 0x02 925e1ddb48SDavid Howells #define UVC_CT_AE_PRIORITY_CONTROL 0x03 935e1ddb48SDavid Howells #define UVC_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x04 945e1ddb48SDavid Howells #define UVC_CT_EXPOSURE_TIME_RELATIVE_CONTROL 0x05 955e1ddb48SDavid Howells #define UVC_CT_FOCUS_ABSOLUTE_CONTROL 0x06 965e1ddb48SDavid Howells #define UVC_CT_FOCUS_RELATIVE_CONTROL 0x07 975e1ddb48SDavid Howells #define UVC_CT_FOCUS_AUTO_CONTROL 0x08 985e1ddb48SDavid Howells #define UVC_CT_IRIS_ABSOLUTE_CONTROL 0x09 995e1ddb48SDavid Howells #define UVC_CT_IRIS_RELATIVE_CONTROL 0x0a 1005e1ddb48SDavid Howells #define UVC_CT_ZOOM_ABSOLUTE_CONTROL 0x0b 1015e1ddb48SDavid Howells #define UVC_CT_ZOOM_RELATIVE_CONTROL 0x0c 1025e1ddb48SDavid Howells #define UVC_CT_PANTILT_ABSOLUTE_CONTROL 0x0d 1035e1ddb48SDavid Howells #define UVC_CT_PANTILT_RELATIVE_CONTROL 0x0e 1045e1ddb48SDavid Howells #define UVC_CT_ROLL_ABSOLUTE_CONTROL 0x0f 1055e1ddb48SDavid Howells #define UVC_CT_ROLL_RELATIVE_CONTROL 0x10 1065e1ddb48SDavid Howells #define UVC_CT_PRIVACY_CONTROL 0x11 1075e1ddb48SDavid Howells 1085e1ddb48SDavid Howells /* A.9.5. Processing Unit Control Selectors */ 1095e1ddb48SDavid Howells #define UVC_PU_CONTROL_UNDEFINED 0x00 1105e1ddb48SDavid Howells #define UVC_PU_BACKLIGHT_COMPENSATION_CONTROL 0x01 1115e1ddb48SDavid Howells #define UVC_PU_BRIGHTNESS_CONTROL 0x02 1125e1ddb48SDavid Howells #define UVC_PU_CONTRAST_CONTROL 0x03 1135e1ddb48SDavid Howells #define UVC_PU_GAIN_CONTROL 0x04 1145e1ddb48SDavid Howells #define UVC_PU_POWER_LINE_FREQUENCY_CONTROL 0x05 1155e1ddb48SDavid Howells #define UVC_PU_HUE_CONTROL 0x06 1165e1ddb48SDavid Howells #define UVC_PU_SATURATION_CONTROL 0x07 1175e1ddb48SDavid Howells #define UVC_PU_SHARPNESS_CONTROL 0x08 1185e1ddb48SDavid Howells #define UVC_PU_GAMMA_CONTROL 0x09 1195e1ddb48SDavid Howells #define UVC_PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x0a 1205e1ddb48SDavid Howells #define UVC_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x0b 1215e1ddb48SDavid Howells #define UVC_PU_WHITE_BALANCE_COMPONENT_CONTROL 0x0c 1225e1ddb48SDavid Howells #define UVC_PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL 0x0d 1235e1ddb48SDavid Howells #define UVC_PU_DIGITAL_MULTIPLIER_CONTROL 0x0e 1245e1ddb48SDavid Howells #define UVC_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x0f 1255e1ddb48SDavid Howells #define UVC_PU_HUE_AUTO_CONTROL 0x10 1265e1ddb48SDavid Howells #define UVC_PU_ANALOG_VIDEO_STANDARD_CONTROL 0x11 1275e1ddb48SDavid Howells #define UVC_PU_ANALOG_LOCK_STATUS_CONTROL 0x12 1285e1ddb48SDavid Howells 1295e1ddb48SDavid Howells /* A.9.7. VideoStreaming Interface Control Selectors */ 1305e1ddb48SDavid Howells #define UVC_VS_CONTROL_UNDEFINED 0x00 1315e1ddb48SDavid Howells #define UVC_VS_PROBE_CONTROL 0x01 1325e1ddb48SDavid Howells #define UVC_VS_COMMIT_CONTROL 0x02 1335e1ddb48SDavid Howells #define UVC_VS_STILL_PROBE_CONTROL 0x03 1345e1ddb48SDavid Howells #define UVC_VS_STILL_COMMIT_CONTROL 0x04 1355e1ddb48SDavid Howells #define UVC_VS_STILL_IMAGE_TRIGGER_CONTROL 0x05 1365e1ddb48SDavid Howells #define UVC_VS_STREAM_ERROR_CODE_CONTROL 0x06 1375e1ddb48SDavid Howells #define UVC_VS_GENERATE_KEY_FRAME_CONTROL 0x07 1385e1ddb48SDavid Howells #define UVC_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x08 1395e1ddb48SDavid Howells #define UVC_VS_SYNC_DELAY_CONTROL 0x09 1405e1ddb48SDavid Howells 1415e1ddb48SDavid Howells /* B.1. USB Terminal Types */ 1425e1ddb48SDavid Howells #define UVC_TT_VENDOR_SPECIFIC 0x0100 1435e1ddb48SDavid Howells #define UVC_TT_STREAMING 0x0101 1445e1ddb48SDavid Howells 1455e1ddb48SDavid Howells /* B.2. Input Terminal Types */ 1465e1ddb48SDavid Howells #define UVC_ITT_VENDOR_SPECIFIC 0x0200 1475e1ddb48SDavid Howells #define UVC_ITT_CAMERA 0x0201 1485e1ddb48SDavid Howells #define UVC_ITT_MEDIA_TRANSPORT_INPUT 0x0202 1495e1ddb48SDavid Howells 1505e1ddb48SDavid Howells /* B.3. Output Terminal Types */ 1515e1ddb48SDavid Howells #define UVC_OTT_VENDOR_SPECIFIC 0x0300 1525e1ddb48SDavid Howells #define UVC_OTT_DISPLAY 0x0301 1535e1ddb48SDavid Howells #define UVC_OTT_MEDIA_TRANSPORT_OUTPUT 0x0302 1545e1ddb48SDavid Howells 1555e1ddb48SDavid Howells /* B.4. External Terminal Types */ 1565e1ddb48SDavid Howells #define UVC_EXTERNAL_VENDOR_SPECIFIC 0x0400 1575e1ddb48SDavid Howells #define UVC_COMPOSITE_CONNECTOR 0x0401 1585e1ddb48SDavid Howells #define UVC_SVIDEO_CONNECTOR 0x0402 1595e1ddb48SDavid Howells #define UVC_COMPONENT_CONNECTOR 0x0403 1605e1ddb48SDavid Howells 1615e1ddb48SDavid Howells /* 2.4.2.2. Status Packet Type */ 1625e1ddb48SDavid Howells #define UVC_STATUS_TYPE_CONTROL 1 1635e1ddb48SDavid Howells #define UVC_STATUS_TYPE_STREAMING 2 1645e1ddb48SDavid Howells 1655e1ddb48SDavid Howells /* 2.4.3.3. Payload Header Information */ 1665e1ddb48SDavid Howells #define UVC_STREAM_EOH (1 << 7) 1675e1ddb48SDavid Howells #define UVC_STREAM_ERR (1 << 6) 1685e1ddb48SDavid Howells #define UVC_STREAM_STI (1 << 5) 1695e1ddb48SDavid Howells #define UVC_STREAM_RES (1 << 4) 1705e1ddb48SDavid Howells #define UVC_STREAM_SCR (1 << 3) 1715e1ddb48SDavid Howells #define UVC_STREAM_PTS (1 << 2) 1725e1ddb48SDavid Howells #define UVC_STREAM_EOF (1 << 1) 1735e1ddb48SDavid Howells #define UVC_STREAM_FID (1 << 0) 1745e1ddb48SDavid Howells 1755e1ddb48SDavid Howells /* 4.1.2. Control Capabilities */ 1765e1ddb48SDavid Howells #define UVC_CONTROL_CAP_GET (1 << 0) 1775e1ddb48SDavid Howells #define UVC_CONTROL_CAP_SET (1 << 1) 1785e1ddb48SDavid Howells #define UVC_CONTROL_CAP_DISABLED (1 << 2) 1795e1ddb48SDavid Howells #define UVC_CONTROL_CAP_AUTOUPDATE (1 << 3) 1805e1ddb48SDavid Howells #define UVC_CONTROL_CAP_ASYNCHRONOUS (1 << 4) 1815e1ddb48SDavid Howells 182*e16cab9cSDaniel Scally /* 3.9.2.6 Color Matching Descriptor Values */ 183*e16cab9cSDaniel Scally enum uvc_color_primaries_values { 184*e16cab9cSDaniel Scally UVC_COLOR_PRIMARIES_UNSPECIFIED, 185*e16cab9cSDaniel Scally UVC_COLOR_PRIMARIES_BT_709_SRGB, 186*e16cab9cSDaniel Scally UVC_COLOR_PRIMARIES_BT_470_2_M, 187*e16cab9cSDaniel Scally UVC_COLOR_PRIMARIES_BT_470_2_B_G, 188*e16cab9cSDaniel Scally UVC_COLOR_PRIMARIES_SMPTE_170M, 189*e16cab9cSDaniel Scally UVC_COLOR_PRIMARIES_SMPTE_240M, 190*e16cab9cSDaniel Scally }; 191*e16cab9cSDaniel Scally 192*e16cab9cSDaniel Scally enum uvc_transfer_characteristics_values { 193*e16cab9cSDaniel Scally UVC_TRANSFER_CHARACTERISTICS_UNSPECIFIED, 194*e16cab9cSDaniel Scally UVC_TRANSFER_CHARACTERISTICS_BT_709, 195*e16cab9cSDaniel Scally UVC_TRANSFER_CHARACTERISTICS_BT_470_2_M, 196*e16cab9cSDaniel Scally UVC_TRANSFER_CHARACTERISTICS_BT_470_2_B_G, 197*e16cab9cSDaniel Scally UVC_TRANSFER_CHARACTERISTICS_SMPTE_170M, 198*e16cab9cSDaniel Scally UVC_TRANSFER_CHARACTERISTICS_SMPTE_240M, 199*e16cab9cSDaniel Scally UVC_TRANSFER_CHARACTERISTICS_LINEAR, 200*e16cab9cSDaniel Scally UVC_TRANSFER_CHARACTERISTICS_SRGB, 201*e16cab9cSDaniel Scally }; 202*e16cab9cSDaniel Scally 203*e16cab9cSDaniel Scally enum uvc_matrix_coefficients { 204*e16cab9cSDaniel Scally UVC_MATRIX_COEFFICIENTS_UNSPECIFIED, 205*e16cab9cSDaniel Scally UVC_MATRIX_COEFFICIENTS_BT_709, 206*e16cab9cSDaniel Scally UVC_MATRIX_COEFFICIENTS_FCC, 207*e16cab9cSDaniel Scally UVC_MATRIX_COEFFICIENTS_BT_470_2_B_G, 208*e16cab9cSDaniel Scally UVC_MATRIX_COEFFICIENTS_SMPTE_170M, 209*e16cab9cSDaniel Scally UVC_MATRIX_COEFFICIENTS_SMPTE_240M, 210*e16cab9cSDaniel Scally }; 211*e16cab9cSDaniel Scally 2125e1ddb48SDavid Howells /* ------------------------------------------------------------------------ 2135e1ddb48SDavid Howells * UVC structures 2145e1ddb48SDavid Howells */ 2155e1ddb48SDavid Howells 2165e1ddb48SDavid Howells /* All UVC descriptors have these 3 fields at the beginning */ 2175e1ddb48SDavid Howells struct uvc_descriptor_header { 2185e1ddb48SDavid Howells __u8 bLength; 2195e1ddb48SDavid Howells __u8 bDescriptorType; 2205e1ddb48SDavid Howells __u8 bDescriptorSubType; 2215e1ddb48SDavid Howells } __attribute__((packed)); 2225e1ddb48SDavid Howells 2235e1ddb48SDavid Howells /* 3.7.2. Video Control Interface Header Descriptor */ 2245e1ddb48SDavid Howells struct uvc_header_descriptor { 2255e1ddb48SDavid Howells __u8 bLength; 2265e1ddb48SDavid Howells __u8 bDescriptorType; 2275e1ddb48SDavid Howells __u8 bDescriptorSubType; 228f823b75fSLaurent Pinchart __le16 bcdUVC; 229f823b75fSLaurent Pinchart __le16 wTotalLength; 230f823b75fSLaurent Pinchart __le32 dwClockFrequency; 2315e1ddb48SDavid Howells __u8 bInCollection; 2325e1ddb48SDavid Howells __u8 baInterfaceNr[]; 2335e1ddb48SDavid Howells } __attribute__((__packed__)); 2345e1ddb48SDavid Howells 2355e1ddb48SDavid Howells #define UVC_DT_HEADER_SIZE(n) (12+(n)) 2365e1ddb48SDavid Howells 2375e1ddb48SDavid Howells #define UVC_HEADER_DESCRIPTOR(n) \ 2385e1ddb48SDavid Howells uvc_header_descriptor_##n 2395e1ddb48SDavid Howells 2405e1ddb48SDavid Howells #define DECLARE_UVC_HEADER_DESCRIPTOR(n) \ 2415e1ddb48SDavid Howells struct UVC_HEADER_DESCRIPTOR(n) { \ 2425e1ddb48SDavid Howells __u8 bLength; \ 2435e1ddb48SDavid Howells __u8 bDescriptorType; \ 2445e1ddb48SDavid Howells __u8 bDescriptorSubType; \ 245f823b75fSLaurent Pinchart __le16 bcdUVC; \ 246f823b75fSLaurent Pinchart __le16 wTotalLength; \ 247f823b75fSLaurent Pinchart __le32 dwClockFrequency; \ 2485e1ddb48SDavid Howells __u8 bInCollection; \ 2495e1ddb48SDavid Howells __u8 baInterfaceNr[n]; \ 2505e1ddb48SDavid Howells } __attribute__ ((packed)) 2515e1ddb48SDavid Howells 2525e1ddb48SDavid Howells /* 3.7.2.1. Input Terminal Descriptor */ 2535e1ddb48SDavid Howells struct uvc_input_terminal_descriptor { 2545e1ddb48SDavid Howells __u8 bLength; 2555e1ddb48SDavid Howells __u8 bDescriptorType; 2565e1ddb48SDavid Howells __u8 bDescriptorSubType; 2575e1ddb48SDavid Howells __u8 bTerminalID; 258f823b75fSLaurent Pinchart __le16 wTerminalType; 2595e1ddb48SDavid Howells __u8 bAssocTerminal; 2605e1ddb48SDavid Howells __u8 iTerminal; 2615e1ddb48SDavid Howells } __attribute__((__packed__)); 2625e1ddb48SDavid Howells 2635e1ddb48SDavid Howells #define UVC_DT_INPUT_TERMINAL_SIZE 8 2645e1ddb48SDavid Howells 2655e1ddb48SDavid Howells /* 3.7.2.2. Output Terminal Descriptor */ 2665e1ddb48SDavid Howells struct uvc_output_terminal_descriptor { 2675e1ddb48SDavid Howells __u8 bLength; 2685e1ddb48SDavid Howells __u8 bDescriptorType; 2695e1ddb48SDavid Howells __u8 bDescriptorSubType; 2705e1ddb48SDavid Howells __u8 bTerminalID; 271f823b75fSLaurent Pinchart __le16 wTerminalType; 2725e1ddb48SDavid Howells __u8 bAssocTerminal; 2735e1ddb48SDavid Howells __u8 bSourceID; 2745e1ddb48SDavid Howells __u8 iTerminal; 2755e1ddb48SDavid Howells } __attribute__((__packed__)); 2765e1ddb48SDavid Howells 2775e1ddb48SDavid Howells #define UVC_DT_OUTPUT_TERMINAL_SIZE 9 2785e1ddb48SDavid Howells 2795e1ddb48SDavid Howells /* 3.7.2.3. Camera Terminal Descriptor */ 2805e1ddb48SDavid Howells struct uvc_camera_terminal_descriptor { 2815e1ddb48SDavid Howells __u8 bLength; 2825e1ddb48SDavid Howells __u8 bDescriptorType; 2835e1ddb48SDavid Howells __u8 bDescriptorSubType; 2845e1ddb48SDavid Howells __u8 bTerminalID; 285f823b75fSLaurent Pinchart __le16 wTerminalType; 2865e1ddb48SDavid Howells __u8 bAssocTerminal; 2875e1ddb48SDavid Howells __u8 iTerminal; 288f823b75fSLaurent Pinchart __le16 wObjectiveFocalLengthMin; 289f823b75fSLaurent Pinchart __le16 wObjectiveFocalLengthMax; 290f823b75fSLaurent Pinchart __le16 wOcularFocalLength; 2915e1ddb48SDavid Howells __u8 bControlSize; 2925e1ddb48SDavid Howells __u8 bmControls[3]; 2935e1ddb48SDavid Howells } __attribute__((__packed__)); 2945e1ddb48SDavid Howells 2955e1ddb48SDavid Howells #define UVC_DT_CAMERA_TERMINAL_SIZE(n) (15+(n)) 2965e1ddb48SDavid Howells 2975e1ddb48SDavid Howells /* 3.7.2.4. Selector Unit Descriptor */ 2985e1ddb48SDavid Howells struct uvc_selector_unit_descriptor { 2995e1ddb48SDavid Howells __u8 bLength; 3005e1ddb48SDavid Howells __u8 bDescriptorType; 3015e1ddb48SDavid Howells __u8 bDescriptorSubType; 3025e1ddb48SDavid Howells __u8 bUnitID; 3035e1ddb48SDavid Howells __u8 bNrInPins; 3045e1ddb48SDavid Howells __u8 baSourceID[0]; 3055e1ddb48SDavid Howells __u8 iSelector; 3065e1ddb48SDavid Howells } __attribute__((__packed__)); 3075e1ddb48SDavid Howells 3085e1ddb48SDavid Howells #define UVC_DT_SELECTOR_UNIT_SIZE(n) (6+(n)) 3095e1ddb48SDavid Howells 3105e1ddb48SDavid Howells #define UVC_SELECTOR_UNIT_DESCRIPTOR(n) \ 3115e1ddb48SDavid Howells uvc_selector_unit_descriptor_##n 3125e1ddb48SDavid Howells 3135e1ddb48SDavid Howells #define DECLARE_UVC_SELECTOR_UNIT_DESCRIPTOR(n) \ 3145e1ddb48SDavid Howells struct UVC_SELECTOR_UNIT_DESCRIPTOR(n) { \ 3155e1ddb48SDavid Howells __u8 bLength; \ 3165e1ddb48SDavid Howells __u8 bDescriptorType; \ 3175e1ddb48SDavid Howells __u8 bDescriptorSubType; \ 3185e1ddb48SDavid Howells __u8 bUnitID; \ 3195e1ddb48SDavid Howells __u8 bNrInPins; \ 3205e1ddb48SDavid Howells __u8 baSourceID[n]; \ 3215e1ddb48SDavid Howells __u8 iSelector; \ 3225e1ddb48SDavid Howells } __attribute__ ((packed)) 3235e1ddb48SDavid Howells 3245e1ddb48SDavid Howells /* 3.7.2.5. Processing Unit Descriptor */ 3255e1ddb48SDavid Howells struct uvc_processing_unit_descriptor { 3265e1ddb48SDavid Howells __u8 bLength; 3275e1ddb48SDavid Howells __u8 bDescriptorType; 3285e1ddb48SDavid Howells __u8 bDescriptorSubType; 3295e1ddb48SDavid Howells __u8 bUnitID; 3305e1ddb48SDavid Howells __u8 bSourceID; 331f823b75fSLaurent Pinchart __le16 wMaxMultiplier; 3325e1ddb48SDavid Howells __u8 bControlSize; 3335e1ddb48SDavid Howells __u8 bmControls[2]; 3345e1ddb48SDavid Howells __u8 iProcessing; 3356a154ec9SPawel Laszczak __u8 bmVideoStandards; 3365e1ddb48SDavid Howells } __attribute__((__packed__)); 3375e1ddb48SDavid Howells 3386a154ec9SPawel Laszczak #define UVC_DT_PROCESSING_UNIT_SIZE(n) (10+(n)) 3395e1ddb48SDavid Howells 3405e1ddb48SDavid Howells /* 3.7.2.6. Extension Unit Descriptor */ 3415e1ddb48SDavid Howells struct uvc_extension_unit_descriptor { 3425e1ddb48SDavid Howells __u8 bLength; 3435e1ddb48SDavid Howells __u8 bDescriptorType; 3445e1ddb48SDavid Howells __u8 bDescriptorSubType; 3455e1ddb48SDavid Howells __u8 bUnitID; 3465e1ddb48SDavid Howells __u8 guidExtensionCode[16]; 3475e1ddb48SDavid Howells __u8 bNumControls; 3485e1ddb48SDavid Howells __u8 bNrInPins; 3495e1ddb48SDavid Howells __u8 baSourceID[0]; 3505e1ddb48SDavid Howells __u8 bControlSize; 3515e1ddb48SDavid Howells __u8 bmControls[0]; 3525e1ddb48SDavid Howells __u8 iExtension; 3535e1ddb48SDavid Howells } __attribute__((__packed__)); 3545e1ddb48SDavid Howells 3555e1ddb48SDavid Howells #define UVC_DT_EXTENSION_UNIT_SIZE(p, n) (24+(p)+(n)) 3565e1ddb48SDavid Howells 3575e1ddb48SDavid Howells #define UVC_EXTENSION_UNIT_DESCRIPTOR(p, n) \ 3585e1ddb48SDavid Howells uvc_extension_unit_descriptor_##p_##n 3595e1ddb48SDavid Howells 3605e1ddb48SDavid Howells #define DECLARE_UVC_EXTENSION_UNIT_DESCRIPTOR(p, n) \ 3615e1ddb48SDavid Howells struct UVC_EXTENSION_UNIT_DESCRIPTOR(p, n) { \ 3625e1ddb48SDavid Howells __u8 bLength; \ 3635e1ddb48SDavid Howells __u8 bDescriptorType; \ 3645e1ddb48SDavid Howells __u8 bDescriptorSubType; \ 3655e1ddb48SDavid Howells __u8 bUnitID; \ 3665e1ddb48SDavid Howells __u8 guidExtensionCode[16]; \ 3675e1ddb48SDavid Howells __u8 bNumControls; \ 3685e1ddb48SDavid Howells __u8 bNrInPins; \ 3695e1ddb48SDavid Howells __u8 baSourceID[p]; \ 3705e1ddb48SDavid Howells __u8 bControlSize; \ 3715e1ddb48SDavid Howells __u8 bmControls[n]; \ 3725e1ddb48SDavid Howells __u8 iExtension; \ 3735e1ddb48SDavid Howells } __attribute__ ((packed)) 3745e1ddb48SDavid Howells 3755e1ddb48SDavid Howells /* 3.8.2.2. Video Control Interrupt Endpoint Descriptor */ 3765e1ddb48SDavid Howells struct uvc_control_endpoint_descriptor { 3775e1ddb48SDavid Howells __u8 bLength; 3785e1ddb48SDavid Howells __u8 bDescriptorType; 3795e1ddb48SDavid Howells __u8 bDescriptorSubType; 380f823b75fSLaurent Pinchart __le16 wMaxTransferSize; 3815e1ddb48SDavid Howells } __attribute__((__packed__)); 3825e1ddb48SDavid Howells 3835e1ddb48SDavid Howells #define UVC_DT_CONTROL_ENDPOINT_SIZE 5 3845e1ddb48SDavid Howells 3855e1ddb48SDavid Howells /* 3.9.2.1. Input Header Descriptor */ 3865e1ddb48SDavid Howells struct uvc_input_header_descriptor { 3875e1ddb48SDavid Howells __u8 bLength; 3885e1ddb48SDavid Howells __u8 bDescriptorType; 3895e1ddb48SDavid Howells __u8 bDescriptorSubType; 3905e1ddb48SDavid Howells __u8 bNumFormats; 391f823b75fSLaurent Pinchart __le16 wTotalLength; 3925e1ddb48SDavid Howells __u8 bEndpointAddress; 3935e1ddb48SDavid Howells __u8 bmInfo; 3945e1ddb48SDavid Howells __u8 bTerminalLink; 3955e1ddb48SDavid Howells __u8 bStillCaptureMethod; 3965e1ddb48SDavid Howells __u8 bTriggerSupport; 3975e1ddb48SDavid Howells __u8 bTriggerUsage; 3985e1ddb48SDavid Howells __u8 bControlSize; 3995e1ddb48SDavid Howells __u8 bmaControls[]; 4005e1ddb48SDavid Howells } __attribute__((__packed__)); 4015e1ddb48SDavid Howells 4025e1ddb48SDavid Howells #define UVC_DT_INPUT_HEADER_SIZE(n, p) (13+(n*p)) 4035e1ddb48SDavid Howells 4045e1ddb48SDavid Howells #define UVC_INPUT_HEADER_DESCRIPTOR(n, p) \ 4055e1ddb48SDavid Howells uvc_input_header_descriptor_##n_##p 4065e1ddb48SDavid Howells 4075e1ddb48SDavid Howells #define DECLARE_UVC_INPUT_HEADER_DESCRIPTOR(n, p) \ 4085e1ddb48SDavid Howells struct UVC_INPUT_HEADER_DESCRIPTOR(n, p) { \ 4095e1ddb48SDavid Howells __u8 bLength; \ 4105e1ddb48SDavid Howells __u8 bDescriptorType; \ 4115e1ddb48SDavid Howells __u8 bDescriptorSubType; \ 4125e1ddb48SDavid Howells __u8 bNumFormats; \ 413f823b75fSLaurent Pinchart __le16 wTotalLength; \ 4145e1ddb48SDavid Howells __u8 bEndpointAddress; \ 4155e1ddb48SDavid Howells __u8 bmInfo; \ 4165e1ddb48SDavid Howells __u8 bTerminalLink; \ 4175e1ddb48SDavid Howells __u8 bStillCaptureMethod; \ 4185e1ddb48SDavid Howells __u8 bTriggerSupport; \ 4195e1ddb48SDavid Howells __u8 bTriggerUsage; \ 4205e1ddb48SDavid Howells __u8 bControlSize; \ 4215e1ddb48SDavid Howells __u8 bmaControls[p][n]; \ 4225e1ddb48SDavid Howells } __attribute__ ((packed)) 4235e1ddb48SDavid Howells 4245e1ddb48SDavid Howells /* 3.9.2.2. Output Header Descriptor */ 4255e1ddb48SDavid Howells struct uvc_output_header_descriptor { 4265e1ddb48SDavid Howells __u8 bLength; 4275e1ddb48SDavid Howells __u8 bDescriptorType; 4285e1ddb48SDavid Howells __u8 bDescriptorSubType; 4295e1ddb48SDavid Howells __u8 bNumFormats; 430f823b75fSLaurent Pinchart __le16 wTotalLength; 4315e1ddb48SDavid Howells __u8 bEndpointAddress; 4325e1ddb48SDavid Howells __u8 bTerminalLink; 4335e1ddb48SDavid Howells __u8 bControlSize; 4345e1ddb48SDavid Howells __u8 bmaControls[]; 4355e1ddb48SDavid Howells } __attribute__((__packed__)); 4365e1ddb48SDavid Howells 4375e1ddb48SDavid Howells #define UVC_DT_OUTPUT_HEADER_SIZE(n, p) (9+(n*p)) 4385e1ddb48SDavid Howells 4395e1ddb48SDavid Howells #define UVC_OUTPUT_HEADER_DESCRIPTOR(n, p) \ 4405e1ddb48SDavid Howells uvc_output_header_descriptor_##n_##p 4415e1ddb48SDavid Howells 4425e1ddb48SDavid Howells #define DECLARE_UVC_OUTPUT_HEADER_DESCRIPTOR(n, p) \ 4435e1ddb48SDavid Howells struct UVC_OUTPUT_HEADER_DESCRIPTOR(n, p) { \ 4445e1ddb48SDavid Howells __u8 bLength; \ 4455e1ddb48SDavid Howells __u8 bDescriptorType; \ 4465e1ddb48SDavid Howells __u8 bDescriptorSubType; \ 4475e1ddb48SDavid Howells __u8 bNumFormats; \ 448f823b75fSLaurent Pinchart __le16 wTotalLength; \ 4495e1ddb48SDavid Howells __u8 bEndpointAddress; \ 4505e1ddb48SDavid Howells __u8 bTerminalLink; \ 4515e1ddb48SDavid Howells __u8 bControlSize; \ 4525e1ddb48SDavid Howells __u8 bmaControls[p][n]; \ 4535e1ddb48SDavid Howells } __attribute__ ((packed)) 4545e1ddb48SDavid Howells 4555e1ddb48SDavid Howells /* 3.9.2.6. Color matching descriptor */ 4565e1ddb48SDavid Howells struct uvc_color_matching_descriptor { 4575e1ddb48SDavid Howells __u8 bLength; 4585e1ddb48SDavid Howells __u8 bDescriptorType; 4595e1ddb48SDavid Howells __u8 bDescriptorSubType; 4605e1ddb48SDavid Howells __u8 bColorPrimaries; 4615e1ddb48SDavid Howells __u8 bTransferCharacteristics; 4625e1ddb48SDavid Howells __u8 bMatrixCoefficients; 4635e1ddb48SDavid Howells } __attribute__((__packed__)); 4645e1ddb48SDavid Howells 4655e1ddb48SDavid Howells #define UVC_DT_COLOR_MATCHING_SIZE 6 4665e1ddb48SDavid Howells 4675e1ddb48SDavid Howells /* 4.3.1.1. Video Probe and Commit Controls */ 4685e1ddb48SDavid Howells struct uvc_streaming_control { 4695e1ddb48SDavid Howells __u16 bmHint; 4705e1ddb48SDavid Howells __u8 bFormatIndex; 4715e1ddb48SDavid Howells __u8 bFrameIndex; 4725e1ddb48SDavid Howells __u32 dwFrameInterval; 4735e1ddb48SDavid Howells __u16 wKeyFrameRate; 4745e1ddb48SDavid Howells __u16 wPFrameRate; 4755e1ddb48SDavid Howells __u16 wCompQuality; 4765e1ddb48SDavid Howells __u16 wCompWindowSize; 4775e1ddb48SDavid Howells __u16 wDelay; 4785e1ddb48SDavid Howells __u32 dwMaxVideoFrameSize; 4795e1ddb48SDavid Howells __u32 dwMaxPayloadTransferSize; 4805e1ddb48SDavid Howells __u32 dwClockFrequency; 4815e1ddb48SDavid Howells __u8 bmFramingInfo; 4825e1ddb48SDavid Howells __u8 bPreferedVersion; 4835e1ddb48SDavid Howells __u8 bMinVersion; 4845e1ddb48SDavid Howells __u8 bMaxVersion; 4855e1ddb48SDavid Howells } __attribute__((__packed__)); 4865e1ddb48SDavid Howells 4875e1ddb48SDavid Howells /* Uncompressed Payload - 3.1.1. Uncompressed Video Format Descriptor */ 4885e1ddb48SDavid Howells struct uvc_format_uncompressed { 4895e1ddb48SDavid Howells __u8 bLength; 4905e1ddb48SDavid Howells __u8 bDescriptorType; 4915e1ddb48SDavid Howells __u8 bDescriptorSubType; 4925e1ddb48SDavid Howells __u8 bFormatIndex; 4935e1ddb48SDavid Howells __u8 bNumFrameDescriptors; 4945e1ddb48SDavid Howells __u8 guidFormat[16]; 4955e1ddb48SDavid Howells __u8 bBitsPerPixel; 4965e1ddb48SDavid Howells __u8 bDefaultFrameIndex; 4975e1ddb48SDavid Howells __u8 bAspectRatioX; 4985e1ddb48SDavid Howells __u8 bAspectRatioY; 49981c25247SDaniel Scally __u8 bmInterlaceFlags; 5005e1ddb48SDavid Howells __u8 bCopyProtect; 5015e1ddb48SDavid Howells } __attribute__((__packed__)); 5025e1ddb48SDavid Howells 5035e1ddb48SDavid Howells #define UVC_DT_FORMAT_UNCOMPRESSED_SIZE 27 5045e1ddb48SDavid Howells 5055e1ddb48SDavid Howells /* Uncompressed Payload - 3.1.2. Uncompressed Video Frame Descriptor */ 5065e1ddb48SDavid Howells struct uvc_frame_uncompressed { 5075e1ddb48SDavid Howells __u8 bLength; 5085e1ddb48SDavid Howells __u8 bDescriptorType; 5095e1ddb48SDavid Howells __u8 bDescriptorSubType; 5105e1ddb48SDavid Howells __u8 bFrameIndex; 5115e1ddb48SDavid Howells __u8 bmCapabilities; 512f823b75fSLaurent Pinchart __le16 wWidth; 513f823b75fSLaurent Pinchart __le16 wHeight; 514f823b75fSLaurent Pinchart __le32 dwMinBitRate; 515f823b75fSLaurent Pinchart __le32 dwMaxBitRate; 516f823b75fSLaurent Pinchart __le32 dwMaxVideoFrameBufferSize; 517f823b75fSLaurent Pinchart __le32 dwDefaultFrameInterval; 5185e1ddb48SDavid Howells __u8 bFrameIntervalType; 519f823b75fSLaurent Pinchart __le32 dwFrameInterval[]; 5205e1ddb48SDavid Howells } __attribute__((__packed__)); 5215e1ddb48SDavid Howells 5225e1ddb48SDavid Howells #define UVC_DT_FRAME_UNCOMPRESSED_SIZE(n) (26+4*(n)) 5235e1ddb48SDavid Howells 5245e1ddb48SDavid Howells #define UVC_FRAME_UNCOMPRESSED(n) \ 5255e1ddb48SDavid Howells uvc_frame_uncompressed_##n 5265e1ddb48SDavid Howells 5275e1ddb48SDavid Howells #define DECLARE_UVC_FRAME_UNCOMPRESSED(n) \ 5285e1ddb48SDavid Howells struct UVC_FRAME_UNCOMPRESSED(n) { \ 5295e1ddb48SDavid Howells __u8 bLength; \ 5305e1ddb48SDavid Howells __u8 bDescriptorType; \ 5315e1ddb48SDavid Howells __u8 bDescriptorSubType; \ 5325e1ddb48SDavid Howells __u8 bFrameIndex; \ 5335e1ddb48SDavid Howells __u8 bmCapabilities; \ 534f823b75fSLaurent Pinchart __le16 wWidth; \ 535f823b75fSLaurent Pinchart __le16 wHeight; \ 536f823b75fSLaurent Pinchart __le32 dwMinBitRate; \ 537f823b75fSLaurent Pinchart __le32 dwMaxBitRate; \ 538f823b75fSLaurent Pinchart __le32 dwMaxVideoFrameBufferSize; \ 539f823b75fSLaurent Pinchart __le32 dwDefaultFrameInterval; \ 5405e1ddb48SDavid Howells __u8 bFrameIntervalType; \ 541f823b75fSLaurent Pinchart __le32 dwFrameInterval[n]; \ 5425e1ddb48SDavid Howells } __attribute__ ((packed)) 5435e1ddb48SDavid Howells 5445e1ddb48SDavid Howells /* MJPEG Payload - 3.1.1. MJPEG Video Format Descriptor */ 5455e1ddb48SDavid Howells struct uvc_format_mjpeg { 5465e1ddb48SDavid Howells __u8 bLength; 5475e1ddb48SDavid Howells __u8 bDescriptorType; 5485e1ddb48SDavid Howells __u8 bDescriptorSubType; 5495e1ddb48SDavid Howells __u8 bFormatIndex; 5505e1ddb48SDavid Howells __u8 bNumFrameDescriptors; 5515e1ddb48SDavid Howells __u8 bmFlags; 5525e1ddb48SDavid Howells __u8 bDefaultFrameIndex; 5535e1ddb48SDavid Howells __u8 bAspectRatioX; 5545e1ddb48SDavid Howells __u8 bAspectRatioY; 55581c25247SDaniel Scally __u8 bmInterlaceFlags; 5565e1ddb48SDavid Howells __u8 bCopyProtect; 5575e1ddb48SDavid Howells } __attribute__((__packed__)); 5585e1ddb48SDavid Howells 5595e1ddb48SDavid Howells #define UVC_DT_FORMAT_MJPEG_SIZE 11 5605e1ddb48SDavid Howells 5615e1ddb48SDavid Howells /* MJPEG Payload - 3.1.2. MJPEG Video Frame Descriptor */ 5625e1ddb48SDavid Howells struct uvc_frame_mjpeg { 5635e1ddb48SDavid Howells __u8 bLength; 5645e1ddb48SDavid Howells __u8 bDescriptorType; 5655e1ddb48SDavid Howells __u8 bDescriptorSubType; 5665e1ddb48SDavid Howells __u8 bFrameIndex; 5675e1ddb48SDavid Howells __u8 bmCapabilities; 568f823b75fSLaurent Pinchart __le16 wWidth; 569f823b75fSLaurent Pinchart __le16 wHeight; 570f823b75fSLaurent Pinchart __le32 dwMinBitRate; 571f823b75fSLaurent Pinchart __le32 dwMaxBitRate; 572f823b75fSLaurent Pinchart __le32 dwMaxVideoFrameBufferSize; 573f823b75fSLaurent Pinchart __le32 dwDefaultFrameInterval; 5745e1ddb48SDavid Howells __u8 bFrameIntervalType; 575f823b75fSLaurent Pinchart __le32 dwFrameInterval[]; 5765e1ddb48SDavid Howells } __attribute__((__packed__)); 5775e1ddb48SDavid Howells 5785e1ddb48SDavid Howells #define UVC_DT_FRAME_MJPEG_SIZE(n) (26+4*(n)) 5795e1ddb48SDavid Howells 5805e1ddb48SDavid Howells #define UVC_FRAME_MJPEG(n) \ 5815e1ddb48SDavid Howells uvc_frame_mjpeg_##n 5825e1ddb48SDavid Howells 5835e1ddb48SDavid Howells #define DECLARE_UVC_FRAME_MJPEG(n) \ 5845e1ddb48SDavid Howells struct UVC_FRAME_MJPEG(n) { \ 5855e1ddb48SDavid Howells __u8 bLength; \ 5865e1ddb48SDavid Howells __u8 bDescriptorType; \ 5875e1ddb48SDavid Howells __u8 bDescriptorSubType; \ 5885e1ddb48SDavid Howells __u8 bFrameIndex; \ 5895e1ddb48SDavid Howells __u8 bmCapabilities; \ 590f823b75fSLaurent Pinchart __le16 wWidth; \ 591f823b75fSLaurent Pinchart __le16 wHeight; \ 592f823b75fSLaurent Pinchart __le32 dwMinBitRate; \ 593f823b75fSLaurent Pinchart __le32 dwMaxBitRate; \ 594f823b75fSLaurent Pinchart __le32 dwMaxVideoFrameBufferSize; \ 595f823b75fSLaurent Pinchart __le32 dwDefaultFrameInterval; \ 5965e1ddb48SDavid Howells __u8 bFrameIntervalType; \ 597f823b75fSLaurent Pinchart __le32 dwFrameInterval[n]; \ 5985e1ddb48SDavid Howells } __attribute__ ((packed)) 5995e1ddb48SDavid Howells 6005e1ddb48SDavid Howells #endif /* __LINUX_USB_VIDEO_H */ 6015e1ddb48SDavid Howells 602