123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336 |
- /*
- * Copyright (c) 2023 HPMicro
- *
- * SPDX-License-Identifier: BSD-3-Clause
- *
- */
- #ifndef HPM_PIXELMUX_DRV_H
- #define HPM_PIXELMUX_DRV_H
- /**
- * @brief PIXELMUX APIs
- * @defgroup pixelmux_interface PIXELMUX driver APIs
- * @ingroup pixelmux_interfaces
- * @{
- */
- #include "hpm_common.h"
- #include "hpm_soc.h"
- #include "hpm_pixelmux_regs.h"
- /**
- * @brief rgb interface pixel data source
- */
- typedef enum {
- pixelmux_rgb_sel_lcdc0 = 0,
- pixelmux_rgb_sel_lcdc1
- } pixelmux_rgb_select_t;
- /**
- * @brief gwc1 pixel data source
- */
- typedef enum {
- pixelmux_gwc1_sel_lcdc0 = 0,
- pixelmux_gwc1_sel_lcdc1
- } pixelmux_gwc1_select_t;
- /**
- * @brief gwc0 pixel data source
- */
- typedef enum {
- pixelmux_gwc0_sel_lcdc0 = 0,
- pixelmux_gwc0_sel_lcdc1
- } pixelmux_gwc0_select_t;
- /**
- * @brief lvb di1 pixel data source
- */
- typedef enum {
- pixelmux_lvb_di1_sel_lcdc0 = 0,
- pixelmux_lvb_di1_sel_lcdc1
- } pixelmux_lvb_di1_select_t;
- /**
- * @brief lvb di0 pixel data source
- */
- typedef enum {
- pixelmux_lvb_di0_sel_lcdc0 = 0,
- pixelmux_lvb_di0_sel_lcdc1
- } pixelmux_lvb_di0_select_t;
- /**
- * @brief mipi dsi1 pixel data source
- */
- typedef enum {
- pixelmux_mipi_dsi1_sel_lcdc0 = 0,
- pixelmux_mipi_dsi1_sel_lcdc1
- } pixelmux_mipi_dsi1_select_t;
- /**
- * @brief mipi dsi0 pixel data source
- */
- typedef enum {
- pixelmux_mipi_dsi0_sel_lcdc0 = 0,
- pixelmux_mipi_dsi0_sel_lcdc1
- } pixelmux_mipi_dsi0_select_t;
- /**
- * @brief mipi dsi pixel data type
- */
- typedef enum {
- pixelmux_mipi_dsi_data_type_rgb565 = 0,
- pixelmux_mipi_dsi_data_type_rgb666 = 3,
- pixelmux_mipi_dsi_data_type_rgb666_packed = 4,
- pixelmux_mipi_dsi_data_type_rgb888 = 5,
- } pixelmux_mipi_dsi_data_type_t;
- /**
- * @brief cam1 pixel data source
- */
- typedef enum {
- pixelmux_cam1_sel_dvp = 0,
- pixelmux_cam1_sel_mipi_csi0,
- pixelmux_cam1_sel_mipi_csi1,
- pixelmux_cam1_sel_lcdc0,
- pixelmux_cam1_sel_lcdc1,
- pixelmux_cam1_sel_lcb_do0,
- pixelmux_cam1_sel_lcb_do1,
- } pixelmux_cam1_select_t;
- /**
- * @brief cam0 pixel data source
- */
- typedef enum {
- pixelmux_cam0_sel_dvp = 0,
- pixelmux_cam0_sel_mipi_csi0,
- pixelmux_cam0_sel_mipi_csi1,
- pixelmux_cam0_sel_lcdc0,
- pixelmux_cam0_sel_lcdc1,
- pixelmux_cam0_sel_lcb_do0,
- pixelmux_cam0_sel_lcb_do1,
- } pixelmux_cam0_select_t;
- #define PIXELMUX_LVDS_TX_PHY_PFD_FREQ_MAX 40000000UL
- #define PIXELMUX_LVDS_TX_PHY_PFD_FREQ_MIN 10000000UL
- #define PIXELMUX_LVDS_TX_PHY_VCO_FREQ_MAX 4000000000UL
- #define PIXELMUX_LVDS_TX_PHY_VCO_FREQ_MIN 2000000000UL
- #define PIXELMUX_LVDS_TX_PHY_DATA_LANE_FREQ_MAX 1000000000UL
- typedef struct lvds_phy_clk_reg {
- uint32_t rate_lvds; /*!< rate_lvds[1:0] */
- uint32_t data_rate_div4;
- uint32_t refclk_div; /*!< refclk_div[3:0] */
- uint32_t pll_div; /*!< pll_div[14:0] */
- } lvds_phy_clk_reg_t;
- typedef struct lvds_phy_clk_param {
- lvds_phy_clk_reg_t reg;
- uint32_t fvco_freq_hz;
- uint32_t pfd_freq_hz;
- uint32_t lane_data_rate_hz;
- uint32_t hsclk_freq_hz;
- } lvds_phy_clk_param_t;
- typedef enum pixelmux_tx_phy_mode {
- pixelmux_tx_phy_mode_gpio = 0,
- pixelmux_tx_phy_mode_lvds = 1,
- pixelmux_tx_phy_mode_mipi = 2
- } pixelmux_tx_phy_mode_t;
- typedef enum pixelmux_rx_phy_mode {
- pixelmux_rx_phy_mode_gpio = 0,
- pixelmux_rx_phy_mode_lvds = 1,
- pixelmux_rx_phy_mode_mipi = 2,
- pixelmux_rx_phy_mode_lvds_camera = 3
- } pixelmux_rx_phy_mode_t;
- #ifdef __cplusplus
- extern "C" {
- #endif
- /**
- * @brief select pixel data source and enable for rgb interface
- *
- * @param[in] src rgb pixel data source options
- */
- void pixelmux_rgb_data_source_enable(pixelmux_rgb_select_t src);
- /**
- * @brief disable rgb interface pixel data source
- */
- void pixelmux_rgb_data_source_disable(void);
- /**
- * @brief select pixel data source and enable for gwc1
- *
- * @param[in] src gwc1 pixel data source options
- */
- void pixelmux_gwc1_data_source_enable(pixelmux_gwc1_select_t src);
- /**
- * @brief disable gwc1 pixel data source
- */
- void pixelmux_gwc1_data_source_disable(void);
- /**
- * @brief select pixel data source and enable for gwc0
- *
- * @param[in] src gwc0 pixel data source options
- */
- void pixelmux_gwc0_data_source_enable(pixelmux_gwc0_select_t src);
- /**
- * @brief disable gwc0 pixel data source
- */
- void pixelmux_gwc0_data_source_disable(void);
- /**
- * @brief select pixel data source and enable for lvb di1
- *
- * @param[in] src lvb di1 pixel data source options
- */
- void pixelmux_lvb_di1_data_source_enable(pixelmux_lvb_di1_select_t src);
- /**
- * @brief disable lvb di1 pixel data source
- */
- void pixelmux_lvb_di1_data_source_disable(void);
- /**
- * @brief select pixel data source and enable for lvb di0
- *
- * @param[in] src lvb di0 pixel data source options
- */
- void pixelmux_lvb_di0_data_source_enable(pixelmux_lvb_di0_select_t src);
- /**
- * @brief disable lvb di0 pixel data source
- */
- void pixelmux_lvb_di0_data_source_disable(void);
- /**
- * @brief select pixel data source and enable for mipi dsi1
- *
- * @param[in] src mipi dsi1 pixel data source options
- */
- void pixelmux_mipi_dsi1_data_source_enable(pixelmux_mipi_dsi1_select_t src);
- /**
- * @brief disable mipi dis1 pixel data source
- */
- void pixelmux_mipi_dsi1_data_source_disable(void);
- /**
- * @brief select pixel data source and enable for mipi dsi0
- *
- * @param[in] src mipi dsi0 pixel data source options
- */
- void pixelmux_mipi_dsi0_data_source_enable(pixelmux_mipi_dsi0_select_t src);
- /**
- * @brief disable mipi dsi0 pixel data source
- */
- void pixelmux_mipi_dsi0_data_source_disable(void);
- /**
- * @brief set data type for mipi dsi1
- *
- * @param[in] type mipi dsi data type
- */
- void pixelmux_mipi_dsi1_set_data_type(pixelmux_mipi_dsi_data_type_t type);
- /**
- * @brief set data type for mipi dsi0
- *
- * @param[in] type mipi dsi data type
- */
- void pixelmux_mipi_dsi0_set_data_type(pixelmux_mipi_dsi_data_type_t type);
- /**
- * @brief select pixel data source and enable for camera1
- *
- * @param[in] src camera1 pixel data source options
- */
- void pixelmux_cam1_data_source_enable(pixelmux_cam1_select_t src);
- /**
- * @brief disable camera1 pixel data source
- */
- void pixelmux_cam1_data_source_disable(void);
- /**
- * @brief select pixel data source and enable for camera0
- *
- * @param[in] src camera0 pixel data source options
- */
- void pixelmux_cam0_data_source_enable(pixelmux_cam0_select_t src);
- /**
- * @brief disable camera0 pixel data source
- */
- void pixelmux_cam0_data_source_disable(void);
- /**
- * @brief calculate pll config base pixel frequency
- *
- * @param[in] pixel_freq_hz lcdc pixel frequency
- * @param[in] is_split 1: enable split mode, 0: disable split mode
- * @param[out] param use for lvds phy config
- * @return status
- */
- hpm_stat_t pixelmux_lvds_phy_calc_pll_cfg(uint32_t pixel_freq_hz, bool is_split, lvds_phy_clk_param_t *param);
- /**
- * @brief config tx phy0 mode
- *
- * @param[in] mode phy mode
- */
- void pixelmux_config_tx_phy0_mode(pixelmux_tx_phy_mode_t mode);
- /**
- * @brief config tx phy1 mode
- *
- * @param[in] mode phy mode
- */
- void pixelmux_config_tx_phy1_mode(pixelmux_tx_phy_mode_t mode);
- /**
- * @brief config lvds tx phy0 clock
- *
- * @param[in] clk_reg phy register config
- */
- void pixelmux_config_lvds_tx_phy0_clk(const lvds_phy_clk_reg_t *clk_reg);
- /**
- * @brief config lvds tx phy1 clock
- *
- * @param[in] clk_reg phy register config
- */
- void pixelmux_config_lvds_tx_phy1_clk(const lvds_phy_clk_reg_t *clk_reg);
- /**
- * @brief config rx phy0 mode
- *
- * @param[in] mode phy mode
- */
- void pixelmux_config_rx_phy0_mode(pixelmux_rx_phy_mode_t mode);
- /**
- * @brief config rx phy1 mode
- *
- * @param[in] mode phy mode
- */
- void pixelmux_config_rx_phy1_mode(pixelmux_rx_phy_mode_t mode);
- #ifdef __cplusplus
- }
- #endif
- /**
- * @}
- */
- #endif /* HPM_PIXELMUX_DRV_H */
|