xref: /linux/include/uapi/linux/usb/video.h (revision 9a87ffc99ec8eb8d35eed7c4f816d75f5cc9662e)
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