uvc.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. #pragma once
  2. /****************************
  3. * CONTROLS *
  4. ****************************/
  5. static int webcamSetControlCallback_uvc( struct v4l2_ctrl* );
  6. static const struct v4l2_ctrl_ops webcamControlOps_uvc = {
  7. .s_ctrl = webcamSetControlCallback_uvc,
  8. };
  9. /****************************
  10. * UVC *
  11. ****************************/
  12. enum {
  13. UVC_SC_VIDEOCONTROL = 1,
  14. UVC_SC_VIDEOSTREAMING = 1,
  15. UVC_VC_HEADER = 1,
  16. UVC_VC_INPUT_TERMINAL = 2,
  17. UVC_VC_OUTPUT_TERMINAL = 3,
  18. UVC_VC_SELECTOR_UNIT = 4,
  19. UVC_VC_PROCESSING_UNIT = 5,
  20. UVC_VC_EXTENSION_UNIT = 6,
  21. UVC_VC_REQUEST_ERROR_CODE_CONTROL = 0x02,
  22. UVC_VS_INPUT_HEADER = 0x01,
  23. UVC_VS_FORMAT_UNCOMPRESSED = 0x04,
  24. UVC_VS_FRAME_UNCOMPRESSED = 0x05,
  25. UVC_SET_CUR = 0x01,
  26. UVC_GET_CUR = 0x81,
  27. UVC_GET_MIN = 0x82,
  28. UVC_GET_MAX = 0x83,
  29. UVC_GET_RES = 0x84,
  30. UVC_GET_LEN = 0x85,
  31. UVC_GET_INFO = 0x86,
  32. UVC_GET_DEF = 0x87,
  33. UVC_PU_BACKLIGHT_COMPENSATION_CONTROL = 0x01,
  34. UVC_PU_BRIGHTNESS_CONTROL = 0x02,
  35. UVC_PU_CONTRAST_CONTROL = 0x03,
  36. UVC_PU_POWER_LINE_FREQUENCY_CONTROL = 0x05,
  37. UVC_PU_HUE_CONTROL = 0x06,
  38. UVC_PU_SATURATION_CONTROL = 0x07,
  39. UVC_PU_SHARPNESS_CONTROL = 0x08,
  40. UVC_PU_GAMMA_CONTROL = 0x09,
  41. UVC_VS_PROBE_CONTROL = 0x01,
  42. UVC_VS_COMMIT_CONTROL = 0x02,
  43. };
  44. static const struct r5u870_uvc_fmtinfo {
  45. const char* fi_name;
  46. int fi_v4l_id;
  47. u8 fi_guid[16];
  48. } r5u870_uvc_fmts[] = {
  49. { .fi_name = "YUY2 4:2:2",
  50. .fi_v4l_id = V4L2_PIX_FMT_YUYV,
  51. .fi_guid = { 0x59, 0x55, 0x59, 0x32, 0x00, 0x00, 0x10, 0x00,
  52. 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } },
  53. { }
  54. };
  55. /*
  56. * Known UVC controls for processing units
  57. *
  58. * Not all types of UVC controls are supported. We stick to simple
  59. * controls with one or two byte values, and don't do anything very
  60. * complicated.
  61. *
  62. * We don't support camera unit controls, or multiple processing units
  63. * with instances of the same control. We also don't check for
  64. * redefined control IDs, and let usbcam do this for us.
  65. */
  66. struct r5u870_uvc_ctrlinfo {
  67. const char* ci_name;
  68. u32 ci_v4l_id;
  69. int ci_v4l_type;
  70. int ci_v4l_flags;
  71. u8 ci_reg;
  72. u8 ci_size;
  73. u8 ci_bm_index;
  74. int ci_min, ci_max, ci_def;
  75. u8 ci_min_force, ci_max_force, ci_def_force;
  76. const char** ci_menu_names;
  77. int ci_val_offset;
  78. };
  79. static struct r5u870_uvc_ctrlinfo r5u870_uvc_proc_ctrls[] = {
  80. { .ci_name = "Brightness",
  81. .ci_v4l_id = V4L2_CID_BRIGHTNESS,
  82. .ci_v4l_type = V4L2_CTRL_TYPE_INTEGER,
  83. .ci_v4l_flags = V4L2_CTRL_FLAG_SLIDER,
  84. .ci_reg = UVC_PU_BRIGHTNESS_CONTROL,
  85. .ci_size = 2,
  86. .ci_bm_index = 0 },
  87. { .ci_name = "Contrast",
  88. .ci_v4l_id = V4L2_CID_CONTRAST,
  89. .ci_v4l_type = V4L2_CTRL_TYPE_INTEGER,
  90. .ci_v4l_flags = V4L2_CTRL_FLAG_SLIDER,
  91. .ci_reg = UVC_PU_CONTRAST_CONTROL,
  92. .ci_size = 2,
  93. .ci_bm_index = 1 },
  94. { .ci_name = "Hue",
  95. .ci_v4l_id = V4L2_CID_HUE,
  96. .ci_v4l_type = V4L2_CTRL_TYPE_INTEGER,
  97. .ci_v4l_flags = V4L2_CTRL_FLAG_SLIDER,
  98. .ci_reg = UVC_PU_HUE_CONTROL,
  99. .ci_size = 2,
  100. .ci_min = -180, .ci_min_force = 1,
  101. .ci_max = 180, .ci_max_force = 1,
  102. .ci_def = 0, .ci_def_force = 1,
  103. .ci_bm_index = 2 },
  104. { .ci_name = "Saturation",
  105. .ci_v4l_id = V4L2_CID_SATURATION,
  106. .ci_v4l_type = V4L2_CTRL_TYPE_INTEGER,
  107. .ci_v4l_flags = V4L2_CTRL_FLAG_SLIDER,
  108. .ci_reg = UVC_PU_SATURATION_CONTROL,
  109. .ci_size = 2,
  110. .ci_bm_index = 3 },
  111. { .ci_name = "Sharpness",
  112. .ci_v4l_id = V4L2_CID_SHARPNESS,
  113. .ci_v4l_type = V4L2_CTRL_TYPE_INTEGER,
  114. .ci_v4l_flags = V4L2_CTRL_FLAG_SLIDER,
  115. .ci_reg = UVC_PU_SHARPNESS_CONTROL,
  116. .ci_size = 2,
  117. .ci_bm_index = 4 },
  118. { .ci_name = "Gamma",
  119. .ci_v4l_id = V4L2_CID_GAMMA,
  120. .ci_v4l_type = V4L2_CTRL_TYPE_INTEGER,
  121. .ci_v4l_flags = V4L2_CTRL_FLAG_SLIDER,
  122. .ci_reg = UVC_PU_GAMMA_CONTROL,
  123. .ci_size = 2,
  124. .ci_bm_index = 5 },
  125. { .ci_name = "Backlight Compensation",
  126. .ci_v4l_id = V4L2_CID_BACKLIGHT_COMPENSATION,
  127. .ci_v4l_type = V4L2_CTRL_TYPE_INTEGER,
  128. .ci_v4l_flags = V4L2_CTRL_FLAG_SLIDER,
  129. .ci_reg = UVC_PU_BACKLIGHT_COMPENSATION_CONTROL,
  130. .ci_size = 2,
  131. .ci_bm_index = 8 },
  132. { .ci_name = "Power Line Frequency",
  133. .ci_v4l_id = V4L2_CID_POWER_LINE_FREQUENCY,
  134. .ci_v4l_type = V4L2_CTRL_TYPE_MENU,
  135. .ci_reg = UVC_PU_POWER_LINE_FREQUENCY_CONTROL,
  136. .ci_size = 1,
  137. .ci_bm_index = 10,
  138. .ci_min = 0, .ci_min_force = 1,
  139. .ci_max = 2, .ci_max_force = 1,
  140. .ci_menu_names = powerline_frequency_menu_item_names },
  141. { }
  142. };