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 cam1 pixel data source 80 */ 81 typedef enum { 82 pixelmux_cam1_sel_dvp = 0, 83 pixelmux_cam1_sel_mipi_csi0, 84 pixelmux_cam1_sel_mipi_csi1, 85 pixelmux_cam1_sel_lcdc0, 86 pixelmux_cam1_sel_lcdc1, 87 pixelmux_cam1_sel_lcb_do0, 88 pixelmux_cam1_sel_lcb_do1, 89 } pixelmux_cam1_select_t; 90 91 /** 92 * @brief cam0 pixel data source 93 */ 94 typedef enum { 95 pixelmux_cam0_sel_dvp = 0, 96 pixelmux_cam0_sel_mipi_csi0, 97 pixelmux_cam0_sel_mipi_csi1, 98 pixelmux_cam0_sel_lcdc0, 99 pixelmux_cam0_sel_lcdc1, 100 pixelmux_cam0_sel_lcb_do0, 101 pixelmux_cam0_sel_lcb_do1, 102 } pixelmux_cam0_select_t; 103 104 #define PIXELMUX_LVDS_TX_PHY_PFD_FREQ_MAX 40000000UL 105 #define PIXELMUX_LVDS_TX_PHY_PFD_FREQ_MIN 10000000UL 106 107 #define PIXELMUX_LVDS_TX_PHY_VCO_FREQ_MAX 4000000000UL 108 #define PIXELMUX_LVDS_TX_PHY_VCO_FREQ_MIN 2000000000UL 109 110 #define PIXELMUX_LVDS_TX_PHY_DATA_LANE_FREQ_MAX 1000000000UL 111 112 typedef struct lvds_phy_clk_reg { 113 uint32_t rate_lvds; /*!< rate_lvds[1:0] */ 114 uint32_t data_rate_div4; 115 uint32_t refclk_div; /*!< refclk_div[3:0] */ 116 uint32_t pll_div; /*!< pll_div[14:0] */ 117 } lvds_phy_clk_reg_t; 118 119 typedef struct lvds_phy_clk_param { 120 lvds_phy_clk_reg_t reg; 121 uint32_t fvco_freq_hz; 122 uint32_t pfd_freq_hz; 123 uint32_t lane_data_rate_hz; 124 uint32_t hsclk_freq_hz; 125 } lvds_phy_clk_param_t; 126 127 typedef enum pixelmux_tx_phy_mode { 128 pixelmux_tx_phy_mode_gpio = 0, 129 pixelmux_tx_phy_mode_lvds = 1, 130 pixelmux_tx_phy_mode_mipi = 2 131 } pixelmux_tx_phy_mode_t; 132 133 typedef enum pixelmux_rx_phy_mode { 134 pixelmux_rx_phy_mode_gpio = 0, 135 pixelmux_rx_phy_mode_lvds = 1, 136 pixelmux_rx_phy_mode_mipi = 2, 137 pixelmux_rx_phy_mode_lvds_camera = 3 138 } pixelmux_rx_phy_mode_t; 139 140 141 #ifdef __cplusplus 142 extern "C" { 143 #endif 144 145 /** 146 * @brief select pixel data source and enable for rgb interface 147 * 148 * @param[in] src rgb pixel data source options 149 */ 150 void pixelmux_rgb_data_source_enable(pixelmux_rgb_select_t src); 151 152 /** 153 * @brief disable rgb interface pixel data source 154 */ 155 void pixelmux_rgb_data_source_disable(void); 156 157 /** 158 * @brief select pixel data source and enable for gwc1 159 * 160 * @param[in] src gwc1 pixel data source options 161 */ 162 void pixelmux_gwc1_data_source_enable(pixelmux_gwc1_select_t src); 163 164 /** 165 * @brief disable gwc1 pixel data source 166 */ 167 void pixelmux_gwc1_data_source_disable(void); 168 169 /** 170 * @brief select pixel data source and enable for gwc0 171 * 172 * @param[in] src gwc0 pixel data source options 173 */ 174 void pixelmux_gwc0_data_source_enable(pixelmux_gwc0_select_t src); 175 176 /** 177 * @brief disable gwc0 pixel data source 178 */ 179 void pixelmux_gwc0_data_source_disable(void); 180 181 /** 182 * @brief select pixel data source and enable for lvb di1 183 * 184 * @param[in] src lvb di1 pixel data source options 185 */ 186 void pixelmux_lvb_di1_data_source_enable(pixelmux_lvb_di1_select_t src); 187 188 /** 189 * @brief disable lvb di1 pixel data source 190 */ 191 void pixelmux_lvb_di1_data_source_disable(void); 192 193 /** 194 * @brief select pixel data source and enable for lvb di0 195 * 196 * @param[in] src lvb di0 pixel data source options 197 */ 198 void pixelmux_lvb_di0_data_source_enable(pixelmux_lvb_di0_select_t src); 199 200 /** 201 * @brief disable lvb di0 pixel data source 202 */ 203 void pixelmux_lvb_di0_data_source_disable(void); 204 205 /** 206 * @brief select pixel data source and enable for mipi dsi1 207 * 208 * @param[in] src mipi dsi1 pixel data source options 209 */ 210 void pixelmux_mipi_dsi1_data_source_enable(pixelmux_mipi_dsi1_select_t src); 211 212 /** 213 * @brief disable mipi dis1 pixel data source 214 */ 215 void pixelmux_mipi_dsi1_data_source_disable(void); 216 217 /** 218 * @brief select pixel data source and enable for mipi dsi0 219 * 220 * @param[in] src mipi dsi0 pixel data source options 221 */ 222 void pixelmux_mipi_dsi0_data_source_enable(pixelmux_mipi_dsi0_select_t src); 223 224 /** 225 * @brief disable mipi dsi0 pixel data source 226 */ 227 void pixelmux_mipi_dsi0_data_source_disable(void); 228 229 /** 230 * @brief select pixel data source and enable for camera1 231 * 232 * @param[in] src camera1 pixel data source options 233 */ 234 void pixelmux_cam1_data_source_enable(pixelmux_cam1_select_t src); 235 236 /** 237 * @brief disable camera1 pixel data source 238 */ 239 void pixelmux_cam1_data_source_disable(void); 240 241 /** 242 * @brief select pixel data source and enable for camera0 243 * 244 * @param[in] src camera0 pixel data source options 245 */ 246 void pixelmux_cam0_data_source_enable(pixelmux_cam0_select_t src); 247 248 /** 249 * @brief disable camera0 pixel data source 250 */ 251 void pixelmux_cam0_data_source_disable(void); 252 253 /** 254 * @brief calculate pll config base pixel frequency 255 * 256 * @param[in] pixel_freq_hz lcdc pixel frequency 257 * @param[in] is_split 1: enable split mode, 0: disable split mode 258 * @param[out] param use for lvds phy config 259 * @return status 260 */ 261 hpm_stat_t pixelmux_lvds_phy_calc_pll_cfg(uint32_t pixel_freq_hz, bool is_split, lvds_phy_clk_param_t *param); 262 263 /** 264 * @brief config tx phy0 mode 265 * 266 * @param[in] mode phy mode 267 */ 268 void pixelmux_config_tx_phy0_mode(pixelmux_tx_phy_mode_t mode); 269 270 /** 271 * @brief config tx phy1 mode 272 * 273 * @param[in] mode phy mode 274 */ 275 void pixelmux_config_tx_phy1_mode(pixelmux_tx_phy_mode_t mode); 276 277 /** 278 * @brief config lvds tx phy0 clock 279 * 280 * @param[in] clk_reg phy register config 281 */ 282 void pixelmux_config_lvds_tx_phy0_clk(const lvds_phy_clk_reg_t *clk_reg); 283 284 /** 285 * @brief config lvds tx phy1 clock 286 * 287 * @param[in] clk_reg phy register config 288 */ 289 void pixelmux_config_lvds_tx_phy1_clk(const lvds_phy_clk_reg_t *clk_reg); 290 291 /** 292 * @brief config rx phy0 mode 293 * 294 * @param[in] mode phy mode 295 */ 296 void pixelmux_config_rx_phy0_mode(pixelmux_rx_phy_mode_t mode); 297 298 /** 299 * @brief config rx phy1 mode 300 * 301 * @param[in] mode phy mode 302 */ 303 void pixelmux_config_rx_phy1_mode(pixelmux_rx_phy_mode_t mode); 304 305 #ifdef __cplusplus 306 } 307 #endif 308 309 /** 310 * @} 311 */ 312 #endif /* HPM_PIXELMUX_DRV_H */ 313