hpm_pixelmux_drv.h 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  1. /*
  2. * Copyright (c) 2023 HPMicro
  3. *
  4. * SPDX-License-Identifier: BSD-3-Clause
  5. *
  6. */
  7. #ifndef HPM_PIXELMUX_DRV_H
  8. #define HPM_PIXELMUX_DRV_H
  9. /**
  10. * @brief PIXELMUX APIs
  11. * @defgroup pixelmux_interface PIXELMUX driver APIs
  12. * @ingroup pixelmux_interfaces
  13. * @{
  14. */
  15. #include "hpm_common.h"
  16. #include "hpm_soc.h"
  17. #include "hpm_pixelmux_regs.h"
  18. /**
  19. * @brief rgb interface pixel data source
  20. */
  21. typedef enum {
  22. pixelmux_rgb_sel_lcdc0 = 0,
  23. pixelmux_rgb_sel_lcdc1
  24. } pixelmux_rgb_select_t;
  25. /**
  26. * @brief gwc1 pixel data source
  27. */
  28. typedef enum {
  29. pixelmux_gwc1_sel_lcdc0 = 0,
  30. pixelmux_gwc1_sel_lcdc1
  31. } pixelmux_gwc1_select_t;
  32. /**
  33. * @brief gwc0 pixel data source
  34. */
  35. typedef enum {
  36. pixelmux_gwc0_sel_lcdc0 = 0,
  37. pixelmux_gwc0_sel_lcdc1
  38. } pixelmux_gwc0_select_t;
  39. /**
  40. * @brief lvb di1 pixel data source
  41. */
  42. typedef enum {
  43. pixelmux_lvb_di1_sel_lcdc0 = 0,
  44. pixelmux_lvb_di1_sel_lcdc1
  45. } pixelmux_lvb_di1_select_t;
  46. /**
  47. * @brief lvb di0 pixel data source
  48. */
  49. typedef enum {
  50. pixelmux_lvb_di0_sel_lcdc0 = 0,
  51. pixelmux_lvb_di0_sel_lcdc1
  52. } pixelmux_lvb_di0_select_t;
  53. /**
  54. * @brief mipi dsi1 pixel data source
  55. */
  56. typedef enum {
  57. pixelmux_mipi_dsi1_sel_lcdc0 = 0,
  58. pixelmux_mipi_dsi1_sel_lcdc1
  59. } pixelmux_mipi_dsi1_select_t;
  60. /**
  61. * @brief mipi dsi0 pixel data source
  62. */
  63. typedef enum {
  64. pixelmux_mipi_dsi0_sel_lcdc0 = 0,
  65. pixelmux_mipi_dsi0_sel_lcdc1
  66. } pixelmux_mipi_dsi0_select_t;
  67. /**
  68. * @brief mipi dsi pixel data type
  69. */
  70. typedef enum {
  71. pixelmux_mipi_dsi_data_type_rgb565 = 0,
  72. pixelmux_mipi_dsi_data_type_rgb666 = 3,
  73. pixelmux_mipi_dsi_data_type_rgb666_packed = 4,
  74. pixelmux_mipi_dsi_data_type_rgb888 = 5,
  75. } pixelmux_mipi_dsi_data_type_t;
  76. /**
  77. * @brief cam1 pixel data source
  78. */
  79. typedef enum {
  80. pixelmux_cam1_sel_dvp = 0,
  81. pixelmux_cam1_sel_mipi_csi0,
  82. pixelmux_cam1_sel_mipi_csi1,
  83. pixelmux_cam1_sel_lcdc0,
  84. pixelmux_cam1_sel_lcdc1,
  85. pixelmux_cam1_sel_lcb_do0,
  86. pixelmux_cam1_sel_lcb_do1,
  87. } pixelmux_cam1_select_t;
  88. /**
  89. * @brief cam0 pixel data source
  90. */
  91. typedef enum {
  92. pixelmux_cam0_sel_dvp = 0,
  93. pixelmux_cam0_sel_mipi_csi0,
  94. pixelmux_cam0_sel_mipi_csi1,
  95. pixelmux_cam0_sel_lcdc0,
  96. pixelmux_cam0_sel_lcdc1,
  97. pixelmux_cam0_sel_lcb_do0,
  98. pixelmux_cam0_sel_lcb_do1,
  99. } pixelmux_cam0_select_t;
  100. #define PIXELMUX_LVDS_TX_PHY_PFD_FREQ_MAX 40000000UL
  101. #define PIXELMUX_LVDS_TX_PHY_PFD_FREQ_MIN 10000000UL
  102. #define PIXELMUX_LVDS_TX_PHY_VCO_FREQ_MAX 4000000000UL
  103. #define PIXELMUX_LVDS_TX_PHY_VCO_FREQ_MIN 2000000000UL
  104. #define PIXELMUX_LVDS_TX_PHY_DATA_LANE_FREQ_MAX 1000000000UL
  105. typedef struct lvds_phy_clk_reg {
  106. uint32_t rate_lvds; /*!< rate_lvds[1:0] */
  107. uint32_t data_rate_div4;
  108. uint32_t refclk_div; /*!< refclk_div[3:0] */
  109. uint32_t pll_div; /*!< pll_div[14:0] */
  110. } lvds_phy_clk_reg_t;
  111. typedef struct lvds_phy_clk_param {
  112. lvds_phy_clk_reg_t reg;
  113. uint32_t fvco_freq_hz;
  114. uint32_t pfd_freq_hz;
  115. uint32_t lane_data_rate_hz;
  116. uint32_t hsclk_freq_hz;
  117. } lvds_phy_clk_param_t;
  118. typedef enum pixelmux_tx_phy_mode {
  119. pixelmux_tx_phy_mode_gpio = 0,
  120. pixelmux_tx_phy_mode_lvds = 1,
  121. pixelmux_tx_phy_mode_mipi = 2
  122. } pixelmux_tx_phy_mode_t;
  123. typedef enum pixelmux_rx_phy_mode {
  124. pixelmux_rx_phy_mode_gpio = 0,
  125. pixelmux_rx_phy_mode_lvds = 1,
  126. pixelmux_rx_phy_mode_mipi = 2,
  127. pixelmux_rx_phy_mode_lvds_camera = 3
  128. } pixelmux_rx_phy_mode_t;
  129. #ifdef __cplusplus
  130. extern "C" {
  131. #endif
  132. /**
  133. * @brief select pixel data source and enable for rgb interface
  134. *
  135. * @param[in] src rgb pixel data source options
  136. */
  137. void pixelmux_rgb_data_source_enable(pixelmux_rgb_select_t src);
  138. /**
  139. * @brief disable rgb interface pixel data source
  140. */
  141. void pixelmux_rgb_data_source_disable(void);
  142. /**
  143. * @brief select pixel data source and enable for gwc1
  144. *
  145. * @param[in] src gwc1 pixel data source options
  146. */
  147. void pixelmux_gwc1_data_source_enable(pixelmux_gwc1_select_t src);
  148. /**
  149. * @brief disable gwc1 pixel data source
  150. */
  151. void pixelmux_gwc1_data_source_disable(void);
  152. /**
  153. * @brief select pixel data source and enable for gwc0
  154. *
  155. * @param[in] src gwc0 pixel data source options
  156. */
  157. void pixelmux_gwc0_data_source_enable(pixelmux_gwc0_select_t src);
  158. /**
  159. * @brief disable gwc0 pixel data source
  160. */
  161. void pixelmux_gwc0_data_source_disable(void);
  162. /**
  163. * @brief select pixel data source and enable for lvb di1
  164. *
  165. * @param[in] src lvb di1 pixel data source options
  166. */
  167. void pixelmux_lvb_di1_data_source_enable(pixelmux_lvb_di1_select_t src);
  168. /**
  169. * @brief disable lvb di1 pixel data source
  170. */
  171. void pixelmux_lvb_di1_data_source_disable(void);
  172. /**
  173. * @brief select pixel data source and enable for lvb di0
  174. *
  175. * @param[in] src lvb di0 pixel data source options
  176. */
  177. void pixelmux_lvb_di0_data_source_enable(pixelmux_lvb_di0_select_t src);
  178. /**
  179. * @brief disable lvb di0 pixel data source
  180. */
  181. void pixelmux_lvb_di0_data_source_disable(void);
  182. /**
  183. * @brief select pixel data source and enable for mipi dsi1
  184. *
  185. * @param[in] src mipi dsi1 pixel data source options
  186. */
  187. void pixelmux_mipi_dsi1_data_source_enable(pixelmux_mipi_dsi1_select_t src);
  188. /**
  189. * @brief disable mipi dis1 pixel data source
  190. */
  191. void pixelmux_mipi_dsi1_data_source_disable(void);
  192. /**
  193. * @brief select pixel data source and enable for mipi dsi0
  194. *
  195. * @param[in] src mipi dsi0 pixel data source options
  196. */
  197. void pixelmux_mipi_dsi0_data_source_enable(pixelmux_mipi_dsi0_select_t src);
  198. /**
  199. * @brief disable mipi dsi0 pixel data source
  200. */
  201. void pixelmux_mipi_dsi0_data_source_disable(void);
  202. /**
  203. * @brief set data type for mipi dsi1
  204. *
  205. * @param[in] type mipi dsi data type
  206. */
  207. void pixelmux_mipi_dsi1_set_data_type(pixelmux_mipi_dsi_data_type_t type);
  208. /**
  209. * @brief set data type for mipi dsi0
  210. *
  211. * @param[in] type mipi dsi data type
  212. */
  213. void pixelmux_mipi_dsi0_set_data_type(pixelmux_mipi_dsi_data_type_t type);
  214. /**
  215. * @brief select pixel data source and enable for camera1
  216. *
  217. * @param[in] src camera1 pixel data source options
  218. */
  219. void pixelmux_cam1_data_source_enable(pixelmux_cam1_select_t src);
  220. /**
  221. * @brief disable camera1 pixel data source
  222. */
  223. void pixelmux_cam1_data_source_disable(void);
  224. /**
  225. * @brief select pixel data source and enable for camera0
  226. *
  227. * @param[in] src camera0 pixel data source options
  228. */
  229. void pixelmux_cam0_data_source_enable(pixelmux_cam0_select_t src);
  230. /**
  231. * @brief disable camera0 pixel data source
  232. */
  233. void pixelmux_cam0_data_source_disable(void);
  234. /**
  235. * @brief calculate pll config base pixel frequency
  236. *
  237. * @param[in] pixel_freq_hz lcdc pixel frequency
  238. * @param[in] is_split 1: enable split mode, 0: disable split mode
  239. * @param[out] param use for lvds phy config
  240. * @return status
  241. */
  242. hpm_stat_t pixelmux_lvds_phy_calc_pll_cfg(uint32_t pixel_freq_hz, bool is_split, lvds_phy_clk_param_t *param);
  243. /**
  244. * @brief config tx phy0 mode
  245. *
  246. * @param[in] mode phy mode
  247. */
  248. void pixelmux_config_tx_phy0_mode(pixelmux_tx_phy_mode_t mode);
  249. /**
  250. * @brief config tx phy1 mode
  251. *
  252. * @param[in] mode phy mode
  253. */
  254. void pixelmux_config_tx_phy1_mode(pixelmux_tx_phy_mode_t mode);
  255. /**
  256. * @brief config lvds tx phy0 clock
  257. *
  258. * @param[in] clk_reg phy register config
  259. */
  260. void pixelmux_config_lvds_tx_phy0_clk(const lvds_phy_clk_reg_t *clk_reg);
  261. /**
  262. * @brief config lvds tx phy1 clock
  263. *
  264. * @param[in] clk_reg phy register config
  265. */
  266. void pixelmux_config_lvds_tx_phy1_clk(const lvds_phy_clk_reg_t *clk_reg);
  267. /**
  268. * @brief config rx phy0 mode
  269. *
  270. * @param[in] mode phy mode
  271. */
  272. void pixelmux_config_rx_phy0_mode(pixelmux_rx_phy_mode_t mode);
  273. /**
  274. * @brief config rx phy1 mode
  275. *
  276. * @param[in] mode phy mode
  277. */
  278. void pixelmux_config_rx_phy1_mode(pixelmux_rx_phy_mode_t mode);
  279. #ifdef __cplusplus
  280. }
  281. #endif
  282. /**
  283. * @}
  284. */
  285. #endif /* HPM_PIXELMUX_DRV_H */