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