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