xref: /linux/include/linux/usb/uvc.h (revision c34e9ab9a612ee8b18273398ef75c207b01f516d)
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  *  v4l2 uvc internal API header
4  *
5  *  Some commonly needed functions for uvc drivers
6  */
7 
8 #ifndef __LINUX_V4L2_UVC_H
9 #define __LINUX_V4L2_UVC_H
10 
11 /* ------------------------------------------------------------------------
12  * GUIDs
13  */
14 #define UVC_GUID_UVC_CAMERA \
15 	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
16 	 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}
17 #define UVC_GUID_UVC_OUTPUT \
18 	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
19 	 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}
20 #define UVC_GUID_UVC_MEDIA_TRANSPORT_INPUT \
21 	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
22 	 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03}
23 #define UVC_GUID_UVC_PROCESSING \
24 	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
25 	 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01}
26 #define UVC_GUID_UVC_SELECTOR \
27 	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
28 	 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02}
29 #define UVC_GUID_EXT_GPIO_CONTROLLER \
30 	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
31 	 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03}
32 #define UVC_GUID_CHROMEOS_XU \
33 	{0x24, 0xe9, 0xd7, 0x74, 0xc9, 0x49, 0x45, 0x4a, \
34 	 0x98, 0xa3, 0xc8, 0x07, 0x7e, 0x05, 0x1c, 0xa3}
35 #define UVC_GUID_MSXU_1_5 \
36 	{0xdc, 0x95, 0x3f, 0x0f, 0x32, 0x26, 0x4e, 0x4c, \
37 	 0x92, 0xc9, 0xa0, 0x47, 0x82, 0xf4, 0x3b, 0xc8}
38 
39 /* https://learn.microsoft.com/en-us/windows-hardware/drivers/stream/uvc-extensions-1-5#222-extension-unit-controls */
40 #define UVC_MSXU_CONTROL_FOCUS			0x01
41 #define UVC_MSXU_CONTROL_EXPOSURE		0x02
42 #define UVC_MSXU_CONTROL_EVCOMPENSATION		0x03
43 #define UVC_MSXU_CONTROL_WHITEBALANCE		0x04
44 #define UVC_MSXU_CONTROL_FACE_AUTHENTICATION	0x06
45 #define UVC_MSXU_CONTROL_CAMERA_EXTRINSICS	0x07
46 #define UVC_MSXU_CONTROL_CAMERA_INTRINSICS	0x08
47 #define UVC_MSXU_CONTROL_METADATA		0x09
48 #define UVC_MSXU_CONTROL_IR_TORCH		0x0a
49 #define UVC_MSXU_CONTROL_DIGITALWINDOW		0x0b
50 #define UVC_MSXU_CONTROL_DIGITALWINDOW_CONFIG	0x0c
51 #define UVC_MSXU_CONTROL_VIDEO_HDR		0x0d
52 #define UVC_MSXU_CONTROL_FRAMERATE_THROTTLE	0x0e
53 #define UVC_MSXU_CONTROL_FIELDOFVIEW2_CONFIG	0x0f
54 #define UVC_MSXU_CONTROL_FIELDOFVIEW2		0x10
55 
56 #define UVC_CROSXU_CONTROL_IQ_PROFILE		0x04
57 
58 #define UVC_GUID_FORMAT_MJPEG \
59 	{ 'M',  'J',  'P',  'G', 0x00, 0x00, 0x10, 0x00, \
60 	 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
61 #define UVC_GUID_FORMAT_YUY2 \
62 	{ 'Y',  'U',  'Y',  '2', 0x00, 0x00, 0x10, 0x00, \
63 	 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
64 #define UVC_GUID_FORMAT_YUY2_ISIGHT \
65 	{ 'Y',  'U',  'Y',  '2', 0x00, 0x00, 0x10, 0x00, \
66 	 0x80, 0x00, 0x00, 0x00, 0x00, 0x38, 0x9b, 0x71}
67 #define UVC_GUID_FORMAT_NV12 \
68 	{ 'N',  'V',  '1',  '2', 0x00, 0x00, 0x10, 0x00, \
69 	 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
70 #define UVC_GUID_FORMAT_YV12 \
71 	{ 'Y',  'V',  '1',  '2', 0x00, 0x00, 0x10, 0x00, \
72 	 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
73 #define UVC_GUID_FORMAT_I420 \
74 	{ 'I',  '4',  '2',  '0', 0x00, 0x00, 0x10, 0x00, \
75 	 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
76 #define UVC_GUID_FORMAT_UYVY \
77 	{ 'U',  'Y',  'V',  'Y', 0x00, 0x00, 0x10, 0x00, \
78 	 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
79 #define UVC_GUID_FORMAT_Y800 \
80 	{ 'Y',  '8',  '0',  '0', 0x00, 0x00, 0x10, 0x00, \
81 	 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
82 #define UVC_GUID_FORMAT_Y8 \
83 	{ 'Y',  '8',  ' ',  ' ', 0x00, 0x00, 0x10, 0x00, \
84 	 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
85 #define UVC_GUID_FORMAT_Y10 \
86 	{ 'Y',  '1',  '0',  ' ', 0x00, 0x00, 0x10, 0x00, \
87 	 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
88 #define UVC_GUID_FORMAT_Y12 \
89 	{ 'Y',  '1',  '2',  ' ', 0x00, 0x00, 0x10, 0x00, \
90 	 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
91 #define UVC_GUID_FORMAT_Y16 \
92 	{ 'Y',  '1',  '6',  ' ', 0x00, 0x00, 0x10, 0x00, \
93 	 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
94 #define UVC_GUID_FORMAT_BY8 \
95 	{ 'B',  'Y',  '8',  ' ', 0x00, 0x00, 0x10, 0x00, \
96 	 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
97 #define UVC_GUID_FORMAT_BA81 \
98 	{ 'B',  'A',  '8',  '1', 0x00, 0x00, 0x10, 0x00, \
99 	 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
100 #define UVC_GUID_FORMAT_GBRG \
101 	{ 'G',  'B',  'R',  'G', 0x00, 0x00, 0x10, 0x00, \
102 	 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
103 #define UVC_GUID_FORMAT_GRBG \
104 	{ 'G',  'R',  'B',  'G', 0x00, 0x00, 0x10, 0x00, \
105 	 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
106 #define UVC_GUID_FORMAT_RGGB \
107 	{ 'R',  'G',  'G',  'B', 0x00, 0x00, 0x10, 0x00, \
108 	 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
109 #define UVC_GUID_FORMAT_BG16 \
110 	{ 'B',  'G',  '1',  '6', 0x00, 0x00, 0x10, 0x00, \
111 	 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
112 #define UVC_GUID_FORMAT_GB16 \
113 	{ 'G',  'B',  '1',  '6', 0x00, 0x00, 0x10, 0x00, \
114 	 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
115 #define UVC_GUID_FORMAT_RG16 \
116 	{ 'R',  'G',  '1',  '6', 0x00, 0x00, 0x10, 0x00, \
117 	 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
118 #define UVC_GUID_FORMAT_GR16 \
119 	{ 'G',  'R',  '1',  '6', 0x00, 0x00, 0x10, 0x00, \
120 	 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
121 #define UVC_GUID_FORMAT_RGBP \
122 	{ 'R',  'G',  'B',  'P', 0x00, 0x00, 0x10, 0x00, \
123 	 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
124 #define UVC_GUID_FORMAT_BGR3 \
125 	{ 0x7d, 0xeb, 0x36, 0xe4, 0x4f, 0x52, 0xce, 0x11, \
126 	 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70}
127 #define UVC_GUID_FORMAT_BGR4 \
128 	{ 0x7e, 0xeb, 0x36, 0xe4, 0x4f, 0x52, 0xce, 0x11, \
129 	 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70}
130 #define UVC_GUID_FORMAT_M420 \
131 	{ 'M',  '4',  '2',  '0', 0x00, 0x00, 0x10, 0x00, \
132 	 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
133 
134 #define UVC_GUID_FORMAT_H264 \
135 	{ 'H',  '2',  '6',  '4', 0x00, 0x00, 0x10, 0x00, \
136 	 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
137 #define UVC_GUID_FORMAT_H265 \
138 	{ 'H',  '2',  '6',  '5', 0x00, 0x00, 0x10, 0x00, \
139 	 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
140 #define UVC_GUID_FORMAT_Y8I \
141 	{ 'Y',  '8',  'I',  ' ', 0x00, 0x00, 0x10, 0x00, \
142 	 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
143 #define UVC_GUID_FORMAT_Y12I \
144 	{ 'Y',  '1',  '2',  'I', 0x00, 0x00, 0x10, 0x00, \
145 	 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
146 #define UVC_GUID_FORMAT_Y16I \
147 	{ 'Y',  '1',  '6',  'I', 0x00, 0x00, 0x10, 0x00, \
148 	 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
149 #define UVC_GUID_FORMAT_Z16 \
150 	{ 'Z',  '1',  '6',  ' ', 0x00, 0x00, 0x10, 0x00, \
151 	 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
152 #define UVC_GUID_FORMAT_RW10 \
153 	{ 'R',  'W',  '1',  '0', 0x00, 0x00, 0x10, 0x00, \
154 	 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
155 #define UVC_GUID_FORMAT_INVZ \
156 	{ 'I',  'N',  'V',  'Z', 0x90, 0x2d, 0x58, 0x4a, \
157 	 0x92, 0x0b, 0x77, 0x3f, 0x1f, 0x2c, 0x55, 0x6b}
158 #define UVC_GUID_FORMAT_INZI \
159 	{ 'I',  'N',  'Z',  'I', 0x66, 0x1a, 0x42, 0xa2, \
160 	 0x90, 0x65, 0xd0, 0x18, 0x14, 0xa8, 0xef, 0x8a}
161 #define UVC_GUID_FORMAT_INVI \
162 	{ 'I',  'N',  'V',  'I', 0xdb, 0x57, 0x49, 0x5e, \
163 	 0x8e, 0x3f, 0xf4, 0x79, 0x53, 0x2b, 0x94, 0x6f}
164 #define UVC_GUID_FORMAT_CNF4 \
165 	{ 'C',  ' ',  ' ',  ' ', 0x00, 0x00, 0x10, 0x00, \
166 	 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
167 
168 #define UVC_GUID_FORMAT_D3DFMT_L8 \
169 	{0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, \
170 	 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
171 #define UVC_GUID_FORMAT_D3DFMT_R5G6B5 \
172 	{0x7b, 0xeb, 0x36, 0xe4, 0x4f, 0x52, 0xce, 0x11, \
173 	 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70}
174 #define UVC_GUID_FORMAT_KSMEDIA_L8_IR \
175 	{0x32, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, \
176 	 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
177 
178 #define UVC_GUID_FORMAT_HEVC \
179 	{ 'H',  'E',  'V',  'C', 0x00, 0x00, 0x10, 0x00, \
180 	 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
181 
182 struct uvc_format_desc {
183 	u8 guid[16];
184 	u32 fcc;
185 };
186 
187 const struct uvc_format_desc *uvc_format_by_guid(const u8 guid[16]);
188 
189 #endif /* __LINUX_V4L2_UVC_H */
190