uvc_configfs.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * uvc_configfs.h
  4. *
  5. * Configfs support for the uvc function.
  6. *
  7. * Copyright (c) 2014 Samsung Electronics Co., Ltd.
  8. * http://www.samsung.com
  9. *
  10. * Author: Andrzej Pietrasiewicz <andrzejtp2010@gmail.com>
  11. */
  12. #ifndef UVC_CONFIGFS_H
  13. #define UVC_CONFIGFS_H
  14. #include <linux/configfs.h>
  15. #include "u_uvc.h"
  16. static inline struct f_uvc_opts *to_f_uvc_opts(struct config_item *item)
  17. {
  18. return container_of(to_config_group(item), struct f_uvc_opts,
  19. func_inst.group);
  20. }
  21. #define UVCG_STREAMING_CONTROL_SIZE 1
  22. DECLARE_UVC_HEADER_DESCRIPTOR(1);
  23. struct uvcg_control_header {
  24. struct config_item item;
  25. struct UVC_HEADER_DESCRIPTOR(1) desc;
  26. unsigned linked;
  27. };
  28. static inline struct uvcg_control_header *to_uvcg_control_header(struct config_item *item)
  29. {
  30. return container_of(item, struct uvcg_control_header, item);
  31. }
  32. struct uvcg_color_matching {
  33. struct config_group group;
  34. struct uvc_color_matching_descriptor desc;
  35. unsigned int refcnt;
  36. };
  37. #define to_uvcg_color_matching(group_ptr) \
  38. container_of(group_ptr, struct uvcg_color_matching, group)
  39. enum uvcg_format_type {
  40. UVCG_UNCOMPRESSED = 0,
  41. UVCG_MJPEG,
  42. };
  43. struct uvcg_format {
  44. struct config_group group;
  45. enum uvcg_format_type type;
  46. unsigned linked;
  47. struct list_head frames;
  48. unsigned num_frames;
  49. __u8 bmaControls[UVCG_STREAMING_CONTROL_SIZE];
  50. struct uvcg_color_matching *color_matching;
  51. };
  52. struct uvcg_format_ptr {
  53. struct uvcg_format *fmt;
  54. struct list_head entry;
  55. };
  56. static inline struct uvcg_format *to_uvcg_format(struct config_item *item)
  57. {
  58. return container_of(to_config_group(item), struct uvcg_format, group);
  59. }
  60. struct uvcg_streaming_header {
  61. struct config_item item;
  62. struct uvc_input_header_descriptor desc;
  63. unsigned linked;
  64. struct list_head formats;
  65. unsigned num_fmt;
  66. };
  67. static inline struct uvcg_streaming_header *to_uvcg_streaming_header(struct config_item *item)
  68. {
  69. return container_of(item, struct uvcg_streaming_header, item);
  70. }
  71. struct uvcg_frame_ptr {
  72. struct uvcg_frame *frm;
  73. struct list_head entry;
  74. };
  75. struct uvcg_frame {
  76. struct config_item item;
  77. enum uvcg_format_type fmt_type;
  78. struct {
  79. u8 b_length;
  80. u8 b_descriptor_type;
  81. u8 b_descriptor_subtype;
  82. u8 b_frame_index;
  83. u8 bm_capabilities;
  84. u16 w_width;
  85. u16 w_height;
  86. u32 dw_min_bit_rate;
  87. u32 dw_max_bit_rate;
  88. u32 dw_max_video_frame_buffer_size;
  89. u32 dw_default_frame_interval;
  90. u8 b_frame_interval_type;
  91. } __attribute__((packed)) frame;
  92. u32 *dw_frame_interval;
  93. };
  94. static inline struct uvcg_frame *to_uvcg_frame(struct config_item *item)
  95. {
  96. return container_of(item, struct uvcg_frame, item);
  97. }
  98. /* -----------------------------------------------------------------------------
  99. * streaming/uncompressed/<NAME>
  100. */
  101. struct uvcg_uncompressed {
  102. struct uvcg_format fmt;
  103. struct uvc_format_uncompressed desc;
  104. };
  105. static inline struct uvcg_uncompressed *to_uvcg_uncompressed(struct config_item *item)
  106. {
  107. return container_of(to_uvcg_format(item), struct uvcg_uncompressed, fmt);
  108. }
  109. /* -----------------------------------------------------------------------------
  110. * streaming/mjpeg/<NAME>
  111. */
  112. struct uvcg_mjpeg {
  113. struct uvcg_format fmt;
  114. struct uvc_format_mjpeg desc;
  115. };
  116. static inline struct uvcg_mjpeg *to_uvcg_mjpeg(struct config_item *item)
  117. {
  118. return container_of(to_uvcg_format(item), struct uvcg_mjpeg, fmt);
  119. }
  120. /* -----------------------------------------------------------------------------
  121. * control/extensions/<NAME>
  122. */
  123. struct uvcg_extension_unit_descriptor {
  124. u8 bLength;
  125. u8 bDescriptorType;
  126. u8 bDescriptorSubType;
  127. u8 bUnitID;
  128. u8 guidExtensionCode[16];
  129. u8 bNumControls;
  130. u8 bNrInPins;
  131. u8 *baSourceID;
  132. u8 bControlSize;
  133. u8 *bmControls;
  134. u8 iExtension;
  135. } __packed;
  136. struct uvcg_extension {
  137. struct config_item item;
  138. struct list_head list;
  139. u8 string_descriptor_index;
  140. struct uvcg_extension_unit_descriptor desc;
  141. };
  142. static inline struct uvcg_extension *to_uvcg_extension(struct config_item *item)
  143. {
  144. return container_of(item, struct uvcg_extension, item);
  145. }
  146. int uvcg_attach_configfs(struct f_uvc_opts *opts);
  147. #endif /* UVC_CONFIGFS_H */