v4l2-uvc.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  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. #ifndef __LINUX_V4L2_UVC_H
  8. #define __LINUX_V4L2_UVC_H
  9. /* ------------------------------------------------------------------------
  10. * GUIDs
  11. */
  12. #define UVC_GUID_UVC_CAMERA \
  13. {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
  14. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}
  15. #define UVC_GUID_UVC_OUTPUT \
  16. {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
  17. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}
  18. #define UVC_GUID_UVC_MEDIA_TRANSPORT_INPUT \
  19. {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
  20. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03}
  21. #define UVC_GUID_UVC_PROCESSING \
  22. {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
  23. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01}
  24. #define UVC_GUID_UVC_SELECTOR \
  25. {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
  26. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02}
  27. #define UVC_GUID_EXT_GPIO_CONTROLLER \
  28. {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
  29. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03}
  30. #define UVC_GUID_FORMAT_MJPEG \
  31. { 'M', 'J', 'P', 'G', 0x00, 0x00, 0x10, 0x00, \
  32. 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
  33. #define UVC_GUID_FORMAT_YUY2 \
  34. { 'Y', 'U', 'Y', '2', 0x00, 0x00, 0x10, 0x00, \
  35. 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
  36. #define UVC_GUID_FORMAT_YUY2_ISIGHT \
  37. { 'Y', 'U', 'Y', '2', 0x00, 0x00, 0x10, 0x00, \
  38. 0x80, 0x00, 0x00, 0x00, 0x00, 0x38, 0x9b, 0x71}
  39. #define UVC_GUID_FORMAT_NV12 \
  40. { 'N', 'V', '1', '2', 0x00, 0x00, 0x10, 0x00, \
  41. 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
  42. #define UVC_GUID_FORMAT_YV12 \
  43. { 'Y', 'V', '1', '2', 0x00, 0x00, 0x10, 0x00, \
  44. 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
  45. #define UVC_GUID_FORMAT_I420 \
  46. { 'I', '4', '2', '0', 0x00, 0x00, 0x10, 0x00, \
  47. 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
  48. #define UVC_GUID_FORMAT_UYVY \
  49. { 'U', 'Y', 'V', 'Y', 0x00, 0x00, 0x10, 0x00, \
  50. 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
  51. #define UVC_GUID_FORMAT_Y800 \
  52. { 'Y', '8', '0', '0', 0x00, 0x00, 0x10, 0x00, \
  53. 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
  54. #define UVC_GUID_FORMAT_Y8 \
  55. { 'Y', '8', ' ', ' ', 0x00, 0x00, 0x10, 0x00, \
  56. 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
  57. #define UVC_GUID_FORMAT_Y10 \
  58. { 'Y', '1', '0', ' ', 0x00, 0x00, 0x10, 0x00, \
  59. 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
  60. #define UVC_GUID_FORMAT_Y12 \
  61. { 'Y', '1', '2', ' ', 0x00, 0x00, 0x10, 0x00, \
  62. 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
  63. #define UVC_GUID_FORMAT_Y16 \
  64. { 'Y', '1', '6', ' ', 0x00, 0x00, 0x10, 0x00, \
  65. 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
  66. #define UVC_GUID_FORMAT_BY8 \
  67. { 'B', 'Y', '8', ' ', 0x00, 0x00, 0x10, 0x00, \
  68. 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
  69. #define UVC_GUID_FORMAT_BA81 \
  70. { 'B', 'A', '8', '1', 0x00, 0x00, 0x10, 0x00, \
  71. 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
  72. #define UVC_GUID_FORMAT_GBRG \
  73. { 'G', 'B', 'R', 'G', 0x00, 0x00, 0x10, 0x00, \
  74. 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
  75. #define UVC_GUID_FORMAT_GRBG \
  76. { 'G', 'R', 'B', 'G', 0x00, 0x00, 0x10, 0x00, \
  77. 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
  78. #define UVC_GUID_FORMAT_RGGB \
  79. { 'R', 'G', 'G', 'B', 0x00, 0x00, 0x10, 0x00, \
  80. 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
  81. #define UVC_GUID_FORMAT_BG16 \
  82. { 'B', 'G', '1', '6', 0x00, 0x00, 0x10, 0x00, \
  83. 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
  84. #define UVC_GUID_FORMAT_GB16 \
  85. { 'G', 'B', '1', '6', 0x00, 0x00, 0x10, 0x00, \
  86. 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
  87. #define UVC_GUID_FORMAT_RG16 \
  88. { 'R', 'G', '1', '6', 0x00, 0x00, 0x10, 0x00, \
  89. 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
  90. #define UVC_GUID_FORMAT_GR16 \
  91. { 'G', 'R', '1', '6', 0x00, 0x00, 0x10, 0x00, \
  92. 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
  93. #define UVC_GUID_FORMAT_RGBP \
  94. { 'R', 'G', 'B', 'P', 0x00, 0x00, 0x10, 0x00, \
  95. 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
  96. #define UVC_GUID_FORMAT_BGR3 \
  97. { 0x7d, 0xeb, 0x36, 0xe4, 0x4f, 0x52, 0xce, 0x11, \
  98. 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70}
  99. #define UVC_GUID_FORMAT_BGR4 \
  100. { 0x7e, 0xeb, 0x36, 0xe4, 0x4f, 0x52, 0xce, 0x11, \
  101. 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70}
  102. #define UVC_GUID_FORMAT_M420 \
  103. { 'M', '4', '2', '0', 0x00, 0x00, 0x10, 0x00, \
  104. 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
  105. #define UVC_GUID_FORMAT_H264 \
  106. { 'H', '2', '6', '4', 0x00, 0x00, 0x10, 0x00, \
  107. 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
  108. #define UVC_GUID_FORMAT_H265 \
  109. { 'H', '2', '6', '5', 0x00, 0x00, 0x10, 0x00, \
  110. 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
  111. #define UVC_GUID_FORMAT_Y8I \
  112. { 'Y', '8', 'I', ' ', 0x00, 0x00, 0x10, 0x00, \
  113. 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
  114. #define UVC_GUID_FORMAT_Y12I \
  115. { 'Y', '1', '2', 'I', 0x00, 0x00, 0x10, 0x00, \
  116. 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
  117. #define UVC_GUID_FORMAT_Z16 \
  118. { 'Z', '1', '6', ' ', 0x00, 0x00, 0x10, 0x00, \
  119. 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
  120. #define UVC_GUID_FORMAT_RW10 \
  121. { 'R', 'W', '1', '0', 0x00, 0x00, 0x10, 0x00, \
  122. 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
  123. #define UVC_GUID_FORMAT_INVZ \
  124. { 'I', 'N', 'V', 'Z', 0x90, 0x2d, 0x58, 0x4a, \
  125. 0x92, 0x0b, 0x77, 0x3f, 0x1f, 0x2c, 0x55, 0x6b}
  126. #define UVC_GUID_FORMAT_INZI \
  127. { 'I', 'N', 'Z', 'I', 0x66, 0x1a, 0x42, 0xa2, \
  128. 0x90, 0x65, 0xd0, 0x18, 0x14, 0xa8, 0xef, 0x8a}
  129. #define UVC_GUID_FORMAT_INVI \
  130. { 'I', 'N', 'V', 'I', 0xdb, 0x57, 0x49, 0x5e, \
  131. 0x8e, 0x3f, 0xf4, 0x79, 0x53, 0x2b, 0x94, 0x6f}
  132. #define UVC_GUID_FORMAT_CNF4 \
  133. { 'C', ' ', ' ', ' ', 0x00, 0x00, 0x10, 0x00, \
  134. 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
  135. #define UVC_GUID_FORMAT_D3DFMT_L8 \
  136. {0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, \
  137. 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
  138. #define UVC_GUID_FORMAT_KSMEDIA_L8_IR \
  139. {0x32, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, \
  140. 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
  141. #define UVC_GUID_FORMAT_HEVC \
  142. { 'H', 'E', 'V', 'C', 0x00, 0x00, 0x10, 0x00, \
  143. 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
  144. /* ------------------------------------------------------------------------
  145. * Video formats
  146. */
  147. struct uvc_format_desc {
  148. char *name;
  149. u8 guid[16];
  150. u32 fcc;
  151. };
  152. static struct uvc_format_desc uvc_fmts[] = {
  153. {
  154. .name = "YUV 4:2:2 (YUYV)",
  155. .guid = UVC_GUID_FORMAT_YUY2,
  156. .fcc = V4L2_PIX_FMT_YUYV,
  157. },
  158. {
  159. .name = "YUV 4:2:2 (YUYV)",
  160. .guid = UVC_GUID_FORMAT_YUY2_ISIGHT,
  161. .fcc = V4L2_PIX_FMT_YUYV,
  162. },
  163. {
  164. .name = "YUV 4:2:0 (NV12)",
  165. .guid = UVC_GUID_FORMAT_NV12,
  166. .fcc = V4L2_PIX_FMT_NV12,
  167. },
  168. {
  169. .name = "MJPEG",
  170. .guid = UVC_GUID_FORMAT_MJPEG,
  171. .fcc = V4L2_PIX_FMT_MJPEG,
  172. },
  173. {
  174. .name = "YVU 4:2:0 (YV12)",
  175. .guid = UVC_GUID_FORMAT_YV12,
  176. .fcc = V4L2_PIX_FMT_YVU420,
  177. },
  178. {
  179. .name = "YUV 4:2:0 (I420)",
  180. .guid = UVC_GUID_FORMAT_I420,
  181. .fcc = V4L2_PIX_FMT_YUV420,
  182. },
  183. {
  184. .name = "YUV 4:2:0 (M420)",
  185. .guid = UVC_GUID_FORMAT_M420,
  186. .fcc = V4L2_PIX_FMT_M420,
  187. },
  188. {
  189. .name = "YUV 4:2:2 (UYVY)",
  190. .guid = UVC_GUID_FORMAT_UYVY,
  191. .fcc = V4L2_PIX_FMT_UYVY,
  192. },
  193. {
  194. .name = "Greyscale 8-bit (Y800)",
  195. .guid = UVC_GUID_FORMAT_Y800,
  196. .fcc = V4L2_PIX_FMT_GREY,
  197. },
  198. {
  199. .name = "Greyscale 8-bit (Y8 )",
  200. .guid = UVC_GUID_FORMAT_Y8,
  201. .fcc = V4L2_PIX_FMT_GREY,
  202. },
  203. {
  204. .name = "Greyscale 8-bit (D3DFMT_L8)",
  205. .guid = UVC_GUID_FORMAT_D3DFMT_L8,
  206. .fcc = V4L2_PIX_FMT_GREY,
  207. },
  208. {
  209. .name = "IR 8-bit (L8_IR)",
  210. .guid = UVC_GUID_FORMAT_KSMEDIA_L8_IR,
  211. .fcc = V4L2_PIX_FMT_GREY,
  212. },
  213. {
  214. .name = "Greyscale 10-bit (Y10 )",
  215. .guid = UVC_GUID_FORMAT_Y10,
  216. .fcc = V4L2_PIX_FMT_Y10,
  217. },
  218. {
  219. .name = "Greyscale 12-bit (Y12 )",
  220. .guid = UVC_GUID_FORMAT_Y12,
  221. .fcc = V4L2_PIX_FMT_Y12,
  222. },
  223. {
  224. .name = "Greyscale 16-bit (Y16 )",
  225. .guid = UVC_GUID_FORMAT_Y16,
  226. .fcc = V4L2_PIX_FMT_Y16,
  227. },
  228. {
  229. .name = "BGGR Bayer (BY8 )",
  230. .guid = UVC_GUID_FORMAT_BY8,
  231. .fcc = V4L2_PIX_FMT_SBGGR8,
  232. },
  233. {
  234. .name = "BGGR Bayer (BA81)",
  235. .guid = UVC_GUID_FORMAT_BA81,
  236. .fcc = V4L2_PIX_FMT_SBGGR8,
  237. },
  238. {
  239. .name = "GBRG Bayer (GBRG)",
  240. .guid = UVC_GUID_FORMAT_GBRG,
  241. .fcc = V4L2_PIX_FMT_SGBRG8,
  242. },
  243. {
  244. .name = "GRBG Bayer (GRBG)",
  245. .guid = UVC_GUID_FORMAT_GRBG,
  246. .fcc = V4L2_PIX_FMT_SGRBG8,
  247. },
  248. {
  249. .name = "RGGB Bayer (RGGB)",
  250. .guid = UVC_GUID_FORMAT_RGGB,
  251. .fcc = V4L2_PIX_FMT_SRGGB8,
  252. },
  253. {
  254. .name = "RGB565",
  255. .guid = UVC_GUID_FORMAT_RGBP,
  256. .fcc = V4L2_PIX_FMT_RGB565,
  257. },
  258. {
  259. .name = "BGR 8:8:8 (BGR3)",
  260. .guid = UVC_GUID_FORMAT_BGR3,
  261. .fcc = V4L2_PIX_FMT_BGR24,
  262. },
  263. {
  264. .name = "BGRA/X 8:8:8:8 (BGR4)",
  265. .guid = UVC_GUID_FORMAT_BGR4,
  266. .fcc = V4L2_PIX_FMT_XBGR32,
  267. },
  268. {
  269. .name = "H.264",
  270. .guid = UVC_GUID_FORMAT_H264,
  271. .fcc = V4L2_PIX_FMT_H264,
  272. },
  273. {
  274. .name = "H.265",
  275. .guid = UVC_GUID_FORMAT_H265,
  276. .fcc = V4L2_PIX_FMT_HEVC,
  277. },
  278. {
  279. .name = "Greyscale 8 L/R (Y8I)",
  280. .guid = UVC_GUID_FORMAT_Y8I,
  281. .fcc = V4L2_PIX_FMT_Y8I,
  282. },
  283. {
  284. .name = "Greyscale 12 L/R (Y12I)",
  285. .guid = UVC_GUID_FORMAT_Y12I,
  286. .fcc = V4L2_PIX_FMT_Y12I,
  287. },
  288. {
  289. .name = "Depth data 16-bit (Z16)",
  290. .guid = UVC_GUID_FORMAT_Z16,
  291. .fcc = V4L2_PIX_FMT_Z16,
  292. },
  293. {
  294. .name = "Bayer 10-bit (SRGGB10P)",
  295. .guid = UVC_GUID_FORMAT_RW10,
  296. .fcc = V4L2_PIX_FMT_SRGGB10P,
  297. },
  298. {
  299. .name = "Bayer 16-bit (SBGGR16)",
  300. .guid = UVC_GUID_FORMAT_BG16,
  301. .fcc = V4L2_PIX_FMT_SBGGR16,
  302. },
  303. {
  304. .name = "Bayer 16-bit (SGBRG16)",
  305. .guid = UVC_GUID_FORMAT_GB16,
  306. .fcc = V4L2_PIX_FMT_SGBRG16,
  307. },
  308. {
  309. .name = "Bayer 16-bit (SRGGB16)",
  310. .guid = UVC_GUID_FORMAT_RG16,
  311. .fcc = V4L2_PIX_FMT_SRGGB16,
  312. },
  313. {
  314. .name = "Bayer 16-bit (SGRBG16)",
  315. .guid = UVC_GUID_FORMAT_GR16,
  316. .fcc = V4L2_PIX_FMT_SGRBG16,
  317. },
  318. {
  319. .name = "Depth data 16-bit (Z16)",
  320. .guid = UVC_GUID_FORMAT_INVZ,
  321. .fcc = V4L2_PIX_FMT_Z16,
  322. },
  323. {
  324. .name = "Greyscale 10-bit (Y10 )",
  325. .guid = UVC_GUID_FORMAT_INVI,
  326. .fcc = V4L2_PIX_FMT_Y10,
  327. },
  328. {
  329. .name = "IR:Depth 26-bit (INZI)",
  330. .guid = UVC_GUID_FORMAT_INZI,
  331. .fcc = V4L2_PIX_FMT_INZI,
  332. },
  333. {
  334. .name = "4-bit Depth Confidence (Packed)",
  335. .guid = UVC_GUID_FORMAT_CNF4,
  336. .fcc = V4L2_PIX_FMT_CNF4,
  337. },
  338. {
  339. .name = "HEVC",
  340. .guid = UVC_GUID_FORMAT_HEVC,
  341. .fcc = V4L2_PIX_FMT_HEVC,
  342. },
  343. };
  344. static inline struct uvc_format_desc *uvc_format_by_guid(const u8 guid[16])
  345. {
  346. unsigned int len = ARRAY_SIZE(uvc_fmts);
  347. unsigned int i;
  348. for (i = 0; i < len; ++i) {
  349. if (memcmp(guid, uvc_fmts[i].guid, 16) == 0)
  350. return &uvc_fmts[i];
  351. }
  352. return NULL;
  353. }
  354. #endif /* __LINUX_V4L2_UVC_H */