1 /* 2 * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 */ 6 #pragma once 7 8 #include <stdbool.h> 9 #include "esp_err.h" 10 #include "esp_lcd_types.h" 11 #include "soc/soc_caps.h" 12 #include "hal/lcd_types.h" 13 14 #ifdef __cplusplus 15 extern "C" { 16 #endif 17 18 #if SOC_LCD_RGB_SUPPORTED 19 /** 20 * @brief LCD RGB timing structure 21 * @verbatim 22 * Total Width 23 * <---------------------------------------------------> 24 * HSYNC width HBP Active Width HFP 25 * <---><--><--------------------------------------><---> 26 * ____ ____|_______________________________________|____| 27 * |___| | | | 28 * | | | 29 * __| | | | 30 * /|\ /|\ | | | | 31 * | VSYNC| | | | | 32 * |Width\|/ |__ | | | 33 * | /|\ | | | | 34 * | VBP | | | | | 35 * | \|/_____|_________|_______________________________________| | 36 * | /|\ | | / / / / / / / / / / / / / / / / / / / | | 37 * | | | |/ / / / / / / / / / / / / / / / / / / /| | 38 * Total | | | |/ / / / / / / / / / / / / / / / / / / /| | 39 * Height | | | |/ / / / / / / / / / / / / / / / / / / /| | 40 * |Active| | |/ / / / / / / / / / / / / / / / / / / /| | 41 * |Heigh | | |/ / / / / / Active Display Area / / / /| | 42 * | | | |/ / / / / / / / / / / / / / / / / / / /| | 43 * | | | |/ / / / / / / / / / / / / / / / / / / /| | 44 * | | | |/ / / / / / / / / / / / / / / / / / / /| | 45 * | | | |/ / / / / / / / / / / / / / / / / / / /| | 46 * | | | |/ / / / / / / / / / / / / / / / / / / /| | 47 * | \|/_____|_________|_______________________________________| | 48 * | /|\ | | 49 * | VFP | | | 50 * \|/ \|/_____|______________________________________________________| 51 * @endverbatim 52 */ 53 typedef struct { 54 unsigned int pclk_hz; /*!< Frequency of pixel clock */ 55 unsigned int h_res; /*!< Horizontal resolution, i.e. the number of pixels in a line */ 56 unsigned int v_res; /*!< Vertical resolution, i.e. the number of lines in the frame */ 57 unsigned int hsync_pulse_width; /*!< Horizontal sync width, unit: PCLK period */ 58 unsigned int hsync_back_porch; /*!< Horizontal back porch, number of PCLK between hsync and start of line active data */ 59 unsigned int hsync_front_porch; /*!< Horizontal front porch, number of PCLK between the end of active data and the next hsync */ 60 unsigned int vsync_pulse_width; /*!< Vertical sync width, unit: number of lines */ 61 unsigned int vsync_back_porch; /*!< Vertical back porch, number of invalid lines between vsync and start of frame */ 62 unsigned int vsync_front_porch; /*!< Vertical front porch, number of invalid lines between then end of frame and the next vsync */ 63 struct { 64 unsigned int hsync_idle_low: 1; /*!< The hsync signal is low in IDLE state */ 65 unsigned int vsync_idle_low: 1; /*!< The vsync signal is low in IDLE state */ 66 unsigned int de_idle_high: 1; /*!< The de signal is high in IDLE state */ 67 unsigned int pclk_active_neg: 1; /*!< Whether the display data is clocked out at the falling edge of PCLK */ 68 unsigned int pclk_idle_high: 1; /*!< The PCLK stays at high level in IDLE phase */ 69 } flags; 70 } esp_lcd_rgb_timing_t; 71 72 /** 73 * @brief Type of RGB LCD panel event data 74 */ 75 typedef struct { 76 } esp_lcd_rgb_panel_event_data_t; 77 78 /** 79 * @brief Declare the prototype of the function that will be invoked when panel IO finishes transferring color data 80 * 81 * @param[in] panel LCD panel handle, returned from `esp_lcd_new_rgb_panel` 82 * @param[in] edata Panel event data, fed by driver 83 * @param[in] user_ctx User data, passed from `esp_lcd_rgb_panel_config_t` 84 * @return Whether a high priority task has been waken up by this function 85 */ 86 typedef bool (*esp_lcd_rgb_panel_frame_trans_done_cb_t)(esp_lcd_panel_handle_t panel, esp_lcd_rgb_panel_event_data_t *edata, void *user_ctx); 87 88 /** 89 * @brief LCD RGB panel configuration structure 90 */ 91 typedef struct { 92 lcd_clock_source_t clk_src; /*!< Clock source for the RGB LCD peripheral */ 93 esp_lcd_rgb_timing_t timings; /*!< RGB timing parameters */ 94 size_t data_width; /*!< Number of data lines */ 95 size_t sram_trans_align; /*!< Alignment for framebuffer that allocated in SRAM */ 96 size_t psram_trans_align; /*!< Alignment for framebuffer that allocated in PSRAM */ 97 int hsync_gpio_num; /*!< GPIO used for HSYNC signal */ 98 int vsync_gpio_num; /*!< GPIO used for VSYNC signal */ 99 int de_gpio_num; /*!< GPIO used for DE signal, set to -1 if it's not used */ 100 int pclk_gpio_num; /*!< GPIO used for PCLK signal */ 101 int data_gpio_nums[SOC_LCD_RGB_DATA_WIDTH]; /*!< GPIOs used for data lines */ 102 int disp_gpio_num; /*!< GPIO used for display control signal, set to -1 if it's not used */ 103 esp_lcd_rgb_panel_frame_trans_done_cb_t on_frame_trans_done; /*!< Callback invoked when one frame buffer has transferred done */ 104 void *user_ctx; /*!< User data which would be passed to on_frame_trans_done's user_ctx */ 105 struct { 106 unsigned int disp_active_low: 1; /*!< If this flag is enabled, a low level of display control signal can turn the screen on; vice versa */ 107 unsigned int relax_on_idle: 1; /*!< If this flag is enabled, the host won't refresh the LCD if nothing changed in host's frame buffer (this is usefull for LCD with built-in GRAM) */ 108 unsigned int fb_in_psram: 1; /*!< If this flag is enabled, the frame buffer will be allocated from PSRAM preferentially */ 109 } flags; 110 } esp_lcd_rgb_panel_config_t; 111 112 /** 113 * @brief Create RGB LCD panel 114 * 115 * @param rgb_panel_config RGB panel configuration 116 * @param ret_panel Returned LCD panel handle 117 * @return 118 * - ESP_ERR_INVALID_ARG if parameter is invalid 119 * - ESP_ERR_NO_MEM if out of memory 120 * - ESP_ERR_NOT_FOUND if no free RGB panel is available 121 * - ESP_OK on success 122 */ 123 esp_err_t esp_lcd_new_rgb_panel(const esp_lcd_rgb_panel_config_t *rgb_panel_config, esp_lcd_panel_handle_t *ret_panel); 124 125 #endif // SOC_LCD_RGB_SUPPORTED 126 127 #ifdef __cplusplus 128 } 129 #endif 130