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