cx2341x.h 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. cx23415/6/8 header containing common defines.
  4. */
  5. #ifndef CX2341X_H
  6. #define CX2341X_H
  7. #include <media/v4l2-ctrls.h>
  8. enum cx2341x_port {
  9. CX2341X_PORT_MEMORY = 0,
  10. CX2341X_PORT_STREAMING = 1,
  11. CX2341X_PORT_SERIAL = 2
  12. };
  13. enum cx2341x_cap {
  14. CX2341X_CAP_HAS_SLICED_VBI = 1 << 0,
  15. CX2341X_CAP_HAS_TS = 1 << 1,
  16. CX2341X_CAP_HAS_AC3 = 1 << 2,
  17. };
  18. struct cx2341x_mpeg_params {
  19. /* misc */
  20. u32 capabilities;
  21. enum cx2341x_port port;
  22. u16 width;
  23. u16 height;
  24. u16 is_50hz;
  25. /* stream */
  26. enum v4l2_mpeg_stream_type stream_type;
  27. enum v4l2_mpeg_stream_vbi_fmt stream_vbi_fmt;
  28. u16 stream_insert_nav_packets;
  29. /* audio */
  30. enum v4l2_mpeg_audio_sampling_freq audio_sampling_freq;
  31. enum v4l2_mpeg_audio_encoding audio_encoding;
  32. enum v4l2_mpeg_audio_l2_bitrate audio_l2_bitrate;
  33. enum v4l2_mpeg_audio_ac3_bitrate audio_ac3_bitrate;
  34. enum v4l2_mpeg_audio_mode audio_mode;
  35. enum v4l2_mpeg_audio_mode_extension audio_mode_extension;
  36. enum v4l2_mpeg_audio_emphasis audio_emphasis;
  37. enum v4l2_mpeg_audio_crc audio_crc;
  38. u32 audio_properties;
  39. u16 audio_mute;
  40. /* video */
  41. enum v4l2_mpeg_video_encoding video_encoding;
  42. enum v4l2_mpeg_video_aspect video_aspect;
  43. u16 video_b_frames;
  44. u16 video_gop_size;
  45. u16 video_gop_closure;
  46. enum v4l2_mpeg_video_bitrate_mode video_bitrate_mode;
  47. u32 video_bitrate;
  48. u32 video_bitrate_peak;
  49. u16 video_temporal_decimation;
  50. u16 video_mute;
  51. u32 video_mute_yuv;
  52. /* encoding filters */
  53. enum v4l2_mpeg_cx2341x_video_spatial_filter_mode video_spatial_filter_mode;
  54. u16 video_spatial_filter;
  55. enum v4l2_mpeg_cx2341x_video_luma_spatial_filter_type video_luma_spatial_filter_type;
  56. enum v4l2_mpeg_cx2341x_video_chroma_spatial_filter_type video_chroma_spatial_filter_type;
  57. enum v4l2_mpeg_cx2341x_video_temporal_filter_mode video_temporal_filter_mode;
  58. u16 video_temporal_filter;
  59. enum v4l2_mpeg_cx2341x_video_median_filter_type video_median_filter_type;
  60. u16 video_luma_median_filter_top;
  61. u16 video_luma_median_filter_bottom;
  62. u16 video_chroma_median_filter_top;
  63. u16 video_chroma_median_filter_bottom;
  64. };
  65. #define CX2341X_MBOX_MAX_DATA 16
  66. extern const u32 cx2341x_mpeg_ctrls[];
  67. typedef int (*cx2341x_mbox_func)(void *priv, u32 cmd, int in, int out,
  68. u32 data[CX2341X_MBOX_MAX_DATA]);
  69. int cx2341x_update(void *priv, cx2341x_mbox_func func,
  70. const struct cx2341x_mpeg_params *old,
  71. const struct cx2341x_mpeg_params *new);
  72. int cx2341x_ctrl_query(const struct cx2341x_mpeg_params *params,
  73. struct v4l2_queryctrl *qctrl);
  74. const char * const *cx2341x_ctrl_get_menu(const struct cx2341x_mpeg_params *p, u32 id);
  75. int cx2341x_ext_ctrls(struct cx2341x_mpeg_params *params, int busy,
  76. struct v4l2_ext_controls *ctrls, unsigned int cmd);
  77. void cx2341x_fill_defaults(struct cx2341x_mpeg_params *p);
  78. void cx2341x_log_status(const struct cx2341x_mpeg_params *p, const char *prefix);
  79. struct cx2341x_handler;
  80. struct cx2341x_handler_ops {
  81. /* needed for the video clock freq */
  82. int (*s_audio_sampling_freq)(struct cx2341x_handler *hdl, u32 val);
  83. /* needed for dualwatch */
  84. int (*s_audio_mode)(struct cx2341x_handler *hdl, u32 val);
  85. /* needed for setting up the video resolution */
  86. int (*s_video_encoding)(struct cx2341x_handler *hdl, u32 val);
  87. /* needed for setting up the sliced vbi insertion data structures */
  88. int (*s_stream_vbi_fmt)(struct cx2341x_handler *hdl, u32 val);
  89. };
  90. struct cx2341x_handler {
  91. u32 capabilities;
  92. enum cx2341x_port port;
  93. u16 width;
  94. u16 height;
  95. u16 is_50hz;
  96. u32 audio_properties;
  97. struct v4l2_ctrl_handler hdl;
  98. void *priv;
  99. cx2341x_mbox_func func;
  100. const struct cx2341x_handler_ops *ops;
  101. struct v4l2_ctrl *stream_vbi_fmt;
  102. struct {
  103. /* audio cluster */
  104. struct v4l2_ctrl *audio_sampling_freq;
  105. struct v4l2_ctrl *audio_encoding;
  106. struct v4l2_ctrl *audio_l2_bitrate;
  107. struct v4l2_ctrl *audio_mode;
  108. struct v4l2_ctrl *audio_mode_extension;
  109. struct v4l2_ctrl *audio_emphasis;
  110. struct v4l2_ctrl *audio_crc;
  111. struct v4l2_ctrl *audio_ac3_bitrate;
  112. };
  113. struct {
  114. /* video gop cluster */
  115. struct v4l2_ctrl *video_b_frames;
  116. struct v4l2_ctrl *video_gop_size;
  117. };
  118. struct {
  119. /* stream type cluster */
  120. struct v4l2_ctrl *stream_type;
  121. struct v4l2_ctrl *video_encoding;
  122. struct v4l2_ctrl *video_bitrate_mode;
  123. struct v4l2_ctrl *video_bitrate;
  124. struct v4l2_ctrl *video_bitrate_peak;
  125. };
  126. struct {
  127. /* video mute cluster */
  128. struct v4l2_ctrl *video_mute;
  129. struct v4l2_ctrl *video_mute_yuv;
  130. };
  131. struct {
  132. /* video filter mode cluster */
  133. struct v4l2_ctrl *video_spatial_filter_mode;
  134. struct v4l2_ctrl *video_temporal_filter_mode;
  135. struct v4l2_ctrl *video_median_filter_type;
  136. };
  137. struct {
  138. /* video filter type cluster */
  139. struct v4l2_ctrl *video_luma_spatial_filter_type;
  140. struct v4l2_ctrl *video_chroma_spatial_filter_type;
  141. };
  142. struct {
  143. /* video filter cluster */
  144. struct v4l2_ctrl *video_spatial_filter;
  145. struct v4l2_ctrl *video_temporal_filter;
  146. };
  147. struct {
  148. /* video median cluster */
  149. struct v4l2_ctrl *video_luma_median_filter_top;
  150. struct v4l2_ctrl *video_luma_median_filter_bottom;
  151. struct v4l2_ctrl *video_chroma_median_filter_top;
  152. struct v4l2_ctrl *video_chroma_median_filter_bottom;
  153. };
  154. };
  155. int cx2341x_handler_init(struct cx2341x_handler *cxhdl,
  156. unsigned nr_of_controls_hint);
  157. void cx2341x_handler_set_50hz(struct cx2341x_handler *cxhdl, int is_50hz);
  158. int cx2341x_handler_setup(struct cx2341x_handler *cxhdl);
  159. void cx2341x_handler_set_busy(struct cx2341x_handler *cxhdl, int busy);
  160. /* Firmware names */
  161. #define CX2341X_FIRM_ENC_FILENAME "v4l-cx2341x-enc.fw"
  162. /* Decoder firmware for the cx23415 only */
  163. #define CX2341X_FIRM_DEC_FILENAME "v4l-cx2341x-dec.fw"
  164. /* Firmware API commands */
  165. /* MPEG decoder API, specific to the cx23415 */
  166. #define CX2341X_DEC_PING_FW 0x00
  167. #define CX2341X_DEC_START_PLAYBACK 0x01
  168. #define CX2341X_DEC_STOP_PLAYBACK 0x02
  169. #define CX2341X_DEC_SET_PLAYBACK_SPEED 0x03
  170. #define CX2341X_DEC_STEP_VIDEO 0x05
  171. #define CX2341X_DEC_SET_DMA_BLOCK_SIZE 0x08
  172. #define CX2341X_DEC_GET_XFER_INFO 0x09
  173. #define CX2341X_DEC_GET_DMA_STATUS 0x0a
  174. #define CX2341X_DEC_SCHED_DMA_FROM_HOST 0x0b
  175. #define CX2341X_DEC_PAUSE_PLAYBACK 0x0d
  176. #define CX2341X_DEC_HALT_FW 0x0e
  177. #define CX2341X_DEC_SET_STANDARD 0x10
  178. #define CX2341X_DEC_GET_VERSION 0x11
  179. #define CX2341X_DEC_SET_STREAM_INPUT 0x14
  180. #define CX2341X_DEC_GET_TIMING_INFO 0x15
  181. #define CX2341X_DEC_SET_AUDIO_MODE 0x16
  182. #define CX2341X_DEC_SET_EVENT_NOTIFICATION 0x17
  183. #define CX2341X_DEC_SET_DISPLAY_BUFFERS 0x18
  184. #define CX2341X_DEC_EXTRACT_VBI 0x19
  185. #define CX2341X_DEC_SET_DECODER_SOURCE 0x1a
  186. #define CX2341X_DEC_SET_PREBUFFERING 0x1e
  187. /* MPEG encoder API */
  188. #define CX2341X_ENC_PING_FW 0x80
  189. #define CX2341X_ENC_START_CAPTURE 0x81
  190. #define CX2341X_ENC_STOP_CAPTURE 0x82
  191. #define CX2341X_ENC_SET_AUDIO_ID 0x89
  192. #define CX2341X_ENC_SET_VIDEO_ID 0x8b
  193. #define CX2341X_ENC_SET_PCR_ID 0x8d
  194. #define CX2341X_ENC_SET_FRAME_RATE 0x8f
  195. #define CX2341X_ENC_SET_FRAME_SIZE 0x91
  196. #define CX2341X_ENC_SET_BIT_RATE 0x95
  197. #define CX2341X_ENC_SET_GOP_PROPERTIES 0x97
  198. #define CX2341X_ENC_SET_ASPECT_RATIO 0x99
  199. #define CX2341X_ENC_SET_DNR_FILTER_MODE 0x9b
  200. #define CX2341X_ENC_SET_DNR_FILTER_PROPS 0x9d
  201. #define CX2341X_ENC_SET_CORING_LEVELS 0x9f
  202. #define CX2341X_ENC_SET_SPATIAL_FILTER_TYPE 0xa1
  203. #define CX2341X_ENC_SET_VBI_LINE 0xb7
  204. #define CX2341X_ENC_SET_STREAM_TYPE 0xb9
  205. #define CX2341X_ENC_SET_OUTPUT_PORT 0xbb
  206. #define CX2341X_ENC_SET_AUDIO_PROPERTIES 0xbd
  207. #define CX2341X_ENC_HALT_FW 0xc3
  208. #define CX2341X_ENC_GET_VERSION 0xc4
  209. #define CX2341X_ENC_SET_GOP_CLOSURE 0xc5
  210. #define CX2341X_ENC_GET_SEQ_END 0xc6
  211. #define CX2341X_ENC_SET_PGM_INDEX_INFO 0xc7
  212. #define CX2341X_ENC_SET_VBI_CONFIG 0xc8
  213. #define CX2341X_ENC_SET_DMA_BLOCK_SIZE 0xc9
  214. #define CX2341X_ENC_GET_PREV_DMA_INFO_MB_10 0xca
  215. #define CX2341X_ENC_GET_PREV_DMA_INFO_MB_9 0xcb
  216. #define CX2341X_ENC_SCHED_DMA_TO_HOST 0xcc
  217. #define CX2341X_ENC_INITIALIZE_INPUT 0xcd
  218. #define CX2341X_ENC_SET_FRAME_DROP_RATE 0xd0
  219. #define CX2341X_ENC_PAUSE_ENCODER 0xd2
  220. #define CX2341X_ENC_REFRESH_INPUT 0xd3
  221. #define CX2341X_ENC_SET_COPYRIGHT 0xd4
  222. #define CX2341X_ENC_SET_EVENT_NOTIFICATION 0xd5
  223. #define CX2341X_ENC_SET_NUM_VSYNC_LINES 0xd6
  224. #define CX2341X_ENC_SET_PLACEHOLDER 0xd7
  225. #define CX2341X_ENC_MUTE_VIDEO 0xd9
  226. #define CX2341X_ENC_MUTE_AUDIO 0xda
  227. #define CX2341X_ENC_SET_VERT_CROP_LINE 0xdb
  228. #define CX2341X_ENC_MISC 0xdc
  229. /* OSD API, specific to the cx23415 */
  230. #define CX2341X_OSD_GET_FRAMEBUFFER 0x41
  231. #define CX2341X_OSD_GET_PIXEL_FORMAT 0x42
  232. #define CX2341X_OSD_SET_PIXEL_FORMAT 0x43
  233. #define CX2341X_OSD_GET_STATE 0x44
  234. #define CX2341X_OSD_SET_STATE 0x45
  235. #define CX2341X_OSD_GET_OSD_COORDS 0x46
  236. #define CX2341X_OSD_SET_OSD_COORDS 0x47
  237. #define CX2341X_OSD_GET_SCREEN_COORDS 0x48
  238. #define CX2341X_OSD_SET_SCREEN_COORDS 0x49
  239. #define CX2341X_OSD_GET_GLOBAL_ALPHA 0x4a
  240. #define CX2341X_OSD_SET_GLOBAL_ALPHA 0x4b
  241. #define CX2341X_OSD_SET_BLEND_COORDS 0x4c
  242. #define CX2341X_OSD_GET_FLICKER_STATE 0x4f
  243. #define CX2341X_OSD_SET_FLICKER_STATE 0x50
  244. #define CX2341X_OSD_BLT_COPY 0x52
  245. #define CX2341X_OSD_BLT_FILL 0x53
  246. #define CX2341X_OSD_BLT_TEXT 0x54
  247. #define CX2341X_OSD_SET_FRAMEBUFFER_WINDOW 0x56
  248. #define CX2341X_OSD_SET_CHROMA_KEY 0x60
  249. #define CX2341X_OSD_GET_ALPHA_CONTENT_INDEX 0x61
  250. #define CX2341X_OSD_SET_ALPHA_CONTENT_INDEX 0x62
  251. #endif /* CX2341X_H */