1 /*
2 * Copyright (c) 2020 - 2024 Renesas Electronics Corporation and/or its affiliates
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6 
7 /*******************************************************************************************************************//**
8  * @addtogroup GLCDC
9  * @{
10  **********************************************************************************************************************/
11 
12 #ifndef R_GLCDC_H
13 #define R_GLCDC_H
14 
15 /***********************************************************************************************************************
16  * Includes
17  **********************************************************************************************************************/
18 #include "bsp_api.h"
19 #include "r_display_api.h"
20 
21 /* Common macro for FSP header files. There is also a corresponding FSP_FOOTER macro at the end of this file. */
22 FSP_HEADER
23 
24 /***********************************************************************************************************************
25  * Macro definitions
26  **********************************************************************************************************************/
27 
28 /***********************************************************************************************************************
29  * Typedef definitions
30  **********************************************************************************************************************/
31 
32 /** Display control block.  DO NOT INITIALIZE. */
33 typedef struct st_glcdc_instance_ctrl
34 {
35     display_state_t state;                                 // Status of GLCDC module
36 
37     /* Parameters to Event processing for display devices */
38     void (* p_callback)(display_callback_args_t * p_args); // Pointer to callback function
39     void const          * p_context;                       // Pointer to the higher level device context
40     const display_cfg_t * p_cfg;                           // Pointer to initial configurations
41 } glcdc_instance_ctrl_t;
42 
43 /** Clock source select */
44 typedef enum e_glcdc_clk_src
45 {
46     GLCDC_CLK_SRC_INTERNAL,            ///< Internal
47     GLCDC_CLK_SRC_EXTERNAL,            ///< External
48 } glcdc_clk_src_t;
49 
50 /** Clock frequency division ratio */
51 typedef enum e_glcdc_panel_clk_div
52 {
53     GLCDC_PANEL_CLK_DIVISOR_1  = 1,    ///< Division Ratio 1/1
54     GLCDC_PANEL_CLK_DIVISOR_2  = 2,    ///< Division Ratio 1/2
55     GLCDC_PANEL_CLK_DIVISOR_3  = 3,    ///< Division Ratio 1/3
56     GLCDC_PANEL_CLK_DIVISOR_4  = 4,    ///< Division Ratio 1/4
57     GLCDC_PANEL_CLK_DIVISOR_5  = 5,    ///< Division Ratio 1/5
58     GLCDC_PANEL_CLK_DIVISOR_6  = 6,    ///< Division Ratio 1/6
59     GLCDC_PANEL_CLK_DIVISOR_7  = 7,    ///< Division Ratio 1/7
60     GLCDC_PANEL_CLK_DIVISOR_8  = 8,    ///< Division Ratio 1/8
61     GLCDC_PANEL_CLK_DIVISOR_9  = 9,    ///< Division Ratio 1/9
62     GLCDC_PANEL_CLK_DIVISOR_12 = 12,   ///< Division Ratio 1/12
63     GLCDC_PANEL_CLK_DIVISOR_16 = 16,   ///< Division Ratio 1/16
64     GLCDC_PANEL_CLK_DIVISOR_24 = 24,   ///< Division Ratio 1/24
65     GLCDC_PANEL_CLK_DIVISOR_32 = 32,   ///< Division Ratio 1/32
66 } glcdc_panel_clk_div_t;
67 
68 /** LCD TCON output pin select */
69 typedef enum e_glcdc_tcon_pin
70 {
71     GLCDC_TCON_PIN_NONE = -1,          ///< No output
72     GLCDC_TCON_PIN_0,                  ///< LCD_TCON0
73     GLCDC_TCON_PIN_1,                  ///< LCD_TCON1
74     GLCDC_TCON_PIN_2,                  ///< LCD_TCON2
75     GLCDC_TCON_PIN_3,                  ///< LCD_TCON3
76 } glcdc_tcon_pin_t;
77 
78 /** Bus Arbitration setting */
79 typedef enum e_glcdc_bus_arbitraion
80 {
81     GLCDC_BUS_ARBITRATION_ROUNDROBIN,  ///< Round robin
82     GLCDC_BUS_ARBITRATION_FIX_PRIORITY ///< Fixed
83 } glcdc_bus_arbitration_t;
84 
85 /** Correction circuit sequence control */
86 typedef enum e_glcdc_correction_proc_order
87 {
88     GLCDC_CORRECTION_PROC_ORDER_BRIGHTNESS_CONTRAST2GAMMA, ///< Brightness -> contrast -> gamma correction
89     GLCDC_CORRECTION_PROC_ORDER_GAMMA2BRIGHTNESS_CONTRAST  ///< Gamma correction -> brightness -> contrast
90 } glcdc_correction_proc_order_t;
91 
92 /** Timing signals for driving the LCD panel */
93 typedef enum e_glcdc_tcon_signal_select
94 {
95     GLCDC_TCON_SIGNAL_SELECT_STVA_VS = 0, ///< STVA/VS
96     GLCDC_TCON_SIGNAL_SELECT_STVB_VE = 1, ///< STVB/VE
97     GLCDC_TCON_SIGNAL_SELECT_STHA_HS = 2, ///< STH/SP/HS
98     GLCDC_TCON_SIGNAL_SELECT_STHB_HE = 3, ///< STB/LP/HE
99     GLCDC_TCON_SIGNAL_SELECT_DE      = 7  ///< DE
100 } glcdc_tcon_signal_select_t;
101 
102 /** Clock phase adjustment for serial RGB output */
103 typedef enum e_glcdc_clut_plane
104 {
105     GLCDC_CLUT_PLANE_0 = 0,            ///< GLCDC CLUT plane 0
106     GLCDC_CLUT_PLANE_1 = 1,            ///< GLCDC CLUT plane 1
107 } glcdc_clut_plane_t;
108 
109 /** Dithering mode */
110 typedef enum e_glcdc_dithering_mode
111 {
112     GLCDC_DITHERING_MODE_TRUNCATE   = 0, ///< No dithering (truncate)
113     GLCDC_DITHERING_MODE_ROUND_OFF  = 1, ///< Dithering with round off
114     GLCDC_DITHERING_MODE_2X2PATTERN = 2, ///< Dithering with 2x2 pattern
115     GLCDC_DITHERING_MODE_SETTING_MAX
116 } glcdc_dithering_mode_t;
117 
118 /** Dithering mode */
119 typedef enum e_glcdc_dithering_pattern
120 {
121     GLCDC_DITHERING_PATTERN_00 = 0,    ///< 2x2 pattern '00'
122     GLCDC_DITHERING_PATTERN_01 = 1,    ///< 2x2 pattern '01'
123     GLCDC_DITHERING_PATTERN_10 = 2,    ///< 2x2 pattern '10'
124     GLCDC_DITHERING_PATTERN_11 = 3,    ///< 2x2 pattern '11'
125 } glcdc_dithering_pattern_t;
126 
127 /** Output interface format */
128 typedef enum e_glcdc_input_interface_format
129 {
130     GLCDC_INPUT_INTERFACE_FORMAT_RGB565   = 0, ///< Input interface format RGB565
131     GLCDC_INPUT_INTERFACE_FORMAT_RGB888   = 1, ///< Input interface format RGB888
132     GLCDC_INPUT_INTERFACE_FORMAT_ARGB1555 = 2, ///< Input interface format ARGB1555
133     GLCDC_INPUT_INTERFACE_FORMAT_ARGB4444 = 3, ///< Input interface format ARGB4444
134     GLCDC_INPUT_INTERFACE_FORMAT_ARGB8888 = 4, ///< Input interface format ARGB8888
135     GLCDC_INPUT_INTERFACE_FORMAT_CLUT8    = 5, ///< Input interface format CLUT8
136     GLCDC_INPUT_INTERFACE_FORMAT_CLUT4    = 6, ///< Input interface format CLUT4
137     GLCDC_INPUT_INTERFACE_FORMAT_CLUT1    = 7, ///< Input interface format CLUT1
138 } glcdc_input_interface_format_t;
139 
140 /** Output interface format */
141 typedef enum e_glcdc_output_interface_format
142 {
143     GLCDC_OUTPUT_INTERFACE_FORMAT_RGB888     = 0, ///< Output interface format RGB888
144     GLCDC_OUTPUT_INTERFACE_FORMAT_RGB666     = 1, ///< Output interface format RGB666
145     GLCDC_OUTPUT_INTERFACE_FORMAT_RGB565     = 2, ///< Output interface format RGB565
146     GLCDC_OUTPUT_INTERFACE_FORMAT_SERIAL_RGB = 3, ///< Output interface format Serial RGB
147 } glcdc_output_interface_format_t;
148 
149 /** Dithering output format */
150 typedef enum e_glcdc_dithering_output_format
151 {
152     GLCDC_DITHERING_OUTPUT_FORMAT_RGB888 = 0, ///< Dithering output format RGB888
153     GLCDC_DITHERING_OUTPUT_FORMAT_RGB666 = 1, ///< Dithering output format RGB666
154     GLCDC_DITHERING_OUTPUT_FORMAT_RGB565 = 2, ///< Dithering output format RGB565
155 } glcdc_dithering_output_format_t;
156 
157 /** GLCDC hardware specific configuration */
158 typedef struct st_glcdc_extended_cfg
159 {
160     glcdc_tcon_pin_t              tcon_hsync;            ///< GLCDC TCON output pin select
161     glcdc_tcon_pin_t              tcon_vsync;            ///< GLCDC TCON output pin select
162     glcdc_tcon_pin_t              tcon_de;               ///< GLCDC TCON output pin select
163     glcdc_correction_proc_order_t correction_proc_order; ///< Correction control route select
164     glcdc_clk_src_t               clksrc;                ///< Clock Source selection
165     glcdc_panel_clk_div_t         clock_div_ratio;       ///< Clock divide ratio for dot clock
166     glcdc_dithering_mode_t        dithering_mode;        ///< Dithering mode
167     glcdc_dithering_pattern_t     dithering_pattern_A;   ///< Dithering pattern A
168     glcdc_dithering_pattern_t     dithering_pattern_B;   ///< Dithering pattern B
169     glcdc_dithering_pattern_t     dithering_pattern_C;   ///< Dithering pattern C
170     glcdc_dithering_pattern_t     dithering_pattern_D;   ///< Dithering pattern D
171     void * phy_layer;                                    ///< Alternate PHY layer, such as MIPI DSI.
172 } glcdc_extended_cfg_t;
173 
174 /* GLCDC hardware specific control block */
175 typedef struct st_glcdc_ctrl
176 {
177     display_coordinate_t back_porch;   ///< Zero coordinate for graphics plane(Back porch end)
178     uint16_t             hsize;        ///< Horizontal pixel size in a line
179     uint16_t             vsize;        ///< Vertical pixel size in a frame
180     void               * p_context;    ///< Pointer to the function level device context
181                                        // (e.g. display_ctrl_t type data)
182 } glcdc_ctrl_t;
183 
184 /**********************************************************************************************************************
185  * Exported global variables
186  **********************************************************************************************************************/
187 
188 /* @cond INC_HEADER_DEFS_SEC */
189 /* Filled in Interface API structure for this Instance. */
190 extern const display_api_t g_display_on_glcdc;
191 
192 /* @endcond */
193 
194 /**********************************************************************************************************************
195  * Public APIs
196  **********************************************************************************************************************/
197 
198 fsp_err_t R_GLCDC_Open(display_ctrl_t * const p_api_ctrl, display_cfg_t const * const p_cfg);
199 fsp_err_t R_GLCDC_Close(display_ctrl_t * const p_api_ctrl);
200 fsp_err_t R_GLCDC_Start(display_ctrl_t * const p_api_ctrl);
201 fsp_err_t R_GLCDC_Stop(display_ctrl_t * const p_api_ctrl);
202 fsp_err_t R_GLCDC_LayerChange(display_ctrl_t const * const        p_api_ctrl,
203                               display_runtime_cfg_t const * const p_cfg,
204                               display_frame_layer_t               layer);
205 fsp_err_t R_GLCDC_BufferChange(display_ctrl_t const * const p_api_ctrl,
206                                uint8_t * const              framebuffer,
207                                display_frame_layer_t        layer);
208 fsp_err_t R_GLCDC_ColorCorrection(display_ctrl_t const * const       p_api_ctrl,
209                                   display_correction_t const * const p_correction);
210 fsp_err_t R_GLCDC_ClutUpdate(display_ctrl_t const * const     p_api_ctrl,
211                              display_clut_cfg_t const * const p_clut_cfg,
212                              display_frame_layer_t            layer);
213 fsp_err_t R_GLCDC_ClutEdit(display_ctrl_t const * const p_api_ctrl,
214                            display_frame_layer_t        layer,
215                            uint8_t                      index,
216                            uint32_t                     color);
217 fsp_err_t R_GLCDC_ColorKeySet(display_ctrl_t const * const p_api_ctrl,
218                               display_colorkeying_layer_t  key_cfg,
219                               display_frame_layer_t        layer);
220 fsp_err_t R_GLCDC_StatusGet(display_ctrl_t const * const p_api_ctrl, display_status_t * const status);
221 
222 /*******************************************************************************************************************//**
223  * @} (end defgroup GLCDC)
224  **********************************************************************************************************************/
225 
226 /* Common macro for FSP header files. There is also a corresponding FSP_HEADER macro at the top of this file. */
227 FSP_FOOTER
228 
229 #endif
230