From 7b571a7fc707d2471424b36fca89d0405b1bed46 Mon Sep 17 00:00:00 2001 From: Rop Gonggrijp Date: Wed, 28 Apr 2021 11:04:53 +0200 Subject: [PATCH 1/6] LV_DISP_USE_RST Allows to not allocate a GPIO for display reset: some may have that pin tied or attached to a Power management IC. Supersedes PR from @usedbytes doing same but only for IL9341, this is for all supported displays. --- lvgl_tft/EVE_commands.c | 6 ++++-- lvgl_tft/EVE_commands.h | 4 ++++ lvgl_tft/EVE_config.h | 11 ++++++----- lvgl_tft/FT81x.c | 6 ++++++ lvgl_tft/GC9A01.c | 6 ++++++ lvgl_tft/GC9A01.h | 7 ++++--- lvgl_tft/Kconfig | 13 +++++++++++++ lvgl_tft/hx8357.c | 5 +++++ lvgl_tft/hx8357.h | 7 ++++--- lvgl_tft/il3820.c | 6 ++++++ lvgl_tft/il3820.h | 1 + lvgl_tft/ili9341.c | 5 +++++ lvgl_tft/ili9341.h | 7 ++++--- lvgl_tft/ili9481.c | 5 +++++ lvgl_tft/ili9481.h | 7 ++++--- lvgl_tft/ili9486.c | 5 +++++ lvgl_tft/ili9486.h | 7 ++++--- lvgl_tft/ili9488.c | 5 +++++ lvgl_tft/ili9488.h | 7 ++++--- lvgl_tft/ra8875.c | 6 ++++++ lvgl_tft/ra8875.h | 3 ++- lvgl_tft/sh1107.c | 3 +++ lvgl_tft/sh1107.h | 5 +++-- lvgl_tft/st7735s.c | 3 +++ lvgl_tft/st7735s.h | 5 +++-- lvgl_tft/st7789.c | 4 ++-- lvgl_tft/st7789.h | 9 +++++++++ lvgl_tft/st7796s.c | 6 ++++++ lvgl_tft/st7796s.h | 7 ++++--- 29 files changed, 136 insertions(+), 35 deletions(-) diff --git a/lvgl_tft/EVE_commands.c b/lvgl_tft/EVE_commands.c index 9e458f4..2a93efa 100644 --- a/lvgl_tft/EVE_commands.c +++ b/lvgl_tft/EVE_commands.c @@ -144,7 +144,7 @@ void DELAY_MS(uint16_t ms) vTaskDelay(ms / portTICK_PERIOD_MS); } - +#if EVE_USE_PDN void EVE_pdn_set(void) { gpio_set_level(EVE_PDN, 0); /* Power-Down low */ @@ -155,7 +155,7 @@ void EVE_pdn_clear(void) { gpio_set_level(EVE_PDN, 1); /* Power-Down high */ } - +#endif void spi_acquire() { @@ -841,11 +841,13 @@ uint8_t EVE_init(void) uint8_t chipid = 0; uint16_t timeout = 0; +#if EVE_USE_PDN EVE_pdn_set(); DELAY_MS(6); /* minimum time for power-down is 5ms */ EVE_pdn_clear(); DELAY_MS(21); /* minimum time to allow from rising PD_N to first access is 20ms */ +#endif /* EVE_cmdWrite(EVE_CORERST,0); */ /* reset, only required for warm-start if PowerDown line is not used */ diff --git a/lvgl_tft/EVE_commands.h b/lvgl_tft/EVE_commands.h index 3c5c104..7377a7f 100644 --- a/lvgl_tft/EVE_commands.h +++ b/lvgl_tft/EVE_commands.h @@ -39,8 +39,12 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR TH #define BLOCK_TRANSFER_SIZE 3840 // block transfer size when write data to CMD buffer void DELAY_MS(uint16_t ms); + +#if EVE_USE_PDN void EVE_pdn_set(void); void EVE_pdn_clear(void); +#endif + void spi_acquire(); void spi_release(); diff --git a/lvgl_tft/EVE_config.h b/lvgl_tft/EVE_config.h index 53225a2..386edb9 100644 --- a/lvgl_tft/EVE_config.h +++ b/lvgl_tft/EVE_config.h @@ -44,11 +44,12 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR TH #include "FT81x.h" -#define EVE_CLK DISP_SPI_CLK // orange -#define EVE_MISO DISP_SPI_MISO // yellow -#define EVE_MOSI DISP_SPI_MOSI // green -#define EVE_CS DISP_SPI_CS // blue -#define EVE_PDN CONFIG_LV_DISP_PIN_RST // grey +#define EVE_CLK DISP_SPI_CLK // orange +#define EVE_MISO DISP_SPI_MISO // yellow +#define EVE_MOSI DISP_SPI_MOSI // green +#define EVE_CS DISP_SPI_CS // blue +#define EVE_PDN CONFIG_LV_DISP_PIN_RST // grey +#define EVE_USE_PDN CONFIG_LV_DISP_USE_RST #define SPI_TRANSER_SIZE (DISP_BUF_SIZE * (LV_COLOR_DEPTH / 8)) diff --git a/lvgl_tft/FT81x.c b/lvgl_tft/FT81x.c index b004eba..4afc52b 100644 --- a/lvgl_tft/FT81x.c +++ b/lvgl_tft/FT81x.c @@ -262,9 +262,15 @@ void TFT_bitmap_display(void) void FT81x_init(void) { +#if EVE_USE_PDN gpio_pad_select_gpio(EVE_PDN); +#endif + gpio_set_level(EVE_CS, 1); + +#if EVE_USE_PDN gpio_set_direction(EVE_PDN, GPIO_MODE_OUTPUT); +#endif spi_acquire(); diff --git a/lvgl_tft/GC9A01.c b/lvgl_tft/GC9A01.c index 63687e3..525efc9 100644 --- a/lvgl_tft/GC9A01.c +++ b/lvgl_tft/GC9A01.c @@ -124,18 +124,24 @@ void GC9A01_init(void) //Initialize non-SPI GPIOs gpio_pad_select_gpio(GC9A01_DC); gpio_set_direction(GC9A01_DC, GPIO_MODE_OUTPUT); + +#if GC9A01_USE_RST gpio_pad_select_gpio(GC9A01_RST); gpio_set_direction(GC9A01_RST, GPIO_MODE_OUTPUT); +#endif #if GC9A01_ENABLE_BACKLIGHT_CONTROL gpio_pad_select_gpio(GC9A01_BCKL); gpio_set_direction(GC9A01_BCKL, GPIO_MODE_OUTPUT); #endif + +#if GC9A01_USE_RST //Reset the display gpio_set_level(GC9A01_RST, 0); vTaskDelay(100 / portTICK_RATE_MS); gpio_set_level(GC9A01_RST, 1); vTaskDelay(100 / portTICK_RATE_MS); +#endif ESP_LOGI(TAG, "Initialization."); diff --git a/lvgl_tft/GC9A01.h b/lvgl_tft/GC9A01.h index d462c8d..2995811 100644 --- a/lvgl_tft/GC9A01.h +++ b/lvgl_tft/GC9A01.h @@ -25,9 +25,10 @@ extern "C" { /********************* * DEFINES *********************/ -#define GC9A01_DC CONFIG_LV_DISP_PIN_DC -#define GC9A01_RST CONFIG_LV_DISP_PIN_RST -#define GC9A01_BCKL CONFIG_LV_DISP_PIN_BCKL +#define GC9A01_DC CONFIG_LV_DISP_PIN_DC +#define GC9A01_RST CONFIG_LV_DISP_PIN_RST +#define GC9A01_USE_RST CONFIG_LV_DISP_USE_RST +#define GC9A01_BCKL CONFIG_LV_DISP_PIN_BCKL #define GC9A01_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL diff --git a/lvgl_tft/Kconfig b/lvgl_tft/Kconfig index ddd7f51..d206393 100644 --- a/lvgl_tft/Kconfig +++ b/lvgl_tft/Kconfig @@ -900,8 +900,21 @@ menu "LVGL TFT Display controller" help Configure the display DC pin here. + config LV_DISP_USE_RST + bool "Use a GPIO for resetting the display" if LV_TFT_DISPLAY_PROTOCOL_SPI + default y + help + Enable display reset control. Set this if the reset pin of the + display is connected to the host. If this is not set, then it is + the user's responsibility to ensure that the display is reset + before initialisation. + You may want to disable this option because the reset pin is not + connected, or is connected to an external component such as the + power management IC. + config LV_DISP_PIN_RST int "GPIO for Reset" if LV_TFT_DISPLAY_PROTOCOL_SPI && !LV_DISP_ST7789_SOFT_RESET + depends on LV_DISP_USE_RST range 0 39 if IDF_TARGET_ESP32 range 0 43 if IDF_TARGET_ESP32S2 diff --git a/lvgl_tft/hx8357.c b/lvgl_tft/hx8357.c index ad180fd..6b6cd34 100644 --- a/lvgl_tft/hx8357.c +++ b/lvgl_tft/hx8357.c @@ -162,19 +162,24 @@ void hx8357_init(void) //Initialize non-SPI GPIOs gpio_pad_select_gpio(HX8357_DC); gpio_set_direction(HX8357_DC, GPIO_MODE_OUTPUT); + +#if HX8357_USE_RST gpio_pad_select_gpio(HX8357_RST); gpio_set_direction(HX8357_RST, GPIO_MODE_OUTPUT); +#endif #if HX8357_ENABLE_BACKLIGHT_CONTROL gpio_pad_select_gpio(HX8357_BCKL); gpio_set_direction(HX8357_BCKL, GPIO_MODE_OUTPUT); #endif +#if HX8357_USE_RST //Reset the display gpio_set_level(HX8357_RST, 0); vTaskDelay(10 / portTICK_RATE_MS); gpio_set_level(HX8357_RST, 1); vTaskDelay(120 / portTICK_RATE_MS); +#endif ESP_LOGI(TAG, "Initialization."); diff --git a/lvgl_tft/hx8357.h b/lvgl_tft/hx8357.h index 6bad32d..1e54627 100644 --- a/lvgl_tft/hx8357.h +++ b/lvgl_tft/hx8357.h @@ -35,9 +35,10 @@ extern "C" { /********************* * DEFINES *********************/ -#define HX8357_DC CONFIG_LV_DISP_PIN_DC -#define HX8357_RST CONFIG_LV_DISP_PIN_RST -#define HX8357_BCKL CONFIG_LV_DISP_PIN_BCKL +#define HX8357_DC CONFIG_LV_DISP_PIN_DC +#define HX8357_RST CONFIG_LV_DISP_PIN_RST +#define HX8357_USE_RST CONFIG_LV_DISP_USE_RST +#define HX8357_BCKL CONFIG_LV_DISP_PIN_BCKL #define HX8357_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL #define HX8357_INVERT_COLORS CONFIG_LV_INVERT_COLORS diff --git a/lvgl_tft/il3820.c b/lvgl_tft/il3820.c index 45ae276..80358b2 100644 --- a/lvgl_tft/il3820.c +++ b/lvgl_tft/il3820.c @@ -198,16 +198,22 @@ void il3820_init(void) /* Initialize non-SPI GPIOs */ gpio_pad_select_gpio(IL3820_DC_PIN); gpio_set_direction(IL3820_DC_PIN, GPIO_MODE_OUTPUT); + +#if IL3820_USE_RST gpio_pad_select_gpio(IL3820_RST_PIN); gpio_set_direction(IL3820_RST_PIN, GPIO_MODE_OUTPUT); +#endif + gpio_pad_select_gpio(IL3820_BUSY_PIN); gpio_set_direction(IL3820_BUSY_PIN, GPIO_MODE_INPUT); +#if IL3820_USE_RST /* Harware reset */ gpio_set_level( IL3820_RST_PIN, 0); vTaskDelay(IL3820_RESET_DELAY / portTICK_RATE_MS); gpio_set_level( IL3820_RST_PIN, 1); vTaskDelay(IL3820_RESET_DELAY / portTICK_RATE_MS); +#endif /* Software reset */ il3820_write_cmd(IL3820_CMD_SW_RESET, NULL, 0); diff --git a/lvgl_tft/il3820.h b/lvgl_tft/il3820.h index e0b73cd..f77ffb4 100644 --- a/lvgl_tft/il3820.h +++ b/lvgl_tft/il3820.h @@ -28,6 +28,7 @@ extern "C" #define IL3820_DC_PIN CONFIG_LV_DISP_PIN_DC #define IL3820_RST_PIN CONFIG_LV_DISP_PIN_RST +#define IL3820_USE_RST CONFIG_LV_DISP_USE_RST #define IL3820_BUSY_PIN CONFIG_LV_DISP_PIN_BUSY #define IL3820_BUSY_LEVEL 1 diff --git a/lvgl_tft/ili9341.c b/lvgl_tft/ili9341.c index faf5546..41bd199 100644 --- a/lvgl_tft/ili9341.c +++ b/lvgl_tft/ili9341.c @@ -93,18 +93,23 @@ void ili9341_init(void) //Initialize non-SPI GPIOs gpio_pad_select_gpio(ILI9341_DC); gpio_set_direction(ILI9341_DC, GPIO_MODE_OUTPUT); +#if ILI9341_USE_RST gpio_pad_select_gpio(ILI9341_RST); gpio_set_direction(ILI9341_RST, GPIO_MODE_OUTPUT); +#endif #if ILI9341_ENABLE_BACKLIGHT_CONTROL gpio_pad_select_gpio(ILI9341_BCKL); gpio_set_direction(ILI9341_BCKL, GPIO_MODE_OUTPUT); #endif + +#if ILI9341_USE_RST //Reset the display gpio_set_level(ILI9341_RST, 0); vTaskDelay(100 / portTICK_RATE_MS); gpio_set_level(ILI9341_RST, 1); vTaskDelay(100 / portTICK_RATE_MS); +#endif ESP_LOGI(TAG, "Initialization."); diff --git a/lvgl_tft/ili9341.h b/lvgl_tft/ili9341.h index 4beb4f3..5768fbe 100644 --- a/lvgl_tft/ili9341.h +++ b/lvgl_tft/ili9341.h @@ -25,9 +25,10 @@ extern "C" { /********************* * DEFINES *********************/ -#define ILI9341_DC CONFIG_LV_DISP_PIN_DC -#define ILI9341_RST CONFIG_LV_DISP_PIN_RST -#define ILI9341_BCKL CONFIG_LV_DISP_PIN_BCKL +#define ILI9341_DC CONFIG_LV_DISP_PIN_DC +#define ILI9341_USE_RST CONFIG_LV_DISP_USE_RST +#define ILI9341_RST CONFIG_LV_DISP_PIN_RST +#define ILI9341_BCKL CONFIG_LV_DISP_PIN_BCKL #define ILI9341_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL diff --git a/lvgl_tft/ili9481.c b/lvgl_tft/ili9481.c index 6472a93..f80c810 100644 --- a/lvgl_tft/ili9481.c +++ b/lvgl_tft/ili9481.c @@ -76,19 +76,24 @@ void ili9481_init(void) //Initialize non-SPI GPIOs gpio_pad_select_gpio(ILI9481_DC); gpio_set_direction(ILI9481_DC, GPIO_MODE_OUTPUT); + +#if ILI9481_USE_RST gpio_pad_select_gpio(ILI9481_RST); gpio_set_direction(ILI9481_RST, GPIO_MODE_OUTPUT); +#endif #if ILI9481_ENABLE_BACKLIGHT_CONTROL gpio_pad_select_gpio(ILI9481_BCKL); gpio_set_direction(ILI9481_BCKL, GPIO_MODE_OUTPUT); #endif +#if ILI9481_USE_RST //Reset the display gpio_set_level(ILI9481_RST, 0); vTaskDelay(100 / portTICK_RATE_MS); gpio_set_level(ILI9481_RST, 1); vTaskDelay(100 / portTICK_RATE_MS); +#endif ESP_LOGI(TAG, "ILI9481 initialization."); diff --git a/lvgl_tft/ili9481.h b/lvgl_tft/ili9481.h index 7932190..c0d07fe 100644 --- a/lvgl_tft/ili9481.h +++ b/lvgl_tft/ili9481.h @@ -25,9 +25,10 @@ extern "C" { /********************* * DEFINES *********************/ -#define ILI9481_DC CONFIG_LV_DISP_PIN_DC -#define ILI9481_RST CONFIG_LV_DISP_PIN_RST -#define ILI9481_BCKL CONFIG_LV_DISP_PIN_BCKL +#define ILI9481_DC CONFIG_LV_DISP_PIN_DC +#define ILI9481_RST CONFIG_LV_DISP_PIN_RST +#define ILI9481_USE_RST CONFIG_LV_DISP_USE_RST +#define ILI9481_BCKL CONFIG_LV_DISP_PIN_BCKL #define ILI9481_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL #define ILI9481_INVERT_COLORS CONFIG_LV_INVERT_COLORS diff --git a/lvgl_tft/ili9486.c b/lvgl_tft/ili9486.c index e9b2b08..dd82ac9 100644 --- a/lvgl_tft/ili9486.c +++ b/lvgl_tft/ili9486.c @@ -78,19 +78,24 @@ void ili9486_init(void) //Initialize non-SPI GPIOs gpio_pad_select_gpio(ILI9486_DC); gpio_set_direction(ILI9486_DC, GPIO_MODE_OUTPUT); + +#if ILI9486_USE_RST gpio_pad_select_gpio(ILI9486_RST); gpio_set_direction(ILI9486_RST, GPIO_MODE_OUTPUT); +#endif #if ILI9486_ENABLE_BACKLIGHT_CONTROL gpio_pad_select_gpio(ILI9486_BCKL); gpio_set_direction(ILI9486_BCKL, GPIO_MODE_OUTPUT); #endif +#if ILI9486_USE_RST //Reset the display gpio_set_level(ILI9486_RST, 0); vTaskDelay(100 / portTICK_RATE_MS); gpio_set_level(ILI9486_RST, 1); vTaskDelay(100 / portTICK_RATE_MS); +#endif ESP_LOGI(TAG, "ILI9486 Initialization."); diff --git a/lvgl_tft/ili9486.h b/lvgl_tft/ili9486.h index f65dd80..08e002f 100644 --- a/lvgl_tft/ili9486.h +++ b/lvgl_tft/ili9486.h @@ -25,9 +25,10 @@ extern "C" { /********************* * DEFINES *********************/ -#define ILI9486_DC CONFIG_LV_DISP_PIN_DC -#define ILI9486_RST CONFIG_LV_DISP_PIN_RST -#define ILI9486_BCKL CONFIG_LV_DISP_PIN_BCKL +#define ILI9486_DC CONFIG_LV_DISP_PIN_DC +#define ILI9486_RST CONFIG_LV_DISP_PIN_RST +#define ILI9486_USE_RST CONFIG_LV_DISP_USE_RST +#define ILI9486_BCKL CONFIG_LV_DISP_PIN_BCKL #define ILI9486_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL diff --git a/lvgl_tft/ili9488.c b/lvgl_tft/ili9488.c index 74f7139..5379b77 100644 --- a/lvgl_tft/ili9488.c +++ b/lvgl_tft/ili9488.c @@ -78,19 +78,24 @@ void ili9488_init(void) //Initialize non-SPI GPIOs gpio_pad_select_gpio(ILI9488_DC); gpio_set_direction(ILI9488_DC, GPIO_MODE_OUTPUT); + +#if ILI9488_USE_RST gpio_pad_select_gpio(ILI9488_RST); gpio_set_direction(ILI9488_RST, GPIO_MODE_OUTPUT); +#endif #if ILI9488_ENABLE_BACKLIGHT_CONTROL gpio_pad_select_gpio(ILI9488_BCKL); gpio_set_direction(ILI9488_BCKL, GPIO_MODE_OUTPUT); #endif +#if ILI9488_USE_RST //Reset the display gpio_set_level(ILI9488_RST, 0); vTaskDelay(100 / portTICK_RATE_MS); gpio_set_level(ILI9488_RST, 1); vTaskDelay(100 / portTICK_RATE_MS); +#endif ESP_LOGI(TAG, "ILI9488 initialization."); diff --git a/lvgl_tft/ili9488.h b/lvgl_tft/ili9488.h index 45a7045..2ecfd44 100644 --- a/lvgl_tft/ili9488.h +++ b/lvgl_tft/ili9488.h @@ -25,9 +25,10 @@ extern "C" { /********************* * DEFINES *********************/ -#define ILI9488_DC CONFIG_LV_DISP_PIN_DC -#define ILI9488_RST CONFIG_LV_DISP_PIN_RST -#define ILI9488_BCKL CONFIG_LV_DISP_PIN_BCKL +#define ILI9488_DC CONFIG_LV_DISP_PIN_DC +#define ILI9488_RST CONFIG_LV_DISP_PIN_RST +#define ILI9488_USE_RST CONFIG_LV_DISP_USE_RST +#define ILI9488_BCKL CONFIG_LV_DISP_PIN_BCKL #define ILI9488_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL diff --git a/lvgl_tft/ra8875.c b/lvgl_tft/ra8875.c index 98eea02..c08ff88 100644 --- a/lvgl_tft/ra8875.c +++ b/lvgl_tft/ra8875.c @@ -159,18 +159,24 @@ void ra8875_init(void) #endif // Initialize non-SPI GPIOs + +#if RA8875_USE_RST gpio_pad_select_gpio(RA8875_RST); gpio_set_direction(RA8875_RST, GPIO_MODE_OUTPUT); +#endif + #ifdef CONFIG_LV_DISP_PIN_BCKL gpio_pad_select_gpio(CONFIG_LV_DISP_PIN_BCKL); gpio_set_direction(CONFIG_LV_DISP_PIN_BCKL, GPIO_MODE_OUTPUT); #endif +#if RA8875_USE_RST // Reset the RA8875 gpio_set_level(RA8875_RST, 0); vTaskDelay(DIV_ROUND_UP(100, portTICK_RATE_MS)); gpio_set_level(RA8875_RST, 1); vTaskDelay(DIV_ROUND_UP(100, portTICK_RATE_MS)); +#endif // Initalize RA8875 clocks (SPI must be decelerated before initializing clocks) disp_spi_change_device_speed(SPI_CLOCK_SPEED_SLOW_HZ); diff --git a/lvgl_tft/ra8875.h b/lvgl_tft/ra8875.h index a6d1fe5..6942c3e 100644 --- a/lvgl_tft/ra8875.h +++ b/lvgl_tft/ra8875.h @@ -24,7 +24,8 @@ extern "C" { /********************* * DEFINES *********************/ -#define RA8875_RST CONFIG_LV_DISP_PIN_RST +#define RA8875_RST CONFIG_LV_DISP_PIN_RST +#define RA8875_USE_RST CONFIG_LV_DISP_USE_RST // System & Configuration Registers #define RA8875_REG_PWRR (0x01) // Power and Display Control Register (PWRR) diff --git a/lvgl_tft/sh1107.c b/lvgl_tft/sh1107.c index d8d8c84..d7f6067 100644 --- a/lvgl_tft/sh1107.c +++ b/lvgl_tft/sh1107.c @@ -94,6 +94,8 @@ void sh1107_init(void) //Initialize non-SPI GPIOs gpio_pad_select_gpio(SH1107_DC); gpio_set_direction(SH1107_DC, GPIO_MODE_OUTPUT); + +#if SH1107_USE_RST gpio_pad_select_gpio(SH1107_RST); gpio_set_direction(SH1107_RST, GPIO_MODE_OUTPUT); @@ -102,6 +104,7 @@ void sh1107_init(void) vTaskDelay(100 / portTICK_RATE_MS); gpio_set_level(SH1107_RST, 1); vTaskDelay(100 / portTICK_RATE_MS); +#endif //Send all the commands uint16_t cmd = 0; diff --git a/lvgl_tft/sh1107.h b/lvgl_tft/sh1107.h index 7a0db68..ba77a61 100644 --- a/lvgl_tft/sh1107.h +++ b/lvgl_tft/sh1107.h @@ -25,8 +25,9 @@ extern "C" { /********************* * DEFINES *********************/ -#define SH1107_DC CONFIG_LV_DISP_PIN_DC -#define SH1107_RST CONFIG_LV_DISP_PIN_RST +#define SH1107_DC CONFIG_LV_DISP_PIN_DC +#define SH1107_RST CONFIG_LV_DISP_PIN_RST +#define SH1107_USE_RST CONFIG_LV_DISP_USE_RST /********************** * TYPEDEFS diff --git a/lvgl_tft/st7735s.c b/lvgl_tft/st7735s.c index 861904c..2507118 100644 --- a/lvgl_tft/st7735s.c +++ b/lvgl_tft/st7735s.c @@ -99,6 +99,8 @@ void st7735s_init(void) //Initialize non-SPI GPIOs gpio_pad_select_gpio(ST7735S_DC); gpio_set_direction(ST7735S_DC, GPIO_MODE_OUTPUT); + +#if ST7735S_USE_RST gpio_pad_select_gpio(ST7735S_RST); gpio_set_direction(ST7735S_RST, GPIO_MODE_OUTPUT); @@ -107,6 +109,7 @@ void st7735s_init(void) vTaskDelay(100 / portTICK_RATE_MS); gpio_set_level(ST7735S_RST, 1); vTaskDelay(100 / portTICK_RATE_MS); +#endif ESP_LOGI(TAG, "ST7735S initialization."); diff --git a/lvgl_tft/st7735s.h b/lvgl_tft/st7735s.h index de47140..71924bf 100644 --- a/lvgl_tft/st7735s.h +++ b/lvgl_tft/st7735s.h @@ -25,8 +25,9 @@ extern "C" { *********************/ #define DISP_BUF_SIZE (LV_HOR_RES_MAX * 40) -#define ST7735S_DC CONFIG_LV_DISP_PIN_DC -#define ST7735S_RST CONFIG_LV_DISP_PIN_RST +#define ST7735S_DC CONFIG_LV_DISP_PIN_DC +#define ST7735S_RST CONFIG_LV_DISP_PIN_RST +#define ST7735S_USE_RST CONFIG_LV_DISP_USE_RST #define AXP192_SDA CONFIG_LV_AXP192_PIN_SDA #define AXP192_SCL CONFIG_LV_AXP192_PIN_SCL diff --git a/lvgl_tft/st7789.c b/lvgl_tft/st7789.c index 2b5bd7e..38bdb96 100644 --- a/lvgl_tft/st7789.c +++ b/lvgl_tft/st7789.c @@ -91,7 +91,7 @@ void st7789_init(void) gpio_pad_select_gpio(ST7789_DC); gpio_set_direction(ST7789_DC, GPIO_MODE_OUTPUT); -#if !defined(CONFIG_LV_DISP_ST7789_SOFT_RESET) +#if !defined(ST7789_SOFT_RST) gpio_pad_select_gpio(ST7789_RST); gpio_set_direction(ST7789_RST, GPIO_MODE_OUTPUT); #endif @@ -102,7 +102,7 @@ void st7789_init(void) #endif //Reset the display -#if !defined(CONFIG_LV_DISP_ST7789_SOFT_RESET) +#if !defined(ST7789_SOFT_RST) gpio_set_level(ST7789_RST, 0); vTaskDelay(100 / portTICK_RATE_MS); gpio_set_level(ST7789_RST, 1); diff --git a/lvgl_tft/st7789.h b/lvgl_tft/st7789.h index 3175329..cccbd78 100644 --- a/lvgl_tft/st7789.h +++ b/lvgl_tft/st7789.h @@ -25,6 +25,15 @@ extern "C" #define ST7789_RST CONFIG_LV_DISP_PIN_RST #define ST7789_BCKL CONFIG_LV_DISP_PIN_BCKL +#if CONFIG_LV_DISP_USE_RST + #if CONFIG_LV_DISP_ST7789_SOFT_RESET + #define ST7789_SOFT_RST + #endif +#else + #define ST7789_SOFT_RST +#endif + + #define ST7789_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL #define ST7789_INVERT_COLORS CONFIG_LV_INVERT_COLORS diff --git a/lvgl_tft/st7796s.c b/lvgl_tft/st7796s.c index 457b707..44959f8 100644 --- a/lvgl_tft/st7796s.c +++ b/lvgl_tft/st7796s.c @@ -94,18 +94,24 @@ void st7796s_init(void) //Initialize non-SPI GPIOs gpio_pad_select_gpio(ST7796S_DC); gpio_set_direction(ST7796S_DC, GPIO_MODE_OUTPUT); + +#if ST7796S_USE_RST gpio_pad_select_gpio(ST7796S_RST); gpio_set_direction(ST7796S_RST, GPIO_MODE_OUTPUT); +#endif #if ST7796S_ENABLE_BACKLIGHT_CONTROL gpio_pad_select_gpio(ST7796S_BCKL); gpio_set_direction(ST7796S_BCKL, GPIO_MODE_OUTPUT); #endif + +#if ST7796S_USE_RST //Reset the display gpio_set_level(ST7796S_RST, 0); vTaskDelay(100 / portTICK_RATE_MS); gpio_set_level(ST7796S_RST, 1); vTaskDelay(100 / portTICK_RATE_MS); +#endif ESP_LOGI(TAG, "Initialization."); diff --git a/lvgl_tft/st7796s.h b/lvgl_tft/st7796s.h index 418ec9b..48e566d 100644 --- a/lvgl_tft/st7796s.h +++ b/lvgl_tft/st7796s.h @@ -26,9 +26,10 @@ extern "C" /********************* * DEFINES *********************/ -#define ST7796S_DC CONFIG_LV_DISP_PIN_DC -#define ST7796S_RST CONFIG_LV_DISP_PIN_RST -#define ST7796S_BCKL CONFIG_LV_DISP_PIN_BCKL +#define ST7796S_DC CONFIG_LV_DISP_PIN_DC +#define ST7796S_RST CONFIG_LV_DISP_PIN_RST +#define ST7796S_USE_RST CONFIG_LV_DISP_USE_RST +#define ST7796S_BCKL CONFIG_LV_DISP_PIN_BCKL #define ST7796S_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL #define ST7796S_INVERT_COLORS CONFIG_LV_INVERT_COLORS From 00dd1504d94209900e00e35031b9401cc7d1a3df Mon Sep 17 00:00:00 2001 From: Rop Gonggrijp Date: Wed, 28 Apr 2021 11:15:00 +0200 Subject: [PATCH 2/6] Removed white space at EOL, added some EOLs at EOF Many code editors are set to do this automatically now, so it ends up being annoying to scrape back out of commits to keep them easily reviewable. Also added '.DS_Store' and 'build' entries to .gitignore --- .gitignore | 6 +++++ lvgl_tft/EVE_commands.h | 2 +- lvgl_tft/FT81x.c | 8 +++---- lvgl_tft/GC9A01.c | 8 +++---- lvgl_tft/Kconfig | 4 ++-- lvgl_tft/il3820.c | 50 ++++++++++++++++++++--------------------- lvgl_tft/ili9486.c | 6 ++--- lvgl_tft/ili9488.c | 6 ++--- 8 files changed, 48 insertions(+), 42 deletions(-) diff --git a/.gitignore b/.gitignore index c6127b3..38eeab7 100644 --- a/.gitignore +++ b/.gitignore @@ -50,3 +50,9 @@ modules.order Module.symvers Mkfile.old dkms.conf + +# MacOS +.DS_Store + +# ESP-IDF build dir +build diff --git a/lvgl_tft/EVE_commands.h b/lvgl_tft/EVE_commands.h index 7377a7f..aa9d061 100644 --- a/lvgl_tft/EVE_commands.h +++ b/lvgl_tft/EVE_commands.h @@ -68,7 +68,7 @@ void EVE_get_cmdoffset(void); /* commands to operate on memory: */ void EVE_cmd_memzero(uint32_t ptr, uint32_t num); void EVE_cmd_memset(uint32_t ptr, uint8_t value, uint32_t num); -void EVE_cmd_memwrite(uint32_t dest, uint32_t num, const uint8_t *data); +void EVE_cmd_memwrite(uint32_t dest, uint32_t num, const uint8_t *data); void EVE_cmd_memcpy(uint32_t dest, uint32_t src, uint32_t num); #if FT81X_FULL diff --git a/lvgl_tft/FT81x.c b/lvgl_tft/FT81x.c index 4afc52b..63e0dee 100644 --- a/lvgl_tft/FT81x.c +++ b/lvgl_tft/FT81x.c @@ -250,7 +250,7 @@ void TFT_bitmap_display(void) EVE_cmd_dl(TAG(0)); EVE_cmd_dl(DL_DISPLAY); /* instruct the graphics processor to show the list */ - + EVE_cmd_dl(CMD_SWAP); /* make this list active */ EVE_end_cmd_burst(); /* stop writing to the cmd-fifo */ @@ -273,7 +273,7 @@ void FT81x_init(void) #endif spi_acquire(); - + if(EVE_init()) { tft_active = 1; @@ -284,7 +284,7 @@ void FT81x_init(void) EVE_cmd_memset(SCREEN_BITMAP_ADDR, BLACK, SCREEN_BUFFER_SIZE); // clear screen buffer EVE_cmd_execute(); - + TFT_bitmap_display(); // set DL for fullscreen bitmap display } @@ -326,4 +326,4 @@ void TFT_WriteBitmap(uint8_t* Bitmap, uint16_t X, uint16_t Y, uint16_t Width, ui void FT81x_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map) { TFT_WriteBitmap((uint8_t*)color_map, area->x1, area->y1, lv_area_get_width(area), lv_area_get_height(area)); -} \ No newline at end of file +} diff --git a/lvgl_tft/GC9A01.c b/lvgl_tft/GC9A01.c index 525efc9..6f32051 100644 --- a/lvgl_tft/GC9A01.c +++ b/lvgl_tft/GC9A01.c @@ -173,7 +173,7 @@ void GC9A01_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * colo uint8_t data[4]; /*Column addresses*/ - GC9A01_send_cmd(0x2A); //0x2A + GC9A01_send_cmd(0x2A); //0x2A data[0] = (area->x1 >> 8) & 0xFF; data[1] = area->x1 & 0xFF; data[2] = (area->x2 >> 8) & 0xFF; @@ -181,7 +181,7 @@ void GC9A01_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * colo GC9A01_send_data(data, 4); /*Page addresses*/ - GC9A01_send_cmd(0x2B); //0x2B + GC9A01_send_cmd(0x2B); //0x2B data[0] = (area->y1 >> 8) & 0xFF; data[1] = area->y1 & 0xFF; data[2] = (area->y2 >> 8) & 0xFF; @@ -189,7 +189,7 @@ void GC9A01_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * colo GC9A01_send_data(data, 4); /*Memory write*/ - GC9A01_send_cmd(0x2C); //0x2C + GC9A01_send_cmd(0x2C); //0x2C uint32_t size = lv_area_get_width(area) * lv_area_get_height(area); @@ -217,7 +217,7 @@ void GC9A01_sleep_in() { uint8_t data[] = {0x08}; GC9A01_send_cmd(0x10); //0x10 Enter Sleep Mode - GC9A01_send_data(&data, 1); + GC9A01_send_data(&data, 1); } void GC9A01_sleep_out() diff --git a/lvgl_tft/Kconfig b/lvgl_tft/Kconfig index d206393..01bb4ba 100644 --- a/lvgl_tft/Kconfig +++ b/lvgl_tft/Kconfig @@ -744,11 +744,11 @@ menu "LVGL TFT Display controller" config LV_DISP_ST7789_SOFT_RESET bool "Soft reset - use software reset instead of reset pin" - depends on LV_TFT_DISPLAY_CONTROLLER_ST7789 + depends on LV_TFT_DISPLAY_CONTROLLER_ST7789 default n help Use software reset and ignores configured reset pin (some hardware does not use a reset pin). - + endmenu # menu will be visible only when LV_PREDEFINED_DISPLAY_NONE is y diff --git a/lvgl_tft/il3820.c b/lvgl_tft/il3820.c index 80358b2..fee39e2 100644 --- a/lvgl_tft/il3820.c +++ b/lvgl_tft/il3820.c @@ -73,9 +73,9 @@ static uint8_t il3820_lut_initial[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static uint8_t il3820_lut_default[] = { - 0x10, 0x18, 0x18, 0x08, 0x18, 0x18, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x18, 0x18, 0x08, 0x18, 0x18, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x14, 0x44, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; @@ -113,7 +113,7 @@ void il3820_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_m uint8_t *buffer = (uint8_t*) color_map; uint16_t x_addr_counter = 0; uint16_t y_addr_counter = 0; - + /* Configure entry mode */ il3820_write_cmd(IL3820_CMD_ENTRY_MODE, &il3820_scan_mode, 1); @@ -131,7 +131,7 @@ void il3820_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_m il3820_set_cursor(x_addr_counter, y_addr_counter); il3820_send_cmd(IL3820_CMD_WRITE_RAM); - + /* Write the pixel data to graphic RAM, linelen bytes at the time. */ for(size_t row = 0; row <= (EPD_PANEL_HEIGHT - 1); row++){ il3820_send_data(buffer, linelen); @@ -139,7 +139,7 @@ void il3820_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_m } il3820_set_window(0, EPD_PANEL_WIDTH - 1, 0, EPD_PANEL_HEIGHT - 1); - + il3820_update_display(); /* IMPORTANT!!! @@ -152,7 +152,7 @@ void il3820_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_m * BIT_SET(byte_index, bit_index) clears the bit_index pixel at byte_index of * the display buffer. * BIT_CLEAR(byte_index, bit_index) sets the bit_index pixel at the byte_index - * of the display buffer. */ + * of the display buffer. */ void il3820_set_px_cb(lv_disp_drv_t * disp_drv, uint8_t* buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, lv_color_t color, lv_opa_t opa) @@ -217,7 +217,7 @@ void il3820_init(void) /* Software reset */ il3820_write_cmd(IL3820_CMD_SW_RESET, NULL, 0); - + /* Busy wait for the BUSY signal to go low */ il3820_waitbusy(IL3820_WAIT); @@ -245,10 +245,10 @@ void il3820_init(void) // allow partial updates now il3820_partial = true; - + /* Update LUT */ il3820_write_cmd(IL3820_CMD_UPDATE_LUT, il3820_lut_default, sizeof(il3820_lut_default)); - + /* Clear control memory and update */ il3820_clear_cntlr_mem(IL3820_CMD_WRITE_RAM, true); } @@ -257,10 +257,10 @@ void il3820_init(void) void il3820_sleep_in(void) { uint8_t data[] = {0x01}; - + /* Wait for the BUSY signal to go low */ il3820_waitbusy(IL3820_WAIT); - + il3820_write_cmd(IL3820_CMD_SLEEP_MODE, data, 1); } @@ -270,15 +270,15 @@ static void il3820_waitbusy(int wait_ms) int i = 0; vTaskDelay(10 / portTICK_RATE_MS); // 10ms delay - + for(i = 0; i < (wait_ms * 10); i++) { if(gpio_get_level(IL3820_BUSY_PIN) != IL3820_BUSY_LEVEL) { return; } - + vTaskDelay(10 / portTICK_RATE_MS); } - + ESP_LOGE( TAG, "busy exceeded %dms", i*10 ); } @@ -294,10 +294,10 @@ static inline void il3820_data_mode(void) gpio_set_level(IL3820_DC_PIN, 1); } -static inline void il3820_write_cmd(uint8_t cmd, uint8_t *data, size_t len) +static inline void il3820_write_cmd(uint8_t cmd, uint8_t *data, size_t len) { disp_wait_for_pending_transactions(); - + il3820_command_mode(); disp_spi_send_data(&cmd, 1); @@ -308,10 +308,10 @@ static inline void il3820_write_cmd(uint8_t cmd, uint8_t *data, size_t len) } /* Send cmd to the display */ -static inline void il3820_send_cmd(uint8_t cmd) +static inline void il3820_send_cmd(uint8_t cmd) { disp_wait_for_pending_transactions(); - + il3820_command_mode(); disp_spi_send_data(&cmd, 1); } @@ -320,14 +320,14 @@ static inline void il3820_send_cmd(uint8_t cmd) static void il3820_send_data(uint8_t *data, uint16_t length) { disp_wait_for_pending_transactions(); - + il3820_data_mode(); disp_spi_send_colors(data, length); } /* Specify the start/end positions of the window address in the X and Y * directions by an address unit. - * + * * @param sx: X Start position. * @param ex: X End position. * @param ys: Y Start position. @@ -336,7 +336,7 @@ static void il3820_send_data(uint8_t *data, uint16_t length) static inline void il3820_set_window( uint16_t sx, uint16_t ex, uint16_t ys, uint16_t ye) { uint8_t tmp[4] = {0}; - + tmp[0] = sx / 8; tmp[1] = ex / 8; @@ -384,7 +384,7 @@ static void il3820_update_display(void) } else { tmp = (IL3820_CTRL2_ENABLE_CLK | IL3820_CTRL2_ENABLE_ANALOG | IL3820_CTRL2_TO_PATTERN); } - + il3820_write_cmd(IL3820_CMD_UPDATE_CTRL2, &tmp, 1); il3820_write_cmd(IL3820_CMD_MASTER_ACTIVATION, NULL, 0); @@ -400,10 +400,10 @@ static void il3820_clear_cntlr_mem(uint8_t ram_cmd, bool update) /* Arrays used by SPI must be word alligned */ WORD_ALIGNED_ATTR uint8_t clear_page[IL3820_COLUMNS]; memset(clear_page, 0xff, sizeof clear_page); - + /* Configure entry mode */ il3820_write_cmd(IL3820_CMD_ENTRY_MODE, &il3820_scan_mode, 1); - + /* Configure the window */ il3820_set_window(0, EPD_PANEL_WIDTH - 1, 0, EPD_PANEL_HEIGHT - 1); diff --git a/lvgl_tft/ili9486.c b/lvgl_tft/ili9486.c index dd82ac9..166bef8 100644 --- a/lvgl_tft/ili9486.c +++ b/lvgl_tft/ili9486.c @@ -60,8 +60,8 @@ void ili9486_init(void) {0xE0, {0x0F, 0x1F, 0x1C, 0x0C, 0x0F, 0x08, 0x48, 0x98, 0x37, 0x0A, 0x13, 0x04, 0x11, 0x0D, 0x00}, 15}, {0XE1, {0x0F, 0x32, 0x2E, 0x0B, 0x0D, 0x05, 0x47, 0x75, 0x37, 0x06, 0x10, 0x03, 0x24, 0x20, 0x00}, 15}, {0x20, {0}, 0}, /* display inversion OFF */ - {0x36, {0x48}, 1}, - {0x29, {0}, 0x80}, /* display on */ + {0x36, {0x48}, 1}, + {0x29, {0}, 0x80}, /* display on */ {0x00, {0}, 0xff}, }; @@ -140,7 +140,7 @@ void ili9486_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * col ili9486_send_cmd(0x2C); size = lv_area_get_width(area) * lv_area_get_height(area); - + ili9486_send_color((void*) color_map, size * 2); } diff --git a/lvgl_tft/ili9488.c b/lvgl_tft/ili9488.c index 5379b77..ce8bba0 100644 --- a/lvgl_tft/ili9488.c +++ b/lvgl_tft/ili9488.c @@ -50,7 +50,7 @@ static void ili9488_send_color(void * data, uint16_t length); /********************** * GLOBAL FUNCTIONS **********************/ -// From github.com/jeremyjh/ESP32_TFT_library +// From github.com/jeremyjh/ESP32_TFT_library // From github.com/mvturnho/ILI9488-lvgl-ESP32-WROVER-B void ili9488_init(void) { @@ -102,7 +102,7 @@ void ili9488_init(void) // Exit sleep ili9488_send_cmd(0x01); /* Software reset */ vTaskDelay(100 / portTICK_RATE_MS); - + //Send all the commands uint16_t cmd = 0; while (ili_init_cmds[cmd].databytes!=0xff) { @@ -151,7 +151,7 @@ void ili9488_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * col (uint8_t) (area->x2 >> 8) & 0xFF, (uint8_t) (area->x2) & 0xFF, }; - + /* Page addresses */ uint8_t yb[] = { (uint8_t) (area->y1 >> 8) & 0xFF, From 4ba7c7602833cb9c8337aa45702ece9de2c0ec8a Mon Sep 17 00:00:00 2001 From: Rop Gonggrijp Date: Wed, 28 Apr 2021 11:43:40 +0200 Subject: [PATCH 3/6] Added support for M5Core2 screen (CONFIG_LV_PREDEFINED_DISPLAY_M5CORE2) Update README.md --- README.md | 1 + lvgl_tft/Kconfig | 12 ++++++++++++ lvgl_tft/ili9341.c | 2 ++ 3 files changed, 15 insertions(+) diff --git a/README.md b/README.md index 6aeec91..7ee9a6c 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,7 @@ and sets the gpio numbers for the interface. |---------------------------|-----------------------|-----------|-----------|-----------| | ESP Wrover Kit v4.1 | ILI9341 | SPI | 240 | 320 | | M5Stack | ILI9341 | SPI | 240 | 320 | +| M5Core2 | ILI9341 | SPI | 240 | 320 | | M5Stick | SH1107 | SPI | - | - | | M5StickC | ST7735S | SPI | 80 | 160 | | Adafruit 3.5 Featherwing | HX8357 | SPI | 480 | 320 | diff --git a/lvgl_tft/Kconfig b/lvgl_tft/Kconfig index 01bb4ba..47be8d1 100644 --- a/lvgl_tft/Kconfig +++ b/lvgl_tft/Kconfig @@ -21,6 +21,10 @@ menu "LVGL TFT Display controller" bool "M5Stack" select LV_TFT_DISPLAY_CONTROLLER_ILI9341 select LV_TFT_DISPLAY_PROTOCOL_SPI + config LV_PREDEFINED_DISPLAY_M5CORE2 + bool "M5Core2" + select LV_TFT_DISPLAY_CONTROLLER_ILI9341 + select LV_TFT_DISPLAY_PROTOCOL_SPI config LV_PREDEFINED_DISPLAY_M5STICK bool "M5Stick" select LV_TFT_DISPLAY_CONTROLLER_SH1107 @@ -763,6 +767,7 @@ menu "LVGL TFT Display controller" default 23 if LV_PREDEFINED_DISPLAY_WROVER4 default 23 if LV_PREDEFINED_DISPLAY_ATAG default 23 if LV_PREDEFINED_DISPLAY_M5STACK || LV_PREDEFINED_DISPLAY_M5STICK + default 23 if LV_PREDEFINED_DISPLAY_M5CORE2 default 15 if LV_PREDEFINED_DISPLAY_M5STICKC default 18 if LV_PREDEFINED_DISPLAY_ADA_FEATHERWING default 23 if LV_PREDEFINED_PINS_TKOALA @@ -777,6 +782,7 @@ menu "LVGL TFT Display controller" config LV_DISPLAY_USE_SPI_MISO bool "GPIO for MISO (Master In Slave Out)" if LV_TFT_DISPLAY_PROTOCOL_SPI default y if LV_PREDEFINED_PINS_TKOALA + default y if LV_PREDEFINED_DISPLAY_M5CORE2 help Enable the MISO signal to control the display. You can disable it when the display does not need MISO signal to be controlled. @@ -788,6 +794,7 @@ menu "LVGL TFT Display controller" range 0 43 if IDF_TARGET_ESP32S2 default 19 if LV_PREDEFINED_PINS_TKOALA + default 38 if LV_PREDEFINED_DISPLAY_M5CORE2 default 0 help @@ -830,6 +837,7 @@ menu "LVGL TFT Display controller" range 0 43 if IDF_TARGET_ESP32S2 default 18 if LV_PREDEFINED_DISPLAY_M5STACK || LV_PREDEFINED_DISPLAY_M5STICK + default 18 if LV_PREDEFINED_DISPLAY_M5CORE2 default 13 if LV_PREDEFINED_DISPLAY_M5STICKC default 18 if LV_PREDEFINED_DISPLAY_ATAG default 19 if LV_PREDEFINED_DISPLAY_WROVER4 @@ -858,6 +866,7 @@ menu "LVGL TFT Display controller" default 5 if LV_PREDEFINED_PINS_38V1 default 14 if LV_PREDEFINED_DISPLAY_M5STACK || LV_PREDEFINED_DISPLAY_M5STICK + default 5 if LV_PREDEFINED_DISPLAY_M5CORE2 default 5 if LV_PREDEFINED_DISPLAY_M5STICKC default 22 if LV_PREDEFINED_DISPLAY_WROVER4 default 15 if LV_PREDEFINED_DISPLAY_ADA_FEATHERWING @@ -887,6 +896,7 @@ menu "LVGL TFT Display controller" default 19 if LV_PREDEFINED_PINS_38V1 default 17 if LV_PREDEFINED_PINS_38V4 default 27 if LV_PREDEFINED_DISPLAY_M5STACK || LV_PREDEFINED_DISPLAY_M5STICK + default 15 if LV_PREDEFINED_DISPLAY_M5CORE2 default 23 if LV_PREDEFINED_DISPLAY_M5STICKC default 21 if LV_PREDEFINED_DISPLAY_WROVER4 default 21 if LV_PREDEFINED_DISPLAY_WT32_SC01 @@ -902,6 +912,7 @@ menu "LVGL TFT Display controller" config LV_DISP_USE_RST bool "Use a GPIO for resetting the display" if LV_TFT_DISPLAY_PROTOCOL_SPI + default n if LV_PREDEFINED_DISPLAY_M5CORE2 default y help Enable display reset control. Set this if the reset pin of the @@ -950,6 +961,7 @@ menu "LVGL TFT Display controller" ( LV_PREDEFINED_DISPLAY_NONE && ! ( LV_TFT_DISPLAY_CONTROLLER_SH1107 || LV_TFT_DISPLAY_CONTROLLER_SSD1306 ) ) \ || LV_PREDEFINED_DISPLAY_RPI_MPI3501 default y if LV_PREDEFINED_DISPLAY_M5STACK + default n if LV_PREDEFINED_DISPLAY_M5CORE2 default y if LV_PREDEFINED_DISPLAY_WROVER4 default y if LV_PREDEFINED_DISPLAY_ERTFT0356 default y if LV_PREDEFINED_DISPLAY_TTGO diff --git a/lvgl_tft/ili9341.c b/lvgl_tft/ili9341.c index 41bd199..23aba09 100644 --- a/lvgl_tft/ili9341.c +++ b/lvgl_tft/ili9341.c @@ -233,6 +233,8 @@ static void ili9341_set_orientation(uint8_t orientation) #if defined CONFIG_LV_PREDEFINED_DISPLAY_M5STACK uint8_t data[] = {0x68, 0x68, 0x08, 0x08}; +#elif defined (CONFIG_LV_PREDEFINED_DISPLAY_M5CORE2) + uint8_t data[] = {0x08, 0x88, 0x28, 0xE8}; #elif defined (CONFIG_LV_PREDEFINED_DISPLAY_WROVER4) uint8_t data[] = {0x6C, 0xEC, 0xCC, 0x4C}; #elif defined (CONFIG_LV_PREDEFINED_DISPLAY_NONE) From 21f81d117b49c8e0097bc9ac435ed3124d39d96f Mon Sep 17 00:00:00 2001 From: Martin Lindberg Mogensen Date: Thu, 29 Apr 2021 09:55:22 +0200 Subject: [PATCH 4/6] Support ILI9163c (Sparkfun LCD-15143) --- CMakeLists.txt | 2 + README.md | 1 + lvgl_helpers.h | 2 + lvgl_spi_conf.h | 7 +- lvgl_tft/Kconfig | 15 ++- lvgl_tft/disp_driver.c | 8 +- lvgl_tft/disp_driver.h | 2 + lvgl_tft/ili9163c.c | 270 +++++++++++++++++++++++++++++++++++++++++ lvgl_tft/ili9163c.h | 65 ++++++++++ 9 files changed, 365 insertions(+), 7 deletions(-) create mode 100644 lvgl_tft/ili9163c.c create mode 100644 lvgl_tft/ili9163c.h diff --git a/CMakeLists.txt b/CMakeLists.txt index d86bd33..5832233 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,6 +41,8 @@ elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_RA8875) list(APPEND SOURCES "lvgl_tft/ra8875.c") elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_GC9A01) list(APPEND SOURCES "lvgl_tft/GC9A01.c") +elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9163C) + list(APPEND SOURCES "lvgl_tft/ili9163c.c") else() message(WARNING "LVGL ESP32 drivers: Display controller not defined.") endif() diff --git a/README.md b/README.md index 6aeec91..70fa047 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ swap of RGB565 color on the LVGL configuration menuconfig (it's not handled auto | Display Controller | Type | Interface | Color depth (LV_COLOR_DEPTH) | Swap RGB565 color (LV_COLOR_16_SWAP) | |---------------------------------------------|------------|------------------------|------------------------------|----------------------------------------| | ILI9341 | TFT | SPI | 16: RGB565 | Yes | +| ILI9163C | TFT | SPI | 16: RGB565 | Yes | | ILI9486 | TFT | SPI | 16: RGB565 | Yes | | ILI9488 | TFT | SPI | 16: RGB565 | No | | HX8357B/HX8357D | TFT | SPI | 16: RGB565 | Yes | diff --git a/lvgl_helpers.h b/lvgl_helpers.h index 70ef353..081a843 100644 --- a/lvgl_helpers.h +++ b/lvgl_helpers.h @@ -73,6 +73,8 @@ extern "C" { #define DISP_BUF_SIZE ((LV_VER_RES_MAX * LV_VER_RES_MAX) / 8) // 5KB #elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_UC8151D) #define DISP_BUF_SIZE ((LV_VER_RES_MAX * LV_VER_RES_MAX) / 8) // 2888 bytes +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9163C +#define DISP_BUF_SIZE (LV_HOR_RES_MAX * 40) #else #error "No display controller selected" #endif diff --git a/lvgl_spi_conf.h b/lvgl_spi_conf.h index 16e63b4..b5e7901 100644 --- a/lvgl_spi_conf.h +++ b/lvgl_spi_conf.h @@ -130,7 +130,8 @@ extern "C" { defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_SH1107) || \ defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X) || \ defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_IL3820) || \ - defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_JD79653A) + defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_JD79653A) || \ + defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9163C) #define SPI_BUS_MAX_TRANSFER_SZ (DISP_BUF_SIZE * 2) @@ -157,7 +158,9 @@ extern "C" { #define SPI_TFT_CLOCK_SPEED_HZ (40*1000*1000) #elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9341) #define SPI_TFT_CLOCK_SPEED_HZ (40*1000*1000) -#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X) +#elif defined(CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9163C) +#define SPI_TFT_CLOCK_SPEED_HZ (40 * 1000 * 1000) +#elif defined(CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X) #define SPI_TFT_CLOCK_SPEED_HZ (32*1000*1000) #else #define SPI_TFT_CLOCK_SPEED_HZ (40*1000*1000) diff --git a/lvgl_tft/Kconfig b/lvgl_tft/Kconfig index ddd7f51..e822f60 100644 --- a/lvgl_tft/Kconfig +++ b/lvgl_tft/Kconfig @@ -165,6 +165,11 @@ menu "LVGL TFT Display controller" help ST7796S display controller. + config LV_TFT_DISPLAY_CONTROLLER_ILI9163C + bool + help + ILI9163C display controller. + # Display controller communication protocol # # This symbols define the communication protocol used by the @@ -327,6 +332,10 @@ menu "LVGL TFT Display controller" bool "RA8875" select LV_TFT_DISPLAY_CONTROLLER_RA8875 select LV_TFT_DISPLAY_PROTOCOL_SPI + config LV_TFT_DISPLAY_USER_CONTROLLER_ILI9163C + bool "ILI9163C" + select LV_TFT_DISPLAY_CONTROLLER_ILI9163C + select LV_TFT_DISPLAY_PROTOCOL_SPI endchoice config CUSTOM_DISPLAY_BUFFER_SIZE @@ -586,7 +595,7 @@ menu "LVGL TFT Display controller" If text is backwards on your display, try enabling this. config LV_INVERT_COLORS - bool "Invert colors in display" if LV_TFT_DISPLAY_CONTROLLER_ILI9341 || LV_TFT_DISPLAY_CONTROLLER_ST7735S || LV_TFT_DISPLAY_CONTROLLER_ILI9481 || LV_TFT_DISPLAY_CONTROLLER_ST7789 || LV_TFT_DISPLAY_CONTROLLER_SSD1306 || LV_TFT_DISPLAY_CONTROLLER_SH1107 || LV_TFT_DISPLAY_CONTROLLER_HX8357 + bool "Invert colors in display" if LV_TFT_DISPLAY_CONTROLLER_ILI9341 || LV_TFT_DISPLAY_CONTROLLER_ST7735S || LV_TFT_DISPLAY_CONTROLLER_ILI9481 || LV_TFT_DISPLAY_CONTROLLER_ST7789 || LV_TFT_DISPLAY_CONTROLLER_SSD1306 || LV_TFT_DISPLAY_CONTROLLER_SH1107 || LV_TFT_DISPLAY_CONTROLLER_HX8357 || LV_TFT_DISPLAY_CONTROLLER_ILI9163C default y if LV_PREDEFINED_DISPLAY_M5STACK || LV_PREDEFINED_DISPLAY_M5STICKC help If the colors look inverted on your display, try enabling this. @@ -744,11 +753,11 @@ menu "LVGL TFT Display controller" config LV_DISP_ST7789_SOFT_RESET bool "Soft reset - use software reset instead of reset pin" - depends on LV_TFT_DISPLAY_CONTROLLER_ST7789 + depends on LV_TFT_DISPLAY_CONTROLLER_ST7789 default n help Use software reset and ignores configured reset pin (some hardware does not use a reset pin). - + endmenu # menu will be visible only when LV_PREDEFINED_DISPLAY_NONE is y diff --git a/lvgl_tft/disp_driver.c b/lvgl_tft/disp_driver.c index 9f8e857..adae2ad 100644 --- a/lvgl_tft/disp_driver.c +++ b/lvgl_tft/disp_driver.c @@ -21,7 +21,7 @@ void disp_driver_init(void) st7735s_init(); #elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_HX8357 hx8357_init(); -#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9486 +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9486 ili9486_init(); #elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SH1107 sh1107_init(); @@ -39,6 +39,8 @@ void disp_driver_init(void) jd79653a_init(); #elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_UC8151D uc8151d_init(); +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9163C + ili9163c_init(); #endif } @@ -76,6 +78,8 @@ void disp_driver_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * jd79653a_lv_fb_flush(drv, area, color_map); #elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_UC8151D uc8151d_lv_fb_flush(drv, area, color_map); +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9163C + ili9163c_flush(drv, area, color_map); #endif } @@ -95,7 +99,7 @@ void disp_driver_rounder(lv_disp_drv_t * disp_drv, lv_area_t * area) } void disp_driver_set_px(lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, - lv_color_t color, lv_opa_t opa) + lv_color_t color, lv_opa_t opa) { #if defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SSD1306 ssd1306_set_px_cb(disp_drv, buf, buf_w, x, y, color, opa); diff --git a/lvgl_tft/disp_driver.h b/lvgl_tft/disp_driver.h index e48d05e..2e369cc 100644 --- a/lvgl_tft/disp_driver.h +++ b/lvgl_tft/disp_driver.h @@ -50,6 +50,8 @@ extern "C" { #include "jd79653a.h" #elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_UC8151D #include "uc8151d.h" +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9163C +#include "ili9163c.h" #endif /********************* diff --git a/lvgl_tft/ili9163c.c b/lvgl_tft/ili9163c.c new file mode 100644 index 0000000..77346e4 --- /dev/null +++ b/lvgl_tft/ili9163c.c @@ -0,0 +1,270 @@ +/** + * @file ILI9163C.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "ili9163c.h" +#include "disp_spi.h" +#include "driver/gpio.h" +#include "esp_log.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "assert.h" + +/********************* + * DEFINES + *********************/ +#define TAG "ILI9163C" + +// ILI9163C specific commands used in init +#define ILI9163C_NOP 0x00 +#define ILI9163C_SWRESET 0x01 +#define ILI9163C_RDDID 0x04 +#define ILI9163C_RDDST 0x09 + +#define ILI9163C_SLPIN 0x10 +#define ILI9163C_SLPOUT 0x11 +#define ILI9163C_PTLON 0x12 +#define ILI9163C_NORON 0x13 + +#define ILI9163C_INVOFF 0x20 +#define ILI9163C_INVON 0x21 +#define ILI9163C_CMD_GAMST 0x26 +#define ILI9163C_DISPOFF 0x28 +#define ILI9163C_DISPON 0x29 +#define ILI9163C_CASET 0x2A +#define ILI9163C_RASET 0x2B +#define ILI9163C_RAMWR 0x2C +#define ILI9163C_COLORSET 0x2D +#define ILI9163C_RAMRD 0x2E + +#define ILI9163C_PTLAR 0x30 +#define ILI9163C_VSCRDEF 0x33 +#define ILI9163C_COLMOD 0x3A +#define ILI9163C_MADCTL 0x36 +#define ILI9163C_VSCRSADD 0x37 + +#define ILI9163C_FRMCTR1 0xB1 +#define ILI9163C_FRMCTR2 0xB2 +#define ILI9163C_FRMCTR3 0xB3 +#define ILI9163C_INVCTR 0xB4 +#define ILI9163C_DISSET5 0xB6 +#define ILI9163C_SDDC 0xB7 + +#define ILI9163C_PWCTR1 0xC0 +#define ILI9163C_PWCTR2 0xC1 +#define ILI9163C_PWCTR3 0xC2 +#define ILI9163C_PWCTR4 0xC3 +#define ILI9163C_PWCTR5 0xC4 +#define ILI9163C_VMCTR1 0xC5 +#define ILI9163C_VMCOFFS 0xC7 + +#define ILI9163C_GAMCTL 0xF2 + +#define ILI9163C_GMCTRP1 0xE0 +#define ILI9163C_GMCTRN1 0xE1 + +#define ST77XX_MADCTL_MY 0x80 +#define ST77XX_MADCTL_MX 0x40 +#define ST77XX_MADCTL_MV 0x20 #define +#define ST77XX_MADCTL_ML 0x10 +#define ST77XX_MADCTL_RGB 0x00 +#define ST77XX_MADCTL_BGR 0x08 + +/********************** + * TYPEDEFS + **********************/ + +/*The LCD needs a bunch of command/argument values to be initialized. They are stored in this struct. */ +typedef struct +{ + uint8_t cmd; + uint8_t data[16]; + uint8_t databytes; //No of data in data; bit 7 = delay after set; 0xFF = end of cmds. +} lcd_init_cmd_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void ili9163c_set_orientation(uint8_t orientation); + +static void ili9163c_send_cmd(uint8_t cmd); +static void ili9163c_send_data(void *data, uint16_t length); +static void ili9163c_send_color(void *data, uint16_t length); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void ili9163c_init(void) +{ + ESP_LOGD(TAG, "Init"); + + lcd_init_cmd_t ili_init_cmds[] = { + {ILI9163C_SWRESET, {0}, 0x80}, // Software reset, 0 args, w/delay 120ms + {ILI9163C_SLPOUT, {0}, 0x80}, // Out of sleep mode, 0 args, w/delay 5ms + {ILI9163C_CMD_GAMST, {0x04}, 1}, // Gamma Curve + {ILI9163C_FRMCTR1, {0x0C, 0x14}, 2}, // Frame rate ctrl - normal mode + {ILI9163C_INVCTR, {0x07}, 1}, // Display inversion ctrl, 1 arg, no delay:No inversion + {ILI9163C_PWCTR1, {0x0C, 0x05}, 2}, // Power control, 2 args, no delay + {ILI9163C_PWCTR2, {0x02}, 1}, // Power control, 1 arg + {ILI9163C_PWCTR3, {0x02}, 1}, // Power control, 1 arg + {ILI9163C_VMCTR1, {0x20, 0x55}, 2}, // Power control, 1 arg, no delay: + {ILI9163C_VMCOFFS, {0x40}, 1}, // VCOM Offset +#if ILI9163C_INVERT_COLORS == 1 + {ILI9163C_INVON, {0}, 0}, // set inverted mode +#else + {ILI9163C_INVOFF, {0}, 0}, // set non-inverted mode +#endif + {ILI9163C_COLMOD, {0x5}, 1}, // set color mode, 1 arg, no delay: 16-bit color + {ILI9163C_SDDC, {0}, 1}, // set source driver direction control + {ILI9163C_GAMCTL, {0x01}, 1}, // set source driver direction control + {ILI9163C_GMCTRP1, {0x36, 0x29, 0x12, 0x22, 0x1C, 0x15, 0x42, 0xB7, 0x2F, 0x13, 0x12, 0x0A, 0x11, 0x0B, 0x06}, 16}, // 16 args, no delay: + {ILI9163C_GMCTRN1, {0x09, 0x16, 0x2D, 0x0D, 0x13, 0x15, 0x40, 0x48, 0x53, 0x0C, 0x1D, 0x25, 0x2E, 0x34, 0x39}, 16}, // 16 args, no delay: + {ILI9163C_NORON, {0}, 0x80}, // Normal display on, no args, w/delay 10 ms delay + {ILI9163C_DISPON, {0}, 0x80}, // Main screen turn on, no args w/delay 100 ms delay + {0, {0}, 0xff} + }; + + //Initialize non-SPI GPIOs + gpio_pad_select_gpio(ILI9163C_DC); + gpio_set_direction(ILI9163C_DC, GPIO_MODE_OUTPUT); + gpio_pad_select_gpio(ILI9163C_RST); + gpio_set_direction(ILI9163C_RST, GPIO_MODE_OUTPUT); + +#if ILI9163C_ENABLE_BACKLIGHT_CONTROL + gpio_pad_select_gpio(ILI9163C_BCKL); + gpio_set_direction(ILI9163C_BCKL, GPIO_MODE_OUTPUT); +#endif + //Reset the display + gpio_set_level(ILI9163C_RST, 0); + vTaskDelay(100 / portTICK_RATE_MS); + gpio_set_level(ILI9163C_RST, 1); + vTaskDelay(150 / portTICK_RATE_MS); + + //Send all the commands + uint16_t cmd = 0; + while (ili_init_cmds[cmd].databytes != 0xff) + { + ili9163c_send_cmd(ili_init_cmds[cmd].cmd); + ili9163c_send_data(ili_init_cmds[cmd].data, ili_init_cmds[cmd].databytes & 0x1F); + if (ili_init_cmds[cmd].databytes & 0x80) + { + vTaskDelay(150 / portTICK_RATE_MS); + } + cmd++; + } + + ili9163c_enable_backlight(true); + + ili9163c_set_orientation(CONFIG_LV_DISPLAY_ORIENTATION); +} + +void ili9163c_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map) +{ + uint8_t data[4]; + + /*Column addresses*/ + ili9163c_send_cmd(ILI9163C_CASET); + data[0] = (area->x1 >> 8) & 0xFF; + data[1] = area->x1 & 0xFF; + data[2] = (area->x2 >> 8) & 0xFF; + data[3] = area->x2 & 0xFF; + ili9163c_send_data(data, 4); + + /*Page addresses*/ + ili9163c_send_cmd(ILI9163C_RASET); + data[0] = (area->y1 >> 8) & 0xFF; + data[1] = area->y1 & 0xFF; + data[2] = (area->y2 >> 8) & 0xFF; + data[3] = area->y2 & 0xFF; + ili9163c_send_data(data, 4); + + /*Memory write*/ + ili9163c_send_cmd(ILI9163C_RAMWR); + + uint32_t size = lv_area_get_width(area) * lv_area_get_height(area); + + ili9163c_send_color((void *)color_map, size * 2); +} + +void ili9163c_enable_backlight(bool backlight) +{ +#if ILI9163C_ENABLE_BACKLIGHT_CONTROL + ESP_LOGD(TAG, "%s backlight.", backlight ? "Enabling" : "Disabling"); + uint32_t tmp = 0; + +#if (ILI9163C_BCKL_ACTIVE_LVL == 1) + tmp = backlight ? 1 : 0; +#else + tmp = backlight ? 0 : 1; +#endif + + gpio_set_level(ILI9163C_BCKL, tmp); +#endif +} + +void ili9163c_sleep_in() +{ + uint8_t data[] = {0x08}; + ili9163c_send_cmd(ILI9163C_SLPIN); + ili9163c_send_data(&data, 1); +} + +void ili9163c_sleep_out() +{ + uint8_t data[] = {0x08}; + ili9163c_send_cmd(ILI9163C_SLPOUT); + ili9163c_send_data(&data, 1); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void ili9163c_send_cmd(uint8_t cmd) +{ + disp_wait_for_pending_transactions(); + gpio_set_level(ILI9163C_DC, 0); /*Command mode*/ + disp_spi_send_data(&cmd, 1); +} + +static void ili9163c_send_data(void *data, uint16_t length) +{ + disp_wait_for_pending_transactions(); + gpio_set_level(ILI9163C_DC, 1); /*Data mode*/ + disp_spi_send_data(data, length); +} + +static void ili9163c_send_color(void *data, uint16_t length) +{ + disp_wait_for_pending_transactions(); + gpio_set_level(ILI9163C_DC, 1); /*Data mode*/ + disp_spi_send_colors(data, length); +} + +static void ili9163c_set_orientation(uint8_t orientation) +{ + assert(orientation < 4); + + const char *orientation_str[] = { + "PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED"}; + + ESP_LOGD(TAG, "Display orientation: %s", orientation_str[orientation]); + + uint8_t data[] = {0x48, 0x88, 0xA8, 0x68}; + + ili9163c_send_cmd(ILI9163C_MADCTL); + ili9163c_send_data((void *)&data[orientation], 1); +} diff --git a/lvgl_tft/ili9163c.h b/lvgl_tft/ili9163c.h new file mode 100644 index 0000000..f164ba8 --- /dev/null +++ b/lvgl_tft/ili9163c.h @@ -0,0 +1,65 @@ +/** + * @file lv_templ.h + * + */ + +#ifndef ILI9163C_H +#define ILI9163C_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************* + * INCLUDES + *********************/ +#include + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE +#include "lvgl.h" +#else +#include "lvgl/lvgl.h" +#endif +#include "../lvgl_helpers.h" + +/********************* + * DEFINES + *********************/ +#define ILI9163C_DC CONFIG_LV_DISP_PIN_DC +#define ILI9163C_RST CONFIG_LV_DISP_PIN_RST +#define ILI9163C_BCKL CONFIG_LV_DISP_PIN_BCKL + +#define ILI9163C_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL + +#if CONFIG_LV_BACKLIGHT_ACTIVE_LVL +#define ILI9163C_BCKL_ACTIVE_LVL 1 +#else +#define ILI9163C_BCKL_ACTIVE_LVL 0 +#endif + +#define ILI9163C_INVERT_COLORS CONFIG_LV_INVERT_COLORS + + /********************** + * TYPEDEFS + **********************/ + + /********************** + * GLOBAL PROTOTYPES + **********************/ + + void ili9163c_init(void); + void ili9163c_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map); + void ili9163c_enable_backlight(bool backlight); + void ili9163c_sleep_in(void); + void ili9163c_sleep_out(void); + + /********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*ILI9163C_H*/ From 23907711caeb2e90690d16f051d676ac9af7c18c Mon Sep 17 00:00:00 2001 From: C47D Date: Sun, 9 May 2021 21:31:32 -0500 Subject: [PATCH 5/6] ST7789: Expose send_cmd and send_data to the user --- lvgl_tft/st7789.c | 6 ++---- lvgl_tft/st7789.h | 3 +++ 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lvgl_tft/st7789.c b/lvgl_tft/st7789.c index 2b5bd7e..b8b9fb3 100644 --- a/lvgl_tft/st7789.c +++ b/lvgl_tft/st7789.c @@ -35,8 +35,6 @@ typedef struct { **********************/ static void st7789_set_orientation(uint8_t orientation); -static void st7789_send_cmd(uint8_t cmd); -static void st7789_send_data(void *data, uint16_t length); static void st7789_send_color(void *data, uint16_t length); /********************** @@ -201,14 +199,14 @@ void st7789_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * colo /********************** * STATIC FUNCTIONS **********************/ -static void st7789_send_cmd(uint8_t cmd) +void st7789_send_cmd(uint8_t cmd) { disp_wait_for_pending_transactions(); gpio_set_level(ST7789_DC, 0); disp_spi_send_data(&cmd, 1); } -static void st7789_send_data(void * data, uint16_t length) +void st7789_send_data(void * data, uint16_t length) { disp_wait_for_pending_transactions(); gpio_set_level(ST7789_DC, 1); diff --git a/lvgl_tft/st7789.h b/lvgl_tft/st7789.h index 3175329..7fc6a30 100644 --- a/lvgl_tft/st7789.h +++ b/lvgl_tft/st7789.h @@ -114,6 +114,9 @@ void st7789_init(void); void st7789_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map); void st7789_enable_backlight(bool backlight); +void st7789_send_cmd(uint8_t cmd); +void st7789_send_data(void *data, uint16_t length); + #ifdef __cplusplus } /* extern "C" */ #endif From c3e8f49ae41e0a4c592707bc7f3cdac2b78a4cde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abra=C3=A3o=20de=20Santana?= Date: Thu, 27 May 2021 22:36:39 -0300 Subject: [PATCH 6/6] Update Kconfig --- lvgl_tft/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lvgl_tft/Kconfig b/lvgl_tft/Kconfig index ddd7f51..11ae4d2 100644 --- a/lvgl_tft/Kconfig +++ b/lvgl_tft/Kconfig @@ -586,7 +586,7 @@ menu "LVGL TFT Display controller" If text is backwards on your display, try enabling this. config LV_INVERT_COLORS - bool "Invert colors in display" if LV_TFT_DISPLAY_CONTROLLER_ILI9341 || LV_TFT_DISPLAY_CONTROLLER_ST7735S || LV_TFT_DISPLAY_CONTROLLER_ILI9481 || LV_TFT_DISPLAY_CONTROLLER_ST7789 || LV_TFT_DISPLAY_CONTROLLER_SSD1306 || LV_TFT_DISPLAY_CONTROLLER_SH1107 || LV_TFT_DISPLAY_CONTROLLER_HX8357 + bool "Invert colors in display" if LV_TFT_DISPLAY_CONTROLLER_ILI9341 || LV_TFT_DISPLAY_CONTROLLER_ST7735S || LV_TFT_DISPLAY_CONTROLLER_ILI9481 || LV_TFT_DISPLAY_CONTROLLER_ST7789 || LV_TFT_DISPLAY_CONTROLLER_SSD1306 || LV_TFT_DISPLAY_CONTROLLER_SH1107 || LV_TFT_DISPLAY_CONTROLLER_HX8357 || LV_TFT_DISPLAY_CONTROLLER_GC9A01 default y if LV_PREDEFINED_DISPLAY_M5STACK || LV_PREDEFINED_DISPLAY_M5STICKC help If the colors look inverted on your display, try enabling this.