213 lines
5.2 KiB
C
213 lines
5.2 KiB
C
/*
|
|
* Copyright (c) 2023 HPMicro
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*
|
|
*/
|
|
|
|
#ifndef _HPM_PANEL_H
|
|
#define _HPM_PANEL_H
|
|
|
|
#include <stdint.h>
|
|
#include <string.h>
|
|
#include <stdbool.h>
|
|
|
|
struct hpm_panel;
|
|
typedef struct hpm_panel hpm_panel_t;
|
|
|
|
typedef struct hpm_panel_timing {
|
|
uint32_t pixel_clock_khz; /*!< pixel clocl,UINT: KHz */
|
|
uint32_t hactive; /*!< Horizontal active video */
|
|
uint32_t hfront_porch; /*!< Horizontal Front Porch */
|
|
uint32_t hback_porch; /*!< Horizontal Back Porch */
|
|
uint32_t hsync_len; /*!< Horizontal sync len */
|
|
|
|
uint32_t vactive; /*!< Vertical active video */
|
|
uint32_t vfront_porch; /*!< Vertical Front Porch */
|
|
uint32_t vback_porch; /*!< Vertical Back Porch */
|
|
uint32_t vsync_len; /*!< Vertical sync len */
|
|
uint32_t hsync_pol :1; /*!< Horizontal Synchronization Signal Polarity, 0: High Active, 1: Low Active */
|
|
uint32_t vsync_pol :1; /*!< Vertical Synchronization Signal Polarity, 0: High Active, 1: Low Active */
|
|
uint32_t de_pol :1; /*!< Data Enable Signal Polarity, 0: High Active, 1: Low Active */
|
|
uint32_t pixel_clk_pol :1; /*!< Pixel Clock Signal Polarity, 0: High Active, 1: Low Active */
|
|
uint32_t pixel_data_pol :1;/*!< Pixel Data Signal Polarity, 0: High Active, 1: Low Active */
|
|
} hpm_panel_timing_t;
|
|
|
|
typedef enum hpm_panel_mipi_format {
|
|
HPM_PANEL_MIPI_FORMAT_RGB888,
|
|
HPM_PANEL_MIPI_FORMAT_RGB666,
|
|
HPM_PANEL_MIPI_FORMAT_RGB666_PACKED,
|
|
HPM_PANEL_MIPI_FORMAT_RGB565
|
|
} hpm_panel_mipi_format;
|
|
|
|
typedef struct hpm_panel_hw_interface {
|
|
uint32_t lcdc_pixel_clk_khz;
|
|
void (*set_reset_pin_level)(uint8_t level);
|
|
void (*set_backlight)(uint16_t percent);
|
|
void (*set_video_router)(void);
|
|
union {
|
|
struct {
|
|
hpm_panel_mipi_format format;
|
|
void *mipi_host_base;
|
|
void *mipi_phy_base;
|
|
} mipi;
|
|
struct {
|
|
uint32_t channel_di_index :8;
|
|
uint32_t channel_index :8;
|
|
void *lvb_base;
|
|
} lvds;
|
|
} video;
|
|
} hpm_panel_hw_interface_t;
|
|
|
|
typedef struct hpm_panel_funcs {
|
|
void (*reset)(hpm_panel_t *panel);
|
|
void (*init)(hpm_panel_t *panel);
|
|
void (*power_on)(hpm_panel_t *panel);
|
|
void (*power_off)(hpm_panel_t *panel);
|
|
} hpm_panel_funcs_t;
|
|
|
|
typedef enum hpm_panel_if_type {
|
|
HPM_PANEL_IF_TYPE_RGB,
|
|
HPM_PANEL_IF_TYPE_LVDS_SINGLE,
|
|
HPM_PANEL_IF_TYPE_LVDS_SPLIT,
|
|
HPM_PANEL_IF_TYPE_MIPI,
|
|
} hpm_panel_if_type_t;
|
|
|
|
typedef enum hpm_panel_state_power {
|
|
HPM_PANEL_STATE_POWER_OFF,
|
|
HPM_PANEL_STATE_POWER_ON
|
|
} hpm_panel_power_state_t;
|
|
|
|
typedef struct hpm_panel_state {
|
|
uint8_t backlight_percent;
|
|
uint8_t power_state;
|
|
} hpm_panel_state_t;
|
|
|
|
struct hpm_panel {
|
|
const char *name;
|
|
hpm_panel_if_type_t if_type;
|
|
const hpm_panel_timing_t timing;
|
|
hpm_panel_state_t state;
|
|
hpm_panel_hw_interface_t hw_if;
|
|
hpm_panel_funcs_t funcs;
|
|
};
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/**
|
|
* @brief Find default panel
|
|
*
|
|
* @return pointer of panel instance
|
|
*/
|
|
hpm_panel_t *hpm_panel_find_device_default(void);
|
|
|
|
/**
|
|
* @brief Find panel for name
|
|
*
|
|
* @param [in] name of panel
|
|
*
|
|
* @return pointer of panel instance
|
|
*/
|
|
hpm_panel_t *hpm_panel_find_device(const char *name);
|
|
|
|
/**
|
|
* @brief Get panel name
|
|
*
|
|
* @param panel pointer of panel instance
|
|
*
|
|
* @return panel name
|
|
*/
|
|
const char *hpm_panel_get_name(hpm_panel_t *panel);
|
|
|
|
/**
|
|
* @brief Get panel timing
|
|
*
|
|
* @param panel pointer of panel instance
|
|
*
|
|
* @return pointer of timing
|
|
*/
|
|
const hpm_panel_timing_t *hpm_panel_get_timing(hpm_panel_t *panel);
|
|
|
|
/**
|
|
* @brief Get panel interface type
|
|
*
|
|
* @param [in] panel pointer of panel instance
|
|
*
|
|
* @return panel interface type @ref hpm_panel_if_type_t
|
|
*/
|
|
hpm_panel_if_type_t hpm_panel_get_if_type(hpm_panel_t *panel);
|
|
|
|
/**
|
|
* @brief Register platform level hardware interface
|
|
*
|
|
* @param [in] panel pointer of panel instance
|
|
* @param [in] hw_if pointer of hardware interface
|
|
*/
|
|
void hpm_panel_register_interface(hpm_panel_t *panel, hpm_panel_hw_interface_t *hw_if);
|
|
|
|
/**
|
|
* @brief Reset the panel
|
|
*
|
|
* @param [in] panel pointer of panel instance
|
|
*/
|
|
void hpm_panel_reset(hpm_panel_t *panel);
|
|
|
|
/**
|
|
* @brief Initialize the panel
|
|
*
|
|
* @param [in] panel pointer of panel instance
|
|
*/
|
|
void hpm_panel_init(hpm_panel_t *panel);
|
|
|
|
/**
|
|
* @brief Power on the panel
|
|
*
|
|
* @param [in] panel pointer of panel instance
|
|
*/
|
|
void hpm_panel_power_on(hpm_panel_t *panel);
|
|
|
|
/**
|
|
* @brief Power off the panel
|
|
*
|
|
* @param [in] panel pointer of panel instance
|
|
*/
|
|
void hpm_panel_power_off(hpm_panel_t *panel);
|
|
|
|
/**
|
|
* @brief Set backlight value
|
|
*
|
|
* @param [in] panel pointer of panel instance
|
|
* @param [in] percent percent of backlight [0 - 100]
|
|
*/
|
|
void hpm_panel_set_backlight(hpm_panel_t *panel, uint16_t percent);
|
|
|
|
/**
|
|
*
|
|
* @brief Get backlight value
|
|
*
|
|
* @param [in] panel pointer of panel instance
|
|
* @return percent of backlight [0 - 100]
|
|
*/
|
|
uint8_t hpm_panel_get_backlight(hpm_panel_t *panel);
|
|
|
|
/**
|
|
* @brief Delay specified milliseconds
|
|
*
|
|
* @param [in] ms expected delay interval in milliseconds
|
|
*/
|
|
void hpm_panel_delay_ms(uint32_t ms);
|
|
|
|
/**
|
|
* @brief Delay specified microseconds
|
|
*
|
|
* @param [in] us expected delay interval in microseconds
|
|
*/
|
|
void hpm_panel_delay_us(uint32_t us);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* _HPM_PANEL_H */ |