• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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