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