xref: /openbsd-src/sys/dev/usb/uvideo.h (revision 6c49ea28055d38e86a3c9ab142df42bef6f00813)
1*6c49ea28Skirill /*	$OpenBSD: uvideo.h,v 1.63 2025/01/16 22:58:19 kirill Exp $ */
2c200fde7Smglocker 
3cf110a4aSrobert /*
4cf110a4aSrobert  * Copyright (c) 2007 Robert Nagy <robert@openbsd.org>
5cf110a4aSrobert  * Copyright (c) 2008 Marcus Glocker <mglocker@openbsd.org>
6cf110a4aSrobert  *
7cf110a4aSrobert  * Permission to use, copy, modify, and distribute this software for any
8cf110a4aSrobert  * purpose with or without fee is hereby granted, provided that the above
9cf110a4aSrobert  * copyright notice and this permission notice appear in all copies.
10cf110a4aSrobert  *
11cf110a4aSrobert  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12cf110a4aSrobert  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13cf110a4aSrobert  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14cf110a4aSrobert  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15cf110a4aSrobert  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16cf110a4aSrobert  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17cf110a4aSrobert  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18cf110a4aSrobert  */
19cf110a4aSrobert 
201dc1fa5aSmglocker #include <sys/queue.h>
21cf110a4aSrobert #include <sys/videoio.h>
22cf110a4aSrobert 
23cf110a4aSrobert /*
24cf110a4aSrobert  * USB Video Class
25cf110a4aSrobert  */
26cf110a4aSrobert /* Table A-7: Video Class-Specific Endpoint Descriptor Subtypes */
27cf110a4aSrobert #define	EP_UNDEFINED					0x00
28cf110a4aSrobert #define EP_GENERAL					0x01
29cf110a4aSrobert #define EP_ENDPOINT					0x02
30cf110a4aSrobert #define EP_INTERRUPT					0x03
31cf110a4aSrobert 
32cf110a4aSrobert /* Table A-5: Video Class-Specific VC Interface Descriptor Subtypes */
33cf110a4aSrobert #define	UDESCSUB_VC_DESCRIPTOR_UNDEFINED		0x00
34cf110a4aSrobert #define UDESCSUB_VC_HEADER				0x01
35cf110a4aSrobert #define UDESCSUB_VC_INPUT_TERMINAL			0x02
36cf110a4aSrobert #define UDESCSUB_VC_OUTPUT_TERMINAL			0x03
37cf110a4aSrobert #define UDESCSUB_VC_SELECTOR_UNIT			0x04
38cf110a4aSrobert #define UDESCSUB_VC_PROCESSING_UNIT			0x05
39cf110a4aSrobert #define UDESCSUB_VC_EXTENSION_UNIT			0x06
40cf110a4aSrobert 
41cf110a4aSrobert /* Table A-6: Video Class-Specific VS Interface Descriptor Subtypes */
42cf110a4aSrobert #define	UDESCSUB_VS_UNDEFINED				0x00
43cf110a4aSrobert #define UDESCSUB_VS_INPUT_HEADER			0x01
44cf110a4aSrobert #define UDESCSUB_VS_OUTPUT_HEADER			0x02
45cf110a4aSrobert #define UDESCSUB_VS_STILL_IMAGE_FRAME			0x03
46cf110a4aSrobert #define UDESCSUB_VS_FORMAT_UNCOMPRESSED			0x04
47cf110a4aSrobert #define UDESCSUB_VS_FRAME_UNCOMPRESSED			0x05
48cf110a4aSrobert #define UDESCSUB_VS_FORMAT_MJPEG			0x06
49cf110a4aSrobert #define UDESCSUB_VS_FRAME_MJPEG				0x07
50cf110a4aSrobert #define UDESCSUB_VS_FORMAT_MPEG2TS			0x0a
51cf110a4aSrobert #define UDESCSUB_VS_FORMAT_DV				0x0c
52cf110a4aSrobert #define UDESCSUB_VS_COLORFORMAT				0x0d
53cf110a4aSrobert #define UDESCSUB_VS_FORMAT_FRAME_BASED			0x10
54cf110a4aSrobert #define UDESCSUB_VS_FRAME_FRAME_BASED			0x11
55cf110a4aSrobert #define UDESCSUB_VS_FORMAT_STREAM_BASED			0x12
56cf110a4aSrobert 
57cf110a4aSrobert /* Table A-8: Video Class-Specific Request Codes */
58cf110a4aSrobert #define RC_UNDEFINED					0x00
59cf110a4aSrobert #define SET_CUR						0x01
60cf110a4aSrobert #define GET_CUR						0x81
61cf110a4aSrobert #define GET_MIN						0x82
62cf110a4aSrobert #define GET_MAX						0x83
63cf110a4aSrobert #define GET_RES						0x84
64cf110a4aSrobert #define GET_LEN						0x85
65cf110a4aSrobert #define GET_INFO					0x86
66cf110a4aSrobert #define GET_DEF						0x87
67cf110a4aSrobert 
68cf110a4aSrobert /* Table A-9: Video Control Interface Control Selectors */
69cf110a4aSrobert #define VC_CONTROL_UNDEFINED				0x00
70cf110a4aSrobert #define VC_VIDEO_POWER_MODE_CONTROL			0x01
71cf110a4aSrobert #define VC_REQUEST_ERROR_CODE_CONTROL			0x02
72cf110a4aSrobert 
73cf110a4aSrobert /* Table A-11: Selector Unit Control Selectors */
74cf110a4aSrobert #define	SU_CONTROL_UNDEFINED				0x00
75cf110a4aSrobert #define	SU_INPUT_SELECT_CONTROL				0x01
76cf110a4aSrobert 
77cf110a4aSrobert /* Table A-12: Camera Terminal Control Selectors */
78cf110a4aSrobert #define	CT_CONTROL_UNDEFINED				0x00
79cf110a4aSrobert #define	CT_SCANNING_MODE_CONTROL			0x01
80cf110a4aSrobert #define	CT_AE_MODE_CONTROL				0x02
81cf110a4aSrobert #define	CT_AE_PRIORITY_CONTROL				0x03
82cf110a4aSrobert #define	CT_EXPOSURE_TIME_ABSOLUTE_CONTROL		0x04
83cf110a4aSrobert #define	CT_EXPOSURE_TIME_RELATIVE_CONTROL		0x05
84cf110a4aSrobert #define	CT_FOCUS_ABSOLUTE_CONTROL			0x06
85cf110a4aSrobert #define	CT_FOCUS_RELATIVE_CONTROL			0x07
86cf110a4aSrobert #define	CT_FOCUS_AUTO_CONTROL				0x08
87cf110a4aSrobert #define	CT_IRIS_ABSOLUTE_CONTROL			0x09
88cf110a4aSrobert #define	CT_IRIS_RELATIVE_CONTROL			0x0a
89cf110a4aSrobert #define	CT_ZOOM_ABSOLUTE_CONTROL			0x0b
90cf110a4aSrobert #define	CT_ZOOM_RELATIVE_CONTROL			0x0c
91cf110a4aSrobert #define	CT_PANTILT_ABSOLUTE_CONTROL			0x0d
92cf110a4aSrobert #define	CT_PANTILT_RELATIVE_CONTROL			0x0e
93cf110a4aSrobert #define	CT_ROLL_ABSOLUTE_CONTROL			0x0f
94cf110a4aSrobert #define	CT_ROLL_RELATIVE_CONTROL			0x10
95cf110a4aSrobert #define	CT_PRIVACY_CONTROL				0x11
96cf110a4aSrobert 
97cf110a4aSrobert /* Table A-13: Processing Unit Control Selectors */
98cf110a4aSrobert #define	PU_CONTROL_UNDEFINED				0x00
99cf110a4aSrobert #define	PU_BACKLIGHT_COMPENSATION_CONTROL		0x01
100cf110a4aSrobert #define	PU_BRIGHTNESS_CONTROL				0x02
101cf110a4aSrobert #define	PU_CONTRAST_CONTROL				0x03
102cf110a4aSrobert #define	PU_GAIN_CONTROL					0x04
103cf110a4aSrobert #define	PU_POWER_LINE_FREQUENCY_CONTROL			0x05
104cf110a4aSrobert #define	PU_HUE_CONTROL					0x06
105cf110a4aSrobert #define	PU_SATURATION_CONTROL				0x07
106cf110a4aSrobert #define	PU_SHARPNESS_CONTROL				0x08
107cf110a4aSrobert #define	PU_GAMMA_CONTROL				0x09
108cf110a4aSrobert #define	PU_WHITE_BALANCE_TEMPERATURE_CONTROL		0x0a
109cf110a4aSrobert #define	PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL	0x0b
110cf110a4aSrobert #define	PU_WHITE_BALANCE_COMPONENT_CONTROL		0x0c
111cf110a4aSrobert #define	PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL		0x0d
112cf110a4aSrobert #define	PU_DIGITAL_MULTIPLIER_CONTROL			0x0e
113cf110a4aSrobert #define	PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL		0x0f
114cf110a4aSrobert #define	PU_HUE_AUTO_CONTROL				0x10
115cf110a4aSrobert #define	PU_ANALOG_VIDEO_STANDARD_CONTROL		0x11
116cf110a4aSrobert #define	PU_ANALOG_LOCK_STATUS_CONTROL			0x12
117cf110a4aSrobert 
118cf110a4aSrobert /* Table A-15: VideoStreaming Interface Control Selectors */
119cf110a4aSrobert #define	VS_CONTROL_UNDEFINED				0x00
120cf110a4aSrobert #define	VS_PROBE_CONTROL				0x01
121cf110a4aSrobert #define	VS_COMMIT_CONTROL				0x02
122cf110a4aSrobert #define	VS_STILL_PROBE_CONTROL				0x03
123cf110a4aSrobert #define	VS_STILL_COMMIT_CONTROL				0x04
124cf110a4aSrobert #define	VS_STILL_IMAGE_TRIGGER_CONTROL			0x05
125cf110a4aSrobert #define	VS_STREAM_ERROR_CODE_CONTROL			0x06
126cf110a4aSrobert #define	VS_GENERATE_KEY_FRAME_CONTROL			0x07
127cf110a4aSrobert #define	VS_UPDATE_FRAME_SEGMENT_CONTROL			0x08
128cf110a4aSrobert #define	VS_SYNC_DELAY_CONTROL				0x09
129cf110a4aSrobert 
130cf110a4aSrobert /* probe commit bmRequests */
131cf110a4aSrobert #define	UVIDEO_SET_IF					0x21
132cf110a4aSrobert #define	UVIDEO_GET_IF					0xa1
133cf110a4aSrobert #define	UVIDEO_SET_EP					0x22
134cf110a4aSrobert #define	UVIDEO_GET_EP					0xa2
135cf110a4aSrobert 
136cf110a4aSrobert /* Table B-1: USB Terminal Types */
137cf110a4aSrobert #define	TT_VENDOR_SPECIFIC				0x0100
138cf110a4aSrobert #define	TT_STREAMING					0x0101
139cf110a4aSrobert 
140cf110a4aSrobert /* Table B-2: Input Terminal Types */
141cf110a4aSrobert #define	ITT_VENDOR_SPECIFIC				0x0200
142cf110a4aSrobert #define	ITT_CAMERA					0x0201
143cf110a4aSrobert #define	ITT_MEDIA_TRANSPORT_INPUT			0x0202
144cf110a4aSrobert 
145cf110a4aSrobert /* Table B-3: Output Terminal Types */
146cf110a4aSrobert #define	OTT_VENDOR_SPECIFIC				0x0300
147cf110a4aSrobert #define	OTT_DISPLAY					0x0301
148cf110a4aSrobert #define	OTT_MEDIA_TRANSPORT_OUTPUT			0x0302
149cf110a4aSrobert 
150cf110a4aSrobert /* Table B-4: External Terminal Types */
151cf110a4aSrobert #define	EXTERNAL_VENDOR_SPECIFIC			0x0400
152cf110a4aSrobert #define	COMPOSITE_CONNECTOR				0x0401
153cf110a4aSrobert #define	SVIDEO_CONNECTOR				0x0402
154cf110a4aSrobert #define	COMPONENT_CONNECTOR				0x0403
155cf110a4aSrobert 
156cf110a4aSrobert /* Table 3-3: VC Interface Header Descriptor */
157cf110a4aSrobert struct usb_video_header_desc {
158cf110a4aSrobert 	uByte	bLength;
159cf110a4aSrobert 	uByte	bDescriptorType;
160cf110a4aSrobert 	uByte	bDescriptorSubtype;
161cf110a4aSrobert 	uWord	bcdUVC;
162cf110a4aSrobert 	uWord	wTotalLength;
163f72577ceSmglocker 	uDWord	dwClockFrequency;
164cf110a4aSrobert 	uByte	bInCollection;
165ba30c7beSmglocker } __packed;
166259e150dSmglocker 
167259e150dSmglocker struct usb_video_header_desc_all {
168259e150dSmglocker 	struct usb_video_header_desc	*fix;
169259e150dSmglocker 	uByte				*baInterfaceNr;
170cf110a4aSrobert };
171cf110a4aSrobert 
172cf110a4aSrobert /* Table 3-4: Input Terminal Descriptor */
173cf110a4aSrobert struct usb_video_input_terminal_desc {
174cf110a4aSrobert 	uByte	bLength;
175cf110a4aSrobert 	uByte	bDescriptorType;
176cf110a4aSrobert 	uByte	bDescriptorSubtype;
177cf110a4aSrobert 	uByte	bTerminalID;
178cf110a4aSrobert 	uWord	wTerminalType;
179cf110a4aSrobert 	uByte	bAssocTerminal;
180cf110a4aSrobert 	uByte	iTerminal;
181ba30c7beSmglocker } __packed;
182cf110a4aSrobert 
183cf110a4aSrobert /* Table 3-5: Output Terminal Descriptor */
184cf110a4aSrobert struct usb_video_output_terminal_desc {
185cf110a4aSrobert 	uByte	bLength;
186cf110a4aSrobert 	uByte	bDescriptorType;
187cf110a4aSrobert 	uByte	bDescriptorSubtype;
188cf110a4aSrobert 	uByte	bTerminalID;
189cf110a4aSrobert 	uWord	wTerminalType;
190cf110a4aSrobert 	uByte	bAssocTerminal;
191cf110a4aSrobert 	uByte	bSourceID;
192cf110a4aSrobert 	uByte	iTerminal;
193ba30c7beSmglocker } __packed;
194cf110a4aSrobert 
195cf110a4aSrobert /* Table 3-6: Camera Terminal Descriptor */
196cf110a4aSrobert struct usb_video_camera_terminal_desc {
197cf110a4aSrobert 	uByte	bLength;
198cf110a4aSrobert 	uByte	bDescriptorType;
199cf110a4aSrobert 	uByte	bDescriptorSubtype;
200cf110a4aSrobert 	uByte	bTerminalID;
201cf110a4aSrobert 	uWord	wTerminalType;
202cf110a4aSrobert 	uByte	bAssocTerminal;
203cf110a4aSrobert 	uByte	iTerminal;
204cf110a4aSrobert 	uWord	wObjectiveFocalLengthMin;
205cf110a4aSrobert 	uWord	wObjectiveFocalLengthMax;
206cf110a4aSrobert 	uWord	wOcularFocalLength;
207cf110a4aSrobert 	uByte	bControlSize;
208f72577ceSmglocker 	uByte	*bmControls;
209ba30c7beSmglocker } __packed;
210cf110a4aSrobert 
2112ee56f53Smglocker /* Table 3-8: VC Processing Unit Descriptor */
2122ee56f53Smglocker struct usb_video_vc_processing_desc {
2132ee56f53Smglocker 	uByte	bLength;
2142ee56f53Smglocker 	uByte	bDescriptorType;
2152ee56f53Smglocker 	uByte	bDescriptorSubtype;
2162ee56f53Smglocker 	uByte	bUnitID;
2172ee56f53Smglocker 	uByte	bSourceID;
2182ee56f53Smglocker 	uWord	wMaxMultiplier;
2192ee56f53Smglocker 	uByte	bControlSize;
220eea62ee3Sjakemsr 	uByte	bmControls[255]; /* [bControlSize] */
221eea62ee3Sjakemsr 	/* uByte iProcessing; */
222eea62ee3Sjakemsr 	/* uByte bmVideoStandards; */
2232ee56f53Smglocker } __packed;
2242ee56f53Smglocker 
22501c33b94Smglocker /* Table 3-9: VC Extension Unit Descriptor */
22601c33b94Smglocker struct usb_video_vc_extension_desc {
22701c33b94Smglocker 	uByte	bLength;
22801c33b94Smglocker 	uByte	bDescriptorType;
22901c33b94Smglocker 	uByte	bDescriptorSubtype;
23001c33b94Smglocker 	uByte	bUnitID;
23101c33b94Smglocker 	uByte	guidExtensionCode[16];
23201c33b94Smglocker 	uByte	bNumControls;
23301c33b94Smglocker 	uByte	bNrInPins;
23401c33b94Smglocker } __packed;
23501c33b94Smglocker 
236cf110a4aSrobert /* Table 3-11: VC Endpoint Descriptor */
237cf110a4aSrobert struct usb_video_vc_endpoint_desc {
238cf110a4aSrobert 	uByte	bLength;
239cf110a4aSrobert 	uByte	bDescriptorType;
240cf110a4aSrobert 	uByte	bDescriptorSubtype;
241cf110a4aSrobert 	uWord	wMaxTransferSize;
242ba30c7beSmglocker } __packed;
243cf110a4aSrobert 
24469db36cdSmglocker /* Table 3-13: Interface Input Header Descriptor */
24569db36cdSmglocker struct usb_video_input_header_desc {
24669db36cdSmglocker 	uByte	bLength;
24769db36cdSmglocker 	uByte	bDescriptorType;
24869db36cdSmglocker 	uByte	bDescriptorSubtype;
24969db36cdSmglocker 	uByte	bNumFormats;
25069db36cdSmglocker 	uWord	wTotalLength;
25169db36cdSmglocker 	uByte	bEndpointAddress;
25269db36cdSmglocker 	uByte	bmInfo;
25369db36cdSmglocker 	uByte	bTerminalLink;
25469db36cdSmglocker 	uByte	bStillCaptureMethod;
25569db36cdSmglocker 	uByte	bTriggerSupport;
25669db36cdSmglocker 	uByte	bTriggerUsage;
25769db36cdSmglocker 	uByte	bControlSize;
258ba30c7beSmglocker } __packed;
25969db36cdSmglocker 
260c668bad0Smglocker struct usb_video_input_header_desc_all {
261c668bad0Smglocker 	struct usb_video_input_header_desc	*fix;
262c668bad0Smglocker 	uByte					*bmaControls;
263c668bad0Smglocker };
264c668bad0Smglocker 
265cf110a4aSrobert /* Table 3-18: Color Matching Descriptor */
266cf110a4aSrobert struct usb_video_color_matching_descr {
267cf110a4aSrobert 	uByte	bLength;
268cf110a4aSrobert 	uByte	bDescriptorType;
269cf110a4aSrobert 	uByte	bDescriptorSubtype;
270cf110a4aSrobert 	uByte	bColorPrimaries;
271cf110a4aSrobert 	uByte	bTransferCharacteristics;
272cf110a4aSrobert 	uByte	bMatrixCoefficients;
273cf110a4aSrobert } __packed;
274cf110a4aSrobert 
275cf110a4aSrobert /* Table 4-47: Video Probe and Commit Controls */
276cf110a4aSrobert struct usb_video_probe_commit {
277259e150dSmglocker 	uWord	bmHint;
278cf110a4aSrobert 	uByte	bFormatIndex;
279cf110a4aSrobert 	uByte	bFrameIndex;
280259e150dSmglocker 	uDWord	dwFrameInterval;
281259e150dSmglocker 	uWord	wKeyFrameRate;
282259e150dSmglocker 	uWord	wPFrameRate;
283259e150dSmglocker 	uWord	wCompQuality;
284259e150dSmglocker 	uWord	wCompWindowSize;
285259e150dSmglocker 	uWord	wDelay;
286259e150dSmglocker 	uDWord	dwMaxVideoFrameSize;
287259e150dSmglocker 	uDWord	dwMaxPayloadTransferSize;
288bedd8548Smglocker 	uDWord	dwClockFrequency;
289cf110a4aSrobert 	uByte	bmFramingInfo;
290cf110a4aSrobert 	uByte	bPreferedVersion;
291cf110a4aSrobert 	uByte	bMinVersion;
292cf110a4aSrobert 	uByte	bMaxVersion;
293cf110a4aSrobert } __packed;
294cf110a4aSrobert 
295cf110a4aSrobert /*
296cf110a4aSrobert  * USB Video Payload Uncompressed
297cf110a4aSrobert  */
298cf110a4aSrobert /* Table 2-1: Compression Formats */
299cf110a4aSrobert #define	UVIDEO_FORMAT_GUID_YUY2	{			\
300*6c49ea28Skirill     'Y',  'U',  'Y',  '2',  0x00, 0x00, 0x10, 0x00,	\
301cf110a4aSrobert     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
302cf110a4aSrobert 
30376a04d77Skirill #define	UVIDEO_FORMAT_GUID_YV12	{			\
304*6c49ea28Skirill     'Y',  'V',  '1',  '2',  0x00, 0x00, 0x10, 0x00,	\
305cf110a4aSrobert     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
306cf110a4aSrobert 
30776a04d77Skirill #define	UVIDEO_FORMAT_GUID_I420	{			\
308*6c49ea28Skirill     'I',  '4',  '2',  '0',  0x00, 0x00, 0x10, 0x00,	\
30976a04d77Skirill     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
31076a04d77Skirill 
31176a04d77Skirill #define	UVIDEO_FORMAT_GUID_Y800	{			\
312*6c49ea28Skirill     'Y',  '8',  '0',  '0',  0x00, 0x00, 0x10, 0x00,	\
31376a04d77Skirill     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
31476a04d77Skirill 
31576a04d77Skirill #define	UVIDEO_FORMAT_GUID_Y8	{			\
316*6c49ea28Skirill     'Y',  '8',  ' ',  ' ',  0x00, 0x00, 0x10, 0x00,	\
317*6c49ea28Skirill     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
318*6c49ea28Skirill 
319*6c49ea28Skirill #define	UVIDEO_FORMAT_GUID_D3DFMT_L8	{		\
320*6c49ea28Skirill     0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,	\
3211af93364Syuo     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
3221af93364Syuo 
3237431723dSpatrick #define	UVIDEO_FORMAT_GUID_KSMEDIA_L8_IR	{	\
3247431723dSpatrick     0x32, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00,	\
3257431723dSpatrick     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
3267431723dSpatrick 
327*6c49ea28Skirill #define	UVIDEO_FORMAT_GUID_BY8	{			\
328*6c49ea28Skirill     'B',  'Y',  '8',  ' ',  0x00, 0x00, 0x10, 0x00,	\
329*6c49ea28Skirill     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
330*6c49ea28Skirill 
331*6c49ea28Skirill #define	UVIDEO_FORMAT_GUID_BA81	{			\
332*6c49ea28Skirill     'B',  'A',  '8',  '1',  0x00, 0x00, 0x10, 0x00,	\
333*6c49ea28Skirill     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
334*6c49ea28Skirill 
335*6c49ea28Skirill #define	UVIDEO_FORMAT_GUID_GBRG	{			\
336*6c49ea28Skirill     'G',  'B',  'R',  'G',  0x00, 0x00, 0x10, 0x00,	\
337*6c49ea28Skirill     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
338*6c49ea28Skirill 
339*6c49ea28Skirill #define	UVIDEO_FORMAT_GUID_GRBG	{			\
340*6c49ea28Skirill     'G',  'R',  'B',  'G',  0x00, 0x00, 0x10, 0x00,	\
341*6c49ea28Skirill     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
342*6c49ea28Skirill 
343*6c49ea28Skirill #define	UVIDEO_FORMAT_GUID_RGGB	{			\
344*6c49ea28Skirill     'R',  'G',  'G',  'B',  0x00, 0x00, 0x10, 0x00,	\
345*6c49ea28Skirill     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
346*6c49ea28Skirill 
347*6c49ea28Skirill #define	UVIDEO_FORMAT_GUID_RGBP	{			\
348*6c49ea28Skirill     'R',  'G',  'B',  'P',  0x00, 0x00, 0x10, 0x00,	\
349*6c49ea28Skirill     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
350*6c49ea28Skirill 
351*6c49ea28Skirill #define	UVIDEO_FORMAT_GUID_D3DFMT_R5G6B5	{	\
352*6c49ea28Skirill     0x7b, 0xeb, 0x36, 0xe4, 0x4f, 0x52, 0xce, 0x11,	\
353*6c49ea28Skirill     0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 }
354*6c49ea28Skirill 
355*6c49ea28Skirill #define	UVIDEO_FORMAT_GUID_BGR3	{			\
356*6c49ea28Skirill     0x7d, 0xeb, 0x36, 0xe4, 0x4f, 0x52, 0xce, 0x11,	\
357*6c49ea28Skirill     0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 }
358*6c49ea28Skirill 
359*6c49ea28Skirill #define	UVIDEO_FORMAT_GUID_BGR4	{			\
360*6c49ea28Skirill     0x7e, 0xeb, 0x36, 0xe4, 0x4f, 0x52, 0xce, 0x11,	\
361*6c49ea28Skirill     0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 }
362*6c49ea28Skirill 
363*6c49ea28Skirill #define	UVIDEO_FORMAT_GUID_H265	{			\
364*6c49ea28Skirill     'H',  '2',  '6',  '5',  0x00, 0x00, 0x10, 0x00,	\
365*6c49ea28Skirill     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
366*6c49ea28Skirill 
367*6c49ea28Skirill #define	UVIDEO_FORMAT_GUID_RW10	{			\
368*6c49ea28Skirill     'R',  'W',  '1',  '0',  0x00, 0x00, 0x10, 0x00,	\
369*6c49ea28Skirill     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
370*6c49ea28Skirill 
371*6c49ea28Skirill #define	UVIDEO_FORMAT_GUID_BG16	{			\
372*6c49ea28Skirill     'B',  'G',  '1',  '6',  0x00, 0x00, 0x10, 0x00,	\
373*6c49ea28Skirill     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
374*6c49ea28Skirill 
375*6c49ea28Skirill #define	UVIDEO_FORMAT_GUID_GB16	{			\
376*6c49ea28Skirill     'G',  'B',  '1',  '6',  0x00, 0x00, 0x10, 0x00,	\
377*6c49ea28Skirill     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
378*6c49ea28Skirill 
379*6c49ea28Skirill #define	UVIDEO_FORMAT_GUID_RG16	{			\
380*6c49ea28Skirill     'R',  'G',  '1',  '6',  0x00, 0x00, 0x10, 0x00,	\
381*6c49ea28Skirill     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
382*6c49ea28Skirill 
383*6c49ea28Skirill #define	UVIDEO_FORMAT_GUID_GR16	{			\
384*6c49ea28Skirill     'G',  'R',  '1',  '6',  0x00, 0x00, 0x10, 0x00,	\
385*6c49ea28Skirill     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
386*6c49ea28Skirill 
387*6c49ea28Skirill #define	UVIDEO_FORMAT_GUID_INVZ	{			\
388*6c49ea28Skirill     'I',  'N',  'V',  'Z',  0x90, 0x2d, 0x58, 0x4a,	\
389*6c49ea28Skirill     0x92, 0x0b, 0x77, 0x3f, 0x1f, 0x2c, 0x55, 0x6b }
390*6c49ea28Skirill 
391*6c49ea28Skirill #define	UVIDEO_FORMAT_GUID_INVI	{			\
392*6c49ea28Skirill     'I',  'N',  'V',  'I',  0xdb, 0x57, 0x49, 0x5e,	\
393*6c49ea28Skirill     0x8e, 0x3f, 0xf4, 0x79, 0x53, 0x2b, 0x94, 0x6f }
394*6c49ea28Skirill 
395cf110a4aSrobert /*
396cf110a4aSrobert  * USB Video Payload MJPEG
397cf110a4aSrobert  */
398cf110a4aSrobert /* Table 2-1: Stream Header Format for the Motion-JPEG */
39934070ee7Smglocker #define UVIDEO_SH_MAX_LEN	12
40034070ee7Smglocker #define UVIDEO_SH_MIN_LEN	2
40134070ee7Smglocker struct usb_video_stream_header {
40234070ee7Smglocker 	uByte	bLength;
40334070ee7Smglocker 	uByte	bFlags;
40434070ee7Smglocker #define	UVIDEO_SH_FLAG_FID	(1 << 0)
40534070ee7Smglocker #define	UVIDEO_SH_FLAG_EOF	(1 << 1)
40634070ee7Smglocker #define	UVIDEO_SH_FLAG_PTS	(1 << 2)
40734070ee7Smglocker #define	UVIDEO_SH_FLAG_SCR	(1 << 3)
40834070ee7Smglocker #define	UVIDEO_SH_FLAG_RES	(1 << 4)
40934070ee7Smglocker #define	UVIDEO_SH_FLAG_STI	(1 << 5)
41034070ee7Smglocker #define	UVIDEO_SH_FLAG_ERR	(1 << 6)
41134070ee7Smglocker #define	UVIDEO_SH_FLAG_EOH	(1 << 7)
41234070ee7Smglocker 	/* TODO complete struct */
41334070ee7Smglocker } __packed;
414cf110a4aSrobert 
415cf110a4aSrobert /* Table 3-1: Motion-JPEG Video Format Descriptor */
416259e150dSmglocker struct usb_video_format_mjpeg_desc {
417cf110a4aSrobert 	uByte	bLength;
418cf110a4aSrobert 	uByte	bDescriptorType;
419cf110a4aSrobert 	uByte	bDescriptorSubtype;
420cf110a4aSrobert 	uByte	bFormatIndex;
421cf110a4aSrobert 	uByte	bNumFrameDescriptors;
422cf110a4aSrobert 	uByte	bmFlags;
423cf110a4aSrobert 	uByte	bDefaultFrameIndex;
424cf110a4aSrobert 	uByte	bAspectRatioX;
425cf110a4aSrobert 	uByte	bAspectRatioY;
426cf110a4aSrobert 	uByte	bmInterlaceFlags;
427cf110a4aSrobert 	uByte	bCopyProtect;
428cf110a4aSrobert } __packed;
429cf110a4aSrobert 
4302bc1e751Sjakemsr /* Table 3-2: Video Frame Descriptor (same for mjpeg and uncompressed)*/
4312bc1e751Sjakemsr struct usb_video_frame_desc {
432cf110a4aSrobert 	uByte	bLength;
433cf110a4aSrobert 	uByte	bDescriptorType;
434cf110a4aSrobert 	uByte	bDescriptorSubtype;
435cf110a4aSrobert 	uByte	bFrameIndex;
436cf110a4aSrobert 	uByte	bmCapabilities;
437cf110a4aSrobert 	uWord	wWidth;
438cf110a4aSrobert 	uWord	wHeight;
439cf110a4aSrobert 	uDWord	dwMinBitRate;
440cf110a4aSrobert 	uDWord	dwMaxBitRate;
441cf110a4aSrobert 	uDWord	dwMaxVideoFrameBufferSize;
442eaa1845bSmglocker 	uDWord	dwDefaultFrameInterval;
443cf110a4aSrobert 	uByte	bFrameIntervalType;
444c9ba893eSjakemsr 	/* uDWord ivals[]; frame intervals, length varies */
445cf110a4aSrobert } __packed;
446cf110a4aSrobert 
447cf110a4aSrobert /*
448786c2e79Smglocker  * USB Video Payload Uncompressed
449786c2e79Smglocker  */
450786c2e79Smglocker /* Table 3-1: Uncompressed Video Format Descriptor */
451786c2e79Smglocker struct usb_video_format_uncompressed_desc {
452786c2e79Smglocker 	uByte	bLength;
453786c2e79Smglocker 	uByte	bDescriptorType;
454786c2e79Smglocker 	uByte	bDescriptorSubtype;
455786c2e79Smglocker 	uByte	bFormatIndex;
456786c2e79Smglocker 	uByte	bNumFrameDescriptors;
457786c2e79Smglocker 	uByte	guidFormat[16];
458786c2e79Smglocker 	uByte	bBitsPerPixel;
459786c2e79Smglocker 	uByte	bDefaultFrameIndex;
460786c2e79Smglocker 	uByte	bAspectRatioX;
461786c2e79Smglocker 	uByte	bAspectRatioY;
462786c2e79Smglocker 	uByte	bmInterlaceFlags;
463786c2e79Smglocker 	uByte	bCopyProtect;
464786c2e79Smglocker } __packed;
465786c2e79Smglocker 
466786c2e79Smglocker /*
467cf110a4aSrobert  * Driver specific private definitions.
468cf110a4aSrobert  */
469ff018eb9Smglocker struct uvideo_format_desc {
470ff018eb9Smglocker 	uByte	bLength;
471ff018eb9Smglocker 	uByte	bDescriptorType;
472ff018eb9Smglocker 	uByte	bDescriptorSubtype;
473ff018eb9Smglocker 	uByte	bFormatIndex;
474ff018eb9Smglocker 	uByte	bNumFrameDescriptors;
475ff018eb9Smglocker 	union {
476ff018eb9Smglocker 		/* mjpeg */
477ff018eb9Smglocker 		struct {
478ff018eb9Smglocker 			uByte	bmFlags;
479ff018eb9Smglocker 			uByte	bDefaultFrameIndex;
480ff018eb9Smglocker 			uByte	bAspectRatioX;
481ff018eb9Smglocker 			uByte	bAspectRatioY;
482ff018eb9Smglocker 			uByte	bmInterlaceFlags;
483ff018eb9Smglocker 			uByte	bCopyProtect;
484ff018eb9Smglocker 		} mjpeg;
485ff018eb9Smglocker 
486ff018eb9Smglocker 		/* uncompressed */
487ff018eb9Smglocker 		struct {
488ff018eb9Smglocker 			uByte	guidFormat[16];
489ff018eb9Smglocker 			uByte	bBitsPerPixel;
490ff018eb9Smglocker 			uByte	bDefaultFrameIndex;
491ff018eb9Smglocker 			uByte	bAspectRatioX;
492ff018eb9Smglocker 			uByte	bAspectRatioY;
493ff018eb9Smglocker 			uByte	bmInterlaceFlags;
494ff018eb9Smglocker 			uByte	bCopyProtect;
495ff018eb9Smglocker 		} uc;
496ff018eb9Smglocker 	} u;
497ff018eb9Smglocker } __packed;
498ff018eb9Smglocker 
499c57f28b1Syuo #define UVIDEO_NFRAMES_MAX	40
500dae55fb3Smglocker struct uvideo_isoc_xfer {
501ba30c7beSmglocker 	struct uvideo_softc	*sc;
502ab0b1be7Smglocker 	struct usbd_xfer	*xfer;
503ba30c7beSmglocker 	void			*buf;
504dae55fb3Smglocker 	uint16_t		 size[UVIDEO_NFRAMES_MAX];
505dae55fb3Smglocker };
506dae55fb3Smglocker 
507dae55fb3Smglocker struct uvideo_bulk_xfer {
508dae55fb3Smglocker 	struct uvideo_softc	*sc;
509ab0b1be7Smglocker 	struct usbd_xfer	*xfer;
510dae55fb3Smglocker 	void			*buf;
511dae55fb3Smglocker 	uint16_t		 size;
512dae55fb3Smglocker };
513dae55fb3Smglocker 
514dae55fb3Smglocker #define UVIDEO_IXFERS		3
515dae55fb3Smglocker struct uvideo_vs_iface {
516ab0b1be7Smglocker 	struct usbd_interface	*ifaceh;
517ab0b1be7Smglocker 	struct usbd_pipe	*pipeh;
518d0eede0cSmglocker 	int			 iface;
519ba30c7beSmglocker 	int			 numalts;
520ba30c7beSmglocker 	int			 curalt;
521d0eede0cSmglocker 	int			 endpoint;
522c57f28b1Syuo 	uint32_t		 psize;
52394e1c81bSmglocker 	int			 bulk_endpoint;
52494e1c81bSmglocker 	int			 bulk_running;
525dae55fb3Smglocker 	struct uvideo_isoc_xfer	 ixfer[UVIDEO_IXFERS];
526dae55fb3Smglocker 	struct uvideo_bulk_xfer	 bxfer;
527ba30c7beSmglocker };
528ba30c7beSmglocker 
529ba30c7beSmglocker struct uvideo_frame_buffer {
530ba30c7beSmglocker 	int		 sample;
531ba30c7beSmglocker 	uint8_t		 fid;
532a623dae0Skirill 	uint8_t		 error;
533ba30c7beSmglocker 	int		 offset;
534ba30c7beSmglocker 	int		 buf_size;
535ba30c7beSmglocker 	uint8_t		*buf;
53645b0d639Sjakemsr 	uint32_t	 fmt_flags;
537ba30c7beSmglocker };
538ba30c7beSmglocker 
5393eb42298Smglocker /*
5403eb42298Smglocker  * 1920x1080 uncompressed (e.g. YUYV422) requires ~4MB image data per frame.
5413eb42298Smglocker  * 4MB * 8 frame buffers = 32MB kernel memory required.
5423eb42298Smglocker  * With 8 frame buffers we are pretty safe not to run out of kernel memory.
5433eb42298Smglocker  */
5443eb42298Smglocker #define UVIDEO_MAX_BUFFERS	8
545ba30c7beSmglocker struct uvideo_mmap {
546ba30c7beSmglocker 	SIMPLEQ_ENTRY(uvideo_mmap)	q_frames;
547ba30c7beSmglocker 	uint8_t				*buf;
548ba30c7beSmglocker 	struct v4l2_buffer		 v4l2_buf;
549ba30c7beSmglocker };
550ba30c7beSmglocker typedef SIMPLEQ_HEAD(, uvideo_mmap) q_mmap;
551ba30c7beSmglocker 
55296d56267Smglocker struct uvideo_format_group {
55394047bb7Smglocker 	uint32_t				 pixelformat;
554ff018eb9Smglocker 	uint8_t					 format_dfidx;
55548ae767dSmglocker 	struct uvideo_format_desc		*format;
556ff018eb9Smglocker 	/* frame descriptors for mjpeg and uncompressed are identical */
557c4402e05Sweerd #define UVIDEO_MAX_FRAME			 32
5582bc1e751Sjakemsr 	struct usb_video_frame_desc		*frame_cur;
5592bc1e751Sjakemsr 	struct usb_video_frame_desc		*frame[UVIDEO_MAX_FRAME];
56048ae767dSmglocker 	int					 frame_num;
56148ae767dSmglocker };
56296d56267Smglocker 
56388daba3dSmglocker struct uvideo_res {
56488daba3dSmglocker 	int width;
56588daba3dSmglocker 	int height;
56688daba3dSmglocker 	int fidx;
567ba30c7beSmglocker };
56888daba3dSmglocker 
5692ee56f53Smglocker struct uvideo_controls {
5702ee56f53Smglocker 	int		cid;
5712ee56f53Smglocker 	int		type;
5722ee56f53Smglocker 	char		name[32];
573617c7f44Sjakemsr 	uint8_t         ctrl_bit;
5742ee56f53Smglocker 	uint16_t	ctrl_selector;
5752ee56f53Smglocker 	uint16_t	ctrl_len;
576767e272eSjakemsr 	int		sig;
5772ee56f53Smglocker } uvideo_ctrls[] = {
578617c7f44Sjakemsr         /*
579617c7f44Sjakemsr          * Processing Unit Controls
580617c7f44Sjakemsr          */
5812ee56f53Smglocker 	{
5822ee56f53Smglocker 	    V4L2_CID_BRIGHTNESS,
5832ee56f53Smglocker 	    V4L2_CTRL_TYPE_INTEGER,
5842ee56f53Smglocker 	    "Brightness",
585617c7f44Sjakemsr 	    0,
5862ee56f53Smglocker 	    PU_BRIGHTNESS_CONTROL,
587767e272eSjakemsr 	    2,
588767e272eSjakemsr 	    1
5892ee56f53Smglocker 	},
5902ee56f53Smglocker 	{
5912ee56f53Smglocker 	    V4L2_CID_CONTRAST,
5922ee56f53Smglocker 	    V4L2_CTRL_TYPE_INTEGER,
5932ee56f53Smglocker 	    "Contrast",
594617c7f44Sjakemsr 	    1,
5952ee56f53Smglocker 	    PU_CONTRAST_CONTROL,
596767e272eSjakemsr 	    2,
597767e272eSjakemsr 	    0
5982ee56f53Smglocker 	},
5992ee56f53Smglocker 	{
6002ee56f53Smglocker 	    V4L2_CID_HUE,
6012ee56f53Smglocker 	    V4L2_CTRL_TYPE_INTEGER,
6022ee56f53Smglocker 	    "Hue",
603617c7f44Sjakemsr 	    2,
6042ee56f53Smglocker 	    PU_HUE_CONTROL,
605767e272eSjakemsr 	    2,
606767e272eSjakemsr 	    1
6072ee56f53Smglocker 	},
6082ee56f53Smglocker 	{
6092ee56f53Smglocker 	    V4L2_CID_SATURATION,
6102ee56f53Smglocker 	    V4L2_CTRL_TYPE_INTEGER,
6112ee56f53Smglocker 	    "Saturation",
612617c7f44Sjakemsr 	    3,
6132ee56f53Smglocker 	    PU_SATURATION_CONTROL,
614767e272eSjakemsr 	    2,
615767e272eSjakemsr 	    0
6162ee56f53Smglocker 	},
6172ee56f53Smglocker 	{
618617c7f44Sjakemsr 	    V4L2_CID_SHARPNESS,
619617c7f44Sjakemsr 	    V4L2_CTRL_TYPE_INTEGER,
620617c7f44Sjakemsr 	    "Sharpness",
621617c7f44Sjakemsr 	    4,
622617c7f44Sjakemsr 	    PU_SHARPNESS_CONTROL,
623767e272eSjakemsr 	    2,
624767e272eSjakemsr 	    0
625617c7f44Sjakemsr 	},
626617c7f44Sjakemsr 	{
6272ee56f53Smglocker 	    V4L2_CID_GAMMA,
6282ee56f53Smglocker 	    V4L2_CTRL_TYPE_INTEGER,
6292ee56f53Smglocker 	    "Gamma",
630617c7f44Sjakemsr 	    5,
6312ee56f53Smglocker 	    PU_GAMMA_CONTROL,
632767e272eSjakemsr 	    2,
633767e272eSjakemsr 	    0
6342ee56f53Smglocker 	},
6352ee56f53Smglocker 	{
636617c7f44Sjakemsr 	    V4L2_CID_WHITE_BALANCE_TEMPERATURE,
637617c7f44Sjakemsr 	    V4L2_CTRL_TYPE_INTEGER,
638617c7f44Sjakemsr 	    "White Balance Temperature",
639617c7f44Sjakemsr 	    6,
640617c7f44Sjakemsr 	    PU_WHITE_BALANCE_TEMPERATURE_CONTROL,
641767e272eSjakemsr 	    2,
642767e272eSjakemsr 	    0
643617c7f44Sjakemsr 	},
644617c7f44Sjakemsr #if 0
645617c7f44Sjakemsr         /* XXX Two V4L2 ids mapping one UVC control */
646617c7f44Sjakemsr 	{
647617c7f44Sjakemsr 	    V4L2_CID_RED_BALANCE, /* V4L2_CID_BLUE_BALANCE */
648617c7f44Sjakemsr 	    V4L2_CTRL_TYPE_INTEGER,
649617c7f44Sjakemsr 	    "White Balance Red Component", /* Blue Component */
650617c7f44Sjakemsr 	    7,
651617c7f44Sjakemsr 	    PU_WHITE_BALANCE_COMPONENT_CONTROL,
652767e272eSjakemsr 	    4,
653767e272eSjakemsr 	    0
654617c7f44Sjakemsr 	},
655617c7f44Sjakemsr #endif
656617c7f44Sjakemsr         {
657617c7f44Sjakemsr             V4L2_CID_BACKLIGHT_COMPENSATION,
658617c7f44Sjakemsr             V4L2_CTRL_TYPE_INTEGER,
659617c7f44Sjakemsr             "Backlight Compensation",
660617c7f44Sjakemsr             8,
661617c7f44Sjakemsr             PU_BACKLIGHT_COMPENSATION_CONTROL,
662617c7f44Sjakemsr             2,
663767e272eSjakemsr 	    0
664617c7f44Sjakemsr         },
665617c7f44Sjakemsr 	{
6662ee56f53Smglocker 	    V4L2_CID_GAIN,
6672ee56f53Smglocker 	    V4L2_CTRL_TYPE_INTEGER,
6682ee56f53Smglocker 	    "Gain",
669617c7f44Sjakemsr 	    9,
6702ee56f53Smglocker 	    PU_GAIN_CONTROL,
6712ee56f53Smglocker 	    2,
672767e272eSjakemsr 	    0
6732ee56f53Smglocker 	},
674617c7f44Sjakemsr         {
675617c7f44Sjakemsr             V4L2_CID_POWER_LINE_FREQUENCY,
676617c7f44Sjakemsr             V4L2_CTRL_TYPE_MENU,
677617c7f44Sjakemsr             "Power Line Frequency",
678617c7f44Sjakemsr             10,
679617c7f44Sjakemsr             PU_POWER_LINE_FREQUENCY_CONTROL,
680767e272eSjakemsr             2,
681767e272eSjakemsr 	    0
682617c7f44Sjakemsr         },
683617c7f44Sjakemsr         {
684617c7f44Sjakemsr             V4L2_CID_HUE_AUTO,
685617c7f44Sjakemsr             V4L2_CTRL_TYPE_BOOLEAN,
686617c7f44Sjakemsr             "Hue Auto",
687617c7f44Sjakemsr             11,
688617c7f44Sjakemsr             PU_HUE_AUTO_CONTROL,
689617c7f44Sjakemsr             1,
690767e272eSjakemsr 	    0
691617c7f44Sjakemsr         },
692617c7f44Sjakemsr         {
693617c7f44Sjakemsr             V4L2_CID_AUTO_WHITE_BALANCE,
694617c7f44Sjakemsr             V4L2_CTRL_TYPE_BOOLEAN,
695617c7f44Sjakemsr             "White Balance Temperature Auto",
696617c7f44Sjakemsr             12,
697617c7f44Sjakemsr             PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL,
698617c7f44Sjakemsr             1,
699767e272eSjakemsr 	    0
700617c7f44Sjakemsr         },
701617c7f44Sjakemsr         {
702617c7f44Sjakemsr             V4L2_CID_AUTO_WHITE_BALANCE,
703617c7f44Sjakemsr             V4L2_CTRL_TYPE_BOOLEAN,
704617c7f44Sjakemsr             "White Balance Component Auto",
705617c7f44Sjakemsr             13,
706617c7f44Sjakemsr             PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL,
707617c7f44Sjakemsr             1,
708767e272eSjakemsr 	    0
709617c7f44Sjakemsr         },
710617c7f44Sjakemsr #if 0
711617c7f44Sjakemsr         /* XXX No V4L2 CID for these controls? */
712617c7f44Sjakemsr         {
713617c7f44Sjakemsr             V4L2_CID_XXX,
714617c7f44Sjakemsr             V4L2_CTRL_TYPE_INTEGER,
715617c7f44Sjakemsr             "Digital Multiplier",
716617c7f44Sjakemsr             14,
717617c7f44Sjakemsr             PU_DIGITAL_MULTIPLIER_CONTROL,
718617c7f44Sjakemsr             2,
719767e272eSjakemsr 	    0
720617c7f44Sjakemsr         },
721617c7f44Sjakemsr         {
722617c7f44Sjakemsr             V4L2_CID_XXX,
723617c7f44Sjakemsr             V4L2_CTRL_TYPE_INTEGER,
724617c7f44Sjakemsr             "Digital Multiplier Limit",
725617c7f44Sjakemsr             15,
726617c7f44Sjakemsr             PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL,
727617c7f44Sjakemsr             2,
728767e272eSjakemsr 	    0
729617c7f44Sjakemsr         },
730617c7f44Sjakemsr         {
731617c7f44Sjakemsr             V4L2_CID_XXX,
732617c7f44Sjakemsr             V4L2_CTRL_TYPE_INTEGER,
733617c7f44Sjakemsr             "Analog Video Standard",
734617c7f44Sjakemsr             16,
735617c7f44Sjakemsr             PU_ANALOG_VIDEO_STANDARD_CONTROL,
736617c7f44Sjakemsr             1,
737767e272eSjakemsr 	    0
738617c7f44Sjakemsr         },
739617c7f44Sjakemsr         {
740617c7f44Sjakemsr             V4L2_CID_XXX,
741617c7f44Sjakemsr             V4L2_CTRL_TYPE_INTEGER,
742617c7f44Sjakemsr             "Analog Lock Status",
743617c7f44Sjakemsr             17,
744617c7f44Sjakemsr             PU_ANALOG_LOCK_STATUS_CONTROL,
745617c7f44Sjakemsr             1,
746767e272eSjakemsr 	    0
747617c7f44Sjakemsr         },
748617c7f44Sjakemsr #endif
749767e272eSjakemsr 	{ 0, 0, "", 0, 0, 0, 0 }
7502ee56f53Smglocker };
751