xref: /OK3568_Linux_fs/kernel/include/uapi/linux/usb/video.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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