From 803c58774c35e702c8e9c417b3cb6df9e6c81bef Mon Sep 17 00:00:00 2001 From: Tomas Rezucha Date: Tue, 3 Aug 2021 16:35:25 +0200 Subject: [PATCH 001/105] Remove display driver dependancies on Kconfig --- CMakeLists.txt | 23 +------------------- lvgl_tft/EVE_config.h | 2 ++ lvgl_tft/GC9A01.c | 12 +++++------ lvgl_tft/il3820.c | 5 ++++- lvgl_tft/ili9341.c | 14 ++++++------- lvgl_tft/ili9486.c | 8 +++---- lvgl_tft/ili9488.c | 8 +++---- lvgl_tft/jd79653a.c | 10 ++++++--- lvgl_tft/ra8875.c | 33 ++++++++++++++++++++--------- lvgl_tft/st7735s.c | 49 +++++++++++++++++++++++-------------------- lvgl_tft/st7796s.c | 14 ++++++------- 11 files changed, 89 insertions(+), 89 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2dbc2f7..b9bdfa7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,46 +6,25 @@ list(APPEND SOURCES "lvgl_tft/disp_driver.c") #@todo add SimleInclude macro here -# Include only the source file of the selected -# display controller. -if(CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9341) +# Build all display drivers list(APPEND SOURCES "lvgl_tft/ili9341.c") -elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9481) list(APPEND SOURCES "lvgl_tft/ili9481.c") -elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9486) list(APPEND SOURCES "lvgl_tft/ili9486.c") -elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9488) list(APPEND SOURCES "lvgl_tft/ili9488.c") -elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7789) list(APPEND SOURCES "lvgl_tft/st7789.c") -elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7735S) list(APPEND SOURCES "lvgl_tft/st7735s.c") -elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7796S) list(APPEND SOURCES "lvgl_tft/st7796s.c") -elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_HX8357) list(APPEND SOURCES "lvgl_tft/hx8357.c") -elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_SH1107) list(APPEND SOURCES "lvgl_tft/sh1107.c") -elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_SSD1306) list(APPEND SOURCES "lvgl_tft/ssd1306.c") -elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X) list(APPEND SOURCES "lvgl_tft/EVE_commands.c") list(APPEND SOURCES "lvgl_tft/FT81x.c") -elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_IL3820) list(APPEND SOURCES "lvgl_tft/il3820.c") -elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_JD79653A) list(APPEND SOURCES "lvgl_tft/jd79653a.c") -elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_UC8151D) list(APPEND SOURCES "lvgl_tft/uc8151d.c") -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() if(CONFIG_LV_TFT_DISPLAY_PROTOCOL_SPI) list(APPEND SOURCES "lvgl_tft/disp_spi.c") diff --git a/lvgl_tft/EVE_config.h b/lvgl_tft/EVE_config.h index 386edb9..a15e746 100644 --- a/lvgl_tft/EVE_config.h +++ b/lvgl_tft/EVE_config.h @@ -208,6 +208,8 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR TH #define EVE_SUNFLOWER #elif defined(CONFIG_LV_FT81X_CONFIG_EVE_CONNECTEVE) #define EVE_CONNECTEVE +#else +#define EVE_EVE2_35 // Define something if there is no Kconfig option selected #endif /* display timing parameters below */ diff --git a/lvgl_tft/GC9A01.c b/lvgl_tft/GC9A01.c index 6f32051..a40d299 100644 --- a/lvgl_tft/GC9A01.c +++ b/lvgl_tft/GC9A01.c @@ -255,7 +255,7 @@ static void GC9A01_send_color(void * data, uint16_t length) static void GC9A01_set_orientation(uint8_t orientation) { - // ESP_ASSERT(orientation < 4); + assert(orientation < 4); const char *orientation_str[] = { "PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED" @@ -264,14 +264,14 @@ static void GC9A01_set_orientation(uint8_t orientation) ESP_LOGI(TAG, "Display orientation: %s", orientation_str[orientation]); #if defined CONFIG_LV_PREDEFINED_DISPLAY_M5STACK - uint8_t data[] = {0x68, 0x68, 0x08, 0x08}; /// + const uint8_t data[] = {0x68, 0x68, 0x08, 0x08}; #elif defined (CONFIG_LV_PREDEFINED_DISPLAY_WROVER4) - uint8_t data[] = {0x4C, 0x88, 0x28, 0xE8}; /// -#elif defined (CONFIG_LV_PREDEFINED_DISPLAY_NONE) - uint8_t data[] = {0x08, 0xC8, 0x68, 0xA8}; ///ggggg + const uint8_t data[] = {0x4C, 0x88, 0x28, 0xE8}; +#else + const uint8_t data[] = {0x08, 0xC8, 0x68, 0xA8}; #endif - ESP_LOGI(TAG, "0x36 command value: 0x%02X", data[orientation]); + ESP_LOGD(TAG, "0x36 command value: 0x%02X", data[orientation]); GC9A01_send_cmd(0x36); GC9A01_send_data((void *) &data[orientation], 1); diff --git a/lvgl_tft/il3820.c b/lvgl_tft/il3820.c index fee39e2..1d69136 100644 --- a/lvgl_tft/il3820.c +++ b/lvgl_tft/il3820.c @@ -180,7 +180,10 @@ void il3820_set_px_cb(lv_disp_drv_t * disp_drv, uint8_t* buf, BIT_CLEAR(buf[byte_index], 7 - bit_index); } #else -#error "Unsupported orientation used" + (void)byte_index; + (void)bit_index; + assert(false); // Crash if we get here, but allow compilation for CI +#warning "Unsupported orientation used" #endif } diff --git a/lvgl_tft/ili9341.c b/lvgl_tft/ili9341.c index 23aba09..0d3c8a0 100644 --- a/lvgl_tft/ili9341.c +++ b/lvgl_tft/ili9341.c @@ -223,7 +223,7 @@ static void ili9341_send_color(void * data, uint16_t length) static void ili9341_set_orientation(uint8_t orientation) { - // ESP_ASSERT(orientation < 4); + assert(orientation < 4); const char *orientation_str[] = { "PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED" @@ -232,16 +232,16 @@ static void ili9341_set_orientation(uint8_t orientation) ESP_LOGI(TAG, "Display orientation: %s", orientation_str[orientation]); #if defined CONFIG_LV_PREDEFINED_DISPLAY_M5STACK - uint8_t data[] = {0x68, 0x68, 0x08, 0x08}; + const uint8_t data[] = {0x68, 0x68, 0x08, 0x08}; #elif defined (CONFIG_LV_PREDEFINED_DISPLAY_M5CORE2) - uint8_t data[] = {0x08, 0x88, 0x28, 0xE8}; + const 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) - uint8_t data[] = {0x48, 0x88, 0x28, 0xE8}; + const uint8_t data[] = {0x6C, 0xEC, 0xCC, 0x4C}; +#else + const uint8_t data[] = {0x48, 0x88, 0x28, 0xE8}; #endif - ESP_LOGI(TAG, "0x36 command value: 0x%02X", data[orientation]); + ESP_LOGD(TAG, "0x36 command value: 0x%02X", data[orientation]); ili9341_send_cmd(0x36); ili9341_send_data((void *) &data[orientation], 1); diff --git a/lvgl_tft/ili9486.c b/lvgl_tft/ili9486.c index 166bef8..fda7402 100644 --- a/lvgl_tft/ili9486.c +++ b/lvgl_tft/ili9486.c @@ -200,7 +200,7 @@ static void ili9486_send_color(void * data, uint16_t length) static void ili9486_set_orientation(uint8_t orientation) { - // ESP_ASSERT(orientation < 4); + assert(orientation < 4); const char *orientation_str[] = { "PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED" @@ -208,11 +208,9 @@ static void ili9486_set_orientation(uint8_t orientation) ESP_LOGI(TAG, "Display orientation: %s", orientation_str[orientation]); -#if defined (CONFIG_LV_PREDEFINED_DISPLAY_NONE) - uint8_t data[] = {0x48, 0x88, 0x28, 0xE8}; -#endif + const uint8_t data[] = {0x48, 0x88, 0x28, 0xE8}; - ESP_LOGI(TAG, "0x36 command value: 0x%02X", data[orientation]); + ESP_LOGD(TAG, "0x36 command value: 0x%02X", data[orientation]); ili9486_send_cmd(0x36); ili9486_send_data((void *) &data[orientation], 1); diff --git a/lvgl_tft/ili9488.c b/lvgl_tft/ili9488.c index ce8bba0..7af78ea 100644 --- a/lvgl_tft/ili9488.c +++ b/lvgl_tft/ili9488.c @@ -219,7 +219,7 @@ static void ili9488_send_color(void * data, uint16_t length) static void ili9488_set_orientation(uint8_t orientation) { - // ESP_ASSERT(orientation < 4); + assert(orientation < 4); const char *orientation_str[] = { "PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED" @@ -227,11 +227,9 @@ static void ili9488_set_orientation(uint8_t orientation) ESP_LOGI(TAG, "Display orientation: %s", orientation_str[orientation]); -#if defined (CONFIG_LV_PREDEFINED_DISPLAY_NONE) - uint8_t data[] = {0x48, 0x88, 0x28, 0xE8}; -#endif + const uint8_t data[] = {0x48, 0x88, 0x28, 0xE8}; - ESP_LOGI(TAG, "0x36 command value: 0x%02X", data[orientation]); + ESP_LOGD(TAG, "0x36 command value: 0x%02X", data[orientation]); ili9488_send_cmd(0x36); ili9488_send_data((void *) &data[orientation], 1); diff --git a/lvgl_tft/jd79653a.c b/lvgl_tft/jd79653a.c index 0f4be67..fb67b8b 100644 --- a/lvgl_tft/jd79653a.c +++ b/lvgl_tft/jd79653a.c @@ -126,7 +126,7 @@ static const jd79653a_seq_t init_seq[] = { #elif defined(CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT) {0x00, {0xdf, 0x0e}, 2}, // Panel settings #else -#error "Unsupported orientation - only portrait modes are supported for now" +#warning "Unsupported orientation - only portrait modes are supported for now" #endif {0x4d, {0x55}, 1}, // Undocumented secret from demo code {0xaa, {0x0f}, 1}, // Undocumented secret from demo code @@ -249,7 +249,9 @@ static void jd79653a_partial_in() #elif defined(CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT) uint8_t pst_use_reg_lut[] = { 0xff, 0x0e }; #else -#error "Unsupported orientation - only portrait modes are supported for now" + assert(false); // Crash if we get here, but allow compilation for CI + uint8_t pst_use_reg_lut[] = { 0,0 }; +#warning "Unsupported orientation - only portrait modes are supported for now" #endif jd79653a_spi_send_cmd(0x00); jd79653a_spi_send_data(pst_use_reg_lut, sizeof(pst_use_reg_lut)); @@ -276,7 +278,9 @@ static void jd79653a_partial_out() #elif defined(CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT) uint8_t pst_use_otp_lut[] = { 0xdf, 0x0e }; #else -#error "Unsupported orientation - only portrait modes are supported for now" + assert(false); // Crash if we get here, but allow compilation for CI + uint8_t pst_use_otp_lut[] = { 0,0 }; +#warning "Unsupported orientation - only portrait modes are supported for now" #endif jd79653a_spi_send_cmd(0x00); jd79653a_spi_send_data(pst_use_otp_lut, sizeof(pst_use_otp_lut)); diff --git a/lvgl_tft/ra8875.c b/lvgl_tft/ra8875.c index c08ff88..7c4b976 100644 --- a/lvgl_tft/ra8875.c +++ b/lvgl_tft/ra8875.c @@ -16,7 +16,6 @@ /********************* * DEFINES *********************/ -#define DEBUG false #define TAG "RA8875" #define DIV_ROUND_UP(n, d) (((n)+(d)-1)/(d)) @@ -43,6 +42,25 @@ #define VDIR_MASK (1 << 2) #define HDIR_MASK (1 << 3) +#ifndef CONFIG_LV_TFT_DISPLAY_CONTROLLER_RA8875 + // Use this settings if there is no Kconfig settings defined + #define DPCR_VAL (0x00) + #define PCSR_VAL (0x00) + #define HNDR_VAL (0x00) + #define HNDFTR_VAL (0x00) + #define HSTR_VAL (0x00) + #define HPW (0x00) + #define HPWR_VAL (0x00) + #define VNDR_VAL (0x00) + #define VSTR_VAL (0x00) + #define VPW (0x00) + #define VPWR_VAL (0x00) + #define CONFIG_LV_DISP_RA8875_PLLDIVM (0x00) + #define CONFIG_LV_DISP_RA8875_PLLDIVN (0x00) + #define CONFIG_LV_DISP_RA8875_PLLDIVK (0x00) + + #warning "No RA8875 settings defined" +#else #if ( CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED || CONFIG_LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED ) #if CONFIG_LV_INVERT_DISPLAY #define DPCR_VAL (VDIR_MASK) @@ -92,6 +110,7 @@ #else #define VPWR_VAL (VPW) #endif +#endif // CONFIG_LV_TFT_DISPLAY_CONTROLLER_RA8875 /********************** * TYPEDEFS @@ -242,18 +261,14 @@ void ra8875_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * colo size_t linelen = (area->x2 - area->x1 + 1); uint8_t * buffer = (uint8_t*)color_map; -#if DEBUG - ESP_LOGI(TAG, "flush: %d,%d at %d,%d", area->x1, area->x2, area->y1, area->y2 ); -#endif + ESP_LOGD(TAG, "flush: %d,%d at %d,%d", area->x1, area->x2, area->y1, area->y2 ); // Get lock disp_spi_acquire(); // Set window if needed if ((x1 != area->x1) || (x2 != area->x2)) { -#if DEBUG - ESP_LOGI(TAG, "flush: set window (x1,x2): %d,%d -> %d,%d", x1, x2, area->x1, area->x2); -#endif + ESP_LOGD(TAG, "flush: set window (x1,x2): %d,%d -> %d,%d", x1, x2, area->x1, area->x2); ra8875_set_window(area->x1, area->x2, 0, LV_VER_RES_MAX-1); x1 = area->x1; x2 = area->x2; @@ -261,9 +276,7 @@ void ra8875_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * colo // Set cursor if needed if ((x != area->x1) || (y != area->y1)) { -#if DEBUG - ESP_LOGI(TAG, "flush: set cursor (x,y): %d,%d -> %d,%d", x, y, area->x1, area->y1); -#endif + ESP_LOGD(TAG, "flush: set cursor (x,y): %d,%d -> %d,%d", x, y, area->x1, area->y1); ra8875_set_memory_write_cursor(area->x1, area->y1); x = area->x1; } diff --git a/lvgl_tft/st7735s.c b/lvgl_tft/st7735s.c index 8be725b..aedf386 100644 --- a/lvgl_tft/st7735s.c +++ b/lvgl_tft/st7735s.c @@ -41,10 +41,13 @@ static void st7735s_send_cmd(uint8_t cmd); static void st7735s_send_data(void * data, uint16_t length); static void st7735s_send_color(void * data, uint16_t length); static void st7735s_set_orientation(uint8_t orientation); + +#ifdef CONFIG_LV_M5STICKC_HANDLE_AXP192 static void axp192_write_byte(uint8_t addr, uint8_t data); static void axp192_init(); static void axp192_sleep_in(); static void axp192_sleep_out(); +#endif /********************** * STATIC VARIABLES @@ -225,33 +228,33 @@ static void st7735s_set_orientation(uint8_t orientation) #ifdef CONFIG_LV_M5STICKC_HANDLE_AXP192 - static void axp192_write_byte(uint8_t addr, uint8_t data) - { - err = lvgl_i2c_write(CONFIG_LV_I2C_DISPLAY_PORT, AXP192_I2C_ADDRESS, addr, &data, 1); - if (ret != ESP_OK) { - ESP_LOGE(TAG, "AXP192 send failed. code: 0x%.2X", ret); - } +static void axp192_write_byte(uint8_t addr, uint8_t data) +{ + err = lvgl_i2c_write(CONFIG_LV_I2C_DISPLAY_PORT, AXP192_I2C_ADDRESS, addr, &data, 1); + if (ret != ESP_OK) { + ESP_LOGE(TAG, "AXP192 send failed. code: 0x%.2X", ret); } +} - static void axp192_init() - { - // information on how to init and use AXP192 ifor M5StickC taken from - // https://forum.m5stack.com/topic/1025/m5stickc-turn-off-screen-completely +static void axp192_init() +{ + // information on how to init and use AXP192 ifor M5StickC taken from + // https://forum.m5stack.com/topic/1025/m5stickc-turn-off-screen-completely - axp192_write_byte(0x10, 0xFF); // OLED_VPP Enable - axp192_write_byte(0x28, 0xCC); // Enable LDO2&LDO3, LED&TFT 3.0V - axp192_sleep_out(); - ESP_LOGI(TAG, "AXP192 initialized, power enabled for LDO2 and LDO3"); - } + axp192_write_byte(0x10, 0xFF); // OLED_VPP Enable + axp192_write_byte(0x28, 0xCC); // Enable LDO2&LDO3, LED&TFT 3.0V + axp192_sleep_out(); + ESP_LOGI(TAG, "AXP192 initialized, power enabled for LDO2 and LDO3"); +} - static void axp192_sleep_in() - { - axp192_write_byte(0x12, 0x4b); - } +static void axp192_sleep_in() +{ + axp192_write_byte(0x12, 0x4b); +} - static void axp192_sleep_out() - { - axp192_write_byte(0x12, 0x4d); - } +static void axp192_sleep_out() +{ + axp192_write_byte(0x12, 0x4d); +} #endif diff --git a/lvgl_tft/st7796s.c b/lvgl_tft/st7796s.c index 44959f8..647a05d 100644 --- a/lvgl_tft/st7796s.c +++ b/lvgl_tft/st7796s.c @@ -224,7 +224,7 @@ static void st7796s_send_color(void *data, uint16_t length) static void st7796s_set_orientation(uint8_t orientation) { - // ESP_ASSERT(orientation < 4); + assert(orientation < 4); const char *orientation_str[] = { "PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED"}; @@ -232,16 +232,16 @@ static void st7796s_set_orientation(uint8_t orientation) ESP_LOGI(TAG, "Display orientation: %s", orientation_str[orientation]); #if defined CONFIG_LV_PREDEFINED_DISPLAY_M5STACK - uint8_t data[] = {0x68, 0x68, 0x08, 0x08}; + const uint8_t data[] = {0x68, 0x68, 0x08, 0x08}; #elif defined(CONFIG_LV_PREDEFINED_DISPLAY_WROVER4) - uint8_t data[] = {0x4C, 0x88, 0x28, 0xE8}; + const uint8_t data[] = {0x4C, 0x88, 0x28, 0xE8}; #elif defined(CONFIG_LV_PREDEFINED_DISPLAY_WT32_SC01) - uint8_t data[] = {0x48, 0x88, 0x28, 0xE8}; -#elif defined(CONFIG_LV_PREDEFINED_DISPLAY_NONE) - uint8_t data[] = {0x48, 0x88, 0x28, 0xE8}; + const uint8_t data[] = {0x48, 0x88, 0x28, 0xE8}; +#else + const uint8_t data[] = {0x48, 0x88, 0x28, 0xE8}; #endif - ESP_LOGI(TAG, "0x36 command value: 0x%02X", data[orientation]); + ESP_LOGD(TAG, "0x36 command value: 0x%02X", data[orientation]); st7796s_send_cmd(0x36); st7796s_send_data((void *)&data[orientation], 1); From 01dc1259f8876c436a78fa900083f2b1befe9fc6 Mon Sep 17 00:00:00 2001 From: Tomas Rezucha Date: Wed, 4 Aug 2021 10:11:18 +0200 Subject: [PATCH 002/105] Don't fire compiler warnings on missing driver configuration --- lvgl_tft/il3820.c | 3 +-- lvgl_tft/jd79653a.c | 11 ++++------- lvgl_tft/ra8875.c | 4 +++- lvgl_tft/ssd1306.c | 2 +- 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/lvgl_tft/il3820.c b/lvgl_tft/il3820.c index 1d69136..23a96f2 100644 --- a/lvgl_tft/il3820.c +++ b/lvgl_tft/il3820.c @@ -182,8 +182,7 @@ void il3820_set_px_cb(lv_disp_drv_t * disp_drv, uint8_t* buf, #else (void)byte_index; (void)bit_index; - assert(false); // Crash if we get here, but allow compilation for CI -#warning "Unsupported orientation used" + assert(false); // Unsupported orientation configured. Crash if we get here, but allow compilation for CI #endif } diff --git a/lvgl_tft/jd79653a.c b/lvgl_tft/jd79653a.c index fb67b8b..e29d934 100644 --- a/lvgl_tft/jd79653a.c +++ b/lvgl_tft/jd79653a.c @@ -123,10 +123,9 @@ static const uint8_t lut_bb1[] = { static const jd79653a_seq_t init_seq[] = { #if defined (CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED) {0x00, {0xd3, 0x0e}, 2}, // Panel settings -#elif defined(CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT) - {0x00, {0xdf, 0x0e}, 2}, // Panel settings +//#elif defined(CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT) #else -#warning "Unsupported orientation - only portrait modes are supported for now" + {0x00, {0xdf, 0x0e}, 2}, // Panel settings #endif {0x4d, {0x55}, 1}, // Undocumented secret from demo code {0xaa, {0x0f}, 1}, // Undocumented secret from demo code @@ -249,9 +248,8 @@ static void jd79653a_partial_in() #elif defined(CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT) uint8_t pst_use_reg_lut[] = { 0xff, 0x0e }; #else - assert(false); // Crash if we get here, but allow compilation for CI + assert(false); // Unsupported orientation configured. Crash if we get here, but allow compilation for CI uint8_t pst_use_reg_lut[] = { 0,0 }; -#warning "Unsupported orientation - only portrait modes are supported for now" #endif jd79653a_spi_send_cmd(0x00); jd79653a_spi_send_data(pst_use_reg_lut, sizeof(pst_use_reg_lut)); @@ -278,9 +276,8 @@ static void jd79653a_partial_out() #elif defined(CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT) uint8_t pst_use_otp_lut[] = { 0xdf, 0x0e }; #else - assert(false); // Crash if we get here, but allow compilation for CI + assert(false); // Unsupported orientation configured. Crash if we get here, but allow compilation for CI uint8_t pst_use_otp_lut[] = { 0,0 }; -#warning "Unsupported orientation - only portrait modes are supported for now" #endif jd79653a_spi_send_cmd(0x00); jd79653a_spi_send_data(pst_use_otp_lut, sizeof(pst_use_otp_lut)); diff --git a/lvgl_tft/ra8875.c b/lvgl_tft/ra8875.c index 7c4b976..5471756 100644 --- a/lvgl_tft/ra8875.c +++ b/lvgl_tft/ra8875.c @@ -59,7 +59,6 @@ #define CONFIG_LV_DISP_RA8875_PLLDIVN (0x00) #define CONFIG_LV_DISP_RA8875_PLLDIVK (0x00) - #warning "No RA8875 settings defined" #else #if ( CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED || CONFIG_LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED ) #if CONFIG_LV_INVERT_DISPLAY @@ -138,6 +137,9 @@ static void ra8875_send_buffer(uint8_t * data, size_t length, bool signal_flush) void ra8875_init(void) { +#ifndef CONFIG_LV_TFT_DISPLAY_CONTROLLER_RA8875 + assert(false); // This driver is not properly configured +#endif unsigned int i = 0; struct { diff --git a/lvgl_tft/ssd1306.c b/lvgl_tft/ssd1306.c index 5953d44..d282a7f 100644 --- a/lvgl_tft/ssd1306.c +++ b/lvgl_tft/ssd1306.c @@ -106,7 +106,7 @@ void ssd1306_init(void) orientation_1 = 0xA0; orientation_2 = OLED_CMD_SET_COM_SCAN_MODE_NORMAL; #else - #error "Unsupported orientation" + assert(false); // Invalid configuration of SSD1306 driver #endif uint8_t display_mode = 0; From 4e0355ec30c05ba911d486fa1664201a335a8570 Mon Sep 17 00:00:00 2001 From: Tomas Rezucha Date: Wed, 11 Aug 2021 09:45:28 +0200 Subject: [PATCH 003/105] Fix RA8875 build with monochrome settings --- lvgl_tft/ra8875.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/lvgl_tft/ra8875.c b/lvgl_tft/ra8875.c index dd37605..c22cb8c 100644 --- a/lvgl_tft/ra8875.c +++ b/lvgl_tft/ra8875.c @@ -27,13 +27,6 @@ #define RA8875_MODE_CMD_WRITE (0x80) #define RA8875_MODE_STATUS_READ (0xC0) -#if (LV_COLOR_DEPTH == 8) - #define SYSR_VAL (0x00) -#elif (LV_COLOR_DEPTH == 16) - #define SYSR_VAL (0x08) -#else - #error "Unsupported color depth (LV_COLOR_DEPTH)" -#endif #define BYTES_PER_PIXEL (LV_COLOR_DEPTH / 8) #define HDWR_VAL (LV_HOR_RES_MAX/8 - 1) @@ -44,6 +37,7 @@ #ifndef CONFIG_LV_TFT_DISPLAY_CONTROLLER_RA8875 // Use this settings if there is no Kconfig settings defined + #define SYSR_VAL (0x00) #define DPCR_VAL (0x00) #define PCSR_VAL (0x00) #define HNDR_VAL (0x00) @@ -60,6 +54,15 @@ #define CONFIG_LV_DISP_RA8875_PLLDIVK (0x00) #else + +#if (LV_COLOR_DEPTH == 8) + #define SYSR_VAL (0x00) +#elif (LV_COLOR_DEPTH == 16) + #define SYSR_VAL (0x08) +#else + #error "Unsupported color depth (LV_COLOR_DEPTH)" +#endif + #if ( CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED || CONFIG_LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED ) #if CONFIG_LV_INVERT_DISPLAY #define DPCR_VAL (VDIR_MASK) From 568dce244a3c022e2db2e0722de49fb64446583a Mon Sep 17 00:00:00 2001 From: Tomas Rezucha Date: Wed, 11 Aug 2021 09:43:20 +0200 Subject: [PATCH 004/105] Add OLED example project --- .gitmodules | 3 + examples/common_components/lvgl | 1 + .../hello_world/CMakeLists.txt | 9 ++ .../hello_world/main/CMakeLists.txt | 2 + .../hello_world/main/hello_world.c | 98 +++++++++++++++++++ .../hello_world/sdkconfig.defaults | 11 +++ 6 files changed, 124 insertions(+) create mode 100644 .gitmodules create mode 160000 examples/common_components/lvgl create mode 100644 examples/wemos_lolin_oled/hello_world/CMakeLists.txt create mode 100644 examples/wemos_lolin_oled/hello_world/main/CMakeLists.txt create mode 100644 examples/wemos_lolin_oled/hello_world/main/hello_world.c create mode 100644 examples/wemos_lolin_oled/hello_world/sdkconfig.defaults diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..a88f44f --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "examples/common_components/lvgl"] + path = examples/common_components/lvgl + url = git@github.com:lvgl/lvgl.git diff --git a/examples/common_components/lvgl b/examples/common_components/lvgl new file mode 160000 index 0000000..ec9de51 --- /dev/null +++ b/examples/common_components/lvgl @@ -0,0 +1 @@ +Subproject commit ec9de515b36641be565d7bace5863ab631ce3b69 diff --git a/examples/wemos_lolin_oled/hello_world/CMakeLists.txt b/examples/wemos_lolin_oled/hello_world/CMakeLists.txt new file mode 100644 index 0000000..b65f74e --- /dev/null +++ b/examples/wemos_lolin_oled/hello_world/CMakeLists.txt @@ -0,0 +1,9 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.5) + +set(EXTRA_COMPONENT_DIRS ../../common_components ../../..) +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(hello_world) diff --git a/examples/wemos_lolin_oled/hello_world/main/CMakeLists.txt b/examples/wemos_lolin_oled/hello_world/main/CMakeLists.txt new file mode 100644 index 0000000..4e8dbcf --- /dev/null +++ b/examples/wemos_lolin_oled/hello_world/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "hello_world.c" + INCLUDE_DIRS ".") diff --git a/examples/wemos_lolin_oled/hello_world/main/hello_world.c b/examples/wemos_lolin_oled/hello_world/main/hello_world.c new file mode 100644 index 0000000..3b0e6b4 --- /dev/null +++ b/examples/wemos_lolin_oled/hello_world/main/hello_world.c @@ -0,0 +1,98 @@ +/* Hello world on Wemos Lolin32 board + * + * This example code is in the Public Domain (or CC0 licensed, at your option.) + * + * Unless required by applicable law or agreed to in writing, this + * software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + * CONDITIONS OF ANY KIND, either express or implied. + */ +#include +#include +#include +#include + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_freertos_hooks.h" +#include "freertos/semphr.h" +#include "esp_system.h" +#include "driver/gpio.h" + +/* Littlevgl specific */ +#ifdef LV_LVGL_H_INCLUDE_SIMPLE +#include "lvgl.h" +#else +#include "lvgl/lvgl.h" +#endif + +#include "lvgl_helpers.h" + +/********************* + * DEFINES + *********************/ +#define LV_TICK_PERIOD_MS 1 + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lvgl_tick_inc(void *arg); +static void guiTask(void *pvParameter); + +/********************** + * APPLICATION MAIN + **********************/ +void app_main() +{ + xTaskCreatePinnedToCore(guiTask, "gui", 4096*2, NULL, 0, NULL, 1); +} + +static void guiTask(void *pvParameter) +{ + (void) pvParameter; + lv_init(); + lvgl_driver_init(); + + lv_color_t* buf1 = heap_caps_malloc(DISP_BUF_SIZE * sizeof(lv_color_t), MALLOC_CAP_DMA); + assert(buf1 != NULL); + + static lv_disp_buf_t disp_buf; + lv_disp_buf_init(&disp_buf, buf1, NULL, DISP_BUF_SIZE * 8); + + lv_disp_drv_t disp_drv; + lv_disp_drv_init(&disp_drv); + disp_drv.flush_cb = disp_driver_flush; + disp_drv.rounder_cb = disp_driver_rounder; + disp_drv.set_px_cb = disp_driver_set_px; + disp_drv.buffer = &disp_buf; + lv_disp_drv_register(&disp_drv); + + /* Create and start a periodic timer interrupt to call lv_tick_inc */ + const esp_timer_create_args_t periodic_timer_args = { + .callback = &lvgl_tick_inc, + .name = "lvgl_tick" + }; + esp_timer_handle_t periodic_timer; + ESP_ERROR_CHECK(esp_timer_create(&periodic_timer_args, &periodic_timer)); + ESP_ERROR_CHECK(esp_timer_start_periodic(periodic_timer, LV_TICK_PERIOD_MS * 1000)); + + /* Create a Hellow World label on the currently active screen */ + lv_obj_t *scr = lv_disp_get_scr_act(NULL); + lv_obj_t *label1 = lv_label_create(scr, NULL); + lv_label_set_text(label1, "Hello\nworld"); + + /* Align the Label to the center + * NULL means align on parent (which is the screen now) + * 0, 0 at the end means an x, y offset after alignment*/ + lv_obj_align(label1, NULL, LV_ALIGN_CENTER, 0, 0); + + while (1) { + vTaskDelay(pdMS_TO_TICKS(10)); + lv_task_handler(); + } + free(buf1); +} + +static void lvgl_tick_inc(void *arg) { + (void) arg; + lv_tick_inc(LV_TICK_PERIOD_MS); +} diff --git a/examples/wemos_lolin_oled/hello_world/sdkconfig.defaults b/examples/wemos_lolin_oled/hello_world/sdkconfig.defaults new file mode 100644 index 0000000..b92d2d5 --- /dev/null +++ b/examples/wemos_lolin_oled/hello_world/sdkconfig.defaults @@ -0,0 +1,11 @@ +CONFIG_LV_HOR_RES_MAX=128 +CONFIG_LV_VER_RES_MAX=64 +CONFIG_LV_COLOR_DEPTH_1=y +CONFIG_LV_THEME_MONO=y + +CONFIG_LV_PREDEFINED_DISPLAY_WEMOS_LOLIN=y + +CONFIG_I2C_MANAGER_0_ENABLED=y +CONFIG_I2C_MANAGER_0_SDA=5 +CONFIG_I2C_MANAGER_0_SCL=4 +CONFIG_I2C_MANAGER_0_FREQ_HZ=100000 From 7d9527b6e10eba96c34e1e523d31f03991f856b4 Mon Sep 17 00:00:00 2001 From: Tomas Rezucha Date: Wed, 11 Aug 2021 21:31:12 +0200 Subject: [PATCH 005/105] Add automated build of examples --- .github/workflows/build_examples.yml | 29 ++++++++++++++++++++++++++++ .gitmodules | 2 +- 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/build_examples.yml diff --git a/.github/workflows/build_examples.yml b/.github/workflows/build_examples.yml new file mode 100644 index 0000000..6e040f9 --- /dev/null +++ b/.github/workflows/build_examples.yml @@ -0,0 +1,29 @@ +name: 'build' + +on: [push, pull_request] + +jobs: + build: + strategy: + matrix: + idf_ver: ["v4.1", "v4.2", "v4.3"] + idf_target: ["esp32"] + include: + - idf_ver: "v4.2" + idf_target: esp32s2 + - idf_ver: "v4.3" + idf_target: esp32c3 + runs-on: ubuntu-20.04 + container: espressif/idf:release-${{ matrix.idf_ver }} + steps: + - uses: actions/checkout@v1 + with: + submodules: recursive + - name: Build ESP examples + env: + IDF_TARGET: ${{ matrix.idf_target }} + shell: bash + run: | + cd examples/wemos_lolin_oled/hello_world + . ${IDF_PATH}/export.sh + idf.py build diff --git a/.gitmodules b/.gitmodules index a88f44f..61a933b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "examples/common_components/lvgl"] path = examples/common_components/lvgl - url = git@github.com:lvgl/lvgl.git + url = https://github.com/lvgl/lvgl.git From e3347e3cb55e7f66309665556369845b53c0e562 Mon Sep 17 00:00:00 2001 From: chenghongyao <1253146300@qq.com> Date: Sun, 15 Aug 2021 12:52:34 +0800 Subject: [PATCH 006/105] fix data length overflow --- lvgl_tft/st7789.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lvgl_tft/st7789.c b/lvgl_tft/st7789.c index 962eb44..3e47a59 100644 --- a/lvgl_tft/st7789.c +++ b/lvgl_tft/st7789.c @@ -35,7 +35,7 @@ typedef struct { **********************/ static void st7789_set_orientation(uint8_t orientation); -static void st7789_send_color(void *data, uint16_t length); +static void st7789_send_color(void *data, size_t length); /********************** * STATIC VARIABLES @@ -167,7 +167,7 @@ void st7789_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * colo /*Memory write*/ st7789_send_cmd(ST7789_RAMWR); - uint32_t size = lv_area_get_width(area) * lv_area_get_height(area); + size_t size = (size_t)lv_area_get_width(area) * (size_t)lv_area_get_height(area); st7789_send_color((void*)color_map, size * 2); @@ -190,7 +190,7 @@ void st7789_send_data(void * data, uint16_t length) disp_spi_send_data(data, length); } -static void st7789_send_color(void * data, uint16_t length) +static void st7789_send_color(void * data, size_t length) { disp_wait_for_pending_transactions(); gpio_set_level(ST7789_DC, 1); From 7c956f1442d00a08e6683c2c44f9a0c09eeee5d1 Mon Sep 17 00:00:00 2001 From: Kevin Sidwar Date: Fri, 30 Jul 2021 15:29:18 -0600 Subject: [PATCH 007/105] Fix orientation config define --- lvgl_tft/Kconfig | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lvgl_tft/Kconfig b/lvgl_tft/Kconfig index f42351e..61be22a 100644 --- a/lvgl_tft/Kconfig +++ b/lvgl_tft/Kconfig @@ -195,24 +195,24 @@ menu "LVGL TFT Display controller" # Used in display init function to send display orientation commands choice DISPLAY_ORIENTATION prompt "Display orientation" - default DISPLAY_ORIENTATION_PORTRAIT if !LV_TFT_DISPLAY_CONTROLLER_SSD1306 - default DISPLAY_ORIENTATION_LANDSCAPE if LV_TFT_DISPLAY_CONTROLLER_SSD1306 - config DISPLAY_ORIENTATION_PORTRAIT + default LV_DISPLAY_ORIENTATION_PORTRAIT if !LV_TFT_DISPLAY_CONTROLLER_SSD1306 + default LV_DISPLAY_ORIENTATION_LANDSCAPE if LV_TFT_DISPLAY_CONTROLLER_SSD1306 + config LV_DISPLAY_ORIENTATION_PORTRAIT bool "Portrait" if !LV_TFT_DISPLAY_CONTROLLER_SSD1306 - config DISPLAY_ORIENTATION_PORTRAIT_INVERTED + config LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED bool "Portrait inverted" if !LV_TFT_DISPLAY_CONTROLLER_SSD1306 - config DISPLAY_ORIENTATION_LANDSCAPE + config LV_DISPLAY_ORIENTATION_LANDSCAPE bool "Landscape" - config DISPLAY_ORIENTATION_LANDSCAPE_INVERTED + config LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED bool "Landscape inverted" endchoice config LV_DISPLAY_ORIENTATION int - default 0 if DISPLAY_ORIENTATION_PORTRAIT - default 1 if DISPLAY_ORIENTATION_PORTRAIT_INVERTED - default 2 if DISPLAY_ORIENTATION_LANDSCAPE - default 3 if DISPLAY_ORIENTATION_LANDSCAPE_INVERTED + default 0 if LV_DISPLAY_ORIENTATION_PORTRAIT + default 1 if LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED + default 2 if LV_DISPLAY_ORIENTATION_LANDSCAPE + default 3 if LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED config LV_TFT_DISPLAY_OFFSETS bool From 31f340d864183fa046de58acf041467c8967e781 Mon Sep 17 00:00:00 2001 From: Kevin Sidwar Date: Thu, 12 Aug 2021 23:48:23 -0600 Subject: [PATCH 008/105] Change config naming for ssd1306 to use LV_ prefix --- lvgl_tft/Kconfig | 8 ++++---- lvgl_tft/ssd1306.c | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lvgl_tft/Kconfig b/lvgl_tft/Kconfig index 61be22a..140c173 100644 --- a/lvgl_tft/Kconfig +++ b/lvgl_tft/Kconfig @@ -222,15 +222,15 @@ menu "LVGL TFT Display controller" config LV_TFT_DISPLAY_X_OFFSET depends on LV_TFT_DISPLAY_OFFSETS int "X offset" - default 40 if LV_PREDEFINED_DISPLAY_TTGO && (DISPLAY_ORIENTATION_LANDSCAPE || DISPLAY_ORIENTATION_LANDSCAPE_INVERTED) - default 53 if LV_PREDEFINED_DISPLAY_TTGO && (DISPLAY_ORIENTATION_PORTRAIT || DISPLAY_ORIENTATION_PORTRAIT_INVERTED) + default 40 if LV_PREDEFINED_DISPLAY_TTGO && (LV_DISPLAY_ORIENTATION_LANDSCAPE || LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED) + default 53 if LV_PREDEFINED_DISPLAY_TTGO && (LV_DISPLAY_ORIENTATION_PORTRAIT || LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED) default 0 config LV_TFT_DISPLAY_Y_OFFSET depends on LV_TFT_DISPLAY_OFFSETS int "Y offset" - default 53 if LV_PREDEFINED_DISPLAY_TTGO && (DISPLAY_ORIENTATION_LANDSCAPE || DISPLAY_ORIENTATION_LANDSCAPE_INVERTED) - default 40 if LV_PREDEFINED_DISPLAY_TTGO && (DISPLAY_ORIENTATION_PORTRAIT || DISPLAY_ORIENTATION_PORTRAIT_INVERTED) + default 53 if LV_PREDEFINED_DISPLAY_TTGO && (LV_DISPLAY_ORIENTATION_LANDSCAPE || LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED) + default 40 if LV_PREDEFINED_DISPLAY_TTGO && (LV_DISPLAY_ORIENTATION_PORTRAIT || LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED) default 0 diff --git a/lvgl_tft/ssd1306.c b/lvgl_tft/ssd1306.c index d282a7f..1700d02 100644 --- a/lvgl_tft/ssd1306.c +++ b/lvgl_tft/ssd1306.c @@ -99,10 +99,10 @@ void ssd1306_init(void) uint8_t orientation_1 = 0; uint8_t orientation_2 = 0; -#if defined (CONFIG_DISPLAY_ORIENTATION_LANDSCAPE) +#if defined (CONFIG_LV_DISPLAY_ORIENTATION_LANDSCAPE) orientation_1 = OLED_CMD_SET_SEGMENT_REMAP; orientation_2 = OLED_CMD_SET_COM_SCAN_MODE_REMAP; -#elif defined (CONFIG_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED) +#elif defined (CONFIG_LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED) orientation_1 = 0xA0; orientation_2 = OLED_CMD_SET_COM_SCAN_MODE_NORMAL; #else From 0b09769dcc45b5bfdb9dde3d92f5755c75f0c1ea Mon Sep 17 00:00:00 2001 From: C47D Date: Mon, 17 May 2021 09:29:32 -0500 Subject: [PATCH 009/105] ST7789: Hardware abstraction layer prototype --- lvgl_tft/st7789.c | 84 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 63 insertions(+), 21 deletions(-) diff --git a/lvgl_tft/st7789.c b/lvgl_tft/st7789.c index 3e47a59..7fa75f0 100644 --- a/lvgl_tft/st7789.c +++ b/lvgl_tft/st7789.c @@ -37,6 +37,13 @@ static void st7789_set_orientation(uint8_t orientation); static void st7789_send_color(void *data, size_t length); +static void st7789_reset(void); +/* The user should init all the hardware related to the display in this + * function, maybe it's better to do this outside the display code, e.g. + * in main before calling anything related to LVGL. + * Some platforms, like STM32CubeIDE init and configure all the hardware + * with auto generated code. */ +static void bsp_init_hardware(void); /********************** * STATIC VARIABLES **********************/ @@ -50,6 +57,8 @@ static void st7789_send_color(void *data, size_t length); **********************/ void st7789_init(void) { + bsp_init_hardware(); + lcd_init_cmd_t st7789_init_cmds[] = { {0xCF, {0x00, 0x83, 0X30}, 3}, {0xED, {0x64, 0x03, 0X12, 0X81}, 4}, @@ -85,24 +94,7 @@ void st7789_init(void) {0, {0}, 0xff}, }; - //Initialize non-SPI GPIOs - gpio_pad_select_gpio(ST7789_DC); - gpio_set_direction(ST7789_DC, GPIO_MODE_OUTPUT); - -#if !defined(ST7789_SOFT_RST) - gpio_pad_select_gpio(ST7789_RST); - gpio_set_direction(ST7789_RST, GPIO_MODE_OUTPUT); -#endif - - //Reset the display -#if !defined(ST7789_SOFT_RST) - gpio_set_level(ST7789_RST, 0); - vTaskDelay(100 / portTICK_RATE_MS); - gpio_set_level(ST7789_RST, 1); - vTaskDelay(100 / portTICK_RATE_MS); -#else - st7789_send_cmd(ST7789_SWRESET); -#endif + st7789_reset(); printf("ST7789 initialization.\n"); @@ -179,24 +171,37 @@ void st7789_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * colo void st7789_send_cmd(uint8_t cmd) { disp_wait_for_pending_transactions(); - gpio_set_level(ST7789_DC, 0); + bsp_gpio_dc(0); disp_spi_send_data(&cmd, 1); } void st7789_send_data(void * data, uint16_t length) { disp_wait_for_pending_transactions(); - gpio_set_level(ST7789_DC, 1); + bsp_gpio_dc(1); disp_spi_send_data(data, length); } static void st7789_send_color(void * data, size_t length) { disp_wait_for_pending_transactions(); - gpio_set_level(ST7789_DC, 1); + bsp_gpio_dc(1); disp_spi_send_colors(data, length); } +/* Reset the display, if we don't have a reset pin we use software reset */ +static void st7789_reset(void) +{ +#if !defined(CONFIG_LV_DISP_ST7789_SOFT_RESET) + bsp_gpio_rst(0); + bsp_delay(100); + bsp_gpio_rst(1); + bsp_delay(100); +#else + st7789_send_cmd(ST7789_SWRESET); +#endif +} + static void st7789_set_orientation(uint8_t orientation) { // ESP_ASSERT(orientation < 4); @@ -221,3 +226,40 @@ static void st7789_set_orientation(uint8_t orientation) st7789_send_cmd(ST7789_MADCTL); st7789_send_data((void *) &data[orientation], 1); } + +static void bsp_delay(uint32_t delay_ms) +{ + vTaskDelay(delay_ms / portTICK_RATE_MS); +} + +static void bsp_backlight(uint8_t state) +{ + gpio_set_level(ST7789_BCKL, state); +} + +static void bsp_gpio_dc(uint8_t state) +{ + gpio_set_level(ST7789_DC, state); +} + +static void bsp_gpio_rst(uint8_t state) +{ + gpio_set_level(ST7789_RST, state); +} + +static void bsp_init_hardware(void) +{ + //Initialize non-SPI GPIOs + gpio_pad_select_gpio(ST7789_DC); + gpio_set_direction(ST7789_DC, GPIO_MODE_OUTPUT); + +#if !defined(CONFIG_LV_DISP_ST7789_SOFT_RESET) + gpio_pad_select_gpio(ST7789_RST); + gpio_set_direction(ST7789_RST, GPIO_MODE_OUTPUT); +#endif + +#if ST7789_ENABLE_BACKLIGHT_CONTROL + gpio_pad_select_gpio(ST7789_BCKL); + gpio_set_direction(ST7789_BCKL, GPIO_MODE_OUTPUT); +#endif +} From 49a3ba84b4e94f494ab375135c3802170dc77aeb Mon Sep 17 00:00:00 2001 From: C47D Date: Thu, 29 Jul 2021 18:56:22 -0500 Subject: [PATCH 010/105] display bsp: Move ESP32 pin specific code to display_bsp --- lvgl_tft/display_bsp.c | 33 +++++++++++++++++++++++++++++++++ lvgl_tft/display_bsp.h | 9 +++++++++ 2 files changed, 42 insertions(+) create mode 100644 lvgl_tft/display_bsp.c create mode 100644 lvgl_tft/display_bsp.h diff --git a/lvgl_tft/display_bsp.c b/lvgl_tft/display_bsp.c new file mode 100644 index 0000000..965d64f --- /dev/null +++ b/lvgl_tft/display_bsp.c @@ -0,0 +1,33 @@ +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" + +#include "display_bsp.h" + +#include "sdkconfig.h" +#include "driver/gpio.h" + +void display_bsp_delay(uint32_t delay_ms) +{ + vTaskDelay(pdMS_TO_TICKS(delay_ms)); +} + +void display_bsp_backlight(uint8_t state) +{ +#ifdef CONFIG_LV_DISP_PIN_BCKL + gpio_set_level(CONFIG_LV_DISP_PIN_BCKL, state); +#endif +} + +void display_bsp_gpio_dc(uint8_t state) +{ +#ifdef CONFIG_LV_DISPLAY_USE_DC + gpio_set_level(CONFIG_LV_DISP_PIN_DC, state); +#endif +} + +void display_bsp_gpio_rst(uint8_t state) +{ +#ifdef CONFIG_LV_DISP_USE_RST + gpio_set_level(CONFIG_LV_DISP_PIN_RST, state); +#endif +} diff --git a/lvgl_tft/display_bsp.h b/lvgl_tft/display_bsp.h new file mode 100644 index 0000000..3de8795 --- /dev/null +++ b/lvgl_tft/display_bsp.h @@ -0,0 +1,9 @@ +#ifndef DISPLAY_BSP_H_ +#define DISPLAY_BSP_H_ + +void display_bsp_delay(uint32_t delay_ms); +void display_bsp_backlight(uint8_t state); +void display_bsp_gpio_dc(uint8_t state); +void display_bsp_gpio_rst(uint8_t state); + +#endif From 6122d139de3ef280ccad39e9be4c8d7936622197 Mon Sep 17 00:00:00 2001 From: C47D Date: Thu, 29 Jul 2021 19:04:39 -0500 Subject: [PATCH 011/105] display_bsp: Move IO initialization here --- lvgl_tft/display_bsp.c | 18 ++++++++++++++++++ lvgl_tft/display_bsp.h | 1 + 2 files changed, 19 insertions(+) diff --git a/lvgl_tft/display_bsp.c b/lvgl_tft/display_bsp.c index 965d64f..d41d849 100644 --- a/lvgl_tft/display_bsp.c +++ b/lvgl_tft/display_bsp.c @@ -6,6 +6,24 @@ #include "sdkconfig.h" #include "driver/gpio.h" +void display_bsp_init_io(void) +{ +#ifdef CONFIG_LV_DISPLAY_USE_DC + gpio_pad_select_gpio(CONFIG_LV_DISP_PIN_DC); + gpio_set_direction(CONFIG_LV_DISP_PIN_DC, GPIO_MODE_OUTPUT); +#endif + +#ifdef CONFIG_LV_DISP_USE_RST + gpio_pad_select_gpio(CONFIG_LV_DISP_PIN_RST); + gpio_set_direction(CONFIG_LV_DISP_PIN_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 +} + void display_bsp_delay(uint32_t delay_ms) { vTaskDelay(pdMS_TO_TICKS(delay_ms)); diff --git a/lvgl_tft/display_bsp.h b/lvgl_tft/display_bsp.h index 3de8795..4bf8f2c 100644 --- a/lvgl_tft/display_bsp.h +++ b/lvgl_tft/display_bsp.h @@ -1,6 +1,7 @@ #ifndef DISPLAY_BSP_H_ #define DISPLAY_BSP_H_ +void display_bsp_init_io(void); void display_bsp_delay(uint32_t delay_ms); void display_bsp_backlight(uint8_t state); void display_bsp_gpio_dc(uint8_t state); From 2629b6d86aa703c614d91c16681230bddcbc17d9 Mon Sep 17 00:00:00 2001 From: C47D Date: Thu, 29 Jul 2021 19:05:17 -0500 Subject: [PATCH 012/105] Update to use display_bsp --- lvgl_tft/st7789.c | 88 ++++++++++++++++------------------------------- 1 file changed, 29 insertions(+), 59 deletions(-) diff --git a/lvgl_tft/st7789.c b/lvgl_tft/st7789.c index 7fa75f0..3829a8e 100644 --- a/lvgl_tft/st7789.c +++ b/lvgl_tft/st7789.c @@ -4,21 +4,19 @@ * Mostly taken from lbthomsen/esp-idf-littlevgl github. */ -#include "freertos/FreeRTOS.h" -#include "freertos/task.h" #include "sdkconfig.h" - #include "esp_log.h" #include "st7789.h" #include "disp_spi.h" -#include "driver/gpio.h" +#include "display_bsp.h" /********************* * DEFINES *********************/ -#define TAG "st7789" +#define TAG "ST7789" + /********************** * TYPEDEFS **********************/ @@ -38,12 +36,6 @@ static void st7789_set_orientation(uint8_t orientation); static void st7789_send_color(void *data, size_t length); static void st7789_reset(void); -/* The user should init all the hardware related to the display in this - * function, maybe it's better to do this outside the display code, e.g. - * in main before calling anything related to LVGL. - * Some platforms, like STM32CubeIDE init and configure all the hardware - * with auto generated code. */ -static void bsp_init_hardware(void); /********************** * STATIC VARIABLES **********************/ @@ -57,7 +49,7 @@ static void bsp_init_hardware(void); **********************/ void st7789_init(void) { - bsp_init_hardware(); + display_bsp_init_io(); lcd_init_cmd_t st7789_init_cmds[] = { {0xCF, {0x00, 0x83, 0X30}, 3}, @@ -96,7 +88,7 @@ void st7789_init(void) st7789_reset(); - printf("ST7789 initialization.\n"); + ESP_LOGI(TAG, "Initialization.\n"); //Send all the commands uint16_t cmd = 0; @@ -104,7 +96,7 @@ void st7789_init(void) st7789_send_cmd(st7789_init_cmds[cmd].cmd); st7789_send_data(st7789_init_cmds[cmd].data, st7789_init_cmds[cmd].databytes&0x1F); if (st7789_init_cmds[cmd].databytes & 0x80) { - vTaskDelay(100 / portTICK_RATE_MS); + display_bsp_delay(100); } cmd++; } @@ -112,6 +104,22 @@ void st7789_init(void) st7789_set_orientation(CONFIG_LV_DISPLAY_ORIENTATION); } +void st7789_enable_backlight(bool backlight) +{ +#if ST7789_ENABLE_BACKLIGHT_CONTROL + ESP_LOGI(TAG, "%s backlight.\n", backlight ? "Enabling" : "Disabling"); + uint32_t tmp = 0; + +#if (ST7789_BCKL_ACTIVE_LVL==1) + tmp = backlight ? 1 : 0; +#else + tmp = backlight ? 0 : 1; +#endif + + display_bsp_backlight(tmp); +#endif +} + /* The ST7789 display controller can drive 320*240 displays, when using a 240*240 * display there's a gap of 80px, we need to edit the coordinates to take into * account that gap, this is not necessary in all orientations. */ @@ -171,21 +179,21 @@ void st7789_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * colo void st7789_send_cmd(uint8_t cmd) { disp_wait_for_pending_transactions(); - bsp_gpio_dc(0); + display_bsp_gpio_dc(0); disp_spi_send_data(&cmd, 1); } void st7789_send_data(void * data, uint16_t length) { disp_wait_for_pending_transactions(); - bsp_gpio_dc(1); + display_bsp_gpio_dc(1); disp_spi_send_data(data, length); } static void st7789_send_color(void * data, size_t length) { disp_wait_for_pending_transactions(); - bsp_gpio_dc(1); + display_bsp_gpio_dc(1); disp_spi_send_colors(data, length); } @@ -193,10 +201,10 @@ static void st7789_send_color(void * data, size_t length) static void st7789_reset(void) { #if !defined(CONFIG_LV_DISP_ST7789_SOFT_RESET) - bsp_gpio_rst(0); - bsp_delay(100); - bsp_gpio_rst(1); - bsp_delay(100); + display_bsp_gpio_rst(0); + display_bsp_delay(100); + display_bsp_gpio_rst(1); + display_bsp_delay(100); #else st7789_send_cmd(ST7789_SWRESET); #endif @@ -204,8 +212,6 @@ static void st7789_reset(void) static void st7789_set_orientation(uint8_t orientation) { - // ESP_ASSERT(orientation < 4); - const char *orientation_str[] = { "PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED" }; @@ -227,39 +233,3 @@ static void st7789_set_orientation(uint8_t orientation) st7789_send_data((void *) &data[orientation], 1); } -static void bsp_delay(uint32_t delay_ms) -{ - vTaskDelay(delay_ms / portTICK_RATE_MS); -} - -static void bsp_backlight(uint8_t state) -{ - gpio_set_level(ST7789_BCKL, state); -} - -static void bsp_gpio_dc(uint8_t state) -{ - gpio_set_level(ST7789_DC, state); -} - -static void bsp_gpio_rst(uint8_t state) -{ - gpio_set_level(ST7789_RST, state); -} - -static void bsp_init_hardware(void) -{ - //Initialize non-SPI GPIOs - gpio_pad_select_gpio(ST7789_DC); - gpio_set_direction(ST7789_DC, GPIO_MODE_OUTPUT); - -#if !defined(CONFIG_LV_DISP_ST7789_SOFT_RESET) - gpio_pad_select_gpio(ST7789_RST); - gpio_set_direction(ST7789_RST, GPIO_MODE_OUTPUT); -#endif - -#if ST7789_ENABLE_BACKLIGHT_CONTROL - gpio_pad_select_gpio(ST7789_BCKL); - gpio_set_direction(ST7789_BCKL, GPIO_MODE_OUTPUT); -#endif -} From 7cebfdd671721e286a3f31a44fc572d094e84610 Mon Sep 17 00:00:00 2001 From: C47D Date: Wed, 25 Aug 2021 14:43:24 -0500 Subject: [PATCH 013/105] Rename display_bsp to display_hal The implementation of display hal is MCU dependant, in this example we implement it using the ESP-IDF framework --- lvgl_tft/display_bsp.h | 10 --------- ...{display_bsp.c => display_espressif_hal.c} | 0 lvgl_tft/display_hal.h | 10 +++++++++ lvgl_tft/st7789.c | 22 +++++++++---------- 4 files changed, 21 insertions(+), 21 deletions(-) delete mode 100644 lvgl_tft/display_bsp.h rename lvgl_tft/{display_bsp.c => display_espressif_hal.c} (100%) create mode 100644 lvgl_tft/display_hal.h diff --git a/lvgl_tft/display_bsp.h b/lvgl_tft/display_bsp.h deleted file mode 100644 index 4bf8f2c..0000000 --- a/lvgl_tft/display_bsp.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef DISPLAY_BSP_H_ -#define DISPLAY_BSP_H_ - -void display_bsp_init_io(void); -void display_bsp_delay(uint32_t delay_ms); -void display_bsp_backlight(uint8_t state); -void display_bsp_gpio_dc(uint8_t state); -void display_bsp_gpio_rst(uint8_t state); - -#endif diff --git a/lvgl_tft/display_bsp.c b/lvgl_tft/display_espressif_hal.c similarity index 100% rename from lvgl_tft/display_bsp.c rename to lvgl_tft/display_espressif_hal.c diff --git a/lvgl_tft/display_hal.h b/lvgl_tft/display_hal.h new file mode 100644 index 0000000..fedb203 --- /dev/null +++ b/lvgl_tft/display_hal.h @@ -0,0 +1,10 @@ +#ifndef DISPLAY_HAL_H_ +#define DISPLAY_HAL_H_ + +void display_hal_init_io(void); +void display_hal_delay(uint32_t delay_ms); +void display_hal_backlight(uint8_t state); +void display_hal_gpio_dc(uint8_t state); +void display_hal_gpio_rst(uint8_t state); + +#endif diff --git a/lvgl_tft/st7789.c b/lvgl_tft/st7789.c index 3829a8e..4483df0 100644 --- a/lvgl_tft/st7789.c +++ b/lvgl_tft/st7789.c @@ -10,7 +10,7 @@ #include "st7789.h" #include "disp_spi.h" -#include "display_bsp.h" +#include "display_hal.h" /********************* * DEFINES @@ -49,7 +49,7 @@ static void st7789_reset(void); **********************/ void st7789_init(void) { - display_bsp_init_io(); + display_hal_init_io(); lcd_init_cmd_t st7789_init_cmds[] = { {0xCF, {0x00, 0x83, 0X30}, 3}, @@ -96,7 +96,7 @@ void st7789_init(void) st7789_send_cmd(st7789_init_cmds[cmd].cmd); st7789_send_data(st7789_init_cmds[cmd].data, st7789_init_cmds[cmd].databytes&0x1F); if (st7789_init_cmds[cmd].databytes & 0x80) { - display_bsp_delay(100); + display_hal_delay(100); } cmd++; } @@ -116,7 +116,7 @@ void st7789_enable_backlight(bool backlight) tmp = backlight ? 0 : 1; #endif - display_bsp_backlight(tmp); + display_hal_backlight(tmp); #endif } @@ -179,21 +179,21 @@ void st7789_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * colo void st7789_send_cmd(uint8_t cmd) { disp_wait_for_pending_transactions(); - display_bsp_gpio_dc(0); + display_hal_gpio_dc(0); disp_spi_send_data(&cmd, 1); } void st7789_send_data(void * data, uint16_t length) { disp_wait_for_pending_transactions(); - display_bsp_gpio_dc(1); + display_hal_gpio_dc(1); disp_spi_send_data(data, length); } static void st7789_send_color(void * data, size_t length) { disp_wait_for_pending_transactions(); - display_bsp_gpio_dc(1); + display_hal_gpio_dc(1); disp_spi_send_colors(data, length); } @@ -201,10 +201,10 @@ static void st7789_send_color(void * data, size_t length) static void st7789_reset(void) { #if !defined(CONFIG_LV_DISP_ST7789_SOFT_RESET) - display_bsp_gpio_rst(0); - display_bsp_delay(100); - display_bsp_gpio_rst(1); - display_bsp_delay(100); + display_hal_gpio_rst(0); + display_hal_delay(100); + display_hal_gpio_rst(1); + display_hal_delay(100); #else st7789_send_cmd(ST7789_SWRESET); #endif From 413721182c55115e08e121d0d0dd58d2caf026ec Mon Sep 17 00:00:00 2001 From: C47D Date: Wed, 25 Aug 2021 15:16:47 -0500 Subject: [PATCH 014/105] Remove GPIO initialization from display init, they must be initialized by the user in main.c --- lvgl_tft/st7789.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/lvgl_tft/st7789.c b/lvgl_tft/st7789.c index 4483df0..056ecc2 100644 --- a/lvgl_tft/st7789.c +++ b/lvgl_tft/st7789.c @@ -49,8 +49,6 @@ static void st7789_reset(void); **********************/ void st7789_init(void) { - display_hal_init_io(); - lcd_init_cmd_t st7789_init_cmds[] = { {0xCF, {0x00, 0x83, 0X30}, 3}, {0xED, {0x64, 0x03, 0X12, 0X81}, 4}, From 0f1a6d490ed7d11aa17bda8a85661d867b15c408 Mon Sep 17 00:00:00 2001 From: C47D Date: Thu, 26 Aug 2021 10:42:26 -0500 Subject: [PATCH 015/105] Add pointer to lv_disp_drv_t as first parameter to HAL functions --- lvgl_tft/display_espressif_hal.c | 18 +++++--- lvgl_tft/display_hal.h | 28 ++++++++++-- lvgl_tft/st7789.c | 77 ++++++++++++++++---------------- lvgl_tft/st7789.h | 6 +-- 4 files changed, 78 insertions(+), 51 deletions(-) diff --git a/lvgl_tft/display_espressif_hal.c b/lvgl_tft/display_espressif_hal.c index d41d849..f7ec6c1 100644 --- a/lvgl_tft/display_espressif_hal.c +++ b/lvgl_tft/display_espressif_hal.c @@ -1,7 +1,7 @@ #include "freertos/FreeRTOS.h" #include "freertos/task.h" -#include "display_bsp.h" +#include "display_hal.h" #include "sdkconfig.h" #include "driver/gpio.h" @@ -24,27 +24,35 @@ void display_bsp_init_io(void) #endif } -void display_bsp_delay(uint32_t delay_ms) +void display_bsp_delay(lv_disp_drv_t *drv, uint32_t delay_ms) { + (void) drv; + vTaskDelay(pdMS_TO_TICKS(delay_ms)); } -void display_bsp_backlight(uint8_t state) +void display_bsp_backlight(lv_disp_drv_t *drv, uint8_t state) { + (void) drv; + #ifdef CONFIG_LV_DISP_PIN_BCKL gpio_set_level(CONFIG_LV_DISP_PIN_BCKL, state); #endif } -void display_bsp_gpio_dc(uint8_t state) +void display_bsp_gpio_dc(lv_disp_drv_t *drv, uint8_t state) { + (void) drv; + #ifdef CONFIG_LV_DISPLAY_USE_DC gpio_set_level(CONFIG_LV_DISP_PIN_DC, state); #endif } -void display_bsp_gpio_rst(uint8_t state) +void display_bsp_gpio_rst(lv_disp_drv_t *drv, uint8_t state) { + (void) drv; + #ifdef CONFIG_LV_DISP_USE_RST gpio_set_level(CONFIG_LV_DISP_PIN_RST, state); #endif diff --git a/lvgl_tft/display_hal.h b/lvgl_tft/display_hal.h index fedb203..e7f6041 100644 --- a/lvgl_tft/display_hal.h +++ b/lvgl_tft/display_hal.h @@ -1,10 +1,30 @@ #ifndef DISPLAY_HAL_H_ #define DISPLAY_HAL_H_ +#ifdef __cplusplus +extern "C" +{ +#endif + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE +#include "lvgl.h" +#else +#include "lvgl/lvgl.h" +#endif + +/* NOTE We could remove this function from here, because it's used to + * initialize the GPIOS on the MCU */ void display_hal_init_io(void); -void display_hal_delay(uint32_t delay_ms); -void display_hal_backlight(uint8_t state); -void display_hal_gpio_dc(uint8_t state); -void display_hal_gpio_rst(uint8_t state); + +/* NOTE drv parameter is meant to be used in multi display projects, so the + * user could distinguish multiple displays on their hal implementation */ +void display_hal_delay(lv_disp_drv_t *drv, uint32_t delay_ms); +void display_hal_backlight(lv_disp_drv_t *drv, uint8_t state); +void display_hal_gpio_dc(lv_disp_drv_t *drv, uint8_t state); +void display_hal_gpio_rst(lv_disp_drv_t *drv, uint8_t state); + +#ifdef __cplusplus +} /* extern "C" */ +#endif #endif diff --git a/lvgl_tft/st7789.c b/lvgl_tft/st7789.c index 056ecc2..fd44baa 100644 --- a/lvgl_tft/st7789.c +++ b/lvgl_tft/st7789.c @@ -33,9 +33,11 @@ typedef struct { **********************/ static void st7789_set_orientation(uint8_t orientation); -static void st7789_send_color(void *data, size_t length); +static void st7789_send_cmd(lv_disp_drv_t * drv, uint8_t cmd); +static void st7789_send_data(lv_disp_drv_t * drv, void *data, uint16_t length); +static void st7789_send_color(lv_disp_drv_t * drv, void *data, uint16_t length); -static void st7789_reset(void); +static void st7789_reset(lv_disp_drv_t * drv); /********************** * STATIC VARIABLES **********************/ @@ -47,7 +49,7 @@ static void st7789_reset(void); /********************** * GLOBAL FUNCTIONS **********************/ -void st7789_init(void) +void st7789_init(lv_disp_drv_t *drv) { lcd_init_cmd_t st7789_init_cmds[] = { {0xCF, {0x00, 0x83, 0X30}, 3}, @@ -84,25 +86,27 @@ void st7789_init(void) {0, {0}, 0xff}, }; - st7789_reset(); + st7789_reset(drv); ESP_LOGI(TAG, "Initialization.\n"); //Send all the commands uint16_t cmd = 0; while (st7789_init_cmds[cmd].databytes!=0xff) { - st7789_send_cmd(st7789_init_cmds[cmd].cmd); - st7789_send_data(st7789_init_cmds[cmd].data, st7789_init_cmds[cmd].databytes&0x1F); + st7789_send_cmd(drv, st7789_init_cmds[cmd].cmd); + st7789_send_data(drv, st7789_init_cmds[cmd].data, st7789_init_cmds[cmd].databytes&0x1F); if (st7789_init_cmds[cmd].databytes & 0x80) { - display_hal_delay(100); + display_hal_delay(drv, 100); } cmd++; } - st7789_set_orientation(CONFIG_LV_DISPLAY_ORIENTATION); + st7789_enable_backlight(drv, true); + + st7789_set_orientation(drv, CONFIG_LV_DISPLAY_ORIENTATION); } -void st7789_enable_backlight(bool backlight) +void st7789_enable_backlight(lv_disp_drv_t *drv, bool backlight) { #if ST7789_ENABLE_BACKLIGHT_CONTROL ESP_LOGI(TAG, "%s backlight.\n", backlight ? "Enabling" : "Disabling"); @@ -114,7 +118,7 @@ void st7789_enable_backlight(bool backlight) tmp = backlight ? 0 : 1; #endif - display_hal_backlight(tmp); + display_hal_backlight(drv, tmp); #endif } @@ -129,6 +133,7 @@ void st7789_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * colo uint16_t offsetx2 = area->x2; uint16_t offsety1 = area->y1; uint16_t offsety2 = area->y2; + uint32_t size = lv_area_get_width(area) * lv_area_get_height(area); #if (CONFIG_LV_TFT_DISPLAY_OFFSETS) offsetx1 += CONFIG_LV_TFT_DISPLAY_X_OFFSET; @@ -147,68 +152,64 @@ void st7789_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * colo #endif /*Column addresses*/ - st7789_send_cmd(ST7789_CASET); + st7789_send_cmd(drv, ST7789_CASET); data[0] = (offsetx1 >> 8) & 0xFF; data[1] = offsetx1 & 0xFF; data[2] = (offsetx2 >> 8) & 0xFF; data[3] = offsetx2 & 0xFF; - st7789_send_data(data, 4); + st7789_send_data(drv, data, 4); /*Page addresses*/ - st7789_send_cmd(ST7789_RASET); + st7789_send_cmd(drv, ST7789_RASET); data[0] = (offsety1 >> 8) & 0xFF; data[1] = offsety1 & 0xFF; data[2] = (offsety2 >> 8) & 0xFF; data[3] = offsety2 & 0xFF; - st7789_send_data(data, 4); + st7789_send_data(drv, data, 4); /*Memory write*/ - st7789_send_cmd(ST7789_RAMWR); - - size_t size = (size_t)lv_area_get_width(area) * (size_t)lv_area_get_height(area); - - st7789_send_color((void*)color_map, size * 2); - + st7789_send_cmd(drv, ST7789_RAMWR); + st7789_send_color(drv, (void*) color_map, size * 2); } /********************** * STATIC FUNCTIONS **********************/ -void st7789_send_cmd(uint8_t cmd) +static void st7789_send_cmd(lv_disp_drv_t *drv, uint8_t cmd) { disp_wait_for_pending_transactions(); - display_hal_gpio_dc(0); - disp_spi_send_data(&cmd, 1); + display_hal_gpio_dc(drv, 0); + disp_spi_send_data(drv, &cmd, 1); } -void st7789_send_data(void * data, uint16_t length) +static void st7789_send_data(lv_disp_drv_t *drv, void * data, uint16_t length) { disp_wait_for_pending_transactions(); - display_hal_gpio_dc(1); - disp_spi_send_data(data, length); + display_hal_gpio_dc(drv, 1); + disp_spi_send_data(drv, data, length); } -static void st7789_send_color(void * data, size_t length) +static void st7789_send_color(lv_disp_drv_t *drv, void * data, uint16_t length) { disp_wait_for_pending_transactions(); - display_hal_gpio_dc(1); - disp_spi_send_colors(data, length); + display_hal_gpio_dc(drv, 1); + disp_spi_send_colors(drv, data, length); } /* Reset the display, if we don't have a reset pin we use software reset */ -static void st7789_reset(void) +static void st7789_reset(lv_disp_drv_t *drv) { #if !defined(CONFIG_LV_DISP_ST7789_SOFT_RESET) - display_hal_gpio_rst(0); - display_hal_delay(100); - display_hal_gpio_rst(1); - display_hal_delay(100); + display_hal_gpio_rst(drv, 0); + display_hal_delay(drv, 100); + display_hal_gpio_rst(drv, 1); + display_hal_delay(drv, 100); #else - st7789_send_cmd(ST7789_SWRESET); + st7789_send_cmd(drv, ST7789_SWRESET); #endif } -static void st7789_set_orientation(uint8_t orientation) +static void st7789_set_orientation(lv_disp_drv_t *drv, uint8_t orientation) { const char *orientation_str[] = { "PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED" @@ -227,7 +228,7 @@ static void st7789_set_orientation(uint8_t orientation) ESP_LOGI(TAG, "0x36 command value: 0x%02X", data[orientation]); - st7789_send_cmd(ST7789_MADCTL); - st7789_send_data((void *) &data[orientation], 1); + st7789_send_cmd(drv, ST7789_MADCTL); + st7789_send_data(drv, (void *) &data[orientation], 1); } diff --git a/lvgl_tft/st7789.h b/lvgl_tft/st7789.h index cacb31b..49411e8 100644 --- a/lvgl_tft/st7789.h +++ b/lvgl_tft/st7789.h @@ -110,11 +110,9 @@ extern "C" #define ST7789_NVMSET 0xFC // NVM setting #define ST7789_PROMACT 0xFE // Program action -void st7789_init(void); +void st7789_init(lv_disp_drv_t *drv); void st7789_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map); - -void st7789_send_cmd(uint8_t cmd); -void st7789_send_data(void *data, uint16_t length); +void st7789_enable_backlight(lv_disp_drv_t *drv, bool backlight); #ifdef __cplusplus } /* extern "C" */ From 37da744873a8fc940488db962c00708308d0950b Mon Sep 17 00:00:00 2001 From: C47D Date: Thu, 26 Aug 2021 18:50:26 -0500 Subject: [PATCH 016/105] cmake: Add initial display hal implementation for espressif MCUs to the build --- CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index bd2b3b5..701a787 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,6 +4,9 @@ file(GLOB SOURCES *.c) set(LVGL_INCLUDE_DIRS . lvgl_tft) list(APPEND SOURCES "lvgl_tft/disp_driver.c") list(APPEND SOURCES "lvgl_tft/esp_lcd_backlight.c") +list(APPEND SOURCES "lvgl_tft/display_espressif_hal.c") + +#@todo add SimleInclude macro here # Build all display drivers list(APPEND SOURCES "lvgl_tft/ili9341.c") From 0ae3f76097a4ca8cb3d203722165a74487808326 Mon Sep 17 00:00:00 2001 From: C47D Date: Thu, 26 Aug 2021 18:51:35 -0500 Subject: [PATCH 017/105] hal: Fix typo on function signatures --- lvgl_tft/display_espressif_hal.c | 26 ++++---------------------- 1 file changed, 4 insertions(+), 22 deletions(-) diff --git a/lvgl_tft/display_espressif_hal.c b/lvgl_tft/display_espressif_hal.c index f7ec6c1..a5888f3 100644 --- a/lvgl_tft/display_espressif_hal.c +++ b/lvgl_tft/display_espressif_hal.c @@ -6,32 +6,14 @@ #include "sdkconfig.h" #include "driver/gpio.h" -void display_bsp_init_io(void) -{ -#ifdef CONFIG_LV_DISPLAY_USE_DC - gpio_pad_select_gpio(CONFIG_LV_DISP_PIN_DC); - gpio_set_direction(CONFIG_LV_DISP_PIN_DC, GPIO_MODE_OUTPUT); -#endif - -#ifdef CONFIG_LV_DISP_USE_RST - gpio_pad_select_gpio(CONFIG_LV_DISP_PIN_RST); - gpio_set_direction(CONFIG_LV_DISP_PIN_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 -} - -void display_bsp_delay(lv_disp_drv_t *drv, uint32_t delay_ms) +void display_hal_delay(lv_disp_drv_t *drv, uint32_t delay_ms) { (void) drv; vTaskDelay(pdMS_TO_TICKS(delay_ms)); } -void display_bsp_backlight(lv_disp_drv_t *drv, uint8_t state) +void display_hal_backlight(lv_disp_drv_t *drv, uint8_t state) { (void) drv; @@ -40,7 +22,7 @@ void display_bsp_backlight(lv_disp_drv_t *drv, uint8_t state) #endif } -void display_bsp_gpio_dc(lv_disp_drv_t *drv, uint8_t state) +void display_hal_gpio_dc(lv_disp_drv_t *drv, uint8_t state) { (void) drv; @@ -49,7 +31,7 @@ void display_bsp_gpio_dc(lv_disp_drv_t *drv, uint8_t state) #endif } -void display_bsp_gpio_rst(lv_disp_drv_t *drv, uint8_t state) +void display_hal_gpio_rst(lv_disp_drv_t *drv, uint8_t state) { (void) drv; From 0c6975954f5e043061060e2ca41c5cd382ada01a Mon Sep 17 00:00:00 2001 From: C47D Date: Thu, 26 Aug 2021 18:53:13 -0500 Subject: [PATCH 018/105] helpers: Remove display initialization from lvgl_driver_init --- lvgl_helpers.c | 1 - 1 file changed, 1 deletion(-) diff --git a/lvgl_helpers.c b/lvgl_helpers.c index edc522f..c8a76b6 100644 --- a/lvgl_helpers.c +++ b/lvgl_helpers.c @@ -105,7 +105,6 @@ void lvgl_driver_init(void) DISP_SPI_IO2, DISP_SPI_IO3); disp_spi_add_device(TFT_SPI_HOST); - disp_driver_init(); #elif defined (CONFIG_LV_I2C_DISPLAY) disp_driver_init(); From e314c7563bd77eae089cad182113c5afef339056 Mon Sep 17 00:00:00 2001 From: C47D Date: Thu, 26 Aug 2021 18:54:15 -0500 Subject: [PATCH 019/105] disp_driver: Add pointer to lv_disp_drv_t as parameter to disp_driver_init --- lvgl_tft/disp_driver.c | 4 ++-- lvgl_tft/disp_driver.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lvgl_tft/disp_driver.c b/lvgl_tft/disp_driver.c index f62a947..c0b7c8d 100644 --- a/lvgl_tft/disp_driver.c +++ b/lvgl_tft/disp_driver.c @@ -7,7 +7,7 @@ #include "esp_lcd_backlight.h" #include "sdkconfig.h" -void *disp_driver_init(void) +void disp_driver_init(lv_disp_drv_t *drv) { #if defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9341 ili9341_init(); @@ -16,7 +16,7 @@ void *disp_driver_init(void) #elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9488 ili9488_init(); #elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7789 - st7789_init(); + st7789_init(drv); #elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7796S st7796s_init(); #elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7735S diff --git a/lvgl_tft/disp_driver.h b/lvgl_tft/disp_driver.h index 8c70fda..f4929bf 100644 --- a/lvgl_tft/disp_driver.h +++ b/lvgl_tft/disp_driver.h @@ -67,7 +67,7 @@ extern "C" { **********************/ /* Initialize display */ -void *disp_driver_init(void); +void disp_driver_init(lv_disp_drv_t *drv); /* Display flush callback */ void disp_driver_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map); From 64832c41363bc73978c71ff035f18fc90b1d14e3 Mon Sep 17 00:00:00 2001 From: C47D Date: Thu, 26 Aug 2021 18:58:36 -0500 Subject: [PATCH 020/105] fix(st7789): Remove extra parameter on disp_spi_send_colors and disp_spi_send_data --- lvgl_tft/st7789.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lvgl_tft/st7789.c b/lvgl_tft/st7789.c index fd44baa..e81844f 100644 --- a/lvgl_tft/st7789.c +++ b/lvgl_tft/st7789.c @@ -31,7 +31,7 @@ typedef struct { /********************** * STATIC PROTOTYPES **********************/ -static void st7789_set_orientation(uint8_t orientation); +static void st7789_set_orientation(lv_disp_drv_t *drv, uint8_t orientation); static void st7789_send_cmd(lv_disp_drv_t * drv, uint8_t cmd); static void st7789_send_data(lv_disp_drv_t * drv, void *data, uint16_t length); @@ -179,21 +179,21 @@ static void st7789_send_cmd(lv_disp_drv_t *drv, uint8_t cmd) { disp_wait_for_pending_transactions(); display_hal_gpio_dc(drv, 0); - disp_spi_send_data(drv, &cmd, 1); + disp_spi_send_data(&cmd, 1); } static void st7789_send_data(lv_disp_drv_t *drv, void * data, uint16_t length) { disp_wait_for_pending_transactions(); display_hal_gpio_dc(drv, 1); - disp_spi_send_data(drv, data, length); + disp_spi_send_data(data, length); } static void st7789_send_color(lv_disp_drv_t *drv, void * data, uint16_t length) { disp_wait_for_pending_transactions(); display_hal_gpio_dc(drv, 1); - disp_spi_send_colors(drv, data, length); + disp_spi_send_colors(data, length); } /* Reset the display, if we don't have a reset pin we use software reset */ From aa8a78f72a0813decee40db70abddf6912eabc6b Mon Sep 17 00:00:00 2001 From: C47D Date: Tue, 7 Sep 2021 00:11:21 -0500 Subject: [PATCH 021/105] helpers: Remove display initialization when using SPI --- lvgl_helpers.c | 1 - 1 file changed, 1 deletion(-) diff --git a/lvgl_helpers.c b/lvgl_helpers.c index c8a76b6..538b085 100644 --- a/lvgl_helpers.c +++ b/lvgl_helpers.c @@ -105,7 +105,6 @@ void lvgl_driver_init(void) DISP_SPI_IO2, DISP_SPI_IO3); disp_spi_add_device(TFT_SPI_HOST); - disp_driver_init(); #elif defined (CONFIG_LV_I2C_DISPLAY) disp_driver_init(); #else From c7975623219773b9cbedb6241c73b588b75d0f3b Mon Sep 17 00:00:00 2001 From: C47D Date: Tue, 7 Sep 2021 19:12:53 -0500 Subject: [PATCH 022/105] port; Move display_espressif_hal to new lv_port directory --- CMakeLists.txt | 6 +++++- {lvgl_tft => lv_port}/display_espressif_hal.c | 0 2 files changed, 5 insertions(+), 1 deletion(-) rename {lvgl_tft => lv_port}/display_espressif_hal.c (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 701a787..b0010ba 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,11 @@ file(GLOB SOURCES *.c) set(LVGL_INCLUDE_DIRS . lvgl_tft) list(APPEND SOURCES "lvgl_tft/disp_driver.c") list(APPEND SOURCES "lvgl_tft/esp_lcd_backlight.c") -list(APPEND SOURCES "lvgl_tft/display_espressif_hal.c") + +# This are the source files used for mcu abstraction +set(LV_PORT_PATH "lv_port") + +list(APPEND SOURCES "${LV_PORT_PATH}/display_espressif_hal.c") #@todo add SimleInclude macro here diff --git a/lvgl_tft/display_espressif_hal.c b/lv_port/display_espressif_hal.c similarity index 100% rename from lvgl_tft/display_espressif_hal.c rename to lv_port/display_espressif_hal.c From f6307afabc910bd6462a8a9db08dbab39cfa5e88 Mon Sep 17 00:00:00 2001 From: C47D Date: Tue, 7 Sep 2021 19:30:31 -0500 Subject: [PATCH 023/105] Rename display_espressif_hal.c to lv_port_display_espressif.c --- CMakeLists.txt | 2 +- .../{display_espressif_hal.c => lv_port_display_espressif.c} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename lv_port/{display_espressif_hal.c => lv_port_display_espressif.c} (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index b0010ba..d6a67f8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,7 +8,7 @@ list(APPEND SOURCES "lvgl_tft/esp_lcd_backlight.c") # This are the source files used for mcu abstraction set(LV_PORT_PATH "lv_port") -list(APPEND SOURCES "${LV_PORT_PATH}/display_espressif_hal.c") +list(APPEND SOURCES "${LV_PORT_PATH}/lv_port_display_espressif.c") #@todo add SimleInclude macro here diff --git a/lv_port/display_espressif_hal.c b/lv_port/lv_port_display_espressif.c similarity index 100% rename from lv_port/display_espressif_hal.c rename to lv_port/lv_port_display_espressif.c From 83c08f6a2af65ddb2248239a643f8f1e682479a1 Mon Sep 17 00:00:00 2001 From: C47D Date: Tue, 7 Sep 2021 19:44:01 -0500 Subject: [PATCH 024/105] st7789: Remove unused symbols Removed `ST7789_DC` and `ST7789_RST` symbols as they are no longer used. --- lvgl_tft/st7789.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/lvgl_tft/st7789.h b/lvgl_tft/st7789.h index 49411e8..8c29765 100644 --- a/lvgl_tft/st7789.h +++ b/lvgl_tft/st7789.h @@ -21,9 +21,6 @@ extern "C" #include "sdkconfig.h" -#define ST7789_DC CONFIG_LV_DISP_PIN_DC -#define ST7789_RST CONFIG_LV_DISP_PIN_RST - #if CONFIG_LV_DISP_USE_RST #if CONFIG_LV_DISP_ST7789_SOFT_RESET #define ST7789_SOFT_RST From dfe54e8573c71ab23395df33b959a5d4973fb7d8 Mon Sep 17 00:00:00 2001 From: C47D Date: Wed, 8 Sep 2021 22:59:52 -0500 Subject: [PATCH 025/105] ST7789: Add template for update_cb We might use this callback to be able to rotate the display at runtime using the displa controller configuration bytes --- lvgl_tft/st7789.c | 5 +++++ lvgl_tft/st7789.h | 27 +++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/lvgl_tft/st7789.c b/lvgl_tft/st7789.c index e81844f..c85107b 100644 --- a/lvgl_tft/st7789.c +++ b/lvgl_tft/st7789.c @@ -232,3 +232,8 @@ static void st7789_set_orientation(lv_disp_drv_t *drv, uint8_t orientation) st7789_send_data(drv, (void *) &data[orientation], 1); } +/* Display update callback, we could update the orientation in here */ +void st7789_update_cb(lv_disp_drv_t *drv) +{ + (void) drv; +} diff --git a/lvgl_tft/st7789.h b/lvgl_tft/st7789.h index 8c29765..e09f6a7 100644 --- a/lvgl_tft/st7789.h +++ b/lvgl_tft/st7789.h @@ -107,10 +107,37 @@ extern "C" #define ST7789_NVMSET 0xFC // NVM setting #define ST7789_PROMACT 0xFE // Program action +/** + * Initialize the ST7789 display controller with default configuration + * + * @param drv Pointer to lv_disp_drv_t being used + */ void st7789_init(lv_disp_drv_t *drv); + +/** + * Send buffer content to display + * + * @param drv Pointer to lv_disp_drv_t being used + * @param area Pointer to area to be sent + * @param color_map Pointer to color map + */ void st7789_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map); + +/** + * Control display backlight + * + * @param drv Pointer to lv_disp_drv_t being used + * @param backlight Backlight control + */ void st7789_enable_backlight(lv_disp_drv_t *drv, bool backlight); +/** + * Display updated callback + * + * @param drv Pointer to lv_disp_drv_t being used + */ +void st7789_update_cb(lv_disp_drv_t *drv) + #ifdef __cplusplus } /* extern "C" */ #endif From d79b68bdf6ceb1c85ad2638f6cb819118901f9dd Mon Sep 17 00:00:00 2001 From: C47D Date: Wed, 8 Sep 2021 23:01:01 -0500 Subject: [PATCH 026/105] ST7789: Cleanup Remove logging and unneccesary includes --- lvgl_tft/st7789.c | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/lvgl_tft/st7789.c b/lvgl_tft/st7789.c index c85107b..36fb81d 100644 --- a/lvgl_tft/st7789.c +++ b/lvgl_tft/st7789.c @@ -4,9 +4,6 @@ * Mostly taken from lbthomsen/esp-idf-littlevgl github. */ -#include "sdkconfig.h" -#include "esp_log.h" - #include "st7789.h" #include "disp_spi.h" @@ -88,8 +85,6 @@ void st7789_init(lv_disp_drv_t *drv) st7789_reset(drv); - ESP_LOGI(TAG, "Initialization.\n"); - //Send all the commands uint16_t cmd = 0; while (st7789_init_cmds[cmd].databytes!=0xff) { @@ -103,13 +98,13 @@ void st7789_init(lv_disp_drv_t *drv) st7789_enable_backlight(drv, true); - st7789_set_orientation(drv, CONFIG_LV_DISPLAY_ORIENTATION); + /* FIXME We're setting up the initial orientation in the cmd array */ + st7789_set_orientation(drv, ST7789_INITIAL_ORIENTATION); } void st7789_enable_backlight(lv_disp_drv_t *drv, bool backlight) { #if ST7789_ENABLE_BACKLIGHT_CONTROL - ESP_LOGI(TAG, "%s backlight.\n", backlight ? "Enabling" : "Disabling"); uint32_t tmp = 0; #if (ST7789_BCKL_ACTIVE_LVL==1) @@ -211,12 +206,6 @@ static void st7789_reset(lv_disp_drv_t *drv) static void st7789_set_orientation(lv_disp_drv_t *drv, uint8_t orientation) { - const char *orientation_str[] = { - "PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED" - }; - - ESP_LOGI(TAG, "Display orientation: %s", orientation_str[orientation]); - uint8_t data[] = { #if CONFIG_LV_PREDEFINED_DISPLAY_TTGO @@ -226,8 +215,6 @@ static void st7789_set_orientation(lv_disp_drv_t *drv, uint8_t orientation) #endif }; - ESP_LOGI(TAG, "0x36 command value: 0x%02X", data[orientation]); - st7789_send_cmd(drv, ST7789_MADCTL); st7789_send_data(drv, (void *) &data[orientation], 1); } From 2a3157b8fcb6cf14c8a6b74f26a14a1ba297cabd Mon Sep 17 00:00:00 2001 From: C47D Date: Wed, 8 Sep 2021 23:02:47 -0500 Subject: [PATCH 027/105] ST7789: Move configuration to display_config.h --- display_config.h | 29 +++++++++++++++++++++++++++++ lvgl_tft/st7789.h | 16 ++++------------ 2 files changed, 33 insertions(+), 12 deletions(-) create mode 100644 display_config.h diff --git a/display_config.h b/display_config.h new file mode 100644 index 0000000..37e6387 --- /dev/null +++ b/display_config.h @@ -0,0 +1,29 @@ +#ifndef DISPLAY_CONFIG_H_ +#define DISPLAY_CONFIG_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "sdkconfig.h" + +/* Configuration options for ST7789 display controllers */ +#if CONFIG_LV_DISP_USE_RST + #if CONFIG_LV_DISP_ST7789_SOFT_RESET + #define ST7789_SOFT_RST + #endif +#else + #define ST7789_SOFT_RST +#endif + +#if defined (CONFIG_LV_INVERT_COLORS) +#define ST7789_INVERT_COLORS 1U +#endif + +#define ST7789_INITIAL_ORIENTATION CONFIG_LV_DISPLAY_ORIENTATION + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* DISPLAY_CONFIG_H_ */ diff --git a/lvgl_tft/st7789.h b/lvgl_tft/st7789.h index e09f6a7..d48da96 100644 --- a/lvgl_tft/st7789.h +++ b/lvgl_tft/st7789.h @@ -17,19 +17,11 @@ extern "C" #else #include "lvgl/lvgl.h" #endif -#include "../lvgl_helpers.h" -#include "sdkconfig.h" - -#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_INVERT_COLORS CONFIG_LV_INVERT_COLORS +/* For SPI transfers */ +#include "lvgl_helpers.h" +/* For ST7789 particular configurations */ +#include "display_config.h" /* ST7789 commands */ #define ST7789_NOP 0x00 From b6e1f91ed1346d690a23d77afaeb4d2baa2ab85f Mon Sep 17 00:00:00 2001 From: C47D Date: Wed, 8 Sep 2021 23:08:18 -0500 Subject: [PATCH 028/105] ST7789: Use new configuration option for software reset --- lvgl_tft/st7789.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lvgl_tft/st7789.c b/lvgl_tft/st7789.c index 36fb81d..4f0d229 100644 --- a/lvgl_tft/st7789.c +++ b/lvgl_tft/st7789.c @@ -194,7 +194,7 @@ static void st7789_send_color(lv_disp_drv_t *drv, void * data, uint16_t length) /* Reset the display, if we don't have a reset pin we use software reset */ static void st7789_reset(lv_disp_drv_t *drv) { -#if !defined(CONFIG_LV_DISP_ST7789_SOFT_RESET) +#if !defined(ST7789_SOFT_RST) display_hal_gpio_rst(drv, 0); display_hal_delay(drv, 100); display_hal_gpio_rst(drv, 1); From 2134cdcfb566f5f323499e72f53f48415c81860d Mon Sep 17 00:00:00 2001 From: C47D Date: Thu, 9 Sep 2021 18:08:58 -0500 Subject: [PATCH 029/105] fix(st7789.h): Add missing ; to st7789_update_cb --- lvgl_tft/st7789.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lvgl_tft/st7789.h b/lvgl_tft/st7789.h index d48da96..86576e4 100644 --- a/lvgl_tft/st7789.h +++ b/lvgl_tft/st7789.h @@ -128,7 +128,7 @@ void st7789_enable_backlight(lv_disp_drv_t *drv, bool backlight); * * @param drv Pointer to lv_disp_drv_t being used */ -void st7789_update_cb(lv_disp_drv_t *drv) +void st7789_update_cb(lv_disp_drv_t *drv); #ifdef __cplusplus } /* extern "C" */ From 9b1e3d1198b98d2fad613c6c442aa3df45a12dcc Mon Sep 17 00:00:00 2001 From: C47D Date: Thu, 9 Sep 2021 18:10:10 -0500 Subject: [PATCH 030/105] fix(disp_driver): Update disp_driver_init API signature The signature was changed when I was rebasing master into this branch, this commit fixes it :) --- lvgl_tft/disp_driver.c | 2 +- lvgl_tft/disp_driver.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lvgl_tft/disp_driver.c b/lvgl_tft/disp_driver.c index c0b7c8d..634ee93 100644 --- a/lvgl_tft/disp_driver.c +++ b/lvgl_tft/disp_driver.c @@ -7,7 +7,7 @@ #include "esp_lcd_backlight.h" #include "sdkconfig.h" -void disp_driver_init(lv_disp_drv_t *drv) +void *disp_driver_init(lv_disp_drv_t *drv) { #if defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9341 ili9341_init(); diff --git a/lvgl_tft/disp_driver.h b/lvgl_tft/disp_driver.h index f4929bf..8636153 100644 --- a/lvgl_tft/disp_driver.h +++ b/lvgl_tft/disp_driver.h @@ -67,7 +67,7 @@ extern "C" { **********************/ /* Initialize display */ -void disp_driver_init(lv_disp_drv_t *drv); +void *disp_driver_init(lv_disp_drv_t *drv); /* Display flush callback */ void disp_driver_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map); From ffae578a39a01e30350547e3b21f5f88adbe37a9 Mon Sep 17 00:00:00 2001 From: C47D Date: Thu, 9 Sep 2021 19:36:32 -0500 Subject: [PATCH 031/105] chore(st7789.h): Add note to st7789_update_cb --- lvgl_tft/st7789.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lvgl_tft/st7789.c b/lvgl_tft/st7789.c index 4f0d229..4b3b718 100644 --- a/lvgl_tft/st7789.c +++ b/lvgl_tft/st7789.c @@ -219,7 +219,8 @@ static void st7789_set_orientation(lv_disp_drv_t *drv, uint8_t orientation) st7789_send_data(drv, (void *) &data[orientation], 1); } -/* Display update callback, we could update the orientation in here */ +/* Display update callback, we could update the orientation in here + * NOTE Available only for LVGL v8 */ void st7789_update_cb(lv_disp_drv_t *drv) { (void) drv; From 0e29128b3b30f2ea16d060385e2b758c34cca043 Mon Sep 17 00:00:00 2001 From: C47D Date: Thu, 9 Sep 2021 22:47:47 -0500 Subject: [PATCH 032/105] feat(st7789.c): Initial support for display rotation control using LVGL --- lvgl_tft/st7789.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/lvgl_tft/st7789.c b/lvgl_tft/st7789.c index 4b3b718..e990c06 100644 --- a/lvgl_tft/st7789.c +++ b/lvgl_tft/st7789.c @@ -122,6 +122,22 @@ void st7789_enable_backlight(lv_disp_drv_t *drv, bool backlight) * account that gap, this is not necessary in all orientations. */ void st7789_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map) { + static lv_disp_rot_t prev_rotation = LV_DISP_ROT_NONE; + + lv_disp_t *display = (lv_disp_t *) drv; + lv_disp_rot_t rotation = lv_disp_get_rotation(display); + + if (rotation != prev_rotation) { + /* Update rotation */ + + /* TODO Handle all other rotations */ + if (LV_DISP_ROT_180 == rotation) { + st7789_set_orientation(drv, 1); + } + + prev_rotation = rotation; + } + uint8_t data[4] = {0}; uint16_t offsetx1 = area->x1; @@ -138,8 +154,13 @@ void st7789_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * colo #elif (LV_HOR_RES_MAX == 240) && (LV_VER_RES_MAX == 240) #if (CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT) - offsetx1 += 80; - offsetx2 += 80; + if (LV_DISP_ROT_NONE == rotation) { + offsetx1 += 80; + offsetx2 += 80; + } + else { + + } #elif (CONFIG_LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED) offsety1 += 80; offsety2 += 80; From 20438187b14e96a1f53bab3faa60dc946d2d73fb Mon Sep 17 00:00:00 2001 From: C47D Date: Sat, 11 Sep 2021 13:51:21 -0500 Subject: [PATCH 033/105] Revert "feat(st7789.c): Initial support for display rotation control using LVGL" This reverts commit 704f9a2c7f65dac47ba9b1a69aaf4d8dfe5c53ee. --- lvgl_tft/st7789.c | 25 ++----------------------- 1 file changed, 2 insertions(+), 23 deletions(-) diff --git a/lvgl_tft/st7789.c b/lvgl_tft/st7789.c index e990c06..4b3b718 100644 --- a/lvgl_tft/st7789.c +++ b/lvgl_tft/st7789.c @@ -122,22 +122,6 @@ void st7789_enable_backlight(lv_disp_drv_t *drv, bool backlight) * account that gap, this is not necessary in all orientations. */ void st7789_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map) { - static lv_disp_rot_t prev_rotation = LV_DISP_ROT_NONE; - - lv_disp_t *display = (lv_disp_t *) drv; - lv_disp_rot_t rotation = lv_disp_get_rotation(display); - - if (rotation != prev_rotation) { - /* Update rotation */ - - /* TODO Handle all other rotations */ - if (LV_DISP_ROT_180 == rotation) { - st7789_set_orientation(drv, 1); - } - - prev_rotation = rotation; - } - uint8_t data[4] = {0}; uint16_t offsetx1 = area->x1; @@ -154,13 +138,8 @@ void st7789_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * colo #elif (LV_HOR_RES_MAX == 240) && (LV_VER_RES_MAX == 240) #if (CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT) - if (LV_DISP_ROT_NONE == rotation) { - offsetx1 += 80; - offsetx2 += 80; - } - else { - - } + offsetx1 += 80; + offsetx2 += 80; #elif (CONFIG_LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED) offsety1 += 80; offsety2 += 80; From 359dcb92bad08c2d38ffd4673ad8b0866fde07f6 Mon Sep 17 00:00:00 2001 From: C47D Date: Sat, 11 Sep 2021 13:56:32 -0500 Subject: [PATCH 034/105] feat(st7789.c): Add delay after sending software reset command --- lvgl_tft/st7789.c | 1 + 1 file changed, 1 insertion(+) diff --git a/lvgl_tft/st7789.c b/lvgl_tft/st7789.c index 4b3b718..30ef730 100644 --- a/lvgl_tft/st7789.c +++ b/lvgl_tft/st7789.c @@ -201,6 +201,7 @@ static void st7789_reset(lv_disp_drv_t *drv) display_hal_delay(drv, 100); #else st7789_send_cmd(drv, ST7789_SWRESET); + display_hal_delay(drv, 5); #endif } From 9d9fadf45015e58721d5065eaeb06f3afbc02c95 Mon Sep 17 00:00:00 2001 From: C47D Date: Sat, 11 Sep 2021 14:21:08 -0500 Subject: [PATCH 035/105] fix(display_port): Rename display_hal_* to display_port_* Also updates the display drivers that used it --- lv_port/lv_port_display_espressif.c | 10 +++--- lvgl_tft/display_hal.h | 30 ----------------- lvgl_tft/display_port.h | 51 +++++++++++++++++++++++++++++ lvgl_tft/st7789.c | 22 ++++++------- 4 files changed, 67 insertions(+), 46 deletions(-) delete mode 100644 lvgl_tft/display_hal.h create mode 100644 lvgl_tft/display_port.h diff --git a/lv_port/lv_port_display_espressif.c b/lv_port/lv_port_display_espressif.c index a5888f3..9f6f4b1 100644 --- a/lv_port/lv_port_display_espressif.c +++ b/lv_port/lv_port_display_espressif.c @@ -1,19 +1,19 @@ #include "freertos/FreeRTOS.h" #include "freertos/task.h" -#include "display_hal.h" +#include "display_port.h" #include "sdkconfig.h" #include "driver/gpio.h" -void display_hal_delay(lv_disp_drv_t *drv, uint32_t delay_ms) +void display_port_delay(lv_disp_drv_t *drv, uint32_t delay_ms) { (void) drv; vTaskDelay(pdMS_TO_TICKS(delay_ms)); } -void display_hal_backlight(lv_disp_drv_t *drv, uint8_t state) +void display_port_backlight(lv_disp_drv_t *drv, uint8_t state) { (void) drv; @@ -22,7 +22,7 @@ void display_hal_backlight(lv_disp_drv_t *drv, uint8_t state) #endif } -void display_hal_gpio_dc(lv_disp_drv_t *drv, uint8_t state) +void display_port_gpio_dc(lv_disp_drv_t *drv, uint8_t state) { (void) drv; @@ -31,7 +31,7 @@ void display_hal_gpio_dc(lv_disp_drv_t *drv, uint8_t state) #endif } -void display_hal_gpio_rst(lv_disp_drv_t *drv, uint8_t state) +void display_port_gpio_rst(lv_disp_drv_t *drv, uint8_t state) { (void) drv; diff --git a/lvgl_tft/display_hal.h b/lvgl_tft/display_hal.h deleted file mode 100644 index e7f6041..0000000 --- a/lvgl_tft/display_hal.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef DISPLAY_HAL_H_ -#define DISPLAY_HAL_H_ - -#ifdef __cplusplus -extern "C" -{ -#endif - -#ifdef LV_LVGL_H_INCLUDE_SIMPLE -#include "lvgl.h" -#else -#include "lvgl/lvgl.h" -#endif - -/* NOTE We could remove this function from here, because it's used to - * initialize the GPIOS on the MCU */ -void display_hal_init_io(void); - -/* NOTE drv parameter is meant to be used in multi display projects, so the - * user could distinguish multiple displays on their hal implementation */ -void display_hal_delay(lv_disp_drv_t *drv, uint32_t delay_ms); -void display_hal_backlight(lv_disp_drv_t *drv, uint8_t state); -void display_hal_gpio_dc(lv_disp_drv_t *drv, uint8_t state); -void display_hal_gpio_rst(lv_disp_drv_t *drv, uint8_t state); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif diff --git a/lvgl_tft/display_port.h b/lvgl_tft/display_port.h new file mode 100644 index 0000000..2136ec6 --- /dev/null +++ b/lvgl_tft/display_port.h @@ -0,0 +1,51 @@ +#ifndef DISPLAY_PORT_H_ +#define DISPLAY_PORT_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE +#include "lvgl.h" +#else +#include "lvgl/lvgl.h" +#endif + +/** + * Busy wait delay port + * + * @param drv Pointer to driver See @ref lv_disp_drv_t + * @param delay_ms Delay duration in milliseconds + */ +void display_port_delay(lv_disp_drv_t *drv, uint32_t delay_ms); + +/** + * Backlight control port + * + * @param drv Pointer to driver See @ref lv_disp_drv_t + * @param state State of the backlight signal + */ +void display_port_backlight(lv_disp_drv_t *drv, uint8_t state); + +/** + * DC signal control port + * + * @param drv Pointer to driver See @ref lv_disp_drv_t + * @param state State of the DC signal, 1 for logic high, 0 for logic low + */ +void display_port_gpio_dc(lv_disp_drv_t *drv, uint8_t state); + +/** + * Hardware reset control port + * + * @param drv Pointer to driver See @ref lv_disp_drv_t + * @param state State of the reset signal, 1 for logic high, 0 for logic low + */ +void display_port_gpio_rst(lv_disp_drv_t *drv, uint8_t state); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/lvgl_tft/st7789.c b/lvgl_tft/st7789.c index 30ef730..690e44c 100644 --- a/lvgl_tft/st7789.c +++ b/lvgl_tft/st7789.c @@ -7,7 +7,7 @@ #include "st7789.h" #include "disp_spi.h" -#include "display_hal.h" +#include "display_port.h" /********************* * DEFINES @@ -91,7 +91,7 @@ void st7789_init(lv_disp_drv_t *drv) st7789_send_cmd(drv, st7789_init_cmds[cmd].cmd); st7789_send_data(drv, st7789_init_cmds[cmd].data, st7789_init_cmds[cmd].databytes&0x1F); if (st7789_init_cmds[cmd].databytes & 0x80) { - display_hal_delay(drv, 100); + display_port_delay(drv, 100); } cmd++; } @@ -113,7 +113,7 @@ void st7789_enable_backlight(lv_disp_drv_t *drv, bool backlight) tmp = backlight ? 0 : 1; #endif - display_hal_backlight(drv, tmp); + display_port_backlight(drv, tmp); #endif } @@ -173,21 +173,21 @@ void st7789_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * colo static void st7789_send_cmd(lv_disp_drv_t *drv, uint8_t cmd) { disp_wait_for_pending_transactions(); - display_hal_gpio_dc(drv, 0); + display_port_gpio_dc(drv, 0); disp_spi_send_data(&cmd, 1); } static void st7789_send_data(lv_disp_drv_t *drv, void * data, uint16_t length) { disp_wait_for_pending_transactions(); - display_hal_gpio_dc(drv, 1); + display_port_gpio_dc(drv, 1); disp_spi_send_data(data, length); } static void st7789_send_color(lv_disp_drv_t *drv, void * data, uint16_t length) { disp_wait_for_pending_transactions(); - display_hal_gpio_dc(drv, 1); + display_port_gpio_dc(drv, 1); disp_spi_send_colors(data, length); } @@ -195,13 +195,13 @@ static void st7789_send_color(lv_disp_drv_t *drv, void * data, uint16_t length) static void st7789_reset(lv_disp_drv_t *drv) { #if !defined(ST7789_SOFT_RST) - display_hal_gpio_rst(drv, 0); - display_hal_delay(drv, 100); - display_hal_gpio_rst(drv, 1); - display_hal_delay(drv, 100); + display_port_gpio_rst(drv, 0); + display_port_delay(drv, 100); + display_port_gpio_rst(drv, 1); + display_port_delay(drv, 100); #else st7789_send_cmd(drv, ST7789_SWRESET); - display_hal_delay(drv, 5); + display_port_delay(drv, 5); #endif } From 3980e51f074e5477531cc42b1aa199a2f04bb439 Mon Sep 17 00:00:00 2001 From: C47D Date: Sat, 11 Sep 2021 14:27:14 -0500 Subject: [PATCH 036/105] fix(st7789): Remove backlight control from driver Use backlight control introduced in #95 --- lvgl_tft/st7789.c | 17 ----------------- lvgl_tft/st7789.h | 8 -------- 2 files changed, 25 deletions(-) diff --git a/lvgl_tft/st7789.c b/lvgl_tft/st7789.c index 690e44c..1aa1b75 100644 --- a/lvgl_tft/st7789.c +++ b/lvgl_tft/st7789.c @@ -96,27 +96,10 @@ void st7789_init(lv_disp_drv_t *drv) cmd++; } - st7789_enable_backlight(drv, true); - /* FIXME We're setting up the initial orientation in the cmd array */ st7789_set_orientation(drv, ST7789_INITIAL_ORIENTATION); } -void st7789_enable_backlight(lv_disp_drv_t *drv, bool backlight) -{ -#if ST7789_ENABLE_BACKLIGHT_CONTROL - uint32_t tmp = 0; - -#if (ST7789_BCKL_ACTIVE_LVL==1) - tmp = backlight ? 1 : 0; -#else - tmp = backlight ? 0 : 1; -#endif - - display_port_backlight(drv, tmp); -#endif -} - /* The ST7789 display controller can drive 320*240 displays, when using a 240*240 * display there's a gap of 80px, we need to edit the coordinates to take into * account that gap, this is not necessary in all orientations. */ diff --git a/lvgl_tft/st7789.h b/lvgl_tft/st7789.h index 86576e4..be86c21 100644 --- a/lvgl_tft/st7789.h +++ b/lvgl_tft/st7789.h @@ -115,14 +115,6 @@ void st7789_init(lv_disp_drv_t *drv); */ void st7789_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map); -/** - * Control display backlight - * - * @param drv Pointer to lv_disp_drv_t being used - * @param backlight Backlight control - */ -void st7789_enable_backlight(lv_disp_drv_t *drv, bool backlight); - /** * Display updated callback * From 85f70cb688bd3b6cb9da904b9f4c9943637c7a59 Mon Sep 17 00:00:00 2001 From: C47D Date: Sat, 11 Sep 2021 14:46:02 -0500 Subject: [PATCH 037/105] feat(disp_driver): Move backlight configuration to it's own API --- lvgl_tft/disp_driver.c | 5 +++++ lvgl_tft/disp_driver.h | 2 ++ 2 files changed, 7 insertions(+) diff --git a/lvgl_tft/disp_driver.c b/lvgl_tft/disp_driver.c index 634ee93..95569a8 100644 --- a/lvgl_tft/disp_driver.c +++ b/lvgl_tft/disp_driver.c @@ -45,6 +45,11 @@ void *disp_driver_init(lv_disp_drv_t *drv) ili9163c_init(); #endif + return disp_backlight_init(); +} + +void *disp_backlight_init(void) +{ // We still use menuconfig for these settings // It will be set up during runtime in the future #if (defined(CONFIG_LV_DISP_BACKLIGHT_SWITCH) || defined(CONFIG_LV_DISP_BACKLIGHT_PWM)) diff --git a/lvgl_tft/disp_driver.h b/lvgl_tft/disp_driver.h index 8636153..a4a282b 100644 --- a/lvgl_tft/disp_driver.h +++ b/lvgl_tft/disp_driver.h @@ -79,6 +79,8 @@ 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); +/* Display backlight configuration */ +void *disp_backlight_init(void); /********************** * MACROS **********************/ From cd999e34cd209b014c612a1dac50fe15356a99dc Mon Sep 17 00:00:00 2001 From: C47D Date: Tue, 14 Sep 2021 18:06:36 -0500 Subject: [PATCH 038/105] fix(lvgl_helpers): Remove all references to disp_driver_init in lvgl_driver_init --- lvgl_helpers.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/lvgl_helpers.c b/lvgl_helpers.c index 538b085..02f4017 100644 --- a/lvgl_helpers.c +++ b/lvgl_helpers.c @@ -69,7 +69,6 @@ void lvgl_driver_init(void) DISP_SPI_IO2, DISP_SPI_IO3); disp_spi_add_device(TFT_SPI_HOST); - disp_driver_init(); #if defined (CONFIG_LV_TOUCH_CONTROLLER_FT81X) touch_driver_init(); @@ -89,7 +88,6 @@ void lvgl_driver_init(void) disp_spi_add_device(TFT_SPI_HOST); tp_spi_add_device(TOUCH_SPI_HOST); - disp_driver_init(); touch_driver_init(); return; @@ -106,7 +104,6 @@ void lvgl_driver_init(void) disp_spi_add_device(TFT_SPI_HOST); #elif defined (CONFIG_LV_I2C_DISPLAY) - disp_driver_init(); #else #error "No protocol defined for display controller" #endif From 3c5a4061d94497689182c6509bf37c018ac7f510 Mon Sep 17 00:00:00 2001 From: C47D Date: Sat, 18 Sep 2021 20:14:35 -0500 Subject: [PATCH 039/105] feat(lv_port): Add abstraction for busy signal This signal can be used when driving eink displays --- lv_port/lv_port_display_espressif.c | 16 ++++++++++++++++ lvgl_tft/display_port.h | 18 ++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/lv_port/lv_port_display_espressif.c b/lv_port/lv_port_display_espressif.c index 9f6f4b1..79aaa40 100644 --- a/lv_port/lv_port_display_espressif.c +++ b/lv_port/lv_port_display_espressif.c @@ -39,3 +39,19 @@ void display_port_gpio_rst(lv_disp_drv_t *drv, uint8_t state) gpio_set_level(CONFIG_LV_DISP_PIN_RST, state); #endif } + +display_port_busy_t display_port_gpio_is_busy(lv_disp_drv_t *drv) +{ + (void) drv; + + display_port_busy_t device_busy = DISPLAY_PORT_DEVICE_NOT_BUSY; + +#ifdef CONFIG_LV_DISP_PIN_BUSY + /* FIXME Assuming the busy signal in logic 1 means the device is busy */ + if (gpio_get_level(CONFIG_LV_DISP_PIN_BUSY) == 1) { + device_busy = DISPLAY_PORT_DEVICE_IS_BUSY; + } +#endif + + return device_busy; +} diff --git a/lvgl_tft/display_port.h b/lvgl_tft/display_port.h index 2136ec6..bd58fe7 100644 --- a/lvgl_tft/display_port.h +++ b/lvgl_tft/display_port.h @@ -12,6 +12,14 @@ extern "C" #include "lvgl/lvgl.h" #endif +/** Display is busy port + * Useful for eink displays that need to poll their BUSY signal */ +typedef enum { + DISPLAY_PORT_DEVICE_NOT_BUSY, + DISPLAY_PORT_DEVICE_IS_BUSY, + /* NOTE Operation should not be interrupted when the device is busy */ +} display_port_busy_t; + /** * Busy wait delay port * @@ -44,6 +52,16 @@ void display_port_gpio_dc(lv_disp_drv_t *drv, uint8_t state); */ void display_port_gpio_rst(lv_disp_drv_t *drv, uint8_t state); +/** + * Display is busy port + * + * @param drv Pointer to driver See @ref lv_disp_drv_t + * + * @retval Returns DISPLAY_PORT_DEVICE_NOT_BUSY when display is not busy, + * DISPLAY_PORT_DEVICE_IS_BUSY otherwise. + */ +display_port_busy_t display_port_gpio_is_busy(lv_disp_drv_t *drv); + #ifdef __cplusplus } /* extern "C" */ #endif From e5b7ef9de2c492492f5ee7792ed14b0769674ad2 Mon Sep 17 00:00:00 2001 From: C47D Date: Tue, 28 Sep 2021 20:51:36 -0500 Subject: [PATCH 040/105] FT6X36: Fix coordinates invesion The coordinates need to be swapped before inveting them when swapping is enabled. Suggested in #118 by @wreyford --- lvgl_touch/ft6x36.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lvgl_touch/ft6x36.c b/lvgl_touch/ft6x36.c index 9e34845..fcef596 100644 --- a/lvgl_touch/ft6x36.c +++ b/lvgl_touch/ft6x36.c @@ -118,16 +118,16 @@ bool ft6x36_read(lv_indev_drv_t *drv, lv_indev_data_t *data) { last_x = ((data_buf[1] & FT6X36_MSB_MASK) << 8) | (data_buf[2] & FT6X36_LSB_MASK); last_y = ((data_buf[3] & FT6X36_MSB_MASK) << 8) | (data_buf[4] & FT6X36_LSB_MASK); +#if CONFIG_LV_FT6X36_SWAPXY + int16_t swap_buf = last_x; + last_x = last_y; + last_y = swap_buf; +#endif #if CONFIG_LV_FT6X36_INVERT_X last_x = LV_HOR_RES - last_x; #endif #if CONFIG_LV_FT6X36_INVERT_Y last_y = LV_VER_RES - last_y; -#endif -#if CONFIG_LV_FT6X36_SWAPXY - int16_t swap_buf = last_x; - last_x = last_y; - last_y = swap_buf; #endif data->point.x = last_x; data->point.y = last_y; From d6278848877ec9a7b8f4660fb7ba781a2332bde3 Mon Sep 17 00:00:00 2001 From: C47D Date: Fri, 1 Oct 2021 12:11:28 -0500 Subject: [PATCH 041/105] Replace display_port_busy_t with bool --- lv_port/lv_port_display_espressif.c | 6 +++--- lvgl_tft/display_port.h | 14 ++++---------- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/lv_port/lv_port_display_espressif.c b/lv_port/lv_port_display_espressif.c index 79aaa40..1684767 100644 --- a/lv_port/lv_port_display_espressif.c +++ b/lv_port/lv_port_display_espressif.c @@ -40,16 +40,16 @@ void display_port_gpio_rst(lv_disp_drv_t *drv, uint8_t state) #endif } -display_port_busy_t display_port_gpio_is_busy(lv_disp_drv_t *drv) +bool display_port_gpio_is_busy(lv_disp_drv_t *drv) { (void) drv; - display_port_busy_t device_busy = DISPLAY_PORT_DEVICE_NOT_BUSY; + bool device_busy = false; #ifdef CONFIG_LV_DISP_PIN_BUSY /* FIXME Assuming the busy signal in logic 1 means the device is busy */ if (gpio_get_level(CONFIG_LV_DISP_PIN_BUSY) == 1) { - device_busy = DISPLAY_PORT_DEVICE_IS_BUSY; + device_busy = true; } #endif diff --git a/lvgl_tft/display_port.h b/lvgl_tft/display_port.h index bd58fe7..f0004d6 100644 --- a/lvgl_tft/display_port.h +++ b/lvgl_tft/display_port.h @@ -12,13 +12,8 @@ extern "C" #include "lvgl/lvgl.h" #endif -/** Display is busy port - * Useful for eink displays that need to poll their BUSY signal */ -typedef enum { - DISPLAY_PORT_DEVICE_NOT_BUSY, - DISPLAY_PORT_DEVICE_IS_BUSY, - /* NOTE Operation should not be interrupted when the device is busy */ -} display_port_busy_t; +#include +#include /** * Busy wait delay port @@ -57,10 +52,9 @@ void display_port_gpio_rst(lv_disp_drv_t *drv, uint8_t state); * * @param drv Pointer to driver See @ref lv_disp_drv_t * - * @retval Returns DISPLAY_PORT_DEVICE_NOT_BUSY when display is not busy, - * DISPLAY_PORT_DEVICE_IS_BUSY otherwise. + * @retval Returns false when display is not busy, true otherwise. */ -display_port_busy_t display_port_gpio_is_busy(lv_disp_drv_t *drv); +bool display_port_gpio_is_busy(lv_disp_drv_t *drv); #ifdef __cplusplus } /* extern "C" */ From f7164ff22a9bc8f707544043c5adb907068c4aec Mon Sep 17 00:00:00 2001 From: C47D Date: Tue, 5 Oct 2021 00:03:02 -0500 Subject: [PATCH 042/105] ili9341: Update driver to use new port interface --- display_config.h | 7 ++ lvgl_tft/disp_driver.c | 2 +- lvgl_tft/ili9341.c | 234 ++++++++++++++++++++++------------------- lvgl_tft/ili9341.h | 14 +-- 4 files changed, 136 insertions(+), 121 deletions(-) diff --git a/display_config.h b/display_config.h index 37e6387..496c065 100644 --- a/display_config.h +++ b/display_config.h @@ -18,10 +18,17 @@ extern "C" { #if defined (CONFIG_LV_INVERT_COLORS) #define ST7789_INVERT_COLORS 1U +#define ILI9341_INVERT_COLORS 1U #endif #define ST7789_INITIAL_ORIENTATION CONFIG_LV_DISPLAY_ORIENTATION +#if CONFIG_LV_DISP_USE_RST +#define ILI9341_USE_RST +#endif + +#define ILI9341_INITIAL_ORIENTATION CONFIG_LV_DISPLAY_ORIENTATION + #ifdef __cplusplus } /* extern "C" */ #endif diff --git a/lvgl_tft/disp_driver.c b/lvgl_tft/disp_driver.c index 95569a8..eda9989 100644 --- a/lvgl_tft/disp_driver.c +++ b/lvgl_tft/disp_driver.c @@ -10,7 +10,7 @@ void *disp_driver_init(lv_disp_drv_t *drv) { #if defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9341 - ili9341_init(); + ili9341_init(drv); #elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9481 ili9481_init(); #elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9488 diff --git a/lvgl_tft/ili9341.c b/lvgl_tft/ili9341.c index 00c0a42..e4b89b0 100644 --- a/lvgl_tft/ili9341.c +++ b/lvgl_tft/ili9341.c @@ -7,22 +7,25 @@ * INCLUDES *********************/ #include "ili9341.h" + #include "disp_spi.h" -#include "driver/gpio.h" -#include "esp_log.h" -#include "freertos/FreeRTOS.h" -#include "freertos/task.h" +#include "display_port.h" /********************* * DEFINES *********************/ - #define TAG "ILI9341" +#define TAG "ILI9341" +#define END_OF_CMD_MARKER 0xFFU + +#define MEMORY_ACCESS_CONTROL_REG 0x36U +#define SOFTWARE_RESET_REG 0x01U /********************** * 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]; @@ -32,12 +35,13 @@ typedef struct { /********************** * STATIC PROTOTYPES **********************/ -static void ili9341_set_orientation(uint8_t orientation); +static void ili9341_set_orientation(lv_disp_drv_t * drv, uint8_t orientation); -static void ili9341_send_cmd(uint8_t cmd); -static void ili9341_send_data(void * data, uint16_t length); -static void ili9341_send_color(void * data, uint16_t length); +static void ili9341_send_cmd(lv_disp_drv_t * drv, uint8_t cmd); +static void ili9341_send_data(lv_disp_drv_t * drv, void * data, uint16_t length); +static void ili9341_send_color(lv_disp_drv_t * drv, void * data, uint16_t length); +static void ili9341_reset(lv_disp_drv_t * drv); /********************** * STATIC VARIABLES **********************/ @@ -50,150 +54,148 @@ static void ili9341_send_color(void * data, uint16_t length); * GLOBAL FUNCTIONS **********************/ -void ili9341_init(void) +void ili9341_init(lv_disp_drv_t * drv) { - lcd_init_cmd_t ili_init_cmds[]={ - {0xCF, {0x00, 0x83, 0X30}, 3}, - {0xED, {0x64, 0x03, 0X12, 0X81}, 4}, - {0xE8, {0x85, 0x01, 0x79}, 3}, - {0xCB, {0x39, 0x2C, 0x00, 0x34, 0x02}, 5}, - {0xF7, {0x20}, 1}, - {0xEA, {0x00, 0x00}, 2}, - {0xC0, {0x26}, 1}, /*Power control*/ - {0xC1, {0x11}, 1}, /*Power control */ - {0xC5, {0x35, 0x3E}, 2}, /*VCOM control*/ - {0xC7, {0xBE}, 1}, /*VCOM control*/ - {0x36, {0x28}, 1}, /*Memory Access Control*/ - {0x3A, {0x55}, 1}, /*Pixel Format Set*/ - {0xB1, {0x00, 0x1B}, 2}, - {0xF2, {0x08}, 1}, - {0x26, {0x01}, 1}, - {0xE0, {0x1F, 0x1A, 0x18, 0x0A, 0x0F, 0x06, 0x45, 0X87, 0x32, 0x0A, 0x07, 0x02, 0x07, 0x05, 0x00}, 15}, - {0XE1, {0x00, 0x25, 0x27, 0x05, 0x10, 0x09, 0x3A, 0x78, 0x4D, 0x05, 0x18, 0x0D, 0x38, 0x3A, 0x1F}, 15}, - {0x2A, {0x00, 0x00, 0x00, 0xEF}, 4}, - {0x2B, {0x00, 0x00, 0x01, 0x3f}, 4}, - {0x2C, {0}, 0}, - {0xB7, {0x07}, 1}, - {0xB6, {0x0A, 0x82, 0x27, 0x00}, 4}, - {0x11, {0}, 0x80}, - {0x29, {0}, 0x80}, - {0, {0}, 0xff}, - }; + lcd_init_cmd_t ili_init_cmds[] = { + {0xCF, {0x00, 0x83, 0X30}, 3}, + {0xED, {0x64, 0x03, 0X12, 0X81}, 4}, + {0xE8, {0x85, 0x01, 0x79}, 3}, + {0xCB, {0x39, 0x2C, 0x00, 0x34, 0x02}, 5}, + {0xF7, {0x20}, 1}, + {0xEA, {0x00, 0x00}, 2}, + /* Power control */ + {0xC0, {0x26}, 1}, + /* Power control */ + {0xC1, {0x11}, 1}, + /* VCOM control */ + {0xC5, {0x35, 0x3E}, 2}, + /* VCOM control */ + {0xC7, {0xBE}, 1}, + /* Memory Access Control */ + {0x36, {0x28}, 1}, + /* Pixel Format Set */ + {0x3A, {0x55}, 1}, + {0xB1, {0x00, 0x1B}, 2}, + {0xF2, {0x08}, 1}, + {0x26, {0x01}, 1}, + {0xE0, {0x1F, 0x1A, 0x18, 0x0A, 0x0F, 0x06, 0x45, 0X87, 0x32, 0x0A, 0x07, 0x02, 0x07, 0x05, 0x00}, 15}, + {0XE1, {0x00, 0x25, 0x27, 0x05, 0x10, 0x09, 0x3A, 0x78, 0x4D, 0x05, 0x18, 0x0D, 0x38, 0x3A, 0x1F}, 15}, + {0x2A, {0x00, 0x00, 0x00, 0xEF}, 4}, + {0x2B, {0x00, 0x00, 0x01, 0x3f}, 4}, + {0x2C, {0}, 0}, + {0xB7, {0x07}, 1}, + {0xB6, {0x0A, 0x82, 0x27, 0x00}, 4}, + {0x11, {0}, 0x80}, + {0x29, {0}, 0x80}, + {0, {0}, END_OF_CMD_MARKER}, + }; - //Initialize non-SPI GPIOs - gpio_pad_select_gpio(ILI9341_DC); - gpio_set_direction(ILI9341_DC, GPIO_MODE_OUTPUT); + ili9341_reset(drv); -#if ILI9341_USE_RST - gpio_pad_select_gpio(ILI9341_RST); - gpio_set_direction(ILI9341_RST, GPIO_MODE_OUTPUT); + //Send all the commands + uint16_t cmd = 0; + while (ili_init_cmds[cmd].databytes != END_OF_CMD_MARKER) { + ili9341_send_cmd(drv, ili_init_cmds[cmd].cmd); + ili9341_send_data(drv, ili_init_cmds[cmd].data, ili_init_cmds[cmd].databytes & 0x1F); + + if (ili_init_cmds[cmd].databytes & 0x80) { + display_port_delay(drv, 100); + } - //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 + cmd++; + } - ESP_LOGI(TAG, "Initialization."); + ili9341_set_orientation(drv, ILI9341_INITIAL_ORIENTATION); - //Send all the commands - uint16_t cmd = 0; - while (ili_init_cmds[cmd].databytes!=0xff) { - ili9341_send_cmd(ili_init_cmds[cmd].cmd); - ili9341_send_data(ili_init_cmds[cmd].data, ili_init_cmds[cmd].databytes&0x1F); - if (ili_init_cmds[cmd].databytes & 0x80) { - vTaskDelay(100 / portTICK_RATE_MS); - } - cmd++; - } - - ili9341_set_orientation(CONFIG_LV_DISPLAY_ORIENTATION); - -#if ILI9341_INVERT_COLORS == 1 - ili9341_send_cmd(0x21); +#if ILI9341_INVERT_COLORS == 1U + ili9341_send_cmd(drv, 0x21); #else - ili9341_send_cmd(0x20); + ili9341_send_cmd(drv, 0x20); #endif } void ili9341_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map) { - uint8_t data[4]; + uint8_t data[4] = {0}; + uint32_t size = lv_area_get_width(area) * lv_area_get_height(area); - /*Column addresses*/ - ili9341_send_cmd(0x2A); - data[0] = (area->x1 >> 8) & 0xFF; - data[1] = area->x1 & 0xFF; - data[2] = (area->x2 >> 8) & 0xFF; - data[3] = area->x2 & 0xFF; - ili9341_send_data(data, 4); + /*Column addresses*/ + data[0] = (area->x1 >> 8) & 0xFF; + data[1] = area->x1 & 0xFF; + data[2] = (area->x2 >> 8) & 0xFF; + data[3] = area->x2 & 0xFF; - /*Page addresses*/ - ili9341_send_cmd(0x2B); - data[0] = (area->y1 >> 8) & 0xFF; - data[1] = area->y1 & 0xFF; - data[2] = (area->y2 >> 8) & 0xFF; - data[3] = area->y2 & 0xFF; - ili9341_send_data(data, 4); + ili9341_send_cmd(drv, 0x2A); + ili9341_send_data(drv, data, 4); - /*Memory write*/ - ili9341_send_cmd(0x2C); - uint32_t size = lv_area_get_width(area) * lv_area_get_height(area); - ili9341_send_color((void*)color_map, size * 2); + /* Page addresses */ + data[0] = (area->y1 >> 8) & 0xFF; + data[1] = area->y1 & 0xFF; + data[2] = (area->y2 >> 8) & 0xFF; + data[3] = area->y2 & 0xFF; + + ili9341_send_cmd(drv, 0x2B); + ili9341_send_data(drv, data, 4); + + /* Memory write */ + ili9341_send_cmd(drv, 0x2C); + ili9341_send_color(drv, (void*)color_map, size * 2); } -void ili9341_sleep_in() +void ili9341_sleep_in(lv_disp_drv_t * drv) { - uint8_t data[] = {0x08}; - ili9341_send_cmd(0x10); - ili9341_send_data(&data, 1); + uint8_t data[] = {0x08}; + ili9341_send_cmd(drv, 0x10); + ili9341_send_data(drv, data, 1); } -void ili9341_sleep_out() +void ili9341_sleep_out(lv_disp_drv_t * drv) { - uint8_t data[] = {0x08}; - ili9341_send_cmd(0x11); - ili9341_send_data(&data, 1); + uint8_t data[] = {0x08}; + ili9341_send_cmd(drv, 0x11); + ili9341_send_data(drv, data, 1); } /********************** * STATIC FUNCTIONS **********************/ +static inline void set_cmd_mode(lv_disp_drv_t * drv) +{ + display_port_gpio_dc(drv, 0); +} -static void ili9341_send_cmd(uint8_t cmd) +static inline void set_data_mode(lv_disp_drv_t * drv) +{ + display_port_gpio_dc(drv, 1); +} + +static void ili9341_send_cmd(lv_disp_drv_t * drv, uint8_t cmd) { disp_wait_for_pending_transactions(); - gpio_set_level(ILI9341_DC, 0); /*Command mode*/ + set_cmd_mode(drv); disp_spi_send_data(&cmd, 1); } -static void ili9341_send_data(void * data, uint16_t length) +static void ili9341_send_data(lv_disp_drv_t *drv, void * data, uint16_t length) { disp_wait_for_pending_transactions(); - gpio_set_level(ILI9341_DC, 1); /*Data mode*/ + set_data_mode(drv); disp_spi_send_data(data, length); } -static void ili9341_send_color(void * data, uint16_t length) +static void ili9341_send_color(lv_disp_drv_t *drv, void * data, uint16_t length) { disp_wait_for_pending_transactions(); - gpio_set_level(ILI9341_DC, 1); /*Data mode*/ + set_data_mode(drv); disp_spi_send_colors(data, length); } -static void ili9341_set_orientation(uint8_t orientation) +static void ili9341_set_orientation(lv_disp_drv_t *drv, uint8_t orientation) { assert(orientation < 4); - const char *orientation_str[] = { - "PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED" - }; - - ESP_LOGI(TAG, "Display orientation: %s", orientation_str[orientation]); - #if defined CONFIG_LV_PREDEFINED_DISPLAY_M5STACK const uint8_t data[] = {0x68, 0x68, 0x08, 0x08}; #elif defined (CONFIG_LV_PREDEFINED_DISPLAY_M5CORE2) @@ -204,8 +206,20 @@ static void ili9341_set_orientation(uint8_t orientation) const uint8_t data[] = {0x48, 0x88, 0x28, 0xE8}; #endif - ESP_LOGD(TAG, "0x36 command value: 0x%02X", data[orientation]); - - ili9341_send_cmd(0x36); - ili9341_send_data((void *) &data[orientation], 1); + ili9341_send_cmd(drv, MEMORY_ACCESS_CONTROL_REG); + ili9341_send_data(drv, (void *) &data[orientation], 1); +} + +/* Reset the display, if we don't have a reset pin we use software reset */ +static void ili9341_reset(lv_disp_drv_t *drv) +{ +#if defined(ILI9341_USE_RST) + display_port_gpio_rst(drv, 0); + display_port_delay(drv, 100); + display_port_gpio_rst(drv, 1); + display_port_delay(drv, 100); +#else + ili9341_send_cmd(drv, SOFTWARE_RESET_REG); + display_port_delay(drv, 5); +#endif } diff --git a/lvgl_tft/ili9341.h b/lvgl_tft/ili9341.h index 62317e8..0f8c58b 100644 --- a/lvgl_tft/ili9341.h +++ b/lvgl_tft/ili9341.h @@ -13,23 +13,17 @@ extern "C" { /********************* * INCLUDES *********************/ -#include - #ifdef LV_LVGL_H_INCLUDE_SIMPLE #include "lvgl.h" #else #include "lvgl/lvgl.h" #endif -#include "sdkconfig.h" +#include "display_config.h" /********************* * DEFINES *********************/ -#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_INVERT_COLORS CONFIG_LV_INVERT_COLORS /********************** * TYPEDEFS @@ -39,10 +33,10 @@ extern "C" { * GLOBAL PROTOTYPES **********************/ -void ili9341_init(void); +void ili9341_init(lv_disp_drv_t * drv); void ili9341_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map); -void ili9341_sleep_in(void); -void ili9341_sleep_out(void); +void ili9341_sleep_in(lv_disp_drv_t * drv); +void ili9341_sleep_out(lv_disp_drv_t *drv); /********************** * MACROS From 152582e9f8d04e891a38f1a1d6ab1ac253af889d Mon Sep 17 00:00:00 2001 From: C47D Date: Tue, 5 Oct 2021 18:57:58 -0500 Subject: [PATCH 043/105] fix(ili9163c): Fix break when hardware reset is disabled CONFIG_LV_DISP_USE_RST is not defined when hardware reset is disabled --- lvgl_tft/ili9163c.c | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/lvgl_tft/ili9163c.c b/lvgl_tft/ili9163c.c index 059d076..b8de56e 100644 --- a/lvgl_tft/ili9163c.c +++ b/lvgl_tft/ili9163c.c @@ -69,7 +69,7 @@ #define ST77XX_MADCTL_MY 0x80 #define ST77XX_MADCTL_MX 0x40 -#define ST77XX_MADCTL_MV 0x20 #define +#define ST77XX_MADCTL_MV 0x20 #define ST77XX_MADCTL_ML 0x10 #define ST77XX_MADCTL_RGB 0x00 #define ST77XX_MADCTL_BGR 0x08 @@ -94,7 +94,7 @@ 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 void ili9163c_reset(void); /********************** * STATIC VARIABLES **********************/ @@ -136,18 +136,8 @@ void ili9163c_init(void) {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); - - //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); + + ili9163c_reset(); //Send all the commands uint16_t cmd = 0; @@ -246,3 +236,14 @@ static void ili9163c_set_orientation(uint8_t orientation) ili9163c_send_cmd(ILI9163C_MADCTL); ili9163c_send_data((void *)&data[orientation], 1); } + +static void ili9163c_reset(void) +{ +#if CONFIG_LV_DISP_USE_RST + gpio_set_level(ILI9163C_RST, 0); + vTaskDelay(100 / portTICK_RATE_MS); + gpio_set_level(ILI9163C_RST, 1); + vTaskDelay(150 / portTICK_RATE_MS); +#else +#endif +} From 3b33c045855a6876ee9a13728efd2340de615f6e Mon Sep 17 00:00:00 2001 From: C47D Date: Tue, 5 Oct 2021 18:58:29 -0500 Subject: [PATCH 044/105] fix(jd79653a): Fix break when hardware reset is disabled CONFIG_LV_DISP_USE_RST is not defined when hardware reset is disabled --- lvgl_tft/jd79653a.c | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/lvgl_tft/jd79653a.c b/lvgl_tft/jd79653a.c index e29d934..53fbc20 100644 --- a/lvgl_tft/jd79653a.c +++ b/lvgl_tft/jd79653a.c @@ -38,8 +38,12 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR TH #define PIN_DC CONFIG_LV_DISP_PIN_DC #define PIN_DC_BIT ((1ULL << (uint8_t)(CONFIG_LV_DISP_PIN_DC))) + +#if defined CONFIG_LV_DISP_PIN_RST #define PIN_RST CONFIG_LV_DISP_PIN_RST #define PIN_RST_BIT ((1ULL << (uint8_t)(CONFIG_LV_DISP_PIN_RST))) +#endif + #define PIN_BUSY CONFIG_LV_DISP_PIN_BUSY #define PIN_BUSY_BIT ((1ULL << (uint8_t)(CONFIG_LV_DISP_PIN_BUSY))) #define EVT_BUSY (1UL << 0UL) @@ -324,6 +328,8 @@ static void jd79653a_update_partial(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t jd79653a_power_off(); } +static void jd79653a_reset(void); + void jd79653a_fb_set_full_color(uint8_t color) { jd79653a_power_on(); @@ -444,16 +450,6 @@ void jd79653a_init() return; } - // Setup output pins, output (PP) - gpio_config_t out_io_conf = { - .intr_type = GPIO_INTR_DISABLE, - .mode = GPIO_MODE_OUTPUT, - .pin_bit_mask = PIN_DC_BIT | PIN_RST_BIT, - .pull_down_en = 0, - .pull_up_en = 0, - }; - ESP_ERROR_CHECK(gpio_config(&out_io_conf)); - // Setup input pin, pull-up, input gpio_config_t in_io_conf = { .intr_type = GPIO_INTR_POSEDGE, @@ -466,11 +462,7 @@ void jd79653a_init() gpio_install_isr_service(0); gpio_isr_handler_add(PIN_BUSY, jd79653a_busy_intr, (void *) PIN_BUSY); - // Hardware reset - gpio_set_level(PIN_RST, 0); - vTaskDelay(pdMS_TO_TICKS(15)); // At least 10ms, leave 15ms for now just in case... - gpio_set_level(PIN_RST, 1); - vTaskDelay(pdMS_TO_TICKS(120)); + jd79653a_reset(); // Dump in initialise sequence jd79653a_spi_send_seq(init_seq, EPD_SEQ_LEN(init_seq)); @@ -481,3 +473,14 @@ void jd79653a_init() ESP_LOGI(TAG, "Panel is up!"); } + +static void jd79653a_reset(void) +{ +#if defined CONFIG_LV_DISP_PIN_RST + gpio_set_level(PIN_RST, 0); + // At least 10ms, leave 15ms for now just in case... + vTaskDelay(pdMS_TO_TICKS(15)); + gpio_set_level(PIN_RST, 1); + vTaskDelay(pdMS_TO_TICKS(120)); +#endif +} From 52f89b10e15acb040c082b8d304a224f0cc66d5a Mon Sep 17 00:00:00 2001 From: C47D Date: Tue, 5 Oct 2021 18:58:47 -0500 Subject: [PATCH 045/105] fix(uc8151d): Fix break when hardware reset is disabled CONFIG_LV_DISP_USE_RST is not defined when hardware reset is disabled --- lvgl_tft/uc8151d.c | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/lvgl_tft/uc8151d.c b/lvgl_tft/uc8151d.c index d353225..b01982c 100644 --- a/lvgl_tft/uc8151d.c +++ b/lvgl_tft/uc8151d.c @@ -39,8 +39,12 @@ #define PIN_DC CONFIG_LV_DISP_PIN_DC #define PIN_DC_BIT ((1ULL << (uint8_t)(CONFIG_LV_DISP_PIN_DC))) + +#if defined CONFIG_LV_DISP_PIN_RST #define PIN_RST CONFIG_LV_DISP_PIN_RST #define PIN_RST_BIT ((1ULL << (uint8_t)(CONFIG_LV_DISP_PIN_RST))) +#endif + #define PIN_BUSY CONFIG_LV_DISP_PIN_BUSY #define PIN_BUSY_BIT ((1ULL << (uint8_t)(CONFIG_LV_DISP_PIN_BUSY))) #define EVT_BUSY (1UL << 0UL) @@ -139,14 +143,13 @@ static void uc8151d_sleep() uc8151d_spi_send_data_byte(0xa5); } +static void uc8151d_reset(void); + static void uc8151d_panel_init() { // Hardware reset for 3 times - not sure why but it's from official demo code for (uint8_t cnt = 0; cnt < 3; cnt++) { - gpio_set_level(PIN_RST, 0); - vTaskDelay(pdMS_TO_TICKS(10)); // At least 10ms, leave 20ms for now just in case... - gpio_set_level(PIN_RST, 1); - vTaskDelay(pdMS_TO_TICKS(10)); + uc8151d_reset(); } // Power up @@ -240,16 +243,6 @@ void uc8151d_init() return; } - // Setup output pins, output (PP) - gpio_config_t out_io_conf = { - .intr_type = GPIO_INTR_DISABLE, - .mode = GPIO_MODE_OUTPUT, - .pin_bit_mask = PIN_DC_BIT | PIN_RST_BIT, - .pull_down_en = 0, - .pull_up_en = 0, - }; - ESP_ERROR_CHECK(gpio_config(&out_io_conf)); - // Setup input pin, pull-up, input gpio_config_t in_io_conf = { .intr_type = GPIO_INTR_POSEDGE, @@ -266,3 +259,14 @@ void uc8151d_init() uc8151d_panel_init(); ESP_LOGI(TAG, "Panel initialised"); } + +static void uc8151d_reset(void) +{ +#if defined CONFIG_LV_DISP_USE_RST + gpio_set_level(PIN_RST, 0); + // At least 10ms, leave 20ms for now just in case... + vTaskDelay(pdMS_TO_TICKS(20)); + gpio_set_level(PIN_RST, 1); + vTaskDelay(pdMS_TO_TICKS(10)); +#endif +} From 4255e3005bdd71cb07a40f2181448506816f9e52 Mon Sep 17 00:00:00 2001 From: C47D Date: Wed, 6 Oct 2021 23:17:03 -0500 Subject: [PATCH 046/105] feat(lvgl_helpers): Add function to initialize GPIOs Adds helper function to initialize GPIOs, this avoids having to configure and initialize GPIOs in the drivers init function. Closes #128 --- lvgl_helpers.c | 33 +++++++++++++++++++++++++++++++++ lvgl_helpers.h | 2 ++ 2 files changed, 35 insertions(+) diff --git a/lvgl_helpers.c b/lvgl_helpers.c index 02f4017..8f927bf 100644 --- a/lvgl_helpers.c +++ b/lvgl_helpers.c @@ -134,6 +134,39 @@ void lvgl_driver_init(void) #endif } +void display_bsp_init_io(void) +{ + esp_err_t err = ESP_OK; + gpio_config_t io_conf; + +#ifdef CONFIG_LV_DISPLAY_USE_DC + io_conf.mode = GPIO_MODE_OUTPUT; + io_conf.pin_bit_mask = (1ULL << CONFIG_LV_DISP_PIN_DC); + err = gpio_config(&io_conf); + ESP_ERROR_CHECK(err); +#endif + +#ifdef CONFIG_LV_DISP_USE_RST + io_conf.mode = GPIO_MODE_OUTPUT; + io_conf.pin_bit_mask = (1ULL << CONFIG_LV_DISP_PIN_RST); + err = gpio_config(&io_conf); + ESP_ERROR_CHECK(err); +#endif + +#ifndef CONFIG_LV_DISP_BACKLIGHT_OFF + io_conf.mode = GPIO_MODE_OUTPUT; + io_conf.pin_bit_mask = (1ULL << CONFIG_LV_DISP_PIN_BCKL); + err = gpio_config(&io_conf); + ESP_ERROR_CHECK(err); +#endif + +#ifdef CONFIG_LV_DISP_PIN_BUSY + io_conf.mode = GPIO_MODE_INPUT; + io_conf.pin_bit_mask = (1ULL << CONFIG_LV_DISP_PIN_BUSY); + err = gpio_config(&io_conf); + ESP_ERROR_CHECK(err); +#endif +} /* Initialize spi bus master * diff --git a/lvgl_helpers.h b/lvgl_helpers.h index 5fd6f09..439bd6b 100644 --- a/lvgl_helpers.h +++ b/lvgl_helpers.h @@ -98,6 +98,8 @@ void lvgl_driver_init(void); bool lvgl_spi_driver_init(int host, int miso_pin, int mosi_pin, int sclk_pin, int max_transfer_sz, int dma_channel, int quadwp_pin, int quadhd_pin); +/* Initialize display GPIOs, e.g. DC and RST pins */ +void display_bsp_init_io(void); /********************** * MACROS **********************/ From 4b015640769e9bb7629cfc8b83345df58ea23cca Mon Sep 17 00:00:00 2001 From: C47D Date: Wed, 13 Oct 2021 22:39:32 -0500 Subject: [PATCH 047/105] ili9481: Replace ESP_LOG with LVGL logging --- lvgl_tft/ili9481.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lvgl_tft/ili9481.c b/lvgl_tft/ili9481.c index 74bda98..732c9b6 100644 --- a/lvgl_tft/ili9481.c +++ b/lvgl_tft/ili9481.c @@ -8,9 +8,7 @@ #include "ili9481.h" #include "disp_spi.h" #include "driver/gpio.h" -#include "esp_log.h" #include "esp_heap_caps.h" - #include "freertos/FreeRTOS.h" #include "freertos/task.h" @@ -88,7 +86,7 @@ void ili9481_init(void) vTaskDelay(100 / portTICK_RATE_MS); #endif - ESP_LOGI(TAG, "ILI9481 initialization."); + LV_LOG_INFO("TAG" ": Initialization."); // Exit sleep ili9481_send_cmd(0x01); /* Software reset */ @@ -196,7 +194,7 @@ static void ili9481_set_orientation(uint8_t orientation) "PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED" }; - ESP_LOGI(TAG, "Display orientation: %s", orientation_str[orientation]); + LV_LOG_INFO("TAG" ": Display orientation: %s", orientation_str[orientation]); uint8_t data[] = {0x48, 0x4B, 0x28, 0x2B}; ili9481_send_cmd(ILI9481_CMD_MEMORY_ACCESS_CONTROL); From 364349dbf81f13612b68ff531a4160d58a7321ae Mon Sep 17 00:00:00 2001 From: C47D Date: Wed, 13 Oct 2021 22:43:57 -0500 Subject: [PATCH 048/105] ili9481: Replace ESP_LOG with LVGL logging --- lvgl_tft/ili9481.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lvgl_tft/ili9481.c b/lvgl_tft/ili9481.c index 732c9b6..3e22f39 100644 --- a/lvgl_tft/ili9481.c +++ b/lvgl_tft/ili9481.c @@ -115,7 +115,7 @@ void ili9481_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * col uint8_t *mybuf; do { mybuf = (uint8_t *) heap_caps_malloc(3 * size * sizeof(uint8_t), MALLOC_CAP_DMA); - if (mybuf == NULL) ESP_LOGW(TAG, "Could not allocate enough DMA memory!"); + if (mybuf == NULL) LV_LOG_WARN("TAG" ": Could not allocate enough DMA memory!"); } while (mybuf == NULL); uint32_t LD = 0; From 0b8d488867df1038abd9fa0ddf657632cf24111f Mon Sep 17 00:00:00 2001 From: C47D Date: Wed, 13 Oct 2021 22:47:12 -0500 Subject: [PATCH 049/105] Check for CONFIG_LV_DISP_PIN_BCKL before using it --- lvgl_helpers.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lvgl_helpers.c b/lvgl_helpers.c index 8f927bf..8802a2c 100644 --- a/lvgl_helpers.c +++ b/lvgl_helpers.c @@ -153,7 +153,7 @@ void display_bsp_init_io(void) ESP_ERROR_CHECK(err); #endif -#ifndef CONFIG_LV_DISP_BACKLIGHT_OFF +#ifndef (CONFIG_LV_DISP_BACKLIGHT_OFF) && defined(CONFIG_LV_DISP_PIN_BCKL) io_conf.mode = GPIO_MODE_OUTPUT; io_conf.pin_bit_mask = (1ULL << CONFIG_LV_DISP_PIN_BCKL); err = gpio_config(&io_conf); From 6a76078ba83b89e2c6655dfad41c84260479da6e Mon Sep 17 00:00:00 2001 From: C47D Date: Wed, 13 Oct 2021 22:53:00 -0500 Subject: [PATCH 050/105] ili9481: Fix TAG --- lvgl_tft/GC9A01.c | 8 ++++---- lvgl_tft/ili9481.c | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lvgl_tft/GC9A01.c b/lvgl_tft/GC9A01.c index bb6741b..8ec916d 100644 --- a/lvgl_tft/GC9A01.c +++ b/lvgl_tft/GC9A01.c @@ -16,7 +16,7 @@ /********************* * DEFINES *********************/ - #define TAG "GC9A01" + #define TAG "GC9A01: " /********************** * TYPEDEFS @@ -126,7 +126,7 @@ void GC9A01_init(void) vTaskDelay(100 / portTICK_RATE_MS); #endif - ESP_LOGI(TAG, "Initialization."); + LV_LOG_INFO(TAG "Initialization."); //Send all the commands uint16_t cmd = 0; @@ -226,7 +226,7 @@ static void GC9A01_set_orientation(uint8_t orientation) "PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED" }; - ESP_LOGI(TAG, "Display orientation: %s", orientation_str[orientation]); + LV_LOG_INFO(TAG "Display orientation: %s", orientation_str[orientation]); #if defined CONFIG_LV_PREDEFINED_DISPLAY_M5STACK const uint8_t data[] = {0x68, 0x68, 0x08, 0x08}; @@ -236,7 +236,7 @@ static void GC9A01_set_orientation(uint8_t orientation) const uint8_t data[] = {0x08, 0xC8, 0x68, 0xA8}; #endif - ESP_LOGD(TAG, "0x36 command value: 0x%02X", data[orientation]); + LV_LOG_INFO(TAG "0x36 command value: 0x%02X", data[orientation]); GC9A01_send_cmd(0x36); GC9A01_send_data((void *) &data[orientation], 1); diff --git a/lvgl_tft/ili9481.c b/lvgl_tft/ili9481.c index 3e22f39..c587c2b 100644 --- a/lvgl_tft/ili9481.c +++ b/lvgl_tft/ili9481.c @@ -15,7 +15,7 @@ /********************* * DEFINES *********************/ - #define TAG "ILI9481" + #define TAG "ILI9481: " /********************** * TYPEDEFS @@ -86,7 +86,7 @@ void ili9481_init(void) vTaskDelay(100 / portTICK_RATE_MS); #endif - LV_LOG_INFO("TAG" ": Initialization."); + LV_LOG_INFO(TAG "Initialization."); // Exit sleep ili9481_send_cmd(0x01); /* Software reset */ @@ -115,7 +115,7 @@ void ili9481_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * col uint8_t *mybuf; do { mybuf = (uint8_t *) heap_caps_malloc(3 * size * sizeof(uint8_t), MALLOC_CAP_DMA); - if (mybuf == NULL) LV_LOG_WARN("TAG" ": Could not allocate enough DMA memory!"); + if (mybuf == NULL) LV_LOG_WARN(TAG "Could not allocate enough DMA memory!"); } while (mybuf == NULL); uint32_t LD = 0; @@ -194,7 +194,7 @@ static void ili9481_set_orientation(uint8_t orientation) "PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED" }; - LV_LOG_INFO("TAG" ": Display orientation: %s", orientation_str[orientation]); + LV_LOG_INFO(TAG "Display orientation: %s", orientation_str[orientation]); uint8_t data[] = {0x48, 0x4B, 0x28, 0x2B}; ili9481_send_cmd(ILI9481_CMD_MEMORY_ACCESS_CONTROL); From d116dfd87d8a44a0da9e53b354f1085fe3a570b6 Mon Sep 17 00:00:00 2001 From: C47D Date: Wed, 13 Oct 2021 22:54:54 -0500 Subject: [PATCH 051/105] display_bsp_init_io: Fix macro names must be identifiers --- lvgl_helpers.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lvgl_helpers.c b/lvgl_helpers.c index 8802a2c..ab83275 100644 --- a/lvgl_helpers.c +++ b/lvgl_helpers.c @@ -153,7 +153,7 @@ void display_bsp_init_io(void) ESP_ERROR_CHECK(err); #endif -#ifndef (CONFIG_LV_DISP_BACKLIGHT_OFF) && defined(CONFIG_LV_DISP_PIN_BCKL) +#if !defined(CONFIG_LV_DISP_BACKLIGHT_OFF) && defined(CONFIG_LV_DISP_PIN_BCKL) io_conf.mode = GPIO_MODE_OUTPUT; io_conf.pin_bit_mask = (1ULL << CONFIG_LV_DISP_PIN_BCKL); err = gpio_config(&io_conf); From f1e1f0d9fd1d166983850302b4777cbdeac9b15b Mon Sep 17 00:00:00 2001 From: C47D Date: Wed, 13 Oct 2021 23:00:18 -0500 Subject: [PATCH 052/105] uc8151d: Replace ESP_LOG with LVGL logging --- lvgl_tft/uc8151d.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/lvgl_tft/uc8151d.c b/lvgl_tft/uc8151d.c index b01982c..9d5676a 100644 --- a/lvgl_tft/uc8151d.c +++ b/lvgl_tft/uc8151d.c @@ -29,13 +29,12 @@ #include #include #include -#include - +:x #include "disp_spi.h" #include "disp_driver.h" #include "uc8151d.h" -#define TAG "lv_uc8151d" +#define TAG "lv_uc8151d: " #define PIN_DC CONFIG_LV_DISP_PIN_DC #define PIN_DC_BIT ((1ULL << (uint8_t)(CONFIG_LV_DISP_PIN_DC))) @@ -106,7 +105,7 @@ static void uc8151d_spi_send_fb(uint8_t *data, size_t len) static void uc8151d_spi_send_seq(const uc8151d_seq_t *seq, size_t len) { - ESP_LOGD(TAG, "Writing cmd/data sequence, count %u", len); + LV_LOG_INFO(TAG, "Writing cmd/data sequence, count %u", len); if (!seq || len < 1) return; for (size_t cmd_idx = 0; cmd_idx < len; cmd_idx++) { @@ -201,14 +200,14 @@ void uc8151d_lv_fb_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t * { size_t len = ((area->x2 - area->x1 + 1) * (area->y2 - area->y1 + 1)) / 8; - ESP_LOGD(TAG, "x1: 0x%x, x2: 0x%x, y1: 0x%x, y2: 0x%x", area->x1, area->x2, area->y1, area->y2); - ESP_LOGD(TAG, "Writing LVGL fb with len: %u", len); + LV_LOG_INFO(TAG, "x1: 0x%x, x2: 0x%x, y1: 0x%x, y2: 0x%x", area->x1, area->x2, area->y1, area->y2); + LV_LOG_INFO(TAG, "Writing LVGL fb with len: %u", len); uint8_t *buf = (uint8_t *) color_map; uc8151d_full_update(buf); lv_disp_flush_ready(drv); - ESP_LOGD(TAG, "Ready"); + LV_LOG_INFO(TAG, "Ready"); } void uc8151d_lv_set_fb_cb(struct _disp_drv_t *disp_drv, uint8_t *buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, @@ -220,7 +219,7 @@ void uc8151d_lv_set_fb_cb(struct _disp_drv_t *disp_drv, uint8_t *buf, lv_coord_t if (color.full) { BIT_SET(buf[byte_index], 7 - bit_index); } else { - ESP_LOGD(TAG, "Clear at x: %u, y: %u", x, y); + LV_LOG_INFO(TAG, "Clear at x: %u, y: %u", x, y); BIT_CLEAR(buf[byte_index], 7 - bit_index); } } @@ -239,7 +238,7 @@ void uc8151d_init() // Initialise event group uc8151d_evts = xEventGroupCreate(); if (!uc8151d_evts) { - ESP_LOGE(TAG, "Failed when initialising event group!"); + LV_LOG_ERROR(TAG, "Failed when initialising event group!"); return; } @@ -255,9 +254,9 @@ void uc8151d_init() gpio_install_isr_service(0); gpio_isr_handler_add(PIN_BUSY, uc8151d_busy_intr, (void *) PIN_BUSY); - ESP_LOGI(TAG, "IO init finished"); + LV_LOG_INFO(TAG, "IO init finished"); uc8151d_panel_init(); - ESP_LOGI(TAG, "Panel initialised"); + LV_LOG_INFO(TAG, "Panel initialised"); } static void uc8151d_reset(void) From ef0946a6cc14afe0dec983c553a96b6216fc8506 Mon Sep 17 00:00:00 2001 From: C47D Date: Wed, 13 Oct 2021 23:01:26 -0500 Subject: [PATCH 053/105] st7796s: Replace ESP_LOG with LVGL logging --- lvgl_tft/st7796s.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/lvgl_tft/st7796s.c b/lvgl_tft/st7796s.c index 48a767c..68f8f9a 100644 --- a/lvgl_tft/st7796s.c +++ b/lvgl_tft/st7796s.c @@ -9,14 +9,13 @@ #include "st7796s.h" #include "disp_spi.h" #include "driver/gpio.h" -#include "esp_log.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" /********************* * DEFINES *********************/ -#define TAG "ST7796S" +#define TAG "ST7796S: " /********************** * TYPEDEFS @@ -96,7 +95,7 @@ void st7796s_init(void) vTaskDelay(100 / portTICK_RATE_MS); #endif - ESP_LOGI(TAG, "Initialization."); + LV_LOG_INFO(TAG, "Initialization."); //Send all the commands uint16_t cmd = 0; @@ -194,7 +193,7 @@ static void st7796s_set_orientation(uint8_t orientation) const char *orientation_str[] = { "PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED"}; - ESP_LOGI(TAG, "Display orientation: %s", orientation_str[orientation]); + LV_LOG_INFO(TAG, "Display orientation: %s", orientation_str[orientation]); #if defined CONFIG_LV_PREDEFINED_DISPLAY_M5STACK const uint8_t data[] = {0x68, 0x68, 0x08, 0x08}; @@ -206,7 +205,7 @@ static void st7796s_set_orientation(uint8_t orientation) const uint8_t data[] = {0x48, 0x88, 0x28, 0xE8}; #endif - ESP_LOGD(TAG, "0x36 command value: 0x%02X", data[orientation]); + LV_LOG_INFO(TAG, "0x36 command value: 0x%02X", data[orientation]); st7796s_send_cmd(0x36); st7796s_send_data((void *)&data[orientation], 1); From 81abc17904421b99d52fcc1d770c57aa5cc863a7 Mon Sep 17 00:00:00 2001 From: C47D Date: Wed, 13 Oct 2021 23:02:47 -0500 Subject: [PATCH 054/105] st7735s: Replace ESP_LOG with LVGL logging --- lvgl_tft/st7735s.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/lvgl_tft/st7735s.c b/lvgl_tft/st7735s.c index aedf386..29fd452 100644 --- a/lvgl_tft/st7735s.c +++ b/lvgl_tft/st7735s.c @@ -9,7 +9,6 @@ #include "st7735s.h" #include "disp_spi.h" #include "driver/gpio.h" -#include "esp_log.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" @@ -20,7 +19,7 @@ /********************* * DEFINES *********************/ - #define TAG "ST7735S" + #define TAG "ST7735S: " #define AXP192_I2C_ADDRESS 0x34 /********************** @@ -115,7 +114,7 @@ void st7735s_init(void) vTaskDelay(100 / portTICK_RATE_MS); #endif - ESP_LOGI(TAG, "ST7735S initialization."); + LV_LOG_INFO(TAG, "ST7735S initialization."); //Send all the commands uint16_t cmd = 0; @@ -211,7 +210,7 @@ static void st7735s_set_orientation(uint8_t orientation) "PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED" }; - ESP_LOGD(TAG, "Display orientation: %s", orientation_str[orientation]); + LV_LOG_INFO(TAG, "Display orientation: %s", orientation_str[orientation]); /* Portrait: 0xC8 = ST77XX_MADCTL_MX | ST77XX_MADCTL_MY | ST77XX_MADCTL_BGR @@ -220,7 +219,7 @@ static void st7735s_set_orientation(uint8_t orientation) */ uint8_t data[] = {0xC8, 0xC8, 0xA8, 0xA8}; - ESP_LOGD(TAG, "0x36 command value: 0x%02X", data[orientation]); + LV_LOG_INFO(TAG, "0x36 command value: 0x%02X", data[orientation]); st7735s_send_cmd(ST7735_MADCTL); st7735s_send_data((void *) &data[orientation], 1); @@ -232,7 +231,7 @@ static void axp192_write_byte(uint8_t addr, uint8_t data) { err = lvgl_i2c_write(CONFIG_LV_I2C_DISPLAY_PORT, AXP192_I2C_ADDRESS, addr, &data, 1); if (ret != ESP_OK) { - ESP_LOGE(TAG, "AXP192 send failed. code: 0x%.2X", ret); + LV_LOG_ERROR(TAG, "AXP192 send failed. code: 0x%.2X", ret); } } @@ -244,7 +243,7 @@ static void axp192_init() axp192_write_byte(0x10, 0xFF); // OLED_VPP Enable axp192_write_byte(0x28, 0xCC); // Enable LDO2&LDO3, LED&TFT 3.0V axp192_sleep_out(); - ESP_LOGI(TAG, "AXP192 initialized, power enabled for LDO2 and LDO3"); + LV_LOG_INFO(TAG, "AXP192 initialized, power enabled for LDO2 and LDO3"); } static void axp192_sleep_in() From 1a8d0d91e21d641d7af408027b1c7d64393f3ae9 Mon Sep 17 00:00:00 2001 From: C47D Date: Wed, 13 Oct 2021 23:04:44 -0500 Subject: [PATCH 055/105] ra8875: Replace ESP_LOG with LVGL logging --- lvgl_tft/ra8875.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/lvgl_tft/ra8875.c b/lvgl_tft/ra8875.c index c22cb8c..1b431fa 100644 --- a/lvgl_tft/ra8875.c +++ b/lvgl_tft/ra8875.c @@ -9,14 +9,13 @@ #include "ra8875.h" #include "disp_spi.h" #include "driver/gpio.h" -#include "esp_log.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" /********************* * DEFINES *********************/ -#define TAG "RA8875" +#define TAG "RA8875 :" #define DIV_ROUND_UP(n, d) (((n)+(d)-1)/(d)) @@ -170,7 +169,7 @@ void ra8875_init(void) }; #define INIT_CMDS_SIZE (sizeof(init_cmds)/sizeof(init_cmds[0])) - ESP_LOGI(TAG, "Initializing RA8875..."); + LV_LOG_INFO(TAG, "Initializing RA8875..."); // Initialize non-SPI GPIOs @@ -204,7 +203,7 @@ void ra8875_init(void) vTaskDelay(1); } if (i == 0) { - ESP_LOGW(TAG, "WARNING: Memory clear timed out; RA8875 may be unresponsive."); + LV_LOG_WARN(TAG, "WARNING: Memory clear timed out; RA8875 may be unresponsive."); } // Enable the display @@ -213,7 +212,7 @@ void ra8875_init(void) void ra8875_enable_display(bool enable) { - ESP_LOGI(TAG, "%s display.", enable ? "Enabling" : "Disabling"); + LV_LOG_INFO(TAG, "%s display.", enable ? "Enabling" : "Disabling"); uint8_t val = enable ? (0x80) : (0x00); ra8875_write_cmd(RA8875_REG_PWRR, val); // Power and Display Control Register (PWRR) } @@ -229,14 +228,14 @@ void ra8875_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * colo size_t linelen = (area->x2 - area->x1 + 1); uint8_t * buffer = (uint8_t*)color_map; - ESP_LOGD(TAG, "flush: %d,%d at %d,%d", area->x1, area->x2, area->y1, area->y2 ); + LV_LOG_INFO(TAG, "flush: %d,%d at %d,%d", area->x1, area->x2, area->y1, area->y2 ); // Get lock disp_spi_acquire(); // Set window if needed if ((x1 != area->x1) || (x2 != area->x2)) { - ESP_LOGD(TAG, "flush: set window (x1,x2): %d,%d -> %d,%d", x1, x2, area->x1, area->x2); + LV_LOG_INFO(TAG, "flush: set window (x1,x2): %d,%d -> %d,%d", x1, x2, area->x1, area->x2); ra8875_set_window(area->x1, area->x2, 0, LV_VER_RES_MAX-1); x1 = area->x1; x2 = area->x2; @@ -244,7 +243,7 @@ void ra8875_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * colo // Set cursor if needed if ((x != area->x1) || (y != area->y1)) { - ESP_LOGD(TAG, "flush: set cursor (x,y): %d,%d -> %d,%d", x, y, area->x1, area->y1); + LV_LOG_INFO(TAG, "flush: set cursor (x,y): %d,%d -> %d,%d", x, y, area->x1, area->y1); ra8875_set_memory_write_cursor(area->x1, area->y1); x = area->x1; } From 83d54862074ec979c52976cd918853147062794a Mon Sep 17 00:00:00 2001 From: C47D Date: Wed, 13 Oct 2021 23:09:17 -0500 Subject: [PATCH 056/105] uc8151d: Remove typo --- lvgl_tft/uc8151d.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lvgl_tft/uc8151d.c b/lvgl_tft/uc8151d.c index 9d5676a..e93be7c 100644 --- a/lvgl_tft/uc8151d.c +++ b/lvgl_tft/uc8151d.c @@ -29,7 +29,7 @@ #include #include #include -:x + #include "disp_spi.h" #include "disp_driver.h" #include "uc8151d.h" From e1c18c13b90732590f5a4c77878d7c8b2cb63e31 Mon Sep 17 00:00:00 2001 From: C47D Date: Wed, 13 Oct 2021 23:14:03 -0500 Subject: [PATCH 057/105] jd79653a: Replace ESP_LOG with LVGL logging --- lvgl_tft/jd79653a.c | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/lvgl_tft/jd79653a.c b/lvgl_tft/jd79653a.c index 53fbc20..d5171ad 100644 --- a/lvgl_tft/jd79653a.c +++ b/lvgl_tft/jd79653a.c @@ -29,12 +29,11 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR TH #include #include #include -#include #include "disp_spi.h" #include "jd79653a.h" -#define TAG "lv_jd79653a" +#define TAG "lv_jd79653a: " #define PIN_DC CONFIG_LV_DISP_PIN_DC #define PIN_DC_BIT ((1ULL << (uint8_t)(CONFIG_LV_DISP_PIN_DC))) @@ -188,7 +187,7 @@ static void jd79653a_spi_send_fb(uint8_t *data, size_t len) static void jd79653a_spi_send_seq(const jd79653a_seq_t *seq, size_t len) { - ESP_LOGD(TAG, "Writing cmd/data sequence, count %u", len); + LV_LOG_INFO(TAG, "Writing cmd/data sequence, count %u", len); if (!seq || len < 1) return; for (size_t cmd_idx = 0; cmd_idx < len; cmd_idx++) { @@ -244,7 +243,7 @@ static void jd79653a_load_partial_lut() static void jd79653a_partial_in() { - ESP_LOGD(TAG, "Partial in!"); + LV_LOG_INFO(TAG, "Partial in!"); // Panel setting: accept LUT from registers instead of OTP #if defined (CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED) @@ -272,7 +271,7 @@ static void jd79653a_partial_in() static void jd79653a_partial_out() { - ESP_LOGD(TAG, "Partial out!"); + LV_LOG_INFO(TAG, "Partial out!"); // Panel setting: use LUT from OTP #if defined (CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED) @@ -299,10 +298,10 @@ static void jd79653a_update_partial(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t { jd79653a_power_on(); jd79653a_partial_in(); - ESP_LOGD(TAG, "x1: 0x%x, x2: 0x%x, y1: 0x%x, y2: 0x%x", x1, x2, y1, y2); + LV_LOG_INFO(TAG, "x1: 0x%x, x2: 0x%x, y1: 0x%x, y2: 0x%x", x1, x2, y1, y2); size_t len = ((x2 - x1 + 1) * (y2 - y1 + 1)) / 8; - ESP_LOGD(TAG, "Writing PARTIAL LVGL fb with len: %u", len); + LV_LOG_INFO(TAG, "Writing PARTIAL LVGL fb with len: %u", len); // Set partial window uint8_t ptl_setting[7] = { x1, x2, 0, y1, 0, y2, 0x01 }; @@ -318,12 +317,12 @@ static void jd79653a_update_partial(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t len -= EPD_ROW_LEN; } - ESP_LOGD(TAG, "Partial wait start"); + LV_LOG_INFO(TAG, "Partial wait start"); jd79653a_spi_send_cmd(0x12); jd79653a_wait_busy(0); - ESP_LOGD(TAG, "Partial updated"); + LV_LOG_INFO(TAG, "Partial updated"); jd79653a_partial_out(); jd79653a_power_off(); } @@ -360,7 +359,7 @@ void jd79653a_fb_set_full_color(uint8_t color) void jd79653a_fb_full_update(uint8_t *data, size_t len) { jd79653a_power_on(); - ESP_LOGD(TAG, "Performing full update, len: %u", len); + LV_LOG_INFO(TAG, "Performing full update, len: %u", len); uint8_t *data_ptr = data; @@ -379,7 +378,7 @@ void jd79653a_fb_full_update(uint8_t *data, size_t len) len -= EPD_ROW_LEN; } - ESP_LOGD(TAG, "Rest len: %u", len); + LV_LOG_INFO(TAG, "Rest len: %u", len); jd79653a_spi_send_cmd(0x12); // Issue refresh command vTaskDelay(pdMS_TO_TICKS(100)); @@ -414,13 +413,13 @@ void jd79653a_lv_fb_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t { size_t len = ((area->x2 - area->x1 + 1) * (area->y2 - area->y1 + 1)) / 8; - ESP_LOGD(TAG, "x1: 0x%x, x2: 0x%x, y1: 0x%x, y2: 0x%x", area->x1, area->x2, area->y1, area->y2); - ESP_LOGD(TAG, "Writing LVGL fb with len: %u, partial counter: %u", len, partial_counter); + LV_LOG_INFO(TAG, "x1: 0x%x, x2: 0x%x, y1: 0x%x, y2: 0x%x", area->x1, area->x2, area->y1, area->y2); + LV_LOG_INFO(TAG, "Writing LVGL fb with len: %u, partial counter: %u", len, partial_counter); uint8_t *buf = (uint8_t *) color_map; if (partial_counter == 0) { - ESP_LOGD(TAG, "Refreshing in FULL"); + LV_LOG_INFO(TAG, "Refreshing in FULL"); jd79653a_fb_full_update(buf, ((EPD_HEIGHT * EPD_WIDTH) / 8)); partial_counter = EPD_PARTIAL_CNT; // Reset partial counter here } else { @@ -446,7 +445,7 @@ void jd79653a_init() // Initialise event group jd79653a_evts = xEventGroupCreate(); if (!jd79653a_evts) { - ESP_LOGE(TAG, "Failed when initialising event group!"); + LV_LOG_ERROR(TAG, "Failed when initialising event group!"); return; } @@ -466,12 +465,12 @@ void jd79653a_init() // Dump in initialise sequence jd79653a_spi_send_seq(init_seq, EPD_SEQ_LEN(init_seq)); - ESP_LOGI(TAG, "Panel init sequence sent"); + LV_LOG_INFO(TAG, "Panel init sequence sent"); // Check BUSY status here jd79653a_wait_busy(0); - ESP_LOGI(TAG, "Panel is up!"); + LV_LOG_INFO(TAG, "Panel is up!"); } static void jd79653a_reset(void) From e51f47526309528685751c786c615ce0db452434 Mon Sep 17 00:00:00 2001 From: C47D Date: Wed, 13 Oct 2021 23:15:27 -0500 Subject: [PATCH 058/105] ili9486: Replace ESP_LOG with LVGL logging --- lvgl_tft/ili9486.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/lvgl_tft/ili9486.c b/lvgl_tft/ili9486.c index e96b607..afc5fd4 100644 --- a/lvgl_tft/ili9486.c +++ b/lvgl_tft/ili9486.c @@ -9,14 +9,13 @@ #include "ili9486.h" #include "disp_spi.h" #include "driver/gpio.h" -#include "esp_log.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" /********************* * DEFINES *********************/ - #define TAG "ILI9486" +#define TAG "ILI9486: " /********************** * TYPEDEFS @@ -80,7 +79,7 @@ void ili9486_init(void) vTaskDelay(100 / portTICK_RATE_MS); #endif - ESP_LOGI(TAG, "ILI9486 Initialization."); + LV_LOG_INFO(TAG, "ILI9486 Initialization."); //Send all the commands uint16_t cmd = 0; @@ -171,11 +170,11 @@ static void ili9486_set_orientation(uint8_t orientation) "PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED" }; - ESP_LOGI(TAG, "Display orientation: %s", orientation_str[orientation]); + LV_LOG_INFO(TAG, "Display orientation: %s", orientation_str[orientation]); const uint8_t data[] = {0x48, 0x88, 0x28, 0xE8}; - ESP_LOGD(TAG, "0x36 command value: 0x%02X", data[orientation]); + LV_LOG_INFO(TAG, "0x36 command value: 0x%02X", data[orientation]); ili9486_send_cmd(0x36); ili9486_send_data((void *) &data[orientation], 1); From b9c381a07db2029ef5931106ae9c2557bc887c3c Mon Sep 17 00:00:00 2001 From: C47D Date: Wed, 13 Oct 2021 23:17:24 -0500 Subject: [PATCH 059/105] ili9488: Replace ESP_LOG with LVGL logging --- lvgl_tft/ili9488.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/lvgl_tft/ili9488.c b/lvgl_tft/ili9488.c index 482f114..60e8657 100644 --- a/lvgl_tft/ili9488.c +++ b/lvgl_tft/ili9488.c @@ -8,7 +8,6 @@ #include "ili9488.h" #include "disp_spi.h" #include "driver/gpio.h" -#include "esp_log.h" #include "esp_heap_caps.h" #include "freertos/FreeRTOS.h" @@ -17,7 +16,7 @@ /********************* * DEFINES *********************/ - #define TAG "ILI9488" +#define TAG "ILI9488: " /********************** * TYPEDEFS @@ -90,7 +89,7 @@ void ili9488_init(void) vTaskDelay(100 / portTICK_RATE_MS); #endif - ESP_LOGI(TAG, "ILI9488 initialization."); + LV_LOG_INFO(TAG, "ILI9488 initialization."); // Exit sleep ili9488_send_cmd(0x01); /* Software reset */ @@ -119,7 +118,7 @@ void ili9488_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * col uint8_t *mybuf; do { mybuf = (uint8_t *) heap_caps_malloc(3 * size * sizeof(uint8_t), MALLOC_CAP_DMA); - if (mybuf == NULL) ESP_LOGW(TAG, "Could not allocate enough DMA memory!"); + if (mybuf == NULL) LV_LOG_WARN(TAG, "Could not allocate enough DMA memory!"); } while (mybuf == NULL); uint32_t LD = 0; @@ -200,11 +199,11 @@ static void ili9488_set_orientation(uint8_t orientation) "PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED" }; - ESP_LOGI(TAG, "Display orientation: %s", orientation_str[orientation]); + LV_LOG_INFO(TAG, "Display orientation: %s", orientation_str[orientation]); const uint8_t data[] = {0x48, 0x88, 0x28, 0xE8}; - ESP_LOGD(TAG, "0x36 command value: 0x%02X", data[orientation]); + LV_LOG_INFO(TAG, "0x36 command value: 0x%02X", data[orientation]); ili9488_send_cmd(0x36); ili9488_send_data((void *) &data[orientation], 1); From 44b552758e702029305925eb6aa43fbfe3d26581 Mon Sep 17 00:00:00 2001 From: C47D Date: Wed, 13 Oct 2021 23:19:51 -0500 Subject: [PATCH 060/105] ili9163c: Replace ESP_LOG with LVGL logging --- lvgl_tft/ili9163c.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lvgl_tft/ili9163c.c b/lvgl_tft/ili9163c.c index b8de56e..b12479b 100644 --- a/lvgl_tft/ili9163c.c +++ b/lvgl_tft/ili9163c.c @@ -9,7 +9,6 @@ #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" @@ -17,7 +16,7 @@ /********************* * DEFINES *********************/ -#define TAG "ILI9163C" +#define TAG "ILI9163C: " // ILI9163C specific commands used in init #define ILI9163C_NOP 0x00 @@ -109,7 +108,7 @@ static void ili9163c_reset(void); void ili9163c_init(void) { - ESP_LOGD(TAG, "Init"); + LV_LOG_INFO(TAG, "Init"); lcd_init_cmd_t ili_init_cmds[] = { {ILI9163C_SWRESET, {0}, 0x80}, // Software reset, 0 args, w/delay 120ms @@ -229,7 +228,7 @@ static void ili9163c_set_orientation(uint8_t orientation) const char *orientation_str[] = { "PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED"}; - ESP_LOGD(TAG, "Display orientation: %s", orientation_str[orientation]); + LV_LOG_INFO(TAG, "Display orientation: %s", orientation_str[orientation]); uint8_t data[] = {0x48, 0x88, 0xA8, 0x68}; From 94244ad432d4c45a12412bb5067635a63567b8fc Mon Sep 17 00:00:00 2001 From: C47D Date: Wed, 13 Oct 2021 23:20:31 -0500 Subject: [PATCH 061/105] il3820: Replace ESP_LOG with LVGL logging --- lvgl_tft/il3820.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lvgl_tft/il3820.c b/lvgl_tft/il3820.c index 4fe8e82..779cfa2 100644 --- a/lvgl_tft/il3820.c +++ b/lvgl_tft/il3820.c @@ -30,7 +30,6 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR TH *********************/ #include "disp_spi.h" #include "driver/gpio.h" -#include "esp_log.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" @@ -279,7 +278,7 @@ static void il3820_waitbusy(int wait_ms) vTaskDelay(10 / portTICK_RATE_MS); } - ESP_LOGE( TAG, "busy exceeded %dms", i*10 ); + LV_LOG_ERROR( TAG, "busy exceeded %dms", i*10 ); } /* Set DC signal to command mode */ From 83875cc6bd6f691bce0a2d15b909ab6329624ee2 Mon Sep 17 00:00:00 2001 From: C47D Date: Wed, 13 Oct 2021 23:21:19 -0500 Subject: [PATCH 062/105] hx8357: Replace ESP_LOG with LVGL logging --- lvgl_tft/hx8357.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lvgl_tft/hx8357.c b/lvgl_tft/hx8357.c index bb9ea58..41209f6 100644 --- a/lvgl_tft/hx8357.c +++ b/lvgl_tft/hx8357.c @@ -18,14 +18,13 @@ #include "hx8357.h" #include "disp_spi.h" #include "driver/gpio.h" -#include #include "freertos/FreeRTOS.h" #include "freertos/task.h" /********************* * DEFINES *********************/ -#define TAG "HX8357" +#define TAG "HX8357: " #define MADCTL_MY 0x80 ///< Bottom to top #define MADCTL_MX 0x40 ///< Right to left @@ -174,7 +173,7 @@ void hx8357_init(void) vTaskDelay(120 / portTICK_RATE_MS); #endif - ESP_LOGI(TAG, "Initialization."); + LV_LOG_INFO(TAG, "Initialization."); //Send all the commands const uint8_t *addr = (displayType == HX8357B) ? initb : initd; From 4a9cfeb6fb79da011242724a39f9685f49d9be67 Mon Sep 17 00:00:00 2001 From: C47D Date: Wed, 13 Oct 2021 23:23:56 -0500 Subject: [PATCH 063/105] EVE_commands: Replace ESP_LOG with LVGL logging --- lvgl_tft/EVE_commands.c | 24 ++++++++++-------------- lvgl_tft/il3820.c | 2 +- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/lvgl_tft/EVE_commands.c b/lvgl_tft/EVE_commands.c index 2a93efa..5e132e4 100644 --- a/lvgl_tft/EVE_commands.c +++ b/lvgl_tft/EVE_commands.c @@ -41,6 +41,11 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR TH #include +#include + +#if defined (BT81X_ENABLE) +#include +#endif #include "EVE.h" #include "EVE_commands.h" @@ -50,18 +55,9 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR TH #include "driver/gpio.h" #include "esp_log.h" #include "soc/soc_memory_layout.h" - -#include "esp_log.h" - #include "disp_spi.h" -#include - -#if defined (BT81X_ENABLE) -#include -#endif - -#define TAG_LOG "FT81X" +#define TAG_LOG "FT81X: " /* data structure for SPI reading that has (optional) space for inserted dummy byte */ typedef struct _spi_read_data { @@ -875,13 +871,13 @@ uint8_t EVE_init(void) /* The most reliable DIO/QIO switching point is after EVE start up but before reading the ChipID. */ #if defined(DISP_SPI_TRANS_MODE_DIO) - ESP_LOGI(TAG_LOG, "Switching to DIO mode"); + LV_LOG_INFO(TAG_LOG, "Switching to DIO mode"); DELAY_MS(20); /* different boards may take a different delay but this generally seems to work */ EVE_memWrite16(REG_SPI_WIDTH, SPI_WIDTH_DIO); SPIInherentSendFlags = DISP_SPI_MODE_DIO | DISP_SPI_MODE_DIOQIO_ADDR; SPIDummyReadBits = 4; /* Esp32 DMA SPI transaction dummy_bits works more like clock cycles, so in DIO 4 dummy_bits == 8 total bits */ #elif defined(DISP_SPI_TRANS_MODE_QIO) - ESP_LOGI(TAG_LOG, "Switching to QIO mode"); + LV_LOG_INFO(TAG_LOG, "Switching to QIO mode"); DELAY_MS(20); /* different boards may take a different delay but this generally seems to work */ EVE_memWrite16(REG_SPI_WIDTH, SPI_WIDTH_QIO); SPIInherentSendFlags = DISP_SPI_MODE_QIO | DISP_SPI_MODE_DIOQIO_ADDR; @@ -897,7 +893,7 @@ uint8_t EVE_init(void) timeout++; if(timeout > 400) { - ESP_LOGI(TAG_LOG, "Failed to read ChipID...aborting initialization."); + LV_LOG_WARN(TAG_LOG, "Failed to read ChipID...aborting initialization."); return 0; } } @@ -909,7 +905,7 @@ uint8_t EVE_init(void) timeout++; if(timeout > 50) /* experimental, 10 was the lowest value to get the BT815 started with, the touch-controller was the last to get out of reset */ { - ESP_LOGI(TAG_LOG, "Failed to read CPU status...aborting initialization."); + LV_LOG_WARN(TAG_LOG, "Failed to read CPU status...aborting initialization."); return 0; } } diff --git a/lvgl_tft/il3820.c b/lvgl_tft/il3820.c index 779cfa2..691e84d 100644 --- a/lvgl_tft/il3820.c +++ b/lvgl_tft/il3820.c @@ -38,7 +38,7 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR TH /********************* * DEFINES *********************/ - #define TAG "IL3820" +#define TAG "IL3820: " /** * SSD1673, SSD1608 compatible EPD controller driver. From 5d55edc37cdd0bd387194f03a1cb4caac1edc59d Mon Sep 17 00:00:00 2001 From: C47D Date: Wed, 13 Oct 2021 23:27:31 -0500 Subject: [PATCH 064/105] ft6x36: Replace ESP_LOG with LVGL logging --- lvgl_touch/ft6x36.c | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/lvgl_touch/ft6x36.c b/lvgl_touch/ft6x36.c index fcef596..ede0966 100644 --- a/lvgl_touch/ft6x36.c +++ b/lvgl_touch/ft6x36.c @@ -18,7 +18,6 @@ * SOFTWARE. */ -#include #ifdef LV_LVGL_H_INCLUDE_SIMPLE #include #else @@ -28,8 +27,7 @@ #include "lvgl_i2c/i2c_manager.h" -#define TAG "FT6X36" - +#define TAG "FT6X36: " ft6x36_status_t ft6x36_status; uint8_t current_dev_addr; // set during init @@ -46,13 +44,13 @@ esp_err_t ft6x06_i2c_read8(uint8_t slave_addr, uint8_t register_addr, uint8_t *d */ uint8_t ft6x36_get_gesture_id() { if (!ft6x36_status.inited) { - ESP_LOGE(TAG, "Init first!"); + LV_LOG_ERROR(TAG, "Init first!"); return 0x00; } uint8_t data_buf; esp_err_t ret; if ((ret = ft6x06_i2c_read8(current_dev_addr, FT6X36_GEST_ID_REG, &data_buf) != ESP_OK)) - ESP_LOGE(TAG, "Error reading from device: %s", esp_err_to_name(ret)); + LV_LOG_ERROR(TAG, "Error reading from device: %s", esp_err_to_name(ret)); return data_buf; } @@ -67,23 +65,23 @@ void ft6x06_init(uint16_t dev_addr) { current_dev_addr = dev_addr; uint8_t data_buf; esp_err_t ret; - ESP_LOGI(TAG, "Found touch panel controller"); + LV_LOG_INFO(TAG, "Found touch panel controller"); if ((ret = ft6x06_i2c_read8(dev_addr, FT6X36_PANEL_ID_REG, &data_buf) != ESP_OK)) - ESP_LOGE(TAG, "Error reading from device: %s", + LV_LOG_ERROR(TAG, "Error reading from device: %s", esp_err_to_name(ret)); // Only show error the first time - ESP_LOGI(TAG, "\tDevice ID: 0x%02x", data_buf); + LV_LOG_INFO(TAG, "\tDevice ID: 0x%02x", data_buf); ft6x06_i2c_read8(dev_addr, FT6X36_CHIPSELECT_REG, &data_buf); - ESP_LOGI(TAG, "\tChip ID: 0x%02x", data_buf); + LV_LOG_INFO(TAG, "\tChip ID: 0x%02x", data_buf); ft6x06_i2c_read8(dev_addr, FT6X36_DEV_MODE_REG, &data_buf); - ESP_LOGI(TAG, "\tDevice mode: 0x%02x", data_buf); + LV_LOG_INFO(TAG, "\tDevice mode: 0x%02x", data_buf); ft6x06_i2c_read8(dev_addr, FT6X36_FIRMWARE_ID_REG, &data_buf); - ESP_LOGI(TAG, "\tFirmware ID: 0x%02x", data_buf); + LV_LOG_INFO(TAG, "\tFirmware ID: 0x%02x", data_buf); ft6x06_i2c_read8(dev_addr, FT6X36_RELEASECODE_REG, &data_buf); - ESP_LOGI(TAG, "\tRelease code: 0x%02x", data_buf); + LV_LOG_INFO(TAG, "\tRelease code: 0x%02x", data_buf); } @@ -95,7 +93,7 @@ void ft6x06_init(uint16_t dev_addr) { */ bool ft6x36_read(lv_indev_drv_t *drv, lv_indev_data_t *data) { if (!ft6x36_status.inited) { - ESP_LOGE(TAG, "Init first!"); + LV_LOG_ERROR(TAG, "Init first!"); return 0x00; } uint8_t data_buf[5]; // 1 byte status, 2 bytes X, 2 bytes Y @@ -104,7 +102,7 @@ bool ft6x36_read(lv_indev_drv_t *drv, lv_indev_data_t *data) { esp_err_t ret = lvgl_i2c_read(CONFIG_LV_I2C_TOUCH_PORT, current_dev_addr, FT6X36_TD_STAT_REG, &data_buf[0], 5); if (ret != ESP_OK) { - ESP_LOGE(TAG, "Error talking to touch IC: %s", esp_err_to_name(ret)); + LV_LOG_ERROR(TAG, "Error talking to touch IC: %s", esp_err_to_name(ret)); } uint8_t touch_pnt_cnt = data_buf[0]; // Number of detected touch points @@ -132,6 +130,6 @@ bool ft6x36_read(lv_indev_drv_t *drv, lv_indev_data_t *data) { data->point.x = last_x; data->point.y = last_y; data->state = LV_INDEV_STATE_PR; - ESP_LOGD(TAG, "X=%u Y=%u", data->point.x, data->point.y); + LV_LOG_INFO(TAG, "X=%u Y=%u", data->point.x, data->point.y); return false; } From 18569b6c1747e30fed9bc182345077bd50822ce6 Mon Sep 17 00:00:00 2001 From: C47D Date: Wed, 13 Oct 2021 23:28:50 -0500 Subject: [PATCH 065/105] gt911: Replace ESP_LOG with LVGL logging --- lvgl_touch/gt911.c | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/lvgl_touch/gt911.c b/lvgl_touch/gt911.c index 03c3d9d..ba32c51 100644 --- a/lvgl_touch/gt911.c +++ b/lvgl_touch/gt911.c @@ -18,7 +18,6 @@ * SOFTWARE. */ -#include #ifdef LV_LVGL_H_INCLUDE_SIMPLE #include #else @@ -28,7 +27,7 @@ #include "lvgl_i2c/i2c_manager.h" -#define TAG "GT911" +#define TAG "GT911: " gt911_status_t gt911_status; @@ -53,9 +52,9 @@ void gt911_init(uint8_t dev_addr) { uint8_t data_buf; esp_err_t ret; - ESP_LOGI(TAG, "Checking for GT911 Touch Controller"); + LV_LOG_INFO(TAG, "Checking for GT911 Touch Controller"); if ((ret = gt911_i2c_read(dev_addr, GT911_PRODUCT_ID1, &data_buf, 1) != ESP_OK)) { - ESP_LOGE(TAG, "Error reading from device: %s", + LV_LOG_ERROR(TAG, "Error reading from device: %s", esp_err_to_name(ret)); // Only show error the first time return; } @@ -64,22 +63,22 @@ void gt911_init(uint8_t dev_addr) { for (int i = 0; i < GT911_PRODUCT_ID_LEN; i++) { gt911_i2c_read(dev_addr, (GT911_PRODUCT_ID1 + i), (uint8_t *)&(gt911_status.product_id[i]), 1); } - ESP_LOGI(TAG, "\tProduct ID: %s", gt911_status.product_id); + LV_LOG_INFO(TAG, "\tProduct ID: %s", gt911_status.product_id); gt911_i2c_read(dev_addr, GT911_VENDOR_ID, &data_buf, 1); - ESP_LOGI(TAG, "\tVendor ID: 0x%02x", data_buf); + LV_LOG_INFO(TAG, "\tVendor ID: 0x%02x", data_buf); gt911_i2c_read(dev_addr, GT911_X_COORD_RES_L, &data_buf, 1); gt911_status.max_x_coord = data_buf; gt911_i2c_read(dev_addr, GT911_X_COORD_RES_H, &data_buf, 1); gt911_status.max_x_coord |= ((uint16_t)data_buf << 8); - ESP_LOGI(TAG, "\tX Resolution: %d", gt911_status.max_x_coord); + LV_LOG_INFO(TAG, "\tX Resolution: %d", gt911_status.max_x_coord); gt911_i2c_read(dev_addr, GT911_Y_COORD_RES_L, &data_buf, 1); gt911_status.max_y_coord = data_buf; gt911_i2c_read(dev_addr, GT911_Y_COORD_RES_H, &data_buf, 1); gt911_status.max_y_coord |= ((uint16_t)data_buf << 8); - ESP_LOGI(TAG, "\tY Resolution: %d", gt911_status.max_y_coord); + LV_LOG_INFO(TAG, "\tY Resolution: %d", gt911_status.max_y_coord); gt911_status.inited = true; } } @@ -98,7 +97,7 @@ bool gt911_read(lv_indev_drv_t *drv, lv_indev_data_t *data) { uint8_t status_reg; gt911_i2c_read(gt911_status.i2c_dev_addr, GT911_STATUS_REG, &status_reg, 1); -// ESP_LOGI(TAG, "\tstatus: 0x%02x", status_reg); +// LV_LOG_INFO(TAG, "\tstatus: 0x%02x", status_reg); touch_pnt_cnt = status_reg & 0x0F; if ((status_reg & 0x80) || (touch_pnt_cnt < 6)) { //Reset Status Reg Value @@ -112,7 +111,7 @@ bool gt911_read(lv_indev_drv_t *drv, lv_indev_data_t *data) { } // gt911_i2c_read(gt911_status.i2c_dev_addr, GT911_TRACK_ID1, &data_buf, 1); -// ESP_LOGI(TAG, "\ttrack_id: %d", data_buf); +// LV_LOG_INFO(TAG, "\ttrack_id: %d", data_buf); gt911_i2c_read(gt911_status.i2c_dev_addr, GT911_PT1_X_COORD_L, &data_buf, 1); last_x = data_buf; @@ -138,7 +137,7 @@ bool gt911_read(lv_indev_drv_t *drv, lv_indev_data_t *data) { data->point.x = last_x; data->point.y = last_y; data->state = LV_INDEV_STATE_PR; - ESP_LOGI(TAG, "X=%u Y=%u", data->point.x, data->point.y); - ESP_LOGV(TAG, "X=%u Y=%u", data->point.x, data->point.y); + LV_LOG_INFO(TAG, "X=%u Y=%u", data->point.x, data->point.y); + LV_LOG_INFO(TAG, "X=%u Y=%u", data->point.x, data->point.y); return false; } From 6b6b756da37898460b66adba83fe2d8a1e4a9de2 Mon Sep 17 00:00:00 2001 From: C47D Date: Wed, 13 Oct 2021 23:29:34 -0500 Subject: [PATCH 066/105] ra8875: Replace ESP_LOG with LVGL logging --- lvgl_touch/ra8875_touch.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/lvgl_touch/ra8875_touch.c b/lvgl_touch/ra8875_touch.c index 3340e4f..1292de9 100644 --- a/lvgl_touch/ra8875_touch.c +++ b/lvgl_touch/ra8875_touch.c @@ -5,7 +5,6 @@ /********************* * INCLUDES *********************/ -#include "esp_log.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" @@ -83,7 +82,7 @@ void ra8875_touch_init(void) }; #define INIT_CMDS_SIZE (sizeof(init_cmds)/sizeof(init_cmds[0])) - ESP_LOGI(TAG, "Initializing RA8875 Touch..."); + LV_LOG_INFO(TAG, "Initializing RA8875 Touch..."); // Send all the commands for (unsigned int i = 0; i < INIT_CMDS_SIZE; i++) { @@ -94,7 +93,7 @@ void ra8875_touch_init(void) void ra8875_touch_enable(bool enable) { - ESP_LOGI(TAG, "%s touch.", enable ? "Enabling" : "Disabling"); + LV_LOG_INFO(TAG, "%s touch.", enable ? "Enabling" : "Disabling"); uint8_t val = enable ? (0x80 | TPCR0_VAL) : (TPCR0_VAL); ra8875_write_cmd(RA8875_REG_TPCR0, val); } @@ -122,7 +121,7 @@ bool ra8875_touch_read(lv_indev_drv_t * drv, lv_indev_data_t * data) y = (y << 2) | ((xy >> 2) & 0x03); #if DEBUG - ESP_LOGI(TAG, "Touch Poll Raw: %d,%d", x, y); + LV_LOG_INFO(TAG, "Touch Poll Raw: %d,%d", x, y); #endif // Convert to display coordinates @@ -136,7 +135,7 @@ bool ra8875_touch_read(lv_indev_drv_t * drv, lv_indev_data_t * data) data->point.y = y; #if DEBUG - ESP_LOGI(TAG, "Touch Poll - Event: %d; %d,%d", data->state, data->point.x, data->point.y); + LV_LOG_INFO(TAG, "Touch Poll - Event: %d; %d,%d", data->state, data->point.x, data->point.y); #endif return false; From 1ededabf996f03297fa8109d46640a76467b6b99 Mon Sep 17 00:00:00 2001 From: C47D Date: Wed, 13 Oct 2021 23:30:45 -0500 Subject: [PATCH 067/105] stmpe610: Replace ESP_LOG with LVGL logging --- lvgl_touch/stmpe610.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/lvgl_touch/stmpe610.c b/lvgl_touch/stmpe610.c index 6c5ae60..e823ecc 100644 --- a/lvgl_touch/stmpe610.c +++ b/lvgl_touch/stmpe610.c @@ -7,7 +7,6 @@ *********************/ #include "stmpe610.h" #include "esp_system.h" -#include "esp_log.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/gpio.h" @@ -17,7 +16,7 @@ /********************* * DEFINES *********************/ -#define TAG "STMPE610" +#define TAG "STMPE610: " /********************** @@ -55,11 +54,11 @@ void stmpe610_init(void) uint8_t u8; uint16_t u16; - ESP_LOGI(TAG, "Initialization."); + LV_LOG_INFO(TAG, "Initialization."); // Get the initial SPI configuration //u8 = read_8bit_reg(STMPE_SPI_CFG); - //ESP_LOGI(TAG, "SPI_CFG = 0x%x", u8); + //LV_LOG_INFO(TAG, "SPI_CFG = 0x%x", u8); // Attempt a software reset write_8bit_reg(STMPE_SYS_CTRL1, STMPE_SYS_CTRL1_RESET); @@ -69,12 +68,12 @@ void stmpe610_init(void) u8 = read_8bit_reg(STMPE_SPI_CFG); write_8bit_reg(STMPE_SPI_CFG, u8 | STMPE_SPI_CFG_AA); u8 = read_8bit_reg(STMPE_SPI_CFG); - ESP_LOGI(TAG, "SPI_CFG = 0x%x", u8); + LV_LOG_INFO(TAG, "SPI_CFG = 0x%x", u8); // Verify SPI communication u16 = read_16bit_reg(STMPE_CHIP_ID); if (u16 != 0x811) { - ESP_LOGE(TAG, "Incorrect version: 0x%x", u16); + LV_LOG_ERROR(TAG, "Incorrect version: 0x%x", u16); } write_8bit_reg(STMPE_SYS_CTRL2, 0x00); // Disable clocks @@ -130,12 +129,12 @@ bool stmpe610_read(lv_indev_drv_t * drv, lv_indev_data_t * data) } if (c > 0) { - //ESP_LOGI(TAG, "%d: %d %d %d", c, x, y, z); + //LV_LOG_INFO(TAG, "%d: %d %d %d", c, x, y, z); adjust_data(&x, &y); last_x = x; last_y = y; - //ESP_LOGI(TAG, " ==> %d %d", x, y); + //LV_LOG_INFO(TAG, " ==> %d %d", x, y); } z = read_8bit_reg(STMPE_INT_STA); // Clear interrupts @@ -144,7 +143,7 @@ bool stmpe610_read(lv_indev_drv_t * drv, lv_indev_data_t * data) // Clear the FIFO if we discover an overflow write_8bit_reg(STMPE_FIFO_STA, STMPE_FIFO_STA_RESET); write_8bit_reg(STMPE_FIFO_STA, 0); // unreset - ESP_LOGE(TAG, "Fifo overflow"); + LV_LOG_ERROR(TAG, "Fifo overflow"); } } From 9c886307b243421f2cb1656c7334af782fd7b7b5 Mon Sep 17 00:00:00 2001 From: C47D Date: Wed, 13 Oct 2021 23:32:12 -0500 Subject: [PATCH 068/105] xpt2046: Replace ESP_LOG with LVGL logging --- lvgl_touch/xpt2046.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/lvgl_touch/xpt2046.c b/lvgl_touch/xpt2046.c index 93b4329..4c66753 100644 --- a/lvgl_touch/xpt2046.c +++ b/lvgl_touch/xpt2046.c @@ -8,7 +8,6 @@ *********************/ #include "xpt2046.h" #include "esp_system.h" -#include "esp_log.h" #include "driver/gpio.h" #include "tp_spi.h" #include @@ -16,7 +15,7 @@ /********************* * DEFINES *********************/ -#define TAG "XPT2046" +#define TAG "XPT2046: " #define CMD_X_READ 0b10010000 // NOTE: XPT2046 data sheet says this is actually Y #define CMD_Y_READ 0b11010000 // NOTE: XPT2046 data sheet says this is actually X @@ -59,7 +58,7 @@ uint8_t avg_last; */ void xpt2046_init(void) { - ESP_LOGI(TAG, "XPT2046 Initialization"); + LV_LOG_INFO(TAG, "Initialization"); #if XPT2046_TOUCH_IRQ || XPT2046_TOUCH_IRQ_PRESS gpio_config_t irq_config = { @@ -94,19 +93,19 @@ bool xpt2046_read(lv_indev_drv_t * drv, lv_indev_data_t * data) x = xpt2046_cmd(CMD_X_READ); y = xpt2046_cmd(CMD_Y_READ); - ESP_LOGI(TAG, "P(%d,%d)", x, y); + LV_LOG_INFO(TAG, "P(%d,%d)", x, y); /*Normalize Data back to 12-bits*/ x = x >> 4; y = y >> 4; - ESP_LOGI(TAG, "P_norm(%d,%d)", x, y); + LV_LOG_INFO(TAG, "P_norm(%d,%d)", x, y); xpt2046_corr(&x, &y); xpt2046_avg(&x, &y); last_x = x; last_y = y; - ESP_LOGI(TAG, "x = %d, y = %d", x, y); + LV_LOG_INFO(TAG, "x = %d, y = %d", x, y); } else { From a0e915eebca28d2ec4c1bec37e640ee368e41fdd Mon Sep 17 00:00:00 2001 From: C47D Date: Fri, 22 Oct 2021 18:41:47 -0500 Subject: [PATCH 069/105] Remove TAG from LVGL log API The filename is appended at the beginning of the log output by default, we don't need to do it. --- lvgl_tft/EVE_commands.c | 10 ++++------ lvgl_tft/GC9A01.c | 7 +++---- lvgl_tft/hx8357.c | 4 +--- lvgl_tft/il3820.c | 3 +-- lvgl_tft/ili9163c.c | 6 ++---- lvgl_tft/ili9341.c | 1 - lvgl_tft/ili9481.c | 7 +++---- lvgl_tft/ili9486.c | 7 +++---- lvgl_tft/ili9488.c | 9 ++++----- lvgl_tft/jd79653a.c | 32 +++++++++++++++----------------- lvgl_tft/ra8875.c | 14 ++++++-------- lvgl_tft/sh1107.c | 1 - lvgl_tft/ssd1306.c | 2 -- lvgl_tft/st7735s.c | 11 +++++------ lvgl_tft/st7789.c | 1 - lvgl_tft/st7796s.c | 7 +++---- lvgl_tft/uc8151d.c | 18 ++++++++---------- 17 files changed, 58 insertions(+), 82 deletions(-) diff --git a/lvgl_tft/EVE_commands.c b/lvgl_tft/EVE_commands.c index 5e132e4..8765609 100644 --- a/lvgl_tft/EVE_commands.c +++ b/lvgl_tft/EVE_commands.c @@ -57,8 +57,6 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR TH #include "soc/soc_memory_layout.h" #include "disp_spi.h" -#define TAG_LOG "FT81X: " - /* data structure for SPI reading that has (optional) space for inserted dummy byte */ typedef struct _spi_read_data { #if defined(DISP_SPI_FULL_DUPLEX) @@ -871,13 +869,13 @@ uint8_t EVE_init(void) /* The most reliable DIO/QIO switching point is after EVE start up but before reading the ChipID. */ #if defined(DISP_SPI_TRANS_MODE_DIO) - LV_LOG_INFO(TAG_LOG, "Switching to DIO mode"); + LV_LOG_INFO("Switching to DIO mode"); DELAY_MS(20); /* different boards may take a different delay but this generally seems to work */ EVE_memWrite16(REG_SPI_WIDTH, SPI_WIDTH_DIO); SPIInherentSendFlags = DISP_SPI_MODE_DIO | DISP_SPI_MODE_DIOQIO_ADDR; SPIDummyReadBits = 4; /* Esp32 DMA SPI transaction dummy_bits works more like clock cycles, so in DIO 4 dummy_bits == 8 total bits */ #elif defined(DISP_SPI_TRANS_MODE_QIO) - LV_LOG_INFO(TAG_LOG, "Switching to QIO mode"); + LV_LOG_INFO("Switching to QIO mode"); DELAY_MS(20); /* different boards may take a different delay but this generally seems to work */ EVE_memWrite16(REG_SPI_WIDTH, SPI_WIDTH_QIO); SPIInherentSendFlags = DISP_SPI_MODE_QIO | DISP_SPI_MODE_DIOQIO_ADDR; @@ -893,7 +891,7 @@ uint8_t EVE_init(void) timeout++; if(timeout > 400) { - LV_LOG_WARN(TAG_LOG, "Failed to read ChipID...aborting initialization."); + LV_LOG_WARN("Failed to read ChipID...aborting initialization."); return 0; } } @@ -905,7 +903,7 @@ uint8_t EVE_init(void) timeout++; if(timeout > 50) /* experimental, 10 was the lowest value to get the BT815 started with, the touch-controller was the last to get out of reset */ { - LV_LOG_WARN(TAG_LOG, "Failed to read CPU status...aborting initialization."); + LV_LOG_WARN("Failed to read CPU status...aborting initialization."); return 0; } } diff --git a/lvgl_tft/GC9A01.c b/lvgl_tft/GC9A01.c index 8ec916d..81a71d3 100644 --- a/lvgl_tft/GC9A01.c +++ b/lvgl_tft/GC9A01.c @@ -16,7 +16,6 @@ /********************* * DEFINES *********************/ - #define TAG "GC9A01: " /********************** * TYPEDEFS @@ -126,7 +125,7 @@ void GC9A01_init(void) vTaskDelay(100 / portTICK_RATE_MS); #endif - LV_LOG_INFO(TAG "Initialization."); + LV_LOG_INFO("Initialization."); //Send all the commands uint16_t cmd = 0; @@ -226,7 +225,7 @@ static void GC9A01_set_orientation(uint8_t orientation) "PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED" }; - LV_LOG_INFO(TAG "Display orientation: %s", orientation_str[orientation]); + LV_LOG_INFO("Display orientation: %s", orientation_str[orientation]); #if defined CONFIG_LV_PREDEFINED_DISPLAY_M5STACK const uint8_t data[] = {0x68, 0x68, 0x08, 0x08}; @@ -236,7 +235,7 @@ static void GC9A01_set_orientation(uint8_t orientation) const uint8_t data[] = {0x08, 0xC8, 0x68, 0xA8}; #endif - LV_LOG_INFO(TAG "0x36 command value: 0x%02X", data[orientation]); + LV_LOG_INFO("0x36 command value: 0x%02X", data[orientation]); GC9A01_send_cmd(0x36); GC9A01_send_data((void *) &data[orientation], 1); diff --git a/lvgl_tft/hx8357.c b/lvgl_tft/hx8357.c index 41209f6..a22287b 100644 --- a/lvgl_tft/hx8357.c +++ b/lvgl_tft/hx8357.c @@ -24,8 +24,6 @@ /********************* * DEFINES *********************/ -#define TAG "HX8357: " - #define MADCTL_MY 0x80 ///< Bottom to top #define MADCTL_MX 0x40 ///< Right to left #define MADCTL_MV 0x20 ///< Reverse Mode @@ -173,7 +171,7 @@ void hx8357_init(void) vTaskDelay(120 / portTICK_RATE_MS); #endif - LV_LOG_INFO(TAG, "Initialization."); + LV_LOG_INFO("Initialization."); //Send all the commands const uint8_t *addr = (displayType == HX8357B) ? initb : initd; diff --git a/lvgl_tft/il3820.c b/lvgl_tft/il3820.c index 691e84d..31fea55 100644 --- a/lvgl_tft/il3820.c +++ b/lvgl_tft/il3820.c @@ -38,7 +38,6 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR TH /********************* * DEFINES *********************/ -#define TAG "IL3820: " /** * SSD1673, SSD1608 compatible EPD controller driver. @@ -278,7 +277,7 @@ static void il3820_waitbusy(int wait_ms) vTaskDelay(10 / portTICK_RATE_MS); } - LV_LOG_ERROR( TAG, "busy exceeded %dms", i*10 ); + LV_LOG_ERROR("Busy exceeded %dms", i*10 ); } /* Set DC signal to command mode */ diff --git a/lvgl_tft/ili9163c.c b/lvgl_tft/ili9163c.c index b12479b..56b9fca 100644 --- a/lvgl_tft/ili9163c.c +++ b/lvgl_tft/ili9163c.c @@ -16,8 +16,6 @@ /********************* * DEFINES *********************/ -#define TAG "ILI9163C: " - // ILI9163C specific commands used in init #define ILI9163C_NOP 0x00 #define ILI9163C_SWRESET 0x01 @@ -108,7 +106,7 @@ static void ili9163c_reset(void); void ili9163c_init(void) { - LV_LOG_INFO(TAG, "Init"); + LV_LOG_INFO("Init"); lcd_init_cmd_t ili_init_cmds[] = { {ILI9163C_SWRESET, {0}, 0x80}, // Software reset, 0 args, w/delay 120ms @@ -228,7 +226,7 @@ static void ili9163c_set_orientation(uint8_t orientation) const char *orientation_str[] = { "PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED"}; - LV_LOG_INFO(TAG, "Display orientation: %s", orientation_str[orientation]); + LV_LOG_INFO("Display orientation: %s", orientation_str[orientation]); uint8_t data[] = {0x48, 0x88, 0xA8, 0x68}; diff --git a/lvgl_tft/ili9341.c b/lvgl_tft/ili9341.c index e4b89b0..4c02f40 100644 --- a/lvgl_tft/ili9341.c +++ b/lvgl_tft/ili9341.c @@ -14,7 +14,6 @@ /********************* * DEFINES *********************/ -#define TAG "ILI9341" #define END_OF_CMD_MARKER 0xFFU #define MEMORY_ACCESS_CONTROL_REG 0x36U diff --git a/lvgl_tft/ili9481.c b/lvgl_tft/ili9481.c index c587c2b..a599059 100644 --- a/lvgl_tft/ili9481.c +++ b/lvgl_tft/ili9481.c @@ -15,7 +15,6 @@ /********************* * DEFINES *********************/ - #define TAG "ILI9481: " /********************** * TYPEDEFS @@ -86,7 +85,7 @@ void ili9481_init(void) vTaskDelay(100 / portTICK_RATE_MS); #endif - LV_LOG_INFO(TAG "Initialization."); + LV_LOG_INFO("Initialization."); // Exit sleep ili9481_send_cmd(0x01); /* Software reset */ @@ -115,7 +114,7 @@ void ili9481_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * col uint8_t *mybuf; do { mybuf = (uint8_t *) heap_caps_malloc(3 * size * sizeof(uint8_t), MALLOC_CAP_DMA); - if (mybuf == NULL) LV_LOG_WARN(TAG "Could not allocate enough DMA memory!"); + if (mybuf == NULL) LV_LOG_WARN("Could not allocate enough DMA memory!"); } while (mybuf == NULL); uint32_t LD = 0; @@ -194,7 +193,7 @@ static void ili9481_set_orientation(uint8_t orientation) "PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED" }; - LV_LOG_INFO(TAG "Display orientation: %s", orientation_str[orientation]); + LV_LOG_INFO("Display orientation: %s", orientation_str[orientation]); uint8_t data[] = {0x48, 0x4B, 0x28, 0x2B}; ili9481_send_cmd(ILI9481_CMD_MEMORY_ACCESS_CONTROL); diff --git a/lvgl_tft/ili9486.c b/lvgl_tft/ili9486.c index afc5fd4..b4e3a0a 100644 --- a/lvgl_tft/ili9486.c +++ b/lvgl_tft/ili9486.c @@ -15,7 +15,6 @@ /********************* * DEFINES *********************/ -#define TAG "ILI9486: " /********************** * TYPEDEFS @@ -79,7 +78,7 @@ void ili9486_init(void) vTaskDelay(100 / portTICK_RATE_MS); #endif - LV_LOG_INFO(TAG, "ILI9486 Initialization."); + LV_LOG_INFO("ILI9486 Initialization."); //Send all the commands uint16_t cmd = 0; @@ -170,11 +169,11 @@ static void ili9486_set_orientation(uint8_t orientation) "PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED" }; - LV_LOG_INFO(TAG, "Display orientation: %s", orientation_str[orientation]); + LV_LOG_INFO("Display orientation: %s", orientation_str[orientation]); const uint8_t data[] = {0x48, 0x88, 0x28, 0xE8}; - LV_LOG_INFO(TAG, "0x36 command value: 0x%02X", data[orientation]); + LV_LOG_INFO("0x36 command value: 0x%02X", data[orientation]); ili9486_send_cmd(0x36); ili9486_send_data((void *) &data[orientation], 1); diff --git a/lvgl_tft/ili9488.c b/lvgl_tft/ili9488.c index 60e8657..7a2ab9e 100644 --- a/lvgl_tft/ili9488.c +++ b/lvgl_tft/ili9488.c @@ -16,7 +16,6 @@ /********************* * DEFINES *********************/ -#define TAG "ILI9488: " /********************** * TYPEDEFS @@ -89,7 +88,7 @@ void ili9488_init(void) vTaskDelay(100 / portTICK_RATE_MS); #endif - LV_LOG_INFO(TAG, "ILI9488 initialization."); + LV_LOG_INFO("ILI9488 initialization."); // Exit sleep ili9488_send_cmd(0x01); /* Software reset */ @@ -118,7 +117,7 @@ void ili9488_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * col uint8_t *mybuf; do { mybuf = (uint8_t *) heap_caps_malloc(3 * size * sizeof(uint8_t), MALLOC_CAP_DMA); - if (mybuf == NULL) LV_LOG_WARN(TAG, "Could not allocate enough DMA memory!"); + if (mybuf == NULL) LV_LOG_WARN("Could not allocate enough DMA memory!"); } while (mybuf == NULL); uint32_t LD = 0; @@ -199,11 +198,11 @@ static void ili9488_set_orientation(uint8_t orientation) "PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED" }; - LV_LOG_INFO(TAG, "Display orientation: %s", orientation_str[orientation]); + LV_LOG_INFO("Display orientation: %s", orientation_str[orientation]); const uint8_t data[] = {0x48, 0x88, 0x28, 0xE8}; - LV_LOG_INFO(TAG, "0x36 command value: 0x%02X", data[orientation]); + LV_LOG_INFO("0x36 command value: 0x%02X", data[orientation]); ili9488_send_cmd(0x36); ili9488_send_data((void *) &data[orientation], 1); diff --git a/lvgl_tft/jd79653a.c b/lvgl_tft/jd79653a.c index d5171ad..f71b673 100644 --- a/lvgl_tft/jd79653a.c +++ b/lvgl_tft/jd79653a.c @@ -33,8 +33,6 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR TH #include "disp_spi.h" #include "jd79653a.h" -#define TAG "lv_jd79653a: " - #define PIN_DC CONFIG_LV_DISP_PIN_DC #define PIN_DC_BIT ((1ULL << (uint8_t)(CONFIG_LV_DISP_PIN_DC))) @@ -187,7 +185,7 @@ static void jd79653a_spi_send_fb(uint8_t *data, size_t len) static void jd79653a_spi_send_seq(const jd79653a_seq_t *seq, size_t len) { - LV_LOG_INFO(TAG, "Writing cmd/data sequence, count %u", len); + LV_LOG_INFO("Writing cmd/data sequence, count %u", len); if (!seq || len < 1) return; for (size_t cmd_idx = 0; cmd_idx < len; cmd_idx++) { @@ -243,7 +241,7 @@ static void jd79653a_load_partial_lut() static void jd79653a_partial_in() { - LV_LOG_INFO(TAG, "Partial in!"); + LV_LOG_INFO("Partial in!"); // Panel setting: accept LUT from registers instead of OTP #if defined (CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED) @@ -271,7 +269,7 @@ static void jd79653a_partial_in() static void jd79653a_partial_out() { - LV_LOG_INFO(TAG, "Partial out!"); + LV_LOG_INFO("Partial out!"); // Panel setting: use LUT from OTP #if defined (CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED) @@ -298,10 +296,10 @@ static void jd79653a_update_partial(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t { jd79653a_power_on(); jd79653a_partial_in(); - LV_LOG_INFO(TAG, "x1: 0x%x, x2: 0x%x, y1: 0x%x, y2: 0x%x", x1, x2, y1, y2); + LV_LOG_INFO("x1: 0x%x, x2: 0x%x, y1: 0x%x, y2: 0x%x", x1, x2, y1, y2); size_t len = ((x2 - x1 + 1) * (y2 - y1 + 1)) / 8; - LV_LOG_INFO(TAG, "Writing PARTIAL LVGL fb with len: %u", len); + LV_LOG_INFO("Writing PARTIAL LVGL fb with len: %u", len); // Set partial window uint8_t ptl_setting[7] = { x1, x2, 0, y1, 0, y2, 0x01 }; @@ -317,12 +315,12 @@ static void jd79653a_update_partial(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t len -= EPD_ROW_LEN; } - LV_LOG_INFO(TAG, "Partial wait start"); + LV_LOG_INFO("Partial wait start"); jd79653a_spi_send_cmd(0x12); jd79653a_wait_busy(0); - LV_LOG_INFO(TAG, "Partial updated"); + LV_LOG_INFO("Partial updated"); jd79653a_partial_out(); jd79653a_power_off(); } @@ -359,7 +357,7 @@ void jd79653a_fb_set_full_color(uint8_t color) void jd79653a_fb_full_update(uint8_t *data, size_t len) { jd79653a_power_on(); - LV_LOG_INFO(TAG, "Performing full update, len: %u", len); + LV_LOG_INFO("Performing full update, len: %u", len); uint8_t *data_ptr = data; @@ -378,7 +376,7 @@ void jd79653a_fb_full_update(uint8_t *data, size_t len) len -= EPD_ROW_LEN; } - LV_LOG_INFO(TAG, "Rest len: %u", len); + LV_LOG_INFO("Rest len: %u", len); jd79653a_spi_send_cmd(0x12); // Issue refresh command vTaskDelay(pdMS_TO_TICKS(100)); @@ -413,13 +411,13 @@ void jd79653a_lv_fb_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t { size_t len = ((area->x2 - area->x1 + 1) * (area->y2 - area->y1 + 1)) / 8; - LV_LOG_INFO(TAG, "x1: 0x%x, x2: 0x%x, y1: 0x%x, y2: 0x%x", area->x1, area->x2, area->y1, area->y2); - LV_LOG_INFO(TAG, "Writing LVGL fb with len: %u, partial counter: %u", len, partial_counter); + LV_LOG_INFO("x1: 0x%x, x2: 0x%x, y1: 0x%x, y2: 0x%x", area->x1, area->x2, area->y1, area->y2); + LV_LOG_INFO("Writing LVGL fb with len: %u, partial counter: %u", len, partial_counter); uint8_t *buf = (uint8_t *) color_map; if (partial_counter == 0) { - LV_LOG_INFO(TAG, "Refreshing in FULL"); + LV_LOG_INFO("Refreshing in FULL"); jd79653a_fb_full_update(buf, ((EPD_HEIGHT * EPD_WIDTH) / 8)); partial_counter = EPD_PARTIAL_CNT; // Reset partial counter here } else { @@ -445,7 +443,7 @@ void jd79653a_init() // Initialise event group jd79653a_evts = xEventGroupCreate(); if (!jd79653a_evts) { - LV_LOG_ERROR(TAG, "Failed when initialising event group!"); + LV_LOG_ERROR("Failed when initialising event group!"); return; } @@ -465,12 +463,12 @@ void jd79653a_init() // Dump in initialise sequence jd79653a_spi_send_seq(init_seq, EPD_SEQ_LEN(init_seq)); - LV_LOG_INFO(TAG, "Panel init sequence sent"); + LV_LOG_INFO("Panel init sequence sent"); // Check BUSY status here jd79653a_wait_busy(0); - LV_LOG_INFO(TAG, "Panel is up!"); + LV_LOG_INFO("Panel is up!"); } static void jd79653a_reset(void) diff --git a/lvgl_tft/ra8875.c b/lvgl_tft/ra8875.c index 1b431fa..7021a45 100644 --- a/lvgl_tft/ra8875.c +++ b/lvgl_tft/ra8875.c @@ -15,8 +15,6 @@ /********************* * DEFINES *********************/ -#define TAG "RA8875 :" - #define DIV_ROUND_UP(n, d) (((n)+(d)-1)/(d)) #define SPI_CLOCK_SPEED_SLOW_HZ 1000000 @@ -169,7 +167,7 @@ void ra8875_init(void) }; #define INIT_CMDS_SIZE (sizeof(init_cmds)/sizeof(init_cmds[0])) - LV_LOG_INFO(TAG, "Initializing RA8875..."); + LV_LOG_INFO("Initializing RA8875..."); // Initialize non-SPI GPIOs @@ -203,7 +201,7 @@ void ra8875_init(void) vTaskDelay(1); } if (i == 0) { - LV_LOG_WARN(TAG, "WARNING: Memory clear timed out; RA8875 may be unresponsive."); + LV_LOG_WARN("WARNING: Memory clear timed out; RA8875 may be unresponsive."); } // Enable the display @@ -212,7 +210,7 @@ void ra8875_init(void) void ra8875_enable_display(bool enable) { - LV_LOG_INFO(TAG, "%s display.", enable ? "Enabling" : "Disabling"); + LV_LOG_INFO("%s display.", enable ? "Enabling" : "Disabling"); uint8_t val = enable ? (0x80) : (0x00); ra8875_write_cmd(RA8875_REG_PWRR, val); // Power and Display Control Register (PWRR) } @@ -228,14 +226,14 @@ void ra8875_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * colo size_t linelen = (area->x2 - area->x1 + 1); uint8_t * buffer = (uint8_t*)color_map; - LV_LOG_INFO(TAG, "flush: %d,%d at %d,%d", area->x1, area->x2, area->y1, area->y2 ); + LV_LOG_INFO("flush: %d,%d at %d,%d", area->x1, area->x2, area->y1, area->y2 ); // Get lock disp_spi_acquire(); // Set window if needed if ((x1 != area->x1) || (x2 != area->x2)) { - LV_LOG_INFO(TAG, "flush: set window (x1,x2): %d,%d -> %d,%d", x1, x2, area->x1, area->x2); + LV_LOG_INFO("flush: set window (x1,x2): %d,%d -> %d,%d", x1, x2, area->x1, area->x2); ra8875_set_window(area->x1, area->x2, 0, LV_VER_RES_MAX-1); x1 = area->x1; x2 = area->x2; @@ -243,7 +241,7 @@ void ra8875_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * colo // Set cursor if needed if ((x != area->x1) || (y != area->y1)) { - LV_LOG_INFO(TAG, "flush: set cursor (x,y): %d,%d -> %d,%d", x, y, area->x1, area->y1); + LV_LOG_INFO("flush: set cursor (x,y): %d,%d -> %d,%d", x, y, area->x1, area->y1); ra8875_set_memory_write_cursor(area->x1, area->y1); x = area->x1; } diff --git a/lvgl_tft/sh1107.c b/lvgl_tft/sh1107.c index d7f6067..6f787b2 100644 --- a/lvgl_tft/sh1107.c +++ b/lvgl_tft/sh1107.c @@ -16,7 +16,6 @@ /********************* * DEFINES *********************/ - #define TAG "SH1107" /********************** * TYPEDEFS diff --git a/lvgl_tft/ssd1306.c b/lvgl_tft/ssd1306.c index 1700d02..802842c 100644 --- a/lvgl_tft/ssd1306.c +++ b/lvgl_tft/ssd1306.c @@ -22,8 +22,6 @@ /********************* * DEFINES *********************/ -#define TAG "SSD1306" - #define OLED_I2C_PORT (CONFIG_LV_I2C_DISPLAY_PORT) // SLA (0x3C) + WRITE_MODE (0x00) = 0x78 (0b01111000) #define OLED_I2C_ADDRESS 0x3C diff --git a/lvgl_tft/st7735s.c b/lvgl_tft/st7735s.c index 29fd452..0f23a29 100644 --- a/lvgl_tft/st7735s.c +++ b/lvgl_tft/st7735s.c @@ -19,7 +19,6 @@ /********************* * DEFINES *********************/ - #define TAG "ST7735S: " #define AXP192_I2C_ADDRESS 0x34 /********************** @@ -114,7 +113,7 @@ void st7735s_init(void) vTaskDelay(100 / portTICK_RATE_MS); #endif - LV_LOG_INFO(TAG, "ST7735S initialization."); + LV_LOG_INFO("ST7735S initialization."); //Send all the commands uint16_t cmd = 0; @@ -210,7 +209,7 @@ static void st7735s_set_orientation(uint8_t orientation) "PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED" }; - LV_LOG_INFO(TAG, "Display orientation: %s", orientation_str[orientation]); + LV_LOG_INFO("Display orientation: %s", orientation_str[orientation]); /* Portrait: 0xC8 = ST77XX_MADCTL_MX | ST77XX_MADCTL_MY | ST77XX_MADCTL_BGR @@ -219,7 +218,7 @@ static void st7735s_set_orientation(uint8_t orientation) */ uint8_t data[] = {0xC8, 0xC8, 0xA8, 0xA8}; - LV_LOG_INFO(TAG, "0x36 command value: 0x%02X", data[orientation]); + LV_LOG_INFO("0x36 command value: 0x%02X", data[orientation]); st7735s_send_cmd(ST7735_MADCTL); st7735s_send_data((void *) &data[orientation], 1); @@ -231,7 +230,7 @@ static void axp192_write_byte(uint8_t addr, uint8_t data) { err = lvgl_i2c_write(CONFIG_LV_I2C_DISPLAY_PORT, AXP192_I2C_ADDRESS, addr, &data, 1); if (ret != ESP_OK) { - LV_LOG_ERROR(TAG, "AXP192 send failed. code: 0x%.2X", ret); + LV_LOG_ERROR("AXP192 send failed. code: 0x%.2X", ret); } } @@ -243,7 +242,7 @@ static void axp192_init() axp192_write_byte(0x10, 0xFF); // OLED_VPP Enable axp192_write_byte(0x28, 0xCC); // Enable LDO2&LDO3, LED&TFT 3.0V axp192_sleep_out(); - LV_LOG_INFO(TAG, "AXP192 initialized, power enabled for LDO2 and LDO3"); + LV_LOG_INFO("AXP192 initialized, power enabled for LDO2 and LDO3"); } static void axp192_sleep_in() diff --git a/lvgl_tft/st7789.c b/lvgl_tft/st7789.c index 1aa1b75..ba2889a 100644 --- a/lvgl_tft/st7789.c +++ b/lvgl_tft/st7789.c @@ -12,7 +12,6 @@ /********************* * DEFINES *********************/ -#define TAG "ST7789" /********************** * TYPEDEFS diff --git a/lvgl_tft/st7796s.c b/lvgl_tft/st7796s.c index 68f8f9a..8bc07e5 100644 --- a/lvgl_tft/st7796s.c +++ b/lvgl_tft/st7796s.c @@ -15,7 +15,6 @@ /********************* * DEFINES *********************/ -#define TAG "ST7796S: " /********************** * TYPEDEFS @@ -95,7 +94,7 @@ void st7796s_init(void) vTaskDelay(100 / portTICK_RATE_MS); #endif - LV_LOG_INFO(TAG, "Initialization."); + LV_LOG_INFO("Initialization."); //Send all the commands uint16_t cmd = 0; @@ -193,7 +192,7 @@ static void st7796s_set_orientation(uint8_t orientation) const char *orientation_str[] = { "PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED"}; - LV_LOG_INFO(TAG, "Display orientation: %s", orientation_str[orientation]); + LV_LOG_INFO("Display orientation: %s", orientation_str[orientation]); #if defined CONFIG_LV_PREDEFINED_DISPLAY_M5STACK const uint8_t data[] = {0x68, 0x68, 0x08, 0x08}; @@ -205,7 +204,7 @@ static void st7796s_set_orientation(uint8_t orientation) const uint8_t data[] = {0x48, 0x88, 0x28, 0xE8}; #endif - LV_LOG_INFO(TAG, "0x36 command value: 0x%02X", data[orientation]); + LV_LOG_INFO("0x36 command value: 0x%02X", data[orientation]); st7796s_send_cmd(0x36); st7796s_send_data((void *)&data[orientation], 1); diff --git a/lvgl_tft/uc8151d.c b/lvgl_tft/uc8151d.c index e93be7c..91a7f7a 100644 --- a/lvgl_tft/uc8151d.c +++ b/lvgl_tft/uc8151d.c @@ -34,8 +34,6 @@ #include "disp_driver.h" #include "uc8151d.h" -#define TAG "lv_uc8151d: " - #define PIN_DC CONFIG_LV_DISP_PIN_DC #define PIN_DC_BIT ((1ULL << (uint8_t)(CONFIG_LV_DISP_PIN_DC))) @@ -105,7 +103,7 @@ static void uc8151d_spi_send_fb(uint8_t *data, size_t len) static void uc8151d_spi_send_seq(const uc8151d_seq_t *seq, size_t len) { - LV_LOG_INFO(TAG, "Writing cmd/data sequence, count %u", len); + LV_LOG_INFO("Writing cmd/data sequence, count %u", len); if (!seq || len < 1) return; for (size_t cmd_idx = 0; cmd_idx < len; cmd_idx++) { @@ -200,14 +198,14 @@ void uc8151d_lv_fb_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t * { size_t len = ((area->x2 - area->x1 + 1) * (area->y2 - area->y1 + 1)) / 8; - LV_LOG_INFO(TAG, "x1: 0x%x, x2: 0x%x, y1: 0x%x, y2: 0x%x", area->x1, area->x2, area->y1, area->y2); - LV_LOG_INFO(TAG, "Writing LVGL fb with len: %u", len); + LV_LOG_INFO("x1: 0x%x, x2: 0x%x, y1: 0x%x, y2: 0x%x", area->x1, area->x2, area->y1, area->y2); + LV_LOG_INFO("Writing LVGL fb with len: %u", len); uint8_t *buf = (uint8_t *) color_map; uc8151d_full_update(buf); lv_disp_flush_ready(drv); - LV_LOG_INFO(TAG, "Ready"); + LV_LOG_INFO("Ready"); } void uc8151d_lv_set_fb_cb(struct _disp_drv_t *disp_drv, uint8_t *buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, @@ -219,7 +217,7 @@ void uc8151d_lv_set_fb_cb(struct _disp_drv_t *disp_drv, uint8_t *buf, lv_coord_t if (color.full) { BIT_SET(buf[byte_index], 7 - bit_index); } else { - LV_LOG_INFO(TAG, "Clear at x: %u, y: %u", x, y); + LV_LOG_INFO("Clear at x: %u, y: %u", x, y); BIT_CLEAR(buf[byte_index], 7 - bit_index); } } @@ -238,7 +236,7 @@ void uc8151d_init() // Initialise event group uc8151d_evts = xEventGroupCreate(); if (!uc8151d_evts) { - LV_LOG_ERROR(TAG, "Failed when initialising event group!"); + LV_LOG_ERROR("Failed when initialising event group!"); return; } @@ -254,9 +252,9 @@ void uc8151d_init() gpio_install_isr_service(0); gpio_isr_handler_add(PIN_BUSY, uc8151d_busy_intr, (void *) PIN_BUSY); - LV_LOG_INFO(TAG, "IO init finished"); + LV_LOG_INFO("IO init finished"); uc8151d_panel_init(); - LV_LOG_INFO(TAG, "Panel initialised"); + LV_LOG_INFO("Panel initialised"); } static void uc8151d_reset(void) From ea37784f08e0af3afb7be8a19486bf1b27078a54 Mon Sep 17 00:00:00 2001 From: C47D Date: Fri, 22 Oct 2021 18:45:37 -0500 Subject: [PATCH 070/105] Remove TAG from LVGL log API in touch drivers The filename is appended at the beginning of the log output by default, we don't need to do it. --- lvgl_touch/adcraw.c | 1 - lvgl_touch/ft6x36.c | 26 ++++++++++++-------------- lvgl_touch/gt911.c | 22 ++++++++++------------ lvgl_touch/ra8875_touch.c | 9 ++++----- lvgl_touch/stmpe610.c | 16 +++++++--------- lvgl_touch/xpt2046.c | 10 ++++------ 6 files changed, 37 insertions(+), 47 deletions(-) diff --git a/lvgl_touch/adcraw.c b/lvgl_touch/adcraw.c index 6170b4c..c8da1b0 100644 --- a/lvgl_touch/adcraw.c +++ b/lvgl_touch/adcraw.c @@ -12,7 +12,6 @@ #if CONFIG_LV_TOUCH_CONTROLLER_ADCRAW -#define TAG "ADCRAW" #define CALIBRATIONINSET 1 // range 0 <= CALIBRATIONINSET <= 40 #define SAMPLE_CALIBRATION_POINTS 4 // use this scale factor to avoid working in floating point numbers diff --git a/lvgl_touch/ft6x36.c b/lvgl_touch/ft6x36.c index ede0966..5b9b46d 100644 --- a/lvgl_touch/ft6x36.c +++ b/lvgl_touch/ft6x36.c @@ -27,8 +27,6 @@ #include "lvgl_i2c/i2c_manager.h" -#define TAG "FT6X36: " - ft6x36_status_t ft6x36_status; uint8_t current_dev_addr; // set during init @@ -44,13 +42,13 @@ esp_err_t ft6x06_i2c_read8(uint8_t slave_addr, uint8_t register_addr, uint8_t *d */ uint8_t ft6x36_get_gesture_id() { if (!ft6x36_status.inited) { - LV_LOG_ERROR(TAG, "Init first!"); + LV_LOG_ERROR("Init first!"); return 0x00; } uint8_t data_buf; esp_err_t ret; if ((ret = ft6x06_i2c_read8(current_dev_addr, FT6X36_GEST_ID_REG, &data_buf) != ESP_OK)) - LV_LOG_ERROR(TAG, "Error reading from device: %s", esp_err_to_name(ret)); + LV_LOG_ERROR("Error reading from device: %s", esp_err_to_name(ret)); return data_buf; } @@ -65,23 +63,23 @@ void ft6x06_init(uint16_t dev_addr) { current_dev_addr = dev_addr; uint8_t data_buf; esp_err_t ret; - LV_LOG_INFO(TAG, "Found touch panel controller"); + LV_LOG_INFO("Found touch panel controller"); if ((ret = ft6x06_i2c_read8(dev_addr, FT6X36_PANEL_ID_REG, &data_buf) != ESP_OK)) - LV_LOG_ERROR(TAG, "Error reading from device: %s", + LV_LOG_ERROR("Error reading from device: %s", esp_err_to_name(ret)); // Only show error the first time - LV_LOG_INFO(TAG, "\tDevice ID: 0x%02x", data_buf); + LV_LOG_INFO("\tDevice ID: 0x%02x", data_buf); ft6x06_i2c_read8(dev_addr, FT6X36_CHIPSELECT_REG, &data_buf); - LV_LOG_INFO(TAG, "\tChip ID: 0x%02x", data_buf); + LV_LOG_INFO("\tChip ID: 0x%02x", data_buf); ft6x06_i2c_read8(dev_addr, FT6X36_DEV_MODE_REG, &data_buf); - LV_LOG_INFO(TAG, "\tDevice mode: 0x%02x", data_buf); + LV_LOG_INFO("\tDevice mode: 0x%02x", data_buf); ft6x06_i2c_read8(dev_addr, FT6X36_FIRMWARE_ID_REG, &data_buf); - LV_LOG_INFO(TAG, "\tFirmware ID: 0x%02x", data_buf); + LV_LOG_INFO("\tFirmware ID: 0x%02x", data_buf); ft6x06_i2c_read8(dev_addr, FT6X36_RELEASECODE_REG, &data_buf); - LV_LOG_INFO(TAG, "\tRelease code: 0x%02x", data_buf); + LV_LOG_INFO("\tRelease code: 0x%02x", data_buf); } @@ -93,7 +91,7 @@ void ft6x06_init(uint16_t dev_addr) { */ bool ft6x36_read(lv_indev_drv_t *drv, lv_indev_data_t *data) { if (!ft6x36_status.inited) { - LV_LOG_ERROR(TAG, "Init first!"); + LV_LOG_ERROR("Init first!"); return 0x00; } uint8_t data_buf[5]; // 1 byte status, 2 bytes X, 2 bytes Y @@ -102,7 +100,7 @@ bool ft6x36_read(lv_indev_drv_t *drv, lv_indev_data_t *data) { esp_err_t ret = lvgl_i2c_read(CONFIG_LV_I2C_TOUCH_PORT, current_dev_addr, FT6X36_TD_STAT_REG, &data_buf[0], 5); if (ret != ESP_OK) { - LV_LOG_ERROR(TAG, "Error talking to touch IC: %s", esp_err_to_name(ret)); + LV_LOG_ERROR("Error talking to touch IC: %s", esp_err_to_name(ret)); } uint8_t touch_pnt_cnt = data_buf[0]; // Number of detected touch points @@ -130,6 +128,6 @@ bool ft6x36_read(lv_indev_drv_t *drv, lv_indev_data_t *data) { data->point.x = last_x; data->point.y = last_y; data->state = LV_INDEV_STATE_PR; - LV_LOG_INFO(TAG, "X=%u Y=%u", data->point.x, data->point.y); + LV_LOG_INFO("X=%u Y=%u", data->point.x, data->point.y); return false; } diff --git a/lvgl_touch/gt911.c b/lvgl_touch/gt911.c index ba32c51..112b9ac 100644 --- a/lvgl_touch/gt911.c +++ b/lvgl_touch/gt911.c @@ -27,8 +27,6 @@ #include "lvgl_i2c/i2c_manager.h" -#define TAG "GT911: " - gt911_status_t gt911_status; //TODO: handle multibyte read and refactor to just one read transaction @@ -52,9 +50,9 @@ void gt911_init(uint8_t dev_addr) { uint8_t data_buf; esp_err_t ret; - LV_LOG_INFO(TAG, "Checking for GT911 Touch Controller"); + LV_LOG_INFO("Checking for GT911 Touch Controller"); if ((ret = gt911_i2c_read(dev_addr, GT911_PRODUCT_ID1, &data_buf, 1) != ESP_OK)) { - LV_LOG_ERROR(TAG, "Error reading from device: %s", + LV_LOG_ERROR("Error reading from device: %s", esp_err_to_name(ret)); // Only show error the first time return; } @@ -63,22 +61,22 @@ void gt911_init(uint8_t dev_addr) { for (int i = 0; i < GT911_PRODUCT_ID_LEN; i++) { gt911_i2c_read(dev_addr, (GT911_PRODUCT_ID1 + i), (uint8_t *)&(gt911_status.product_id[i]), 1); } - LV_LOG_INFO(TAG, "\tProduct ID: %s", gt911_status.product_id); + LV_LOG_INFO("\tProduct ID: %s", gt911_status.product_id); gt911_i2c_read(dev_addr, GT911_VENDOR_ID, &data_buf, 1); - LV_LOG_INFO(TAG, "\tVendor ID: 0x%02x", data_buf); + LV_LOG_INFO("\tVendor ID: 0x%02x", data_buf); gt911_i2c_read(dev_addr, GT911_X_COORD_RES_L, &data_buf, 1); gt911_status.max_x_coord = data_buf; gt911_i2c_read(dev_addr, GT911_X_COORD_RES_H, &data_buf, 1); gt911_status.max_x_coord |= ((uint16_t)data_buf << 8); - LV_LOG_INFO(TAG, "\tX Resolution: %d", gt911_status.max_x_coord); + LV_LOG_INFO("\tX Resolution: %d", gt911_status.max_x_coord); gt911_i2c_read(dev_addr, GT911_Y_COORD_RES_L, &data_buf, 1); gt911_status.max_y_coord = data_buf; gt911_i2c_read(dev_addr, GT911_Y_COORD_RES_H, &data_buf, 1); gt911_status.max_y_coord |= ((uint16_t)data_buf << 8); - LV_LOG_INFO(TAG, "\tY Resolution: %d", gt911_status.max_y_coord); + LV_LOG_INFO("\tY Resolution: %d", gt911_status.max_y_coord); gt911_status.inited = true; } } @@ -97,7 +95,7 @@ bool gt911_read(lv_indev_drv_t *drv, lv_indev_data_t *data) { uint8_t status_reg; gt911_i2c_read(gt911_status.i2c_dev_addr, GT911_STATUS_REG, &status_reg, 1); -// LV_LOG_INFO(TAG, "\tstatus: 0x%02x", status_reg); +// LV_LOG_INFO("\tstatus: 0x%02x", status_reg); touch_pnt_cnt = status_reg & 0x0F; if ((status_reg & 0x80) || (touch_pnt_cnt < 6)) { //Reset Status Reg Value @@ -111,7 +109,7 @@ bool gt911_read(lv_indev_drv_t *drv, lv_indev_data_t *data) { } // gt911_i2c_read(gt911_status.i2c_dev_addr, GT911_TRACK_ID1, &data_buf, 1); -// LV_LOG_INFO(TAG, "\ttrack_id: %d", data_buf); +// LV_LOG_INFO("\ttrack_id: %d", data_buf); gt911_i2c_read(gt911_status.i2c_dev_addr, GT911_PT1_X_COORD_L, &data_buf, 1); last_x = data_buf; @@ -137,7 +135,7 @@ bool gt911_read(lv_indev_drv_t *drv, lv_indev_data_t *data) { data->point.x = last_x; data->point.y = last_y; data->state = LV_INDEV_STATE_PR; - LV_LOG_INFO(TAG, "X=%u Y=%u", data->point.x, data->point.y); - LV_LOG_INFO(TAG, "X=%u Y=%u", data->point.x, data->point.y); + LV_LOG_INFO("X=%u Y=%u", data->point.x, data->point.y); + LV_LOG_INFO("X=%u Y=%u", data->point.x, data->point.y); return false; } diff --git a/lvgl_touch/ra8875_touch.c b/lvgl_touch/ra8875_touch.c index 1292de9..b694dcd 100644 --- a/lvgl_touch/ra8875_touch.c +++ b/lvgl_touch/ra8875_touch.c @@ -22,7 +22,6 @@ * DEFINES *********************/ #define DEBUG false -#define TAG "RA8875-Touch" #define DIV_ROUND_UP(n, d) (((n)+(d)-1)/(d)) @@ -82,7 +81,7 @@ void ra8875_touch_init(void) }; #define INIT_CMDS_SIZE (sizeof(init_cmds)/sizeof(init_cmds[0])) - LV_LOG_INFO(TAG, "Initializing RA8875 Touch..."); + LV_LOG_INFO("Initializing RA8875 Touch..."); // Send all the commands for (unsigned int i = 0; i < INIT_CMDS_SIZE; i++) { @@ -93,7 +92,7 @@ void ra8875_touch_init(void) void ra8875_touch_enable(bool enable) { - LV_LOG_INFO(TAG, "%s touch.", enable ? "Enabling" : "Disabling"); + LV_LOG_INFO("%s touch.", enable ? "Enabling" : "Disabling"); uint8_t val = enable ? (0x80 | TPCR0_VAL) : (TPCR0_VAL); ra8875_write_cmd(RA8875_REG_TPCR0, val); } @@ -121,7 +120,7 @@ bool ra8875_touch_read(lv_indev_drv_t * drv, lv_indev_data_t * data) y = (y << 2) | ((xy >> 2) & 0x03); #if DEBUG - LV_LOG_INFO(TAG, "Touch Poll Raw: %d,%d", x, y); + LV_LOG_INFO("Touch Poll Raw: %d,%d", x, y); #endif // Convert to display coordinates @@ -135,7 +134,7 @@ bool ra8875_touch_read(lv_indev_drv_t * drv, lv_indev_data_t * data) data->point.y = y; #if DEBUG - LV_LOG_INFO(TAG, "Touch Poll - Event: %d; %d,%d", data->state, data->point.x, data->point.y); + LV_LOG_INFO("Touch Poll - Event: %d; %d,%d", data->state, data->point.x, data->point.y); #endif return false; diff --git a/lvgl_touch/stmpe610.c b/lvgl_touch/stmpe610.c index e823ecc..f10cc6f 100644 --- a/lvgl_touch/stmpe610.c +++ b/lvgl_touch/stmpe610.c @@ -16,8 +16,6 @@ /********************* * DEFINES *********************/ -#define TAG "STMPE610: " - /********************** * TYPEDEFS @@ -54,11 +52,11 @@ void stmpe610_init(void) uint8_t u8; uint16_t u16; - LV_LOG_INFO(TAG, "Initialization."); + LV_LOG_INFO("Initialization."); // Get the initial SPI configuration //u8 = read_8bit_reg(STMPE_SPI_CFG); - //LV_LOG_INFO(TAG, "SPI_CFG = 0x%x", u8); + //LV_LOG_INFO("SPI_CFG = 0x%x", u8); // Attempt a software reset write_8bit_reg(STMPE_SYS_CTRL1, STMPE_SYS_CTRL1_RESET); @@ -68,12 +66,12 @@ void stmpe610_init(void) u8 = read_8bit_reg(STMPE_SPI_CFG); write_8bit_reg(STMPE_SPI_CFG, u8 | STMPE_SPI_CFG_AA); u8 = read_8bit_reg(STMPE_SPI_CFG); - LV_LOG_INFO(TAG, "SPI_CFG = 0x%x", u8); + LV_LOG_INFO("SPI_CFG = 0x%x", u8); // Verify SPI communication u16 = read_16bit_reg(STMPE_CHIP_ID); if (u16 != 0x811) { - LV_LOG_ERROR(TAG, "Incorrect version: 0x%x", u16); + LV_LOG_ERROR("Incorrect version: 0x%x", u16); } write_8bit_reg(STMPE_SYS_CTRL2, 0x00); // Disable clocks @@ -129,12 +127,12 @@ bool stmpe610_read(lv_indev_drv_t * drv, lv_indev_data_t * data) } if (c > 0) { - //LV_LOG_INFO(TAG, "%d: %d %d %d", c, x, y, z); + //LV_LOG_INFO("%d: %d %d %d", c, x, y, z); adjust_data(&x, &y); last_x = x; last_y = y; - //LV_LOG_INFO(TAG, " ==> %d %d", x, y); + //LV_LOG_INFO(" ==> %d %d", x, y); } z = read_8bit_reg(STMPE_INT_STA); // Clear interrupts @@ -143,7 +141,7 @@ bool stmpe610_read(lv_indev_drv_t * drv, lv_indev_data_t * data) // Clear the FIFO if we discover an overflow write_8bit_reg(STMPE_FIFO_STA, STMPE_FIFO_STA_RESET); write_8bit_reg(STMPE_FIFO_STA, 0); // unreset - LV_LOG_ERROR(TAG, "Fifo overflow"); + LV_LOG_ERROR("Fifo overflow"); } } diff --git a/lvgl_touch/xpt2046.c b/lvgl_touch/xpt2046.c index 4c66753..98a5804 100644 --- a/lvgl_touch/xpt2046.c +++ b/lvgl_touch/xpt2046.c @@ -15,8 +15,6 @@ /********************* * DEFINES *********************/ -#define TAG "XPT2046: " - #define CMD_X_READ 0b10010000 // NOTE: XPT2046 data sheet says this is actually Y #define CMD_Y_READ 0b11010000 // NOTE: XPT2046 data sheet says this is actually X #define CMD_Z1_READ 0b10110000 @@ -58,7 +56,7 @@ uint8_t avg_last; */ void xpt2046_init(void) { - LV_LOG_INFO(TAG, "Initialization"); + LV_LOG_INFO("Initialization"); #if XPT2046_TOUCH_IRQ || XPT2046_TOUCH_IRQ_PRESS gpio_config_t irq_config = { @@ -93,19 +91,19 @@ bool xpt2046_read(lv_indev_drv_t * drv, lv_indev_data_t * data) x = xpt2046_cmd(CMD_X_READ); y = xpt2046_cmd(CMD_Y_READ); - LV_LOG_INFO(TAG, "P(%d,%d)", x, y); + LV_LOG_INFO("P(%d,%d)", x, y); /*Normalize Data back to 12-bits*/ x = x >> 4; y = y >> 4; - LV_LOG_INFO(TAG, "P_norm(%d,%d)", x, y); + LV_LOG_INFO("P_norm(%d,%d)", x, y); xpt2046_corr(&x, &y); xpt2046_avg(&x, &y); last_x = x; last_y = y; - LV_LOG_INFO(TAG, "x = %d, y = %d", x, y); + LV_LOG_INFO("x = %d, y = %d", x, y); } else { From 86e3f259ba6f7370b4ab3d3119f678840cceb248 Mon Sep 17 00:00:00 2001 From: Rop Gonggrijp Date: Fri, 15 Oct 2021 15:37:36 +0200 Subject: [PATCH 071/105] Fixes potential ESP-IDF config editor crash (#115) --- lvgl_i2c/Kconfig | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lvgl_i2c/Kconfig b/lvgl_i2c/Kconfig index 4011bcf..48df924 100644 --- a/lvgl_i2c/Kconfig +++ b/lvgl_i2c/Kconfig @@ -6,8 +6,10 @@ menu "I2C Port 0" if I2C_MANAGER_0_ENABLED config I2C_MANAGER_0_SDA int "SDA (GPIO pin)" + default 0 config I2C_MANAGER_0_SCL int "SCL (GPIO pin)" + default 0 config I2C_MANAGER_0_FREQ_HZ int "Frequency (Hz)" default 400000 From 3625deb36dad2f9ab95599e725efee9b1c48f97e Mon Sep 17 00:00:00 2001 From: Rop Gonggrijp Date: Fri, 15 Oct 2021 15:38:16 +0200 Subject: [PATCH 072/105] Addresses confusion: I2C manager component install only when others need I2C too. See #115 --- lvgl_i2c/README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lvgl_i2c/README.md b/lvgl_i2c/README.md index fb74e27..90f3728 100644 --- a/lvgl_i2c/README.md +++ b/lvgl_i2c/README.md @@ -8,9 +8,11 @@ ### I2C Manager support -`lvgl_esp32_drivers` integrates [I2C Manager](https://github.com/ropg/i2c_manager), which is used in case you select a touch sensor or screen that uses the I2C bus. If you're just using LVGL you don't need to do anything special. +`lvgl_esp32_drivers` integrates [I2C Manager](https://github.com/ropg/i2c_manager), which is used in case you select a touch sensor or screen that uses the I2C bus. -I2C Manager can help if you are in a situation where you want to avoid "bus conflicts" on the I2C bus. Suppose you use LVGL with a touch sensor that uses I2C, and your device also has another I2C device that needs to be read frequently, such as a 3D-accelerometer. ESP-IDF is not inherently "thread-safe". So if you read that from another task than the one LVGL uses to read the touch data, you need some kind of mechanism to keep these communications from interfering. +I2C Manager is also available as a separate ESP-IDF component and can help if you are in a situation where you want to avoid "bus conflicts" on the I2C bus. **If in your application nothing outside of LVGL needs to talk to the I2C bus, you can stop reading here.** + +Suppose you use LVGL with a touch sensor that uses I2C, and your device also has another I2C device that needs to be read frequently, such as a 3D-accelerometer. ESP-IDF is not inherently "thread-safe". So if you read that from another task than the one LVGL uses to read the touch data, you need some kind of mechanism to keep these communications from interfering. If you have (or write) a driver for that 3D-accelerometer that can use I2C Manager (or the I2C HAL and i2cdev abstraction layers that I2C Manager is compatible with) then put I2C Manager in your components directory by cloning the repository from below and in your main program do: From 919d644dc842ce4a45ac41eba4888a1c3f4616b9 Mon Sep 17 00:00:00 2001 From: Rashed Talukder <> Date: Tue, 19 Oct 2021 17:27:27 -0700 Subject: [PATCH 073/105] Add touch input values to a FreeRTOS queue --- lvgl_touch/ft6x36.c | 65 +++++++++++++++++++++++++++++++++------------ lvgl_touch/ft6x36.h | 11 ++++++++ 2 files changed, 59 insertions(+), 17 deletions(-) diff --git a/lvgl_touch/ft6x36.c b/lvgl_touch/ft6x36.c index 5b9b46d..cf9ef6f 100644 --- a/lvgl_touch/ft6x36.c +++ b/lvgl_touch/ft6x36.c @@ -23,18 +23,23 @@ #else #include #endif -#include "ft6x36.h" +#include "ft6x36.h" #include "lvgl_i2c/i2c_manager.h" -ft6x36_status_t ft6x36_status; -uint8_t current_dev_addr; // set during init +#define TAG "FT6X36" +#define FT6X36_TOUCH_QUEUE_ELEMENTS 1 -esp_err_t ft6x06_i2c_read8(uint8_t slave_addr, uint8_t register_addr, uint8_t *data_buf) { +static ft6x36_status_t ft6x36_status; +/* Set during initialization */ +static uint8_t current_dev_addr; +/* -1 coordinates to designate it was never touched */ +static ft6x36_touch_t touch_inputs = { -1, -1, LV_INDEV_STATE_REL }; + +static esp_err_t ft6x06_i2c_read8(uint8_t slave_addr, uint8_t register_addr, uint8_t *data_buf) { return lvgl_i2c_read(CONFIG_LV_I2C_TOUCH_PORT, slave_addr, register_addr, data_buf, 1); } - /** * @brief Read the FT6x36 gesture ID. Initialize first! * @param dev_addr: I2C FT6x36 Slave address. @@ -79,8 +84,20 @@ void ft6x06_init(uint16_t dev_addr) { LV_LOG_INFO("\tFirmware ID: 0x%02x", data_buf); ft6x06_i2c_read8(dev_addr, FT6X36_RELEASECODE_REG, &data_buf); +<<<<<<< HEAD LV_LOG_INFO("\tRelease code: 0x%02x", data_buf); +======= + ESP_LOGI(TAG, "\tRelease code: 0x%02x", data_buf); + + ft6x36_touch_queue_handle = xQueueCreate( FT6X36_TOUCH_QUEUE_ELEMENTS, sizeof( ft6x36_touch_t )); + if( ft6x36_touch_queue_handle == NULL ) + { + ESP_LOGE( TAG, "\tError creating touch input FreeRTOS queue" ); + return; + } + xQueueSend( ft6x36_touch_queue_handle, &touch_inputs, 0 ); +>>>>>>> bd445ea... Add touch input values to a FreeRTOS queue } /** @@ -95,8 +112,6 @@ bool ft6x36_read(lv_indev_drv_t *drv, lv_indev_data_t *data) { return 0x00; } uint8_t data_buf[5]; // 1 byte status, 2 bytes X, 2 bytes Y - static int16_t last_x = 0; // 12bit pixel value - static int16_t last_y = 0; // 12bit pixel value esp_err_t ret = lvgl_i2c_read(CONFIG_LV_I2C_TOUCH_PORT, current_dev_addr, FT6X36_TD_STAT_REG, &data_buf[0], 5); if (ret != ESP_OK) { @@ -105,29 +120,45 @@ bool ft6x36_read(lv_indev_drv_t *drv, lv_indev_data_t *data) { uint8_t touch_pnt_cnt = data_buf[0]; // Number of detected touch points if (ret != ESP_OK || touch_pnt_cnt != 1) { // ignore no touch & multi touch - data->point.x = last_x; - data->point.y = last_y; - data->state = LV_INDEV_STATE_REL; + if ( touch_inputs.current_state != LV_INDEV_STATE_REL) + { + touch_inputs.current_state = LV_INDEV_STATE_REL; + xQueueOverwrite( ft6x36_touch_queue_handle, &touch_inputs ); + } + data->point.x = touch_inputs.last_x; + data->point.y = touch_inputs.last_y; + data->state = touch_inputs.current_state; return false; } - last_x = ((data_buf[1] & FT6X36_MSB_MASK) << 8) | (data_buf[2] & FT6X36_LSB_MASK); - last_y = ((data_buf[3] & FT6X36_MSB_MASK) << 8) | (data_buf[4] & FT6X36_LSB_MASK); + touch_inputs.current_state = LV_INDEV_STATE_PR; + touch_inputs.last_x = ((data_buf[1] & FT6X36_MSB_MASK) << 8) | (data_buf[2] & FT6X36_LSB_MASK); + touch_inputs.last_y = ((data_buf[3] & FT6X36_MSB_MASK) << 8) | (data_buf[4] & FT6X36_LSB_MASK); #if CONFIG_LV_FT6X36_SWAPXY - int16_t swap_buf = last_x; - last_x = last_y; - last_y = swap_buf; + int16_t swap_buf = touch_inputs.last_x; + touch_inputs.last_x = touch_inputs.last_y; + touch_inputs.last_y = swap_buf; #endif #if CONFIG_LV_FT6X36_INVERT_X - last_x = LV_HOR_RES - last_x; + touch_inputs.last_x = LV_HOR_RES - touch_inputs.last_x; #endif #if CONFIG_LV_FT6X36_INVERT_Y - last_y = LV_VER_RES - last_y; + touch_inputs.last_y = LV_VER_RES - touch_inputs.last_y; #endif +<<<<<<< HEAD data->point.x = last_x; data->point.y = last_y; data->state = LV_INDEV_STATE_PR; LV_LOG_INFO("X=%u Y=%u", data->point.x, data->point.y); +======= + data->point.x = touch_inputs.last_x; + data->point.y = touch_inputs.last_y; + data->state = touch_inputs.current_state; + ESP_LOGD(TAG, "X=%u Y=%u", data->point.x, data->point.y); + + xQueueOverwrite( ft6x36_touch_queue_handle, &touch_inputs ); + +>>>>>>> bd445ea... Add touch input values to a FreeRTOS queue return false; } diff --git a/lvgl_touch/ft6x36.h b/lvgl_touch/ft6x36.h index ace2997..90f1507 100644 --- a/lvgl_touch/ft6x36.h +++ b/lvgl_touch/ft6x36.h @@ -23,6 +23,8 @@ #include #include +#include "freertos/FreeRTOS.h" +#include "freertos/queue.h" #ifdef LV_LVGL_H_INCLUDE_SIMPLE #include "lvgl.h" #else @@ -145,6 +147,15 @@ typedef struct { bool inited; } ft6x36_status_t; +typedef struct +{ + int16_t last_x; + int16_t last_y; + lv_indev_state_t current_state; +} ft6x36_touch_t; + +QueueHandle_t ft6x36_touch_queue_handle; + /** * @brief Initialize for FT6x36 communication via I2C * @param dev_addr: Device address on communication Bus (I2C slave address of FT6X36). From ac6cde35c9d2360d40e993c0b3b366f5809dd2df Mon Sep 17 00:00:00 2001 From: Rashed Talukder <> Date: Mon, 25 Oct 2021 11:53:26 -0700 Subject: [PATCH 074/105] Add kconfig symbol for optional coordinates queue --- lvgl_touch/Kconfig | 7 +++++++ lvgl_touch/ft6x36.c | 24 +++++++++--------------- lvgl_touch/ft6x36.h | 3 ++- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/lvgl_touch/Kconfig b/lvgl_touch/Kconfig index de4d17b..b9908aa 100644 --- a/lvgl_touch/Kconfig +++ b/lvgl_touch/Kconfig @@ -201,6 +201,13 @@ menu "LVGL Touch controller" prompt "Invert Y coordinate value." default n + config LV_FT6X36_COORDINATES_QUEUE + bool + prompt "Send coordinates to FreeRTOS queue." + default n + help + Receive from the FreeRTOS queue using the handle 'ft6x36_touch_queue_handle'. + endmenu menu "Touchpanel (STMPE610) Pin Assignments" diff --git a/lvgl_touch/ft6x36.c b/lvgl_touch/ft6x36.c index cf9ef6f..c061d42 100644 --- a/lvgl_touch/ft6x36.c +++ b/lvgl_touch/ft6x36.c @@ -84,20 +84,17 @@ void ft6x06_init(uint16_t dev_addr) { LV_LOG_INFO("\tFirmware ID: 0x%02x", data_buf); ft6x06_i2c_read8(dev_addr, FT6X36_RELEASECODE_REG, &data_buf); -<<<<<<< HEAD LV_LOG_INFO("\tRelease code: 0x%02x", data_buf); - -======= - ESP_LOGI(TAG, "\tRelease code: 0x%02x", data_buf); - + +#if CONFIG_LV_FT6X36_COORDINATES_QUEUE ft6x36_touch_queue_handle = xQueueCreate( FT6X36_TOUCH_QUEUE_ELEMENTS, sizeof( ft6x36_touch_t )); if( ft6x36_touch_queue_handle == NULL ) { - ESP_LOGE( TAG, "\tError creating touch input FreeRTOS queue" ); + LV_LOG_ERROR("\tError creating touch input FreeRTOS queue" ); return; } xQueueSend( ft6x36_touch_queue_handle, &touch_inputs, 0 ); ->>>>>>> bd445ea... Add touch input values to a FreeRTOS queue +#endif } /** @@ -123,7 +120,9 @@ bool ft6x36_read(lv_indev_drv_t *drv, lv_indev_data_t *data) { if ( touch_inputs.current_state != LV_INDEV_STATE_REL) { touch_inputs.current_state = LV_INDEV_STATE_REL; +#if CONFIG_LV_FT6X36_COORDINATES_QUEUE xQueueOverwrite( ft6x36_touch_queue_handle, &touch_inputs ); +#endif } data->point.x = touch_inputs.last_x; data->point.y = touch_inputs.last_y; @@ -146,19 +145,14 @@ bool ft6x36_read(lv_indev_drv_t *drv, lv_indev_data_t *data) { #if CONFIG_LV_FT6X36_INVERT_Y touch_inputs.last_y = LV_VER_RES - touch_inputs.last_y; #endif -<<<<<<< HEAD - data->point.x = last_x; - data->point.y = last_y; - data->state = LV_INDEV_STATE_PR; - LV_LOG_INFO("X=%u Y=%u", data->point.x, data->point.y); -======= data->point.x = touch_inputs.last_x; data->point.y = touch_inputs.last_y; data->state = touch_inputs.current_state; - ESP_LOGD(TAG, "X=%u Y=%u", data->point.x, data->point.y); + LV_LOG_INFO("X=%u Y=%u", data->point.x, data->point.y); +#if CONFIG_LV_FT6X36_COORDINATES_QUEUE xQueueOverwrite( ft6x36_touch_queue_handle, &touch_inputs ); +#endif ->>>>>>> bd445ea... Add touch input values to a FreeRTOS queue return false; } diff --git a/lvgl_touch/ft6x36.h b/lvgl_touch/ft6x36.h index 90f1507..5152da5 100644 --- a/lvgl_touch/ft6x36.h +++ b/lvgl_touch/ft6x36.h @@ -154,8 +154,9 @@ typedef struct lv_indev_state_t current_state; } ft6x36_touch_t; +#if CONFIG_LV_FT6X36_COORDINATES_QUEUE QueueHandle_t ft6x36_touch_queue_handle; - +#endif /** * @brief Initialize for FT6x36 communication via I2C * @param dev_addr: Device address on communication Bus (I2C slave address of FT6X36). From 2dad083264ed74ba0775c9204c450e6c32f6f69f Mon Sep 17 00:00:00 2001 From: Rashed Talukder <> Date: Wed, 27 Oct 2021 09:20:57 -0700 Subject: [PATCH 075/105] Extern the queue handle and add definition in source file. Add macro condition for dependencies. --- lvgl_touch/ft6x36.c | 6 +++++- lvgl_touch/ft6x36.h | 4 +++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/lvgl_touch/ft6x36.c b/lvgl_touch/ft6x36.c index c061d42..b968d43 100644 --- a/lvgl_touch/ft6x36.c +++ b/lvgl_touch/ft6x36.c @@ -36,6 +36,10 @@ static uint8_t current_dev_addr; /* -1 coordinates to designate it was never touched */ static ft6x36_touch_t touch_inputs = { -1, -1, LV_INDEV_STATE_REL }; +#if CONFIG_LV_FT6X36_COORDINATES_QUEUE +QueueHandle_t ft6x36_touch_queue_handle; +#endif + static esp_err_t ft6x06_i2c_read8(uint8_t slave_addr, uint8_t register_addr, uint8_t *data_buf) { return lvgl_i2c_read(CONFIG_LV_I2C_TOUCH_PORT, slave_addr, register_addr, data_buf, 1); } @@ -87,7 +91,7 @@ void ft6x06_init(uint16_t dev_addr) { LV_LOG_INFO("\tRelease code: 0x%02x", data_buf); #if CONFIG_LV_FT6X36_COORDINATES_QUEUE - ft6x36_touch_queue_handle = xQueueCreate( FT6X36_TOUCH_QUEUE_ELEMENTS, sizeof( ft6x36_touch_t )); + ft6x36_touch_queue_handle = xQueueCreate( FT6X36_TOUCH_QUEUE_ELEMENTS, sizeof( ft6x36_touch_t ) ); if( ft6x36_touch_queue_handle == NULL ) { LV_LOG_ERROR("\tError creating touch input FreeRTOS queue" ); diff --git a/lvgl_touch/ft6x36.h b/lvgl_touch/ft6x36.h index 5152da5..c4074dc 100644 --- a/lvgl_touch/ft6x36.h +++ b/lvgl_touch/ft6x36.h @@ -23,8 +23,10 @@ #include #include +#if CONFIG_LV_FT6X36_COORDINATES_QUEUE #include "freertos/FreeRTOS.h" #include "freertos/queue.h" +#endif #ifdef LV_LVGL_H_INCLUDE_SIMPLE #include "lvgl.h" #else @@ -155,7 +157,7 @@ typedef struct } ft6x36_touch_t; #if CONFIG_LV_FT6X36_COORDINATES_QUEUE -QueueHandle_t ft6x36_touch_queue_handle; +extern QueueHandle_t ft6x36_touch_queue_handle; #endif /** * @brief Initialize for FT6x36 communication via I2C From c7607e93d85db74e9626634e39f87a054b754a9c Mon Sep 17 00:00:00 2001 From: Carlos Diaz Date: Wed, 17 Nov 2021 21:00:07 -0600 Subject: [PATCH 076/105] ili9488: Start updating to new display port interface (#137) ILI9488: Start updating to new display port interface --- display_config.h | 7 ++ lvgl_tft/disp_driver.c | 2 +- lvgl_tft/ili9488.c | 159 ++++++++++++++++++++++------------------- lvgl_tft/ili9488.h | 7 +- 4 files changed, 95 insertions(+), 80 deletions(-) diff --git a/display_config.h b/display_config.h index 496c065..7452b43 100644 --- a/display_config.h +++ b/display_config.h @@ -29,6 +29,13 @@ extern "C" { #define ILI9341_INITIAL_ORIENTATION CONFIG_LV_DISPLAY_ORIENTATION +/* ILI9488 Configuration */ +#if CONFIG_LV_DISP_USE_RST +#define ILI9488_USE_RST +#endif + +#define ILI9488_INITIAL_ORIENTATION CONFIG_LV_DISPLAY_ORIENTATION + #ifdef __cplusplus } /* extern "C" */ #endif diff --git a/lvgl_tft/disp_driver.c b/lvgl_tft/disp_driver.c index eda9989..ea1d493 100644 --- a/lvgl_tft/disp_driver.c +++ b/lvgl_tft/disp_driver.c @@ -14,7 +14,7 @@ void *disp_driver_init(lv_disp_drv_t *drv) #elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9481 ili9481_init(); #elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9488 - ili9488_init(); + ili9488_init(drv); #elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7789 st7789_init(drv); #elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7796S diff --git a/lvgl_tft/ili9488.c b/lvgl_tft/ili9488.c index 7a2ab9e..1f67391 100644 --- a/lvgl_tft/ili9488.c +++ b/lvgl_tft/ili9488.c @@ -6,12 +6,10 @@ * INCLUDES *********************/ #include "ili9488.h" -#include "disp_spi.h" -#include "driver/gpio.h" -#include "esp_heap_caps.h" -#include "freertos/FreeRTOS.h" -#include "freertos/task.h" +#include "disp_spi.h" +#include "display_port.h" +#include "esp_heap_caps.h" /********************* * DEFINES @@ -31,11 +29,12 @@ typedef struct { /********************** * STATIC PROTOTYPES **********************/ -static void ili9488_set_orientation(uint8_t orientation); +static void ili9488_set_orientation(lv_disp_drv_t * drv, uint8_t orientation); -static void ili9488_send_cmd(uint8_t cmd); -static void ili9488_send_data(void * data, uint16_t length); -static void ili9488_send_color(void * data, uint16_t length); +static void ili9488_send_cmd(lv_disp_drv_t * drv, uint8_t cmd); +static void ili9488_send_data(lv_disp_drv_t * drv, void * data, uint16_t length); +static void ili9488_send_color(lv_disp_drv_t * drv, void * data, uint16_t length); +static void ili9488_reset(lv_disp_drv_t * drv); /********************** * STATIC VARIABLES @@ -50,62 +49,47 @@ static void ili9488_send_color(void * data, uint16_t length); **********************/ // From github.com/jeremyjh/ESP32_TFT_library // From github.com/mvturnho/ILI9488-lvgl-ESP32-WROVER-B -void ili9488_init(void) +void ili9488_init(lv_disp_drv_t * drv) { - lcd_init_cmd_t ili_init_cmds[]={ - {ILI9488_CMD_SLEEP_OUT, {0x00}, 0x80}, - {ILI9488_CMD_POSITIVE_GAMMA_CORRECTION, {0x00, 0x03, 0x09, 0x08, 0x16, 0x0A, 0x3F, 0x78, 0x4C, 0x09, 0x0A, 0x08, 0x16, 0x1A, 0x0F}, 15}, - {ILI9488_CMD_NEGATIVE_GAMMA_CORRECTION, {0x00, 0x16, 0x19, 0x03, 0x0F, 0x05, 0x32, 0x45, 0x46, 0x04, 0x0E, 0x0D, 0x35, 0x37, 0x0F}, 15}, - {ILI9488_CMD_POWER_CONTROL_1, {0x17, 0x15}, 2}, - {ILI9488_CMD_POWER_CONTROL_2, {0x41}, 1}, - {ILI9488_CMD_VCOM_CONTROL_1, {0x00, 0x12, 0x80}, 3}, - {ILI9488_CMD_MEMORY_ACCESS_CONTROL, {(0x20 | 0x08)}, 1}, - {ILI9488_CMD_COLMOD_PIXEL_FORMAT_SET, {0x66}, 1}, - {ILI9488_CMD_INTERFACE_MODE_CONTROL, {0x00}, 1}, - {ILI9488_CMD_FRAME_RATE_CONTROL_NORMAL, {0xA0}, 1}, - {ILI9488_CMD_DISPLAY_INVERSION_CONTROL, {0x02}, 1}, - {ILI9488_CMD_DISPLAY_FUNCTION_CONTROL, {0x02, 0x02}, 2}, - {ILI9488_CMD_SET_IMAGE_FUNCTION, {0x00}, 1}, - {ILI9488_CMD_WRITE_CTRL_DISPLAY, {0x28}, 1}, - {ILI9488_CMD_WRITE_DISPLAY_BRIGHTNESS, {0x7F}, 1}, - {ILI9488_CMD_ADJUST_CONTROL_3, {0xA9, 0x51, 0x2C, 0x02}, 4}, - {ILI9488_CMD_DISPLAY_ON, {0x00}, 0x80}, - {0, {0}, 0xff}, - }; + lcd_init_cmd_t ili_init_cmds[]={ + {ILI9488_CMD_SLEEP_OUT, {0x00}, 0x80}, + {ILI9488_CMD_POSITIVE_GAMMA_CORRECTION, {0x00, 0x03, 0x09, 0x08, 0x16, 0x0A, 0x3F, 0x78, 0x4C, 0x09, 0x0A, 0x08, 0x16, 0x1A, 0x0F}, 15}, + {ILI9488_CMD_NEGATIVE_GAMMA_CORRECTION, {0x00, 0x16, 0x19, 0x03, 0x0F, 0x05, 0x32, 0x45, 0x46, 0x04, 0x0E, 0x0D, 0x35, 0x37, 0x0F}, 15}, + {ILI9488_CMD_POWER_CONTROL_1, {0x17, 0x15}, 2}, + {ILI9488_CMD_POWER_CONTROL_2, {0x41}, 1}, + {ILI9488_CMD_VCOM_CONTROL_1, {0x00, 0x12, 0x80}, 3}, + {ILI9488_CMD_MEMORY_ACCESS_CONTROL, {(0x20 | 0x08)}, 1}, + {ILI9488_CMD_COLMOD_PIXEL_FORMAT_SET, {0x66}, 1}, + {ILI9488_CMD_INTERFACE_MODE_CONTROL, {0x00}, 1}, + {ILI9488_CMD_FRAME_RATE_CONTROL_NORMAL, {0xA0}, 1}, + {ILI9488_CMD_DISPLAY_INVERSION_CONTROL, {0x02}, 1}, + {ILI9488_CMD_DISPLAY_FUNCTION_CONTROL, {0x02, 0x02}, 2}, + {ILI9488_CMD_SET_IMAGE_FUNCTION, {0x00}, 1}, + {ILI9488_CMD_WRITE_CTRL_DISPLAY, {0x28}, 1}, + {ILI9488_CMD_WRITE_DISPLAY_BRIGHTNESS, {0x7F}, 1}, + {ILI9488_CMD_ADJUST_CONTROL_3, {0xA9, 0x51, 0x2C, 0x02}, 4}, + {ILI9488_CMD_DISPLAY_ON, {0x00}, 0x80}, + {0, {0}, 0xff}, + }; - //Initialize non-SPI GPIOs - gpio_pad_select_gpio(ILI9488_DC); - gpio_set_direction(ILI9488_DC, GPIO_MODE_OUTPUT); + ili9488_reset(drv); -#if ILI9488_USE_RST - gpio_pad_select_gpio(ILI9488_RST); - gpio_set_direction(ILI9488_RST, GPIO_MODE_OUTPUT); + LV_LOG_INFO("ILI9488 initialization."); - //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 + //Send all the commands + uint16_t cmd = 0; + while (ili_init_cmds[cmd].databytes!=0xff) { + ili9488_send_cmd(drv, ili_init_cmds[cmd].cmd); + ili9488_send_data(drv, ili_init_cmds[cmd].data, ili_init_cmds[cmd].databytes&0x1F); + + if (ili_init_cmds[cmd].databytes & 0x80) { + display_port_delay(drv, 100); + } - LV_LOG_INFO("ILI9488 initialization."); + cmd++; + } - // 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) { - ili9488_send_cmd(ili_init_cmds[cmd].cmd); - ili9488_send_data(ili_init_cmds[cmd].data, ili_init_cmds[cmd].databytes&0x1F); - if (ili_init_cmds[cmd].databytes & 0x80) { - vTaskDelay(100 / portTICK_RATE_MS); - } - cmd++; - } - - ili9488_set_orientation(CONFIG_LV_DISPLAY_ORIENTATION); + ili9488_set_orientation(drv, ILI9488_INITIAL_ORIENTATION); } // Flush function based on mvturnho repo @@ -117,7 +101,9 @@ void ili9488_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * col uint8_t *mybuf; do { mybuf = (uint8_t *) heap_caps_malloc(3 * size * sizeof(uint8_t), MALLOC_CAP_DMA); - if (mybuf == NULL) LV_LOG_WARN("Could not allocate enough DMA memory!"); + if (mybuf == NULL) { + LV_LOG_WARN("Could not allocate enough DMA memory!"); + } } while (mybuf == NULL); uint32_t LD = 0; @@ -150,17 +136,17 @@ void ili9488_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * col }; /*Column addresses*/ - ili9488_send_cmd(ILI9488_CMD_COLUMN_ADDRESS_SET); - ili9488_send_data(xb, 4); + ili9488_send_cmd(drv, ILI9488_CMD_COLUMN_ADDRESS_SET); + ili9488_send_data(drv, xb, 4); /*Page addresses*/ - ili9488_send_cmd(ILI9488_CMD_PAGE_ADDRESS_SET); - ili9488_send_data(yb, 4); + ili9488_send_cmd(drv, ILI9488_CMD_PAGE_ADDRESS_SET); + ili9488_send_data(drv, yb, 4); /*Memory write*/ - ili9488_send_cmd(ILI9488_CMD_MEMORY_WRITE); + ili9488_send_cmd(drv, ILI9488_CMD_MEMORY_WRITE); - ili9488_send_color((void *) mybuf, size * 3); + ili9488_send_color(drv, (void *) mybuf, size * 3); heap_caps_free(mybuf); } @@ -168,29 +154,38 @@ void ili9488_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * col * STATIC FUNCTIONS **********************/ +static inline void set_cmd_mode(lv_disp_drv_t * drv) +{ + display_port_gpio_dc(drv, 0); +} -static void ili9488_send_cmd(uint8_t cmd) +static inline void set_data_mode(lv_disp_drv_t * drv) +{ + display_port_gpio_dc(drv, 1); +} + +static void ili9488_send_cmd(lv_disp_drv_t * drv, uint8_t cmd) { disp_wait_for_pending_transactions(); - gpio_set_level(ILI9488_DC, 0); /*Command mode*/ + set_cmd_mode(drv); disp_spi_send_data(&cmd, 1); } -static void ili9488_send_data(void * data, uint16_t length) +static void ili9488_send_data(lv_disp_drv_t * drv, void * data, uint16_t length) { disp_wait_for_pending_transactions(); - gpio_set_level(ILI9488_DC, 1); /*Data mode*/ + set_data_mode(drv); disp_spi_send_data(data, length); } -static void ili9488_send_color(void * data, uint16_t length) +static void ili9488_send_color(lv_disp_drv_t * drv, void * data, uint16_t length) { disp_wait_for_pending_transactions(); - gpio_set_level(ILI9488_DC, 1); /*Data mode*/ + set_data_mode(drv); disp_spi_send_colors(data, length); } -static void ili9488_set_orientation(uint8_t orientation) +static void ili9488_set_orientation(lv_disp_drv_t * drv, uint8_t orientation) { assert(orientation < 4); @@ -204,6 +199,20 @@ static void ili9488_set_orientation(uint8_t orientation) LV_LOG_INFO("0x36 command value: 0x%02X", data[orientation]); - ili9488_send_cmd(0x36); - ili9488_send_data((void *) &data[orientation], 1); + ili9488_send_cmd(drv, 0x36); + ili9488_send_data(drv, (void *) &data[orientation], 1); +} + +/* Reset the display, if we don't have a reset pin we use software reset */ +static void ili9488_reset(lv_disp_drv_t *drv) +{ +#if defined(ILI9488_USE_RST) + display_port_gpio_rst(drv, 0); + display_port_delay(drv, 100); + display_port_gpio_rst(drv, 1); + display_port_delay(drv, 100); +#else + ili9341_send_cmd(drv, 0x01); + display_port_delay(drv, 5); +#endif } diff --git a/lvgl_tft/ili9488.h b/lvgl_tft/ili9488.h index 1c6c6f9..fd393b8 100644 --- a/lvgl_tft/ili9488.h +++ b/lvgl_tft/ili9488.h @@ -20,14 +20,13 @@ extern "C" { #else #include "lvgl/lvgl.h" #endif + #include "../lvgl_helpers.h" +#include "display_config.h" /********************* * DEFINES *********************/ -#define ILI9488_DC CONFIG_LV_DISP_PIN_DC -#define ILI9488_RST CONFIG_LV_DISP_PIN_RST -#define ILI9488_USE_RST CONFIG_LV_DISP_USE_RSTS /******************* * ILI9488 REGS @@ -144,7 +143,7 @@ typedef struct { * GLOBAL PROTOTYPES **********************/ -void ili9488_init(void); +void ili9488_init(lv_disp_drv_t * drv); void ili9488_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map); /********************** From d0eca96cd701261ac6c192769cd543e8878a14e7 Mon Sep 17 00:00:00 2001 From: Tomas Rezucha Date: Thu, 16 Dec 2021 13:36:23 +0100 Subject: [PATCH 077/105] fix SPI names --- .gitignore | 4 ++++ examples/common_components/lvgl | 2 +- lvgl_helpers.c | 37 +++++++-------------------------- lvgl_spi_conf.h | 16 ++++++-------- lvgl_tft/Kconfig | 5 +---- lvgl_touch/Kconfig | 27 +++++++++++------------- 6 files changed, 31 insertions(+), 60 deletions(-) diff --git a/.gitignore b/.gitignore index 38eeab7..c2ff946 100644 --- a/.gitignore +++ b/.gitignore @@ -56,3 +56,7 @@ dkms.conf # ESP-IDF build dir build + +# Kconfig files +sdkconfig +sdkconfig.old diff --git a/examples/common_components/lvgl b/examples/common_components/lvgl index ec9de51..2e94206 160000 --- a/examples/common_components/lvgl +++ b/examples/common_components/lvgl @@ -1 +1 @@ -Subproject commit ec9de515b36641be565d7bace5863ab631ce3b69 +Subproject commit 2e942060f077de19667ec200afcfd2b32352064b diff --git a/lvgl_helpers.c b/lvgl_helpers.c index ab83275..f046e2b 100644 --- a/lvgl_helpers.c +++ b/lvgl_helpers.c @@ -182,34 +182,12 @@ bool lvgl_spi_driver_init(int host, int dma_channel, int quadwp_pin, int quadhd_pin) { - int dma_chan = 0 /* SPI_DMA_DISABLED */; - -#if defined (CONFIG_IDF_TARGET_ESP32) - assert((SPI_HOST <= host) && (VSPI_HOST >= host)); - const char *spi_names[] = { - "SPI_HOST", "HSPI_HOST", "VSPI_HOST" - }; - - dma_chan = dma_channel; -#elif defined (CONFIG_IDF_TARGET_ESP32S2) - assert((SPI_HOST <= host) && (HSPI_HOST >= host)); - const char *spi_names[] = { - "SPI_HOST", "", "" - }; - - dma_chan = dma_channel; -#elif defined (CONFIG_IDF_TARGET_ESP32C3) - assert((SPI1_HOST <= host) && (SPI3_HOST >= host)); + assert((0 <= host) && (SPI_HOST_MAX > host)); const char *spi_names[] = { "SPI1_HOST", "SPI2_HOST", "SPI3_HOST" }; - dma_chan = 3 /* SPI_DMA_CH_AUTO */; -#else -#error "Target chip not selected" -#endif - - ESP_LOGI(TAG, "Configuring SPI host %s (%d)", spi_names[host], host); + ESP_LOGI(TAG, "Configuring SPI host %s", spi_names[host]); ESP_LOGI(TAG, "MISO pin: %d, MOSI pin: %d, SCLK pin: %d, IO2/WP pin: %d, IO3/HD pin: %d", miso_pin, mosi_pin, sclk_pin, quadwp_pin, quadhd_pin); @@ -217,17 +195,16 @@ bool lvgl_spi_driver_init(int host, spi_bus_config_t buscfg = { .miso_io_num = miso_pin, - .mosi_io_num = mosi_pin, - .sclk_io_num = sclk_pin, - .quadwp_io_num = quadwp_pin, - .quadhd_io_num = quadhd_pin, + .mosi_io_num = mosi_pin, + .sclk_io_num = sclk_pin, + .quadwp_io_num = quadwp_pin, + .quadhd_io_num = quadhd_pin, .max_transfer_sz = max_transfer_sz }; ESP_LOGI(TAG, "Initializing SPI bus..."); - esp_err_t ret = spi_bus_initialize(host, &buscfg, dma_chan); + esp_err_t ret = spi_bus_initialize(host, &buscfg, (spi_dma_chan_t)dma_channel); assert(ret == ESP_OK); return ESP_OK != ret; } - diff --git a/lvgl_spi_conf.h b/lvgl_spi_conf.h index cab94d7..662be98 100644 --- a/lvgl_spi_conf.h +++ b/lvgl_spi_conf.h @@ -64,9 +64,7 @@ extern "C" { #define ENABLE_TOUCH_INPUT CONFIG_LV_ENABLE_TOUCH -#if defined (CONFIG_LV_TFT_DISPLAY_SPI1_HOST) -#define TFT_SPI_HOST SPI1_HOST -#elif defined (CONFIG_LV_TFT_DISPLAY_SPI2_HOST) +#if defined (CONFIG_LV_TFT_DISPLAY_SPI2_HOST) #define TFT_SPI_HOST SPI2_HOST #elif defined (CONFIG_LV_TFT_DISPLAY_SPI3_HOST) #define TFT_SPI_HOST SPI3_HOST @@ -86,12 +84,10 @@ extern "C" { #define DISP_SPI_TRANS_MODE_SIO #endif -#if defined (CONFIG_LV_TOUCH_CONTROLLER_SPI_HSPI) -#define TOUCH_SPI_HOST HSPI_HOST -#elif defined (CONFIG_LV_TOUCH_CONTROLLER_SPI_VSPI) -#define TOUCH_SPI_HOST VSPI_HOST -#elif defined (CONFIG_LV_TOUCH_CONTROLLER_SPI_FSPI) -#define TOUCH_SPI_HOST FSPI_HOST +#if defined (CONFIG_LV_TOUCH_CONTROLLER_SPI2_HOST) +#define TOUCH_SPI_HOST SPI2_HOST +#elif defined (CONFIG_LV_TOUCH_CONTROLLER_SPI3_HOST) +#define TOUCH_SPI_HOST SPI3_HOST #endif /* Handle the FT81X Special case */ @@ -107,7 +103,7 @@ extern "C" { // Detect the use of a shared SPI Bus and verify the user specified the same SPI bus for both touch and tft #if defined (CONFIG_LV_TOUCH_DRIVER_PROTOCOL_SPI) && TP_SPI_MOSI == DISP_SPI_MOSI && TP_SPI_CLK == DISP_SPI_CLK #if TFT_SPI_HOST != TOUCH_SPI_HOST -#error You must specify the same SPI host (HSPI, VSPI or FSPI) for both display and touch driver +#error You must specify the same SPI host (SPIx_HOST) for both display and touch driver #endif #define SHARED_SPI_BUS diff --git a/lvgl_tft/Kconfig b/lvgl_tft/Kconfig index b55f1f1..7bfde78 100644 --- a/lvgl_tft/Kconfig +++ b/lvgl_tft/Kconfig @@ -469,13 +469,10 @@ menu "LVGL TFT Display controller" choice prompt "TFT SPI Bus." if LV_TFT_DISPLAY_PROTOCOL_SPI - default LV_TFT_DISPLAY_SPI3_HOST if LV_PREDEFINED_DISPLAY_TTGO && \ - !IDF_TARGET_ESP32S2 + default LV_TFT_DISPLAY_SPI2_HOST help Select the SPI Bus the TFT Display is attached to. - config LV_TFT_DISPLAY_SPI1_HOST - bool "SPI1_HOST" config LV_TFT_DISPLAY_SPI2_HOST bool "SPI2_HOST" config LV_TFT_DISPLAY_SPI3_HOST diff --git a/lvgl_touch/Kconfig b/lvgl_touch/Kconfig index b9908aa..5b6eeb1 100644 --- a/lvgl_touch/Kconfig +++ b/lvgl_touch/Kconfig @@ -67,17 +67,14 @@ menu "LVGL Touch controller" prompt "Touch Controller SPI Bus." depends on LV_TOUCH_DRIVER_PROTOCOL_SPI - default LV_TOUCH_CONTROLLER_SPI_VSPI if !IDF_TARGET_ESP32S2 - default LV_TOUCH_CONTROLLER_SPI_FSPI if IDF_TARGET_ESP32S2 + default LV_TOUCH_CONTROLLER_SPI2_HOST help - Select the SPI Bus the TFT Display is attached to. + Select the SPI Bus the touch controller is attached to. - config LV_TOUCH_CONTROLLER_SPI_HSPI - bool "HSPI" - config LV_TOUCH_CONTROLLER_SPI_VSPI - bool "VSPI" if !IDF_TARGET_ESP32S2 - config LV_TOUCH_CONTROLLER_SPI_FSPI - bool "FSPI" if IDF_TARGET_ESP32S2 + config LV_TOUCH_CONTROLLER_SPI2_HOST + bool "SPI2_HOST" + config LV_TOUCH_CONTROLLER_SPI3_HOST + bool "SPI3_HOST" endchoice menu "Touchpanel (XPT2046) Pin Assignments" @@ -86,7 +83,7 @@ menu "LVGL Touch controller" config LV_TOUCH_SPI_MISO int prompt "GPIO for MISO (Master In Slave Out)" - + default 35 if LV_PREDEFINED_PINS_38V1 default 19 help @@ -103,7 +100,7 @@ menu "LVGL Touch controller" config LV_TOUCH_SPI_CLK int "GPIO for CLK (SCK / Serial Clock)" - + default 26 if LV_PREDEFINED_PINS_38V1 default 18 help @@ -119,7 +116,7 @@ menu "LVGL Touch controller" config LV_TOUCH_PIN_IRQ int "GPIO for IRQ (Interrupt Request)" - + default 27 if LV_PREDEFINED_PINS_38V4 default 25 help @@ -216,7 +213,7 @@ menu "LVGL Touch controller" config LV_TOUCH_SPI_MISO int prompt "GPIO for MISO (Master In Slave Out)" - + default 35 if LV_PREDEFINED_PINS_38V1 default 19 if LV_PREDEFINED_DISPLAY_ADA_FEATHERWING default 19 @@ -472,14 +469,14 @@ menu "LVGL Touch controller" config LV_I2C_TOUCH_PORT_0 bool prompt "I2C port 0" - help + help I2C is shared peripheral managed by I2C Manager. In order to configure I2C Manager (pinout, etc.) see menu Component config->I2C Port Settings. config LV_I2C_TOUCH_PORT_1 bool prompt "I2C port 1" - help + help I2C is shared peripheral managed by I2C Manager. In order to configure I2C Manager (pinout, etc.) see menu Component config->I2C Port Settings. From c78e9fe16946f301310cb89e7536fb9c9a7020b8 Mon Sep 17 00:00:00 2001 From: Carlos Diaz Date: Wed, 29 Dec 2021 23:10:08 -0600 Subject: [PATCH 078/105] Migrate hello_world example to LVGL v8 Update example to LVGL v8. --- .../wemos_lolin_oled/hello_world/main/hello_world.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/wemos_lolin_oled/hello_world/main/hello_world.c b/examples/wemos_lolin_oled/hello_world/main/hello_world.c index 3b0e6b4..ab401d8 100644 --- a/examples/wemos_lolin_oled/hello_world/main/hello_world.c +++ b/examples/wemos_lolin_oled/hello_world/main/hello_world.c @@ -55,15 +55,15 @@ static void guiTask(void *pvParameter) lv_color_t* buf1 = heap_caps_malloc(DISP_BUF_SIZE * sizeof(lv_color_t), MALLOC_CAP_DMA); assert(buf1 != NULL); - static lv_disp_buf_t disp_buf; - lv_disp_buf_init(&disp_buf, buf1, NULL, DISP_BUF_SIZE * 8); + static lv_disp_draw_buf_t disp_buf; + lv_disp_draw_buf_init(&disp_buf, buf1, NULL, DISP_BUF_SIZE * 8); lv_disp_drv_t disp_drv; lv_disp_drv_init(&disp_drv); disp_drv.flush_cb = disp_driver_flush; disp_drv.rounder_cb = disp_driver_rounder; disp_drv.set_px_cb = disp_driver_set_px; - disp_drv.buffer = &disp_buf; + disp_drv.draw_buffer = &disp_buf; lv_disp_drv_register(&disp_drv); /* Create and start a periodic timer interrupt to call lv_tick_inc */ @@ -77,13 +77,13 @@ static void guiTask(void *pvParameter) /* Create a Hellow World label on the currently active screen */ lv_obj_t *scr = lv_disp_get_scr_act(NULL); - lv_obj_t *label1 = lv_label_create(scr, NULL); + lv_obj_t *label1 = lv_label_create(scr); lv_label_set_text(label1, "Hello\nworld"); /* Align the Label to the center * NULL means align on parent (which is the screen now) * 0, 0 at the end means an x, y offset after alignment*/ - lv_obj_align(label1, NULL, LV_ALIGN_CENTER, 0, 0); + lv_obj_align(label1, LV_ALIGN_CENTER, 0, 0); while (1) { vTaskDelay(pdMS_TO_TICKS(10)); From b9377200a66286e546c1c34a5f6281c605170230 Mon Sep 17 00:00:00 2001 From: arktrin Date: Sat, 18 Dec 2021 20:54:50 +0300 Subject: [PATCH 079/105] fix SPI names for touch with ESP32-C3 specific auto-dma proper selection --- lvgl_helpers.c | 12 ++++++--- lvgl_tft/Kconfig | 5 +--- lvgl_touch/Kconfig | 62 +++++++++++++++++++++++----------------------- 3 files changed, 40 insertions(+), 39 deletions(-) diff --git a/lvgl_helpers.c b/lvgl_helpers.c index f046e2b..a96bac3 100644 --- a/lvgl_helpers.c +++ b/lvgl_helpers.c @@ -195,14 +195,18 @@ bool lvgl_spi_driver_init(int host, spi_bus_config_t buscfg = { .miso_io_num = miso_pin, - .mosi_io_num = mosi_pin, - .sclk_io_num = sclk_pin, - .quadwp_io_num = quadwp_pin, - .quadhd_io_num = quadhd_pin, + .mosi_io_num = mosi_pin, + .sclk_io_num = sclk_pin, + .quadwp_io_num = quadwp_pin, + .quadhd_io_num = quadhd_pin, .max_transfer_sz = max_transfer_sz }; ESP_LOGI(TAG, "Initializing SPI bus..."); + #if defined (CONFIG_IDF_TARGET_ESP32C3) + dma_channel = 3; + #endif + esp_err_t ret = spi_bus_initialize(host, &buscfg, (spi_dma_chan_t)dma_channel); assert(ret == ESP_OK); diff --git a/lvgl_tft/Kconfig b/lvgl_tft/Kconfig index 7bfde78..4a74ad2 100644 --- a/lvgl_tft/Kconfig +++ b/lvgl_tft/Kconfig @@ -22,7 +22,7 @@ menu "LVGL TFT Display controller" select LV_TFT_DISPLAY_CONTROLLER_ILI9341 select LV_TFT_DISPLAY_PROTOCOL_SPI config LV_PREDEFINED_DISPLAY_M5CORE2 - bool "M5Core2" + bool "M5Core2" select LV_TFT_DISPLAY_CONTROLLER_ILI9341 select LV_TFT_DISPLAY_PROTOCOL_SPI config LV_PREDEFINED_DISPLAY_M5STICK @@ -1008,6 +1008,3 @@ menu "LVGL TFT Display controller" default 0 endmenu - - - diff --git a/lvgl_touch/Kconfig b/lvgl_touch/Kconfig index 5b6eeb1..b793adb 100644 --- a/lvgl_touch/Kconfig +++ b/lvgl_touch/Kconfig @@ -1,28 +1,28 @@ menu "LVGL Touch controller" config LV_TOUCH_CONTROLLER - int - default 0 if LV_TOUCH_CONTROLLER_NONE - default 1 if LV_TOUCH_CONTROLLER_XPT2046 - default 2 if LV_TOUCH_CONTROLLER_FT6X06 - default 3 if LV_TOUCH_CONTROLLER_STMPE610 + int + default 0 if LV_TOUCH_CONTROLLER_NONE + default 1 if LV_TOUCH_CONTROLLER_XPT2046 + default 2 if LV_TOUCH_CONTROLLER_FT6X06 + default 3 if LV_TOUCH_CONTROLLER_STMPE610 default 4 if LV_TOUCH_CONTROLLER_ADCRAW default 5 if LV_TOUCH_CONTROLLER_FT81X default 6 if LV_TOUCH_CONTROLLER_RA8875 default 7 if LV_TOUCH_CONTROLLER_GT911 choice - prompt "Select a touch panel controller model." - default LV_TOUCH_CONTROLLER_NONE - help - Select the controller for your touch panel. + prompt "Select a touch panel controller model." + default LV_TOUCH_CONTROLLER_NONE + help + Select the controller for your touch panel. - config LV_TOUCH_CONTROLLER_NONE - bool "None" - config LV_TOUCH_CONTROLLER_XPT2046 + config LV_TOUCH_CONTROLLER_NONE + bool "None" + config LV_TOUCH_CONTROLLER_XPT2046 select LV_TOUCH_DRIVER_PROTOCOL_SPI bool "XPT2046" - config LV_TOUCH_CONTROLLER_FT6X06 + config LV_TOUCH_CONTROLLER_FT6X06 select LV_I2C_TOUCH bool "FT6X06" config LV_TOUCH_CONTROLLER_STMPE610 @@ -61,7 +61,7 @@ menu "LVGL Touch controller" bool help Touch controller uses same interface/device as display - (Note: Display must be initialized before touch) + (Note: Display must be initialized before touch) choice prompt "Touch Controller SPI Bus." @@ -150,10 +150,10 @@ menu "LVGL Touch controller" default 4095 if LV_PREDEFINED_PINS_38V4 default 1900 - config LV_TOUCH_XY_SWAP - bool - prompt "Swap XY." - default y + config LV_TOUCH_XY_SWAP + bool + prompt "Swap XY." + default y config LV_TOUCH_INVERT_X bool @@ -275,9 +275,9 @@ menu "LVGL Touch controller" default 3800 config LV_TOUCH_XY_SWAP - bool - prompt "Swap XY." - default n + bool + prompt "Swap XY." + default n config LV_TOUCH_INVERT_X bool @@ -376,25 +376,25 @@ menu "LVGL Touch controller" config LV_TOUCH_X_MIN int prompt "Minimum X coordinate ADC value" - range 0 1023 + range 0 1023 default 0 config LV_TOUCH_Y_MIN int prompt "Minimum Y coordinate ADC value" - range 0 1023 + range 0 1023 default 0 config LV_TOUCH_X_MAX int prompt "Maximum X coordinate ADC value" - range 0 1023 + range 0 1023 default 1023 config LV_TOUCH_Y_MAX int prompt "Maximum Y coordinate ADC value" - range 0 1023 + range 0 1023 default 1023 config LV_TOUCH_XY_SWAP @@ -415,13 +415,13 @@ menu "LVGL Touch controller" config LV_TOUCH_RA8875_SAMPLE_TIME int prompt "TP Sample Time Adjusting" - range 0 7 + range 0 7 default 0 config LV_TOUCH_RA8875_ADC_CLOCK int prompt "ADC Clock Setting" - range 0 7 + range 0 7 default 0 config LV_TOUCH_RA8875_WAKEUP_ENABLE @@ -444,10 +444,10 @@ menu "LVGL Touch controller" menu "Touchpanel Configuration (GT911)" depends on LV_TOUCH_CONTROLLER_GT911 - config LV_GT911_SWAPXY - bool - prompt "Swap X with Y coordinate." - default y + config LV_GT911_SWAPXY + bool + prompt "Swap X with Y coordinate." + default y config LV_GT911_INVERT_X bool From a2a13f1a5fe16c43ed96712cae167131398c9a55 Mon Sep 17 00:00:00 2001 From: arktrin Date: Mon, 20 Dec 2021 12:38:42 +0300 Subject: [PATCH 080/105] replace hardcoded SPI DMA parameter --- lvgl_helpers.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lvgl_helpers.c b/lvgl_helpers.c index a96bac3..6bfdff0 100644 --- a/lvgl_helpers.c +++ b/lvgl_helpers.c @@ -204,7 +204,7 @@ bool lvgl_spi_driver_init(int host, ESP_LOGI(TAG, "Initializing SPI bus..."); #if defined (CONFIG_IDF_TARGET_ESP32C3) - dma_channel = 3; + dma_channel = SPI_DMA_CH_AUTO; #endif esp_err_t ret = spi_bus_initialize(host, &buscfg, (spi_dma_chan_t)dma_channel); From fbb4ebe409384314a6ac5706ba9a209d3df9ee61 Mon Sep 17 00:00:00 2001 From: arktrin Date: Wed, 22 Dec 2021 18:55:54 +0300 Subject: [PATCH 081/105] add offset for 240x135 displays based on ST7789 --- lvgl_tft/st7789.c | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/lvgl_tft/st7789.c b/lvgl_tft/st7789.c index 9794b01..a7e8ac4 100644 --- a/lvgl_tft/st7789.c +++ b/lvgl_tft/st7789.c @@ -98,9 +98,9 @@ void st7789_init(lv_disp_drv_t *drv) st7789_set_orientation(drv, ST7789_INITIAL_ORIENTATION); } -/* The ST7789 display controller can drive 320*240 displays, when using a 240*240 - * display there's a gap of 80px, we need to edit the coordinates to take into - * account that gap, this is not necessary in all orientations. */ +/* The ST7789 display controller can drive up to 320*240 displays, when using a 240*240 + * or 240*135 displays there's a gap of 80px or 40/52/53px respectivly, we need to edit + * the coordinates to take into account those gaps, this is not necessary in all orientations. */ void st7789_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map) { uint8_t data[4] = {0}; @@ -118,13 +118,29 @@ void st7789_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * colo offsety2 += CONFIG_LV_TFT_DISPLAY_Y_OFFSET; #elif (LV_HOR_RES_MAX == 240) && (LV_VER_RES_MAX == 240) -#if (CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT) - offsetx1 += 80; - offsetx2 += 80; -#elif (CONFIG_LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED) - offsety1 += 80; - offsety2 += 80; -#endif + #if (CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT) + offsetx1 += 80; + offsetx2 += 80; + #elif (CONFIG_LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED) + offsety1 += 80; + offsety2 += 80; + #endif +#elif (LV_HOR_RES_MAX == 240) && (LV_VER_RES_MAX == 135) + #if (CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT) || \ + (CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED) + offsetx1 += 40; + offsetx2 += 40; + offsety1 += 53; + offsety2 += 53; + #endif +#elif (LV_HOR_RES_MAX == 135) && (LV_VER_RES_MAX == 240) + #if (CONFIG_LV_DISPLAY_ORIENTATION_LANDSCAPE) || \ + (CONFIG_LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED) + offsetx1 += 52; + offsetx2 += 52; + offsety1 += 40; + offsety2 += 40; + #endif #endif /*Column addresses*/ From 26272b08f09d98a078db8808a8f5758ff1ec9f20 Mon Sep 17 00:00:00 2001 From: arktrin Date: Thu, 23 Dec 2021 22:32:23 +0300 Subject: [PATCH 082/105] clarify the 52/53 px offset oddity --- lvgl_tft/st7789.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lvgl_tft/st7789.c b/lvgl_tft/st7789.c index a7e8ac4..4e03786 100644 --- a/lvgl_tft/st7789.c +++ b/lvgl_tft/st7789.c @@ -98,9 +98,9 @@ void st7789_init(lv_disp_drv_t *drv) st7789_set_orientation(drv, ST7789_INITIAL_ORIENTATION); } -/* The ST7789 display controller can drive up to 320*240 displays, when using a 240*240 - * or 240*135 displays there's a gap of 80px or 40/52/53px respectivly, we need to edit - * the coordinates to take into account those gaps, this is not necessary in all orientations. */ +/* The ST7789 display controller can drive up to 320*240 displays, when using a 240*240 or 240*135 + * displays there's a gap of 80px or 40/52/53px respectively. 52px or 53x offset depends on display orientation. + * We need to edit the coordinates to take into account those gaps, this is not necessary in all orientations. */ void st7789_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map) { uint8_t data[4] = {0}; From 1a8a610b0560d12c82e0bc8e91000409c0be4b77 Mon Sep 17 00:00:00 2001 From: C47D Date: Mon, 3 Jan 2022 20:07:02 -0600 Subject: [PATCH 083/105] Display Kconfig: Fix TTGO default SPI bus and display orientation checks --- lvgl_tft/Kconfig | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/lvgl_tft/Kconfig b/lvgl_tft/Kconfig index 4a74ad2..40b10b6 100644 --- a/lvgl_tft/Kconfig +++ b/lvgl_tft/Kconfig @@ -226,15 +226,15 @@ menu "LVGL TFT Display controller" config LV_TFT_DISPLAY_X_OFFSET depends on LV_TFT_DISPLAY_OFFSETS int "X offset" - default 40 if LV_PREDEFINED_DISPLAY_TTGO && (LV_DISPLAY_ORIENTATION_LANDSCAPE || LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED) - default 53 if LV_PREDEFINED_DISPLAY_TTGO && (LV_DISPLAY_ORIENTATION_PORTRAIT || LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED) + default 40 if LV_PREDEFINED_DISPLAY_TTGO && (DISPLAY_ORIENTATION_LANDSCAPE || DISPLAY_ORIENTATION_LANDSCAPE_INVERTED) + default 53 if LV_PREDEFINED_DISPLAY_TTGO && (DISPLAY_ORIENTATION_PORTRAIT || DISPLAY_ORIENTATION_PORTRAIT_INVERTED) default 0 config LV_TFT_DISPLAY_Y_OFFSET depends on LV_TFT_DISPLAY_OFFSETS int "Y offset" - default 53 if LV_PREDEFINED_DISPLAY_TTGO && (LV_DISPLAY_ORIENTATION_LANDSCAPE || LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED) - default 40 if LV_PREDEFINED_DISPLAY_TTGO && (LV_DISPLAY_ORIENTATION_PORTRAIT || LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED) + default 53 if LV_PREDEFINED_DISPLAY_TTGO && (DISPLAY_ORIENTATION_LANDSCAPE || DISPLAY_ORIENTATION_LANDSCAPE_INVERTED) + default 40 if LV_PREDEFINED_DISPLAY_TTGO && (DISPLAY_ORIENTATION_PORTRAIT || DISPLAY_ORIENTATION_PORTRAIT_INVERTED) default 0 @@ -469,14 +469,15 @@ menu "LVGL TFT Display controller" choice prompt "TFT SPI Bus." if LV_TFT_DISPLAY_PROTOCOL_SPI - default LV_TFT_DISPLAY_SPI2_HOST - help - Select the SPI Bus the TFT Display is attached to. + default LV_TFT_DISPLAY_SPI2_HOST if LV_PREDEFINED_DISPLAY_TTGO && !IDF_TARGET_ESP32S2 + default LV_TFT_DISPLAY_SPI3_HOST if !LV_PREDEFINED_DISPLAY_TTGO && IDF_TARGET_ESP32S2 config LV_TFT_DISPLAY_SPI2_HOST bool "SPI2_HOST" config LV_TFT_DISPLAY_SPI3_HOST bool "SPI3_HOST" + help + Select the SPI Bus the TFT Display is attached to. endchoice choice From 79d8989b2adb370b902fe467f46d1b71855391fe Mon Sep 17 00:00:00 2001 From: Carlos Diaz Date: Tue, 4 Jan 2022 12:24:15 -0600 Subject: [PATCH 084/105] Update display Kconfig Remove IDF_TARGET_ESP32S2 checks on TFT SPI Bus choice --- lvgl_tft/Kconfig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lvgl_tft/Kconfig b/lvgl_tft/Kconfig index 40b10b6..cebb344 100644 --- a/lvgl_tft/Kconfig +++ b/lvgl_tft/Kconfig @@ -469,8 +469,8 @@ menu "LVGL TFT Display controller" choice prompt "TFT SPI Bus." if LV_TFT_DISPLAY_PROTOCOL_SPI - default LV_TFT_DISPLAY_SPI2_HOST if LV_PREDEFINED_DISPLAY_TTGO && !IDF_TARGET_ESP32S2 - default LV_TFT_DISPLAY_SPI3_HOST if !LV_PREDEFINED_DISPLAY_TTGO && IDF_TARGET_ESP32S2 + default LV_TFT_DISPLAY_SPI2_HOST if LV_PREDEFINED_DISPLAY_TTGO + default LV_TFT_DISPLAY_SPI3_HOST if !LV_PREDEFINED_DISPLAY_TTGO config LV_TFT_DISPLAY_SPI2_HOST bool "SPI2_HOST" From 31399e012aa3282aca7204ada01cdd69c43e6a95 Mon Sep 17 00:00:00 2001 From: Carlos Diaz Date: Tue, 4 Jan 2022 17:23:50 -0600 Subject: [PATCH 085/105] Make SPI3 not available for ESP32C3 The ESP32C3 device doesn't have SPI3 --- lvgl_tft/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lvgl_tft/Kconfig b/lvgl_tft/Kconfig index cebb344..5e349d5 100644 --- a/lvgl_tft/Kconfig +++ b/lvgl_tft/Kconfig @@ -475,7 +475,7 @@ menu "LVGL TFT Display controller" config LV_TFT_DISPLAY_SPI2_HOST bool "SPI2_HOST" config LV_TFT_DISPLAY_SPI3_HOST - bool "SPI3_HOST" + bool "SPI3_HOST" if !IDF_TARGET_ESP32C3 help Select the SPI Bus the TFT Display is attached to. endchoice From 9ee177b6846914308e3a1c9ce627ab3c05ad7729 Mon Sep 17 00:00:00 2001 From: C47D Date: Thu, 6 Jan 2022 00:05:03 -0600 Subject: [PATCH 086/105] ST7789: Display offsets are now runtime configurable We don't change previous functionality by adding a helper function that sets the user offsets when initializing the display --- lvgl_tft/st7789.c | 89 ++++++++++++++++++++++++++++++----------------- lvgl_tft/st7789.h | 20 +++++++++++ 2 files changed, 78 insertions(+), 31 deletions(-) diff --git a/lvgl_tft/st7789.c b/lvgl_tft/st7789.c index 4e03786..a5981e5 100644 --- a/lvgl_tft/st7789.c +++ b/lvgl_tft/st7789.c @@ -33,9 +33,12 @@ static void st7789_send_data(lv_disp_drv_t * drv, void *data, uint16_t length); static void st7789_send_color(lv_disp_drv_t * drv, void *data, uint16_t length); static void st7789_reset(lv_disp_drv_t * drv); +static void setup_initial_offsets(void); /********************** * STATIC VARIABLES **********************/ +static uint16_t user_x_offset = 0u; +static uint16_t user_y_offset = 0u; /********************** * MACROS @@ -46,6 +49,8 @@ static void st7789_reset(lv_disp_drv_t * drv); **********************/ void st7789_init(lv_disp_drv_t *drv) { + setup_initial_offsets(); + lcd_init_cmd_t st7789_init_cmds[] = { {0xCF, {0x00, 0x83, 0X30}, 3}, {0xED, {0x64, 0x03, 0X12, 0X81}, 4}, @@ -111,37 +116,10 @@ void st7789_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * colo uint16_t offsety2 = area->y2; uint32_t size = lv_area_get_width(area) * lv_area_get_height(area); -#if (CONFIG_LV_TFT_DISPLAY_OFFSETS) - offsetx1 += CONFIG_LV_TFT_DISPLAY_X_OFFSET; - offsetx2 += CONFIG_LV_TFT_DISPLAY_X_OFFSET; - offsety1 += CONFIG_LV_TFT_DISPLAY_Y_OFFSET; - offsety2 += CONFIG_LV_TFT_DISPLAY_Y_OFFSET; - -#elif (LV_HOR_RES_MAX == 240) && (LV_VER_RES_MAX == 240) - #if (CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT) - offsetx1 += 80; - offsetx2 += 80; - #elif (CONFIG_LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED) - offsety1 += 80; - offsety2 += 80; - #endif -#elif (LV_HOR_RES_MAX == 240) && (LV_VER_RES_MAX == 135) - #if (CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT) || \ - (CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED) - offsetx1 += 40; - offsetx2 += 40; - offsety1 += 53; - offsety2 += 53; - #endif -#elif (LV_HOR_RES_MAX == 135) && (LV_VER_RES_MAX == 240) - #if (CONFIG_LV_DISPLAY_ORIENTATION_LANDSCAPE) || \ - (CONFIG_LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED) - offsetx1 += 52; - offsetx2 += 52; - offsety1 += 40; - offsety2 += 40; - #endif -#endif + offsetx1 += st7789_x_offset(); + offsetx2 += st7789_x_offset(); + offsety1 += st7789_y_offset(); + offsety2 += st7789_y_offset(); /*Column addresses*/ st7789_send_cmd(drv, ST7789_CASET); @@ -164,6 +142,26 @@ void st7789_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * colo st7789_send_color(drv, (void*) color_map, size * 2); } +void st7789_set_x_offset(const uint16_t offset) +{ + user_x_offset = offset; +} + +void st7789_set_y_offset(const uint16_t offset) +{ + user_y_offset = offset; +} + +uint16_t st7789_x_offset(void) +{ + return user_x_offset; +} + +uint16_t st7789_y_offset(void) +{ + return user_y_offset; +} + /********************** * STATIC FUNCTIONS **********************/ @@ -217,6 +215,35 @@ static void st7789_set_orientation(lv_disp_drv_t *drv, uint8_t orientation) st7789_send_data(drv, (void *) &data[orientation], 1); } +static void setup_initial_offsets(void) +{ +#if (CONFIG_LV_TFT_DISPLAY_OFFSETS) + st7789_set_x_offset(CONFIG_LV_TFT_DISPLAY_X_OFFSET); + st7789_set_y_offset(CONFIG_LV_TFT_DISPLAY_Y_OFFSET); + +#elif (LV_HOR_RES_MAX == 240) && (LV_VER_RES_MAX == 240) + #if (CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT) + st7789_set_x_offset(80); + st7789_set_y_offset(0); + #elif (CONFIG_LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED) + st7789_set_x_offset(0); + st7789_set_y_offset(80); + #endif +#elif (LV_HOR_RES_MAX == 240) && (LV_VER_RES_MAX == 135) + #if (CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT) || \ + (CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED) + st7789_set_x_offset(40); + st7789_set_y_offset(53); + #endif +#elif (LV_HOR_RES_MAX == 135) && (LV_VER_RES_MAX == 240) + #if (CONFIG_LV_DISPLAY_ORIENTATION_LANDSCAPE) || \ + (CONFIG_LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED) + st7789_set_x_offset(52); + st7789_set_y_offset(40); + #endif +#endif +} + /* Display update callback, we could update the orientation in here * NOTE Available only for LVGL v8 */ void st7789_update_cb(lv_disp_drv_t *drv) diff --git a/lvgl_tft/st7789.h b/lvgl_tft/st7789.h index be86c21..82c3754 100644 --- a/lvgl_tft/st7789.h +++ b/lvgl_tft/st7789.h @@ -115,6 +115,26 @@ void st7789_init(lv_disp_drv_t *drv); */ void st7789_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map); +/** + * Set display buffer offset at x axis + */ +void st7789_set_x_offset(const uint16_t offset); + +/** + * Set display buffer offset at y axis + */ +void st7789_set_y_offset(const uint16_t offset); + +/** + * Get display buffer offset at x axis + */ +uint16_t st7789_x_offset(void); + +/** + * Get display buffer offset at y axis + */ +uint16_t st7789_y_offset(void); + /** * Display updated callback * From 35d2d3a5afe5f0b1f3fac4222927c873c36e576f Mon Sep 17 00:00:00 2001 From: C47D Date: Thu, 6 Jan 2022 23:30:42 -0600 Subject: [PATCH 087/105] Add LV_DISP_USE_BUSY symbol to enable busy signal --- lvgl_helpers.c | 8 ++++++-- lvgl_tft/Kconfig | 7 +++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/lvgl_helpers.c b/lvgl_helpers.c index 6bfdff0..8beb616 100644 --- a/lvgl_helpers.c +++ b/lvgl_helpers.c @@ -137,7 +137,11 @@ void lvgl_driver_init(void) void display_bsp_init_io(void) { esp_err_t err = ESP_OK; - gpio_config_t io_conf; + gpio_config_t io_conf = { + .pull_up_en = GPIO_PULLUP_DISABLE, + .pull_down_en = GPIO_PULLDOWN_DISABLE, + .intr_type = GPIO_INTR_DISABLE, + }; #ifdef CONFIG_LV_DISPLAY_USE_DC io_conf.mode = GPIO_MODE_OUTPUT; @@ -160,7 +164,7 @@ void display_bsp_init_io(void) ESP_ERROR_CHECK(err); #endif -#ifdef CONFIG_LV_DISP_PIN_BUSY +#ifdef CONFIG_LV_DISP_USE_BUSY io_conf.mode = GPIO_MODE_INPUT; io_conf.pin_bit_mask = (1ULL << CONFIG_LV_DISP_PIN_BUSY); err = gpio_config(&io_conf); diff --git a/lvgl_tft/Kconfig b/lvgl_tft/Kconfig index 5e349d5..706cd07 100644 --- a/lvgl_tft/Kconfig +++ b/lvgl_tft/Kconfig @@ -907,6 +907,13 @@ menu "LVGL TFT Display controller" help Configure the display Reset pin here. + config LV_DISP_USE_BUSY + bool "Use a GPIO for busy signal" if LV_TFT_DISPLAY_CONTROLLER_IL3820 || LV_TFT_DISPLAY_CONTROLLER_JD79653A || LV_TFT_DISPLAY_CONTROLLER_UC8151D + default y if LV_TFT_DISPLAY_CONTROLLER_IL3820 || LV_TFT_DISPLAY_CONTROLLER_JD79653A || LV_TFT_DISPLAY_CONTROLLER_UC8151D + default n + help + Use a GPIO for busy signal available in e-ink display controllers. + config LV_DISP_PIN_BUSY int "GPIO for Busy" if LV_TFT_DISPLAY_CONTROLLER_IL3820 || LV_TFT_DISPLAY_CONTROLLER_JD79653A || LV_TFT_DISPLAY_CONTROLLER_UC8151D default 35 if LV_TFT_DISPLAY_CONTROLLER_IL3820 || LV_TFT_DISPLAY_CONTROLLER_JD79653A || LV_TFT_DISPLAY_CONTROLLER_UC8151D From d0376e705cc523e315374609d65d769e57672541 Mon Sep 17 00:00:00 2001 From: C47D Date: Fri, 7 Jan 2022 15:15:02 -0600 Subject: [PATCH 088/105] uc8151d: Remove unused code --- lvgl_tft/uc8151d.c | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/lvgl_tft/uc8151d.c b/lvgl_tft/uc8151d.c index 91a7f7a..c0b67f3 100644 --- a/lvgl_tft/uc8151d.c +++ b/lvgl_tft/uc8151d.c @@ -94,26 +94,6 @@ static void uc8151d_spi_send_data_byte(uint8_t data) disp_spi_send_data(&data, 1); } -static void uc8151d_spi_send_fb(uint8_t *data, size_t len) -{ - disp_wait_for_pending_transactions(); - gpio_set_level(PIN_DC, 1); // DC = 1 for data - disp_spi_send_colors(data, len); -} - -static void uc8151d_spi_send_seq(const uc8151d_seq_t *seq, size_t len) -{ - LV_LOG_INFO("Writing cmd/data sequence, count %u", len); - - if (!seq || len < 1) return; - for (size_t cmd_idx = 0; cmd_idx < len; cmd_idx++) { - uc8151d_spi_send_cmd(seq[cmd_idx].cmd); - if (seq[cmd_idx].len > 0) { - uc8151d_spi_send_data((uint8_t *) seq[cmd_idx].data, seq[cmd_idx].len); - } - } -} - static esp_err_t uc8151d_wait_busy(uint32_t timeout_ms) { uint32_t wait_ticks = (timeout_ms == 0 ? portMAX_DELAY : pdMS_TO_TICKS(timeout_ms)); @@ -196,8 +176,6 @@ static void uc8151d_full_update(uint8_t *buf) void uc8151d_lv_fb_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map) { - size_t len = ((area->x2 - area->x1 + 1) * (area->y2 - area->y1 + 1)) / 8; - LV_LOG_INFO("x1: 0x%x, x2: 0x%x, y1: 0x%x, y2: 0x%x", area->x1, area->x2, area->y1, area->y2); LV_LOG_INFO("Writing LVGL fb with len: %u", len); From f669a09b1945391266f5f54d97d5cdacc2464973 Mon Sep 17 00:00:00 2001 From: C47D Date: Fri, 7 Jan 2022 15:15:18 -0600 Subject: [PATCH 089/105] jd79653a: Remove unused code --- lvgl_tft/jd79653a.c | 9 --------- 1 file changed, 9 deletions(-) diff --git a/lvgl_tft/jd79653a.c b/lvgl_tft/jd79653a.c index f71b673..4872266 100644 --- a/lvgl_tft/jd79653a.c +++ b/lvgl_tft/jd79653a.c @@ -176,13 +176,6 @@ static void jd79653a_spi_send_data(uint8_t *data, size_t len) disp_spi_send_data(data, len); } -static void jd79653a_spi_send_fb(uint8_t *data, size_t len) -{ - disp_wait_for_pending_transactions(); - gpio_set_level(PIN_DC, 1); // DC = 1 for data - disp_spi_send_colors(data, len); -} - static void jd79653a_spi_send_seq(const jd79653a_seq_t *seq, size_t len) { LV_LOG_INFO("Writing cmd/data sequence, count %u", len); @@ -409,8 +402,6 @@ void jd79653a_lv_rounder_cb(struct _disp_drv_t *disp_drv, lv_area_t *area) void jd79653a_lv_fb_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map) { - size_t len = ((area->x2 - area->x1 + 1) * (area->y2 - area->y1 + 1)) / 8; - LV_LOG_INFO("x1: 0x%x, x2: 0x%x, y1: 0x%x, y2: 0x%x", area->x1, area->x2, area->y1, area->y2); LV_LOG_INFO("Writing LVGL fb with len: %u, partial counter: %u", len, partial_counter); From dcff9a7f11ba54da3c589818d4ea4a903c3e70ca Mon Sep 17 00:00:00 2001 From: C47D Date: Fri, 7 Jan 2022 15:15:55 -0600 Subject: [PATCH 090/105] ili9481: Add missing braces --- lvgl_tft/ili9481.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lvgl_tft/ili9481.c b/lvgl_tft/ili9481.c index a599059..565182d 100644 --- a/lvgl_tft/ili9481.c +++ b/lvgl_tft/ili9481.c @@ -114,7 +114,9 @@ void ili9481_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * col uint8_t *mybuf; do { mybuf = (uint8_t *) heap_caps_malloc(3 * size * sizeof(uint8_t), MALLOC_CAP_DMA); - if (mybuf == NULL) LV_LOG_WARN("Could not allocate enough DMA memory!"); + if (mybuf == NULL) { + LV_LOG_WARN("Could not allocate enough DMA memory!"); + } } while (mybuf == NULL); uint32_t LD = 0; @@ -189,11 +191,13 @@ static void ili9481_send_color(void * data, uint16_t length) static void ili9481_set_orientation(uint8_t orientation) { +#if (LV_USE_LOG == 1) const char *orientation_str[] = { "PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED" }; LV_LOG_INFO("Display orientation: %s", orientation_str[orientation]); +#endif uint8_t data[] = {0x48, 0x4B, 0x28, 0x2B}; ili9481_send_cmd(ILI9481_CMD_MEMORY_ACCESS_CONTROL); From bb0e3a1f2736d544ef549af2b96aba09811272cb Mon Sep 17 00:00:00 2001 From: C47D Date: Fri, 7 Jan 2022 15:16:27 -0600 Subject: [PATCH 091/105] Check for LV_USE_LOG when logging orientation --- lvgl_tft/GC9A01.c | 13 +++++++------ lvgl_tft/ili9163c.c | 3 ++- lvgl_tft/ili9486.c | 7 ++++--- lvgl_tft/ili9488.c | 6 +++--- lvgl_tft/st7735s.c | 13 ++++++++----- lvgl_tft/st7796s.c | 11 ++++++----- 6 files changed, 30 insertions(+), 23 deletions(-) diff --git a/lvgl_tft/GC9A01.c b/lvgl_tft/GC9A01.c index 81a71d3..27902b5 100644 --- a/lvgl_tft/GC9A01.c +++ b/lvgl_tft/GC9A01.c @@ -221,12 +221,6 @@ static void GC9A01_set_orientation(uint8_t orientation) { assert(orientation < 4); - const char *orientation_str[] = { - "PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED" - }; - - LV_LOG_INFO("Display orientation: %s", orientation_str[orientation]); - #if defined CONFIG_LV_PREDEFINED_DISPLAY_M5STACK const uint8_t data[] = {0x68, 0x68, 0x08, 0x08}; #elif defined (CONFIG_LV_PREDEFINED_DISPLAY_WROVER4) @@ -235,7 +229,14 @@ static void GC9A01_set_orientation(uint8_t orientation) const uint8_t data[] = {0x08, 0xC8, 0x68, 0xA8}; #endif +#if (LV_USE_LOG == 1); + const char *orientation_str[] = { + "PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED" + }; + + LV_LOG_INFO("Display orientation: %s", orientation_str[orientation]); LV_LOG_INFO("0x36 command value: 0x%02X", data[orientation]); +#endif GC9A01_send_cmd(0x36); GC9A01_send_data((void *) &data[orientation], 1); diff --git a/lvgl_tft/ili9163c.c b/lvgl_tft/ili9163c.c index 56b9fca..0db6592 100644 --- a/lvgl_tft/ili9163c.c +++ b/lvgl_tft/ili9163c.c @@ -223,11 +223,12 @@ static void ili9163c_set_orientation(uint8_t orientation) { assert(orientation < 4); +#if (LV_USE_LOG == 1) const char *orientation_str[] = { "PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED"}; LV_LOG_INFO("Display orientation: %s", orientation_str[orientation]); - +#endif uint8_t data[] = {0x48, 0x88, 0xA8, 0x68}; ili9163c_send_cmd(ILI9163C_MADCTL); diff --git a/lvgl_tft/ili9486.c b/lvgl_tft/ili9486.c index b4e3a0a..2283e54 100644 --- a/lvgl_tft/ili9486.c +++ b/lvgl_tft/ili9486.c @@ -165,15 +165,16 @@ static void ili9486_set_orientation(uint8_t orientation) { assert(orientation < 4); + const uint8_t data[] = {0x48, 0x88, 0x28, 0xE8}; + +#if (LV_USE_LOG == 1) const char *orientation_str[] = { "PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED" }; LV_LOG_INFO("Display orientation: %s", orientation_str[orientation]); - - const uint8_t data[] = {0x48, 0x88, 0x28, 0xE8}; - LV_LOG_INFO("0x36 command value: 0x%02X", data[orientation]); +#endif ili9486_send_cmd(0x36); ili9486_send_data((void *) &data[orientation], 1); diff --git a/lvgl_tft/ili9488.c b/lvgl_tft/ili9488.c index 1f67391..8a02eef 100644 --- a/lvgl_tft/ili9488.c +++ b/lvgl_tft/ili9488.c @@ -188,16 +188,16 @@ static void ili9488_send_color(lv_disp_drv_t * drv, void * data, uint16_t length static void ili9488_set_orientation(lv_disp_drv_t * drv, uint8_t orientation) { assert(orientation < 4); + const uint8_t data[] = {0x48, 0x88, 0x28, 0xE8}; +#if (LV_USE_LOG == 1) const char *orientation_str[] = { "PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED" }; LV_LOG_INFO("Display orientation: %s", orientation_str[orientation]); - - const uint8_t data[] = {0x48, 0x88, 0x28, 0xE8}; - LV_LOG_INFO("0x36 command value: 0x%02X", data[orientation]); +#endif ili9488_send_cmd(drv, 0x36); ili9488_send_data(drv, (void *) &data[orientation], 1); diff --git a/lvgl_tft/st7735s.c b/lvgl_tft/st7735s.c index 0f23a29..c2786a1 100644 --- a/lvgl_tft/st7735s.c +++ b/lvgl_tft/st7735s.c @@ -205,11 +205,7 @@ static void st7735s_send_color(void * data, uint16_t length) static void st7735s_set_orientation(uint8_t orientation) { - const char *orientation_str[] = { - "PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED" - }; - - LV_LOG_INFO("Display orientation: %s", orientation_str[orientation]); + assert(orientation < 4); /* Portrait: 0xC8 = ST77XX_MADCTL_MX | ST77XX_MADCTL_MY | ST77XX_MADCTL_BGR @@ -218,7 +214,14 @@ static void st7735s_set_orientation(uint8_t orientation) */ uint8_t data[] = {0xC8, 0xC8, 0xA8, 0xA8}; +#if (LV_USE_LOG == 1) + const char *orientation_str[] = { + "PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED" + }; + + LV_LOG_INFO("Display orientation: %s", orientation_str[orientation]); LV_LOG_INFO("0x36 command value: 0x%02X", data[orientation]); +#endif st7735s_send_cmd(ST7735_MADCTL); st7735s_send_data((void *) &data[orientation], 1); diff --git a/lvgl_tft/st7796s.c b/lvgl_tft/st7796s.c index 8bc07e5..75e9bd2 100644 --- a/lvgl_tft/st7796s.c +++ b/lvgl_tft/st7796s.c @@ -189,11 +189,6 @@ static void st7796s_set_orientation(uint8_t orientation) { assert(orientation < 4); - const char *orientation_str[] = { - "PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED"}; - - LV_LOG_INFO("Display orientation: %s", orientation_str[orientation]); - #if defined CONFIG_LV_PREDEFINED_DISPLAY_M5STACK const uint8_t data[] = {0x68, 0x68, 0x08, 0x08}; #elif defined(CONFIG_LV_PREDEFINED_DISPLAY_WROVER4) @@ -204,7 +199,13 @@ static void st7796s_set_orientation(uint8_t orientation) const uint8_t data[] = {0x48, 0x88, 0x28, 0xE8}; #endif +#if (LV_USE_LOG == 1) + const char *orientation_str[] = { + "PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED"}; + + LV_LOG_INFO("Display orientation: %s", orientation_str[orientation]); LV_LOG_INFO("0x36 command value: 0x%02X", data[orientation]); +#endif st7796s_send_cmd(0x36); st7796s_send_data((void *)&data[orientation], 1); From 17eb416ef880f4e6eaf5867fa149e4692ae7f1c6 Mon Sep 17 00:00:00 2001 From: Carlos Diaz Date: Fri, 7 Jan 2022 17:22:11 -0600 Subject: [PATCH 092/105] Update helpers and drivers to handle LVGLv7 and v8 versions (#161) * [lvgl_helpers] Cleanup and misc code cleanup Checks for SPI_HOST_MAX symbol before using it. Rename lvgl_driver_init to lvgl_interface_init because it now only initialize the interface bus for display drivers, we still need to remove the indev drivers from here. Use types defined in spi_types.h for spi host (spi_host_device_t) and spi dma channels (spi_dma_chan_t). Also add a couple of symbols to avoid using magic numbers * [lvgl_helpers] Reduce usage of if defined in lvgl_interface_init * [lvgl_helpers] Fix spi dma channel for ESP-IDF versions <= 4.2 * [examples] Update hello_world to call lvgl_interface_init * Add lvgl_get_display_buffer_size helper This helper will allow us to get the calculated display buffer size instead of using a global symbol. * Implement lvgl_get_display_buffer_size This API will be used to get the calculation of display buffer size. * Delete DISP_BUF_SIZE symbols The same functionality is handled by lvgl_get_display_buffer_size * Move SPI max transfer size calculation to helper Use calculate_spi_max_transfer_size to calculate the SPI max transfer size for the SPI master configuration * Remove SPI_BUS_MAX_TRANSFER_SZ definition Same functionality is now handled in calculate_spi_max_transfer_size * Update display buffer size calculation Use lvgl_get_display_buffer_size helper instead of DISP_BUF_SIZE symbol * Update example to LVGL v8 Add comments about changes from: - LVGL v7 to LVGL v8 - Configuration helpers and display drivers * Update lvgl_helpers.c * Update sh1107 driver * Update EVE driver Check for symbols used in previous implementations before trying to use them and add a fallback temporary implementation when not found. The falback implementation isn't tested with hardware. Symbols: - DISP_BUF_SIZE - SPI_TRANSFER_SIZE * Update uc8151d driver * Update jd79653a driver * Update ra8875 driver * Update il3820.h Check for LV_HOR_RES_MAX and LV_VER_RES_MAX before trying to use them * Update lvgl_helpers.c Check for ESP-IDF version before trying to use spi_dma_chan_t type --- .../hello_world/main/hello_world.c | 19 ++- lvgl_helpers.c | 158 +++++++++++++++--- lvgl_helpers.h | 70 +------- lvgl_spi_conf.h | 21 --- lvgl_tft/EVE_commands.c | 8 +- lvgl_tft/EVE_config.h | 4 + lvgl_tft/il3820.h | 11 ++ lvgl_tft/jd79653a.c | 33 +++- lvgl_tft/jd79653a.h | 8 +- lvgl_tft/ra8875.c | 33 +++- lvgl_tft/sh1107.c | 59 +++++-- lvgl_tft/sh1107.h | 4 +- lvgl_tft/uc8151d.c | 23 ++- lvgl_tft/uc8151d.h | 6 +- 14 files changed, 309 insertions(+), 148 deletions(-) diff --git a/examples/wemos_lolin_oled/hello_world/main/hello_world.c b/examples/wemos_lolin_oled/hello_world/main/hello_world.c index ab401d8..6ef1146 100644 --- a/examples/wemos_lolin_oled/hello_world/main/hello_world.c +++ b/examples/wemos_lolin_oled/hello_world/main/hello_world.c @@ -50,20 +50,29 @@ static void guiTask(void *pvParameter) { (void) pvParameter; lv_init(); - lvgl_driver_init(); + + /* Initialize the needed peripherals */ + lvgl_interface_init(); + /* Initialize needed GPIOs, e.g. backlight, reset GPIOs */ + display_bsp_init_io(); + /* ToDo Initialize used display driver passing registered lv_disp_drv_t as parameter */ - lv_color_t* buf1 = heap_caps_malloc(DISP_BUF_SIZE * sizeof(lv_color_t), MALLOC_CAP_DMA); + size_t display_buffer_size = lvgl_get_display_buffer_size(); + lv_color_t* buf1 = heap_caps_malloc(display_buffer_size * sizeof(lv_color_t), MALLOC_CAP_DMA); assert(buf1 != NULL); static lv_disp_draw_buf_t disp_buf; - lv_disp_draw_buf_init(&disp_buf, buf1, NULL, DISP_BUF_SIZE * 8); + lv_disp_draw_buf_init(&disp_buf, buf1, NULL, display_buffer_size * 8); lv_disp_drv_t disp_drv; lv_disp_drv_init(&disp_drv); disp_drv.flush_cb = disp_driver_flush; disp_drv.rounder_cb = disp_driver_rounder; disp_drv.set_px_cb = disp_driver_set_px; - disp_drv.draw_buffer = &disp_buf; + disp_drv.draw_buf = &disp_buf; + /* LVGL v8: Set display horizontal and vertical resolution (in pixels), it's no longer done with lv_conf.h */ + disp_drv.hor_res = 128u; + disp_drv.ver_res = 64u; lv_disp_drv_register(&disp_drv); /* Create and start a periodic timer interrupt to call lv_tick_inc */ @@ -77,6 +86,8 @@ static void guiTask(void *pvParameter) /* Create a Hellow World label on the currently active screen */ lv_obj_t *scr = lv_disp_get_scr_act(NULL); + + /* LVGL v8 lv_label_create no longer takes 2 parameters */ lv_obj_t *label1 = lv_label_create(scr); lv_label_set_text(label1, "Hello\nworld"); diff --git a/lvgl_helpers.c b/lvgl_helpers.c index 8beb616..a8946f5 100644 --- a/lvgl_helpers.c +++ b/lvgl_helpers.c @@ -9,6 +9,7 @@ #include "sdkconfig.h" #include "lvgl_helpers.h" #include "esp_log.h" +#include "esp_idf_version.h" #include "lvgl_tft/disp_spi.h" #include "lvgl_touch/tp_spi.h" @@ -29,6 +30,8 @@ #define TAG "lvgl_helpers" +#define GPIO_NOT_USED (-1) +#define DMA_DEFAULT_TRANSFER_SIZE (0u) /********************** * TYPEDEFS **********************/ @@ -37,6 +40,13 @@ * STATIC PROTOTYPES **********************/ +/** + * Calculates the SPI max transfer size based on the display buffer size + * + * @return SPI max transfer size in bytes + */ +static int calculate_spi_max_transfer_size(const int display_buffer_size); + /********************** * STATIC VARIABLES **********************/ @@ -49,8 +59,8 @@ * GLOBAL FUNCTIONS **********************/ -/* Interface and driver initialization */ -void lvgl_driver_init(void) +/* Interface (SPI, I2C) initialization */ +void lvgl_interface_init(void) { /* Since LVGL v8 LV_HOR_RES_MAX and LV_VER_RES_MAX are not defined, so * print it only if they are defined. */ @@ -58,14 +68,17 @@ void lvgl_driver_init(void) ESP_LOGI(TAG, "Display hor size: %d, ver size: %d", LV_HOR_RES_MAX, LV_VER_RES_MAX); #endif - ESP_LOGI(TAG, "Display buffer size: %d", DISP_BUF_SIZE); + ESP_LOGI(TAG, "Display buffer size: %d", lvgl_get_display_buffer_size()); #if defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X) ESP_LOGI(TAG, "Initializing SPI master for FT81X"); + size_t display_buffer_size = lvgl_get_display_buffer_size(); + int spi_max_transfer_size = calculate_spi_max_transfer_size(display_buffer_size); + lvgl_spi_driver_init(TFT_SPI_HOST, DISP_SPI_MISO, DISP_SPI_MOSI, DISP_SPI_CLK, - SPI_BUS_MAX_TRANSFER_SZ, 1, + spi_max_transfer_size, SPI_DMA_CH1, DISP_SPI_IO2, DISP_SPI_IO3); disp_spi_add_device(TFT_SPI_HOST); @@ -77,32 +90,31 @@ void lvgl_driver_init(void) return; #endif +/* Display controller initialization */ +#if defined (CONFIG_LV_TFT_DISPLAY_PROTOCOL_SPI) || defined (SHARED_SPI_BUS) + ESP_LOGI(TAG, "Initializing SPI master"); + + int miso = DISP_SPI_MISO; + size_t display_buffer_size = lvgl_get_display_buffer_size(); + int spi_max_transfer_size = calculate_spi_max_transfer_size(display_buffer_size); + #if defined (SHARED_SPI_BUS) - ESP_LOGI(TAG, "Initializing shared SPI master"); + miso = TP_SPI_MISO; +#endif lvgl_spi_driver_init(TFT_SPI_HOST, - TP_SPI_MISO, DISP_SPI_MOSI, DISP_SPI_CLK, - SPI_BUS_MAX_TRANSFER_SZ, 1, - -1, -1); + miso, DISP_SPI_MOSI, DISP_SPI_CLK, + spi_max_transfer_size, SPI_DMA_CH1, + DISP_SPI_IO2, DISP_SPI_IO3); disp_spi_add_device(TFT_SPI_HOST); +#if defined (SHARED_SPI_BUS) tp_spi_add_device(TOUCH_SPI_HOST); - touch_driver_init(); return; #endif -/* Display controller initialization */ -#if defined CONFIG_LV_TFT_DISPLAY_PROTOCOL_SPI - ESP_LOGI(TAG, "Initializing SPI master for display"); - - lvgl_spi_driver_init(TFT_SPI_HOST, - DISP_SPI_MISO, DISP_SPI_MOSI, DISP_SPI_CLK, - SPI_BUS_MAX_TRANSFER_SZ, 1, - DISP_SPI_IO2, DISP_SPI_IO3); - - disp_spi_add_device(TFT_SPI_HOST); #elif defined (CONFIG_LV_I2C_DISPLAY) #else #error "No protocol defined for display controller" @@ -115,8 +127,8 @@ void lvgl_driver_init(void) lvgl_spi_driver_init(TOUCH_SPI_HOST, TP_SPI_MISO, TP_SPI_MOSI, TP_SPI_CLK, - 0 /* Defaults to 4094 */, 2, - -1, -1); + DMA_DEFAULT_TRANSFER_SIZE, SPI_DMA_CH2, + GPIO_NOT_USED, GPIO_NOT_USED); tp_spi_add_device(TOUCH_SPI_HOST); @@ -157,7 +169,8 @@ void display_bsp_init_io(void) ESP_ERROR_CHECK(err); #endif -#if !defined(CONFIG_LV_DISP_BACKLIGHT_OFF) && defined(CONFIG_LV_DISP_PIN_BCKL) +#if !defined(CONFIG_LV_DISP_BACKLIGHT_OFF) && defined(CONFIG_LV_DISP_PIN_BCKL) && \ + (CONFIG_LV_DISP_PIN_BCKL > 0) io_conf.mode = GPIO_MODE_OUTPUT; io_conf.pin_bit_mask = (1ULL << CONFIG_LV_DISP_PIN_BCKL); err = gpio_config(&io_conf); @@ -172,6 +185,67 @@ void display_bsp_init_io(void) #endif } +/* DISP_BUF_SIZE value doesn't have an special meaning, but it's the size + * of the buffer(s) passed to LVGL as display buffers. The default values used + * were the values working for the contributor of the display controller. + * + * As LVGL supports partial display updates the DISP_BUF_SIZE doesn't + * necessarily need to be equal to the display size. + * + * When using RGB displays the display buffer size will also depends on the + * color format being used, for RGB565 each pixel needs 2 bytes. + * When using the mono theme, the display pixels can be represented in one bit, + * so the buffer size can be divided by 8, e.g. see SSD1306 display size. */ +size_t lvgl_get_display_buffer_size(void) +{ + size_t disp_buffer_size = 0; + +#if LVGL_VERSION_MAJOR < 8 +#if defined (CONFIG_CUSTOM_DISPLAY_BUFFER_SIZE) + disp_buffer_size = CONFIG_CUSTOM_DISPLAY_BUFFER_BYTES; +#else + /* Calculate total of 40 lines of display horizontal size */ +#if defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7789) || \ + defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7735S) || \ + defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7796S) || \ + defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_HX8357) || \ + defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9481) || \ + defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9486) || \ + defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9488) || \ + defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9341) || \ + defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X) || \ + defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_RA8875) || \ + defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_GC9A01) || \ + defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9163C) + disp_buffer_size = LV_HOR_RES_MAX * 40; +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SH1107 + disp_buffer_size = LV_HOR_RES_MAX * LV_VER_RES_MAX; +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SSD1306 +#if defined (CONFIG_LV_THEME_MONO) + disp_buffer_size = LV_HOR_RES_MAX * (LV_VER_RES_MAX / 8); +#else + disp_buffer_size = LV_HOR_RES_MAX * LV_VER_RES_MAX); +#endif +#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_IL3820) + disp_buffer_size = LV_VER_RES_MAX * IL3820_COLUMNS; +#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_JD79653A) + disp_buffer_size = ((LV_VER_RES_MAX * LV_VER_RES_MAX) / 8); // 5KB +#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_UC8151D) + disp_buffer_size = ((LV_VER_RES_MAX * LV_VER_RES_MAX) / 8); // 2888 bytes +#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_PCD8544) + disp_buffer_size = (LV_HOR_RES_MAX * (LV_VER_RES_MAX / 8)); +#else +#error "No display controller selected" +#endif +#endif + +#else /* LVGL v8 */ + /* ToDo: Implement display buffer size calculation with configuration values from the display driver */ +#endif + + return disp_buffer_size; +} + /* Initialize spi bus master * * NOTE: dma_chan type and value changed to int instead of spi_dma_chan_t @@ -180,13 +254,18 @@ void display_bsp_init_io(void) * We could use the ESP_IDF_VERSION_VAL macro available in the "esp_idf_version.h" * header available since ESP-IDF v4. */ -bool lvgl_spi_driver_init(int host, +bool lvgl_spi_driver_init(spi_host_device_t host, int miso_pin, int mosi_pin, int sclk_pin, int max_transfer_sz, int dma_channel, int quadwp_pin, int quadhd_pin) { - assert((0 <= host) && (SPI_HOST_MAX > host)); +#if defined (SPI_HOST_MAX) + assert((SPI1_HOST <= host) && (SPI_HOST_MAX > host)); +#else + assert((SPI1_HOST <= host) && ((SPI3_HOST + 1) > host)); +#endif + const char *spi_names[] = { "SPI1_HOST", "SPI2_HOST", "SPI3_HOST" }; @@ -210,9 +289,38 @@ bool lvgl_spi_driver_init(int host, #if defined (CONFIG_IDF_TARGET_ESP32C3) dma_channel = SPI_DMA_CH_AUTO; #endif - + +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 3, 0) esp_err_t ret = spi_bus_initialize(host, &buscfg, (spi_dma_chan_t)dma_channel); +#else + esp_err_t ret = spi_bus_initialize(host, &buscfg, dma_channel); +#endif + assert(ret == ESP_OK); return ESP_OK != ret; } + +static int calculate_spi_max_transfer_size(const int display_buffer_size) +{ + int retval = 0; + +#if defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9481) || \ + defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9488) + retval = display_buffer_size * 3; +#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9341) || \ + defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7789) || \ + defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7735S) || \ + defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_HX8357) || \ + 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_ILI9163C) + retval = display_buffer_size * 2; +#else + retval = display_buffer_size * 2; +#endif + + return retval; +} diff --git a/lvgl_helpers.h b/lvgl_helpers.h index 5c5a17a..ca73431 100644 --- a/lvgl_helpers.h +++ b/lvgl_helpers.h @@ -14,6 +14,8 @@ extern "C" { *********************/ #include +#include "driver/spi_common.h" + #include "lvgl_spi_conf.h" #include "lvgl_tft/disp_driver.h" #include "lvgl_tft/esp_lcd_backlight.h" @@ -23,66 +25,6 @@ extern "C" { * DEFINES *********************/ -/* DISP_BUF_SIZE value doesn't have an special meaning, but it's the size - * of the buffer(s) passed to LVGL as display buffers. The default values used - * were the values working for the contributor of the display controller. - * - * As LVGL supports partial display updates the DISP_BUF_SIZE doesn't - * necessarily need to be equal to the display size. - * - * When using RGB displays the display buffer size will also depends on the - * color format being used, for RGB565 each pixel needs 2 bytes. - * When using the mono theme, the display pixels can be represented in one bit, - * so the buffer size can be divided by 8, e.g. see SSD1306 display size. */ -#if defined (CONFIG_CUSTOM_DISPLAY_BUFFER_SIZE) -#define DISP_BUF_SIZE CONFIG_CUSTOM_DISPLAY_BUFFER_BYTES -#else -#if defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7789) -#define DISP_BUF_SIZE (LV_HOR_RES_MAX * 40) -#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7735S -#define DISP_BUF_SIZE (LV_HOR_RES_MAX * 40) -#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7796S -#define DISP_BUF_SIZE (LV_HOR_RES_MAX * 40) -#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_HX8357 -#define DISP_BUF_SIZE (LV_HOR_RES_MAX * 40) -#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SH1107 -#define DISP_BUF_SIZE (LV_HOR_RES_MAX * LV_VER_RES_MAX) -#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9481 -#define DISP_BUF_SIZE (LV_HOR_RES_MAX * 40) -#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9486 -#define DISP_BUF_SIZE (LV_HOR_RES_MAX * 40) -#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9488 -#define DISP_BUF_SIZE (LV_HOR_RES_MAX * 40) -#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9341 -#define DISP_BUF_SIZE (LV_HOR_RES_MAX * 40) -#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SSD1306 -#if defined (CONFIG_LV_THEME_MONO) -#define DISP_BUF_SIZE (LV_HOR_RES_MAX * (LV_VER_RES_MAX / 8)) -#else -#define DISP_BUF_SIZE (LV_HOR_RES_MAX * LV_VER_RES_MAX) -#endif -#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X) -#define DISP_BUF_LINES 40 -#define DISP_BUF_SIZE (LV_HOR_RES_MAX * DISP_BUF_LINES) -#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_IL3820) -#define DISP_BUF_SIZE (LV_VER_RES_MAX * IL3820_COLUMNS) -#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_RA8875 -#define DISP_BUF_SIZE (LV_HOR_RES_MAX * 40) -#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_GC9A01) -#define DISP_BUF_SIZE (LV_HOR_RES_MAX * 40) -#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_JD79653A) -#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) -#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_PCD8544) -#define DISP_BUF_SIZE (LV_HOR_RES_MAX * (LV_VER_RES_MAX / 8)) -#else -#error "No display controller selected" -#endif -#endif - /********************** * TYPEDEFS **********************/ @@ -94,14 +36,18 @@ extern "C" { void lvgl_i2c_locking(void* leader); /* Initialize detected SPI and I2C bus and devices */ -void lvgl_driver_init(void); +void lvgl_interface_init(void); /* Initialize SPI master */ -bool lvgl_spi_driver_init(int host, int miso_pin, int mosi_pin, int sclk_pin, +bool lvgl_spi_driver_init(spi_host_device_t host, int miso_pin, int mosi_pin, int sclk_pin, int max_transfer_sz, int dma_channel, int quadwp_pin, int quadhd_pin); /* Initialize display GPIOs, e.g. DC and RST pins */ void display_bsp_init_io(void); + +/* Get display buffer size */ +size_t lvgl_get_display_buffer_size(void); + /********************** * MACROS **********************/ diff --git a/lvgl_spi_conf.h b/lvgl_spi_conf.h index 662be98..34e784f 100644 --- a/lvgl_spi_conf.h +++ b/lvgl_spi_conf.h @@ -114,27 +114,6 @@ extern "C" { /********************** * TYPEDEFS **********************/ -#if defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9481) || \ - defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9488) - -#define SPI_BUS_MAX_TRANSFER_SZ (DISP_BUF_SIZE * 3) - -#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9341) || \ - defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7789) || \ - defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7735S) || \ - defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_HX8357) || \ - 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_ILI9163C) - -#define SPI_BUS_MAX_TRANSFER_SZ (DISP_BUF_SIZE * 2) - -#else -#define SPI_BUS_MAX_TRANSFER_SZ (DISP_BUF_SIZE * 2) -#endif - #if defined (CONFIG_LV_TFT_USE_CUSTOM_SPI_CLK_DIVIDER) #define SPI_TFT_CLOCK_SPEED_HZ ((80 * 1000 * 1000) / CONFIG_LV_TFT_CUSTOM_SPI_CLK_DIVIDER) #else diff --git a/lvgl_tft/EVE_commands.c b/lvgl_tft/EVE_commands.c index 8765609..90c347f 100644 --- a/lvgl_tft/EVE_commands.c +++ b/lvgl_tft/EVE_commands.c @@ -267,7 +267,13 @@ void EVE_memWrite_buffer(uint32_t ftAddress, const uint8_t *data, uint32_t len, uint32_t bytes_left = len; while(bytes_left > 0) { - uint32_t block_len = (bytes_left > SPI_TRANSER_SIZE ? SPI_TRANSER_SIZE : bytes_left); + uint32_t block_len = 0; + +#if defined (SPI_TRANSFER_SIZE) + block_len = (bytes_left > SPI_TRANSER_SIZE ? SPI_TRANSER_SIZE : bytes_left); +#else + /* ToDo Update SPI_TRANSFER_SIZE calculation, it's based on the DISP_BUF_SIZE */ +#endif // only send flush on last chunk disp_spi_send_flag_t flush_flag = 0; diff --git a/lvgl_tft/EVE_config.h b/lvgl_tft/EVE_config.h index a15e746..af7e305 100644 --- a/lvgl_tft/EVE_config.h +++ b/lvgl_tft/EVE_config.h @@ -51,7 +51,11 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR TH #define EVE_PDN CONFIG_LV_DISP_PIN_RST // grey #define EVE_USE_PDN CONFIG_LV_DISP_USE_RST +#if defined (DISP_BUF_SIZE) #define SPI_TRANSER_SIZE (DISP_BUF_SIZE * (LV_COLOR_DEPTH / 8)) +#else + /* ToDo Update using new API */ +#endif #define BYTES_PER_PIXEL (LV_COLOR_DEPTH / 8) // bytes per pixel for (16 for RGB565) #define BYTES_PER_LINE (EVE_HSIZE * BYTES_PER_PIXEL) diff --git a/lvgl_tft/il3820.h b/lvgl_tft/il3820.h index f77ffb4..d175c5d 100644 --- a/lvgl_tft/il3820.h +++ b/lvgl_tft/il3820.h @@ -20,8 +20,19 @@ extern "C" /* Values for Waveshare 2.9inch e-Paper Module, this values shouldn't be * swapped to change display orientation */ +#if defined (LV_HOR_RES_MAX) #define EPD_PANEL_WIDTH LV_HOR_RES_MAX /* 128 */ +#else + /* Fallback to default value */ +#define EPD_PANEL_WIDTH 128u +#endif + +#if defined (LV_VER_RES_MAX) #define EPD_PANEL_HEIGHT LV_VER_RES_MAX /* 296 */ +#else + /* Fallback to default value */ +#define EPD_PANEL_HEIGHT 296u +#endif /* 128 = panel width */ #define IL3820_COLUMNS (EPD_PANEL_WIDTH / 8) diff --git a/lvgl_tft/jd79653a.c b/lvgl_tft/jd79653a.c index 4872266..a9e5590 100644 --- a/lvgl_tft/jd79653a.c +++ b/lvgl_tft/jd79653a.c @@ -44,9 +44,24 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR TH #define PIN_BUSY CONFIG_LV_DISP_PIN_BUSY #define PIN_BUSY_BIT ((1ULL << (uint8_t)(CONFIG_LV_DISP_PIN_BUSY))) #define EVT_BUSY (1UL << 0UL) + +#if defined (LV_HOR_RES_MAX) #define EPD_WIDTH LV_HOR_RES_MAX +#else + /* ToDo Remove magic number */ +#define EPD_WIDTH 256u +#endif + +#if defined (LV_VER_RES_MAX) #define EPD_HEIGHT LV_VER_RES_MAX +#else + /* ToDo Remove magic number */ +#define EPD_HEIGHT 128u +#endif + #define EPD_ROW_LEN (EPD_HEIGHT / 8u) + +/* ToDo Remove semicolon */ #define EPD_PARTIAL_CNT 5; #define BIT_SET(a, b) ((a) |= (1U << (b))) @@ -200,21 +215,21 @@ static esp_err_t jd79653a_wait_busy(uint32_t timeout_ms) return ((bits & EVT_BUSY) != 0) ? ESP_OK : ESP_ERR_TIMEOUT; } -static void jd79653a_power_on() +static void jd79653a_power_on(void) { jd79653a_spi_send_seq(power_on_seq, EPD_SEQ_LEN(power_on_seq)); vTaskDelay(pdMS_TO_TICKS(10)); jd79653a_wait_busy(0); } -static void jd79653a_power_off() +static void jd79653a_power_off(void) { jd79653a_spi_send_seq(power_off_seq, EPD_SEQ_LEN(power_off_seq)); vTaskDelay(pdMS_TO_TICKS(10)); jd79653a_wait_busy(0); } -static void jd79653a_load_partial_lut() +static void jd79653a_load_partial_lut(void) { jd79653a_spi_send_cmd(0x20); // LUT VCOM register jd79653a_spi_send_data((uint8_t *)lut_vcom_dc1, sizeof(lut_vcom_dc1)); @@ -232,7 +247,7 @@ static void jd79653a_load_partial_lut() jd79653a_spi_send_data((uint8_t *)lut_bb1, sizeof(lut_bb1)); } -static void jd79653a_partial_in() +static void jd79653a_partial_in(void) { LV_LOG_INFO("Partial in!"); @@ -260,7 +275,7 @@ static void jd79653a_partial_in() jd79653a_spi_send_cmd(0x91); } -static void jd79653a_partial_out() +static void jd79653a_partial_out(void) { LV_LOG_INFO("Partial out!"); @@ -378,7 +393,7 @@ void jd79653a_fb_full_update(uint8_t *data, size_t len) jd79653a_power_off(); } -void jd79653a_lv_set_fb_cb(struct _disp_drv_t *disp_drv, uint8_t *buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, +void jd79653a_lv_set_fb_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) { uint16_t byte_index = (x >> 3u) + (y * EPD_ROW_LEN); @@ -391,7 +406,7 @@ void jd79653a_lv_set_fb_cb(struct _disp_drv_t *disp_drv, uint8_t *buf, lv_coord_ } } -void jd79653a_lv_rounder_cb(struct _disp_drv_t *disp_drv, lv_area_t *area) +void jd79653a_lv_rounder_cb(lv_disp_drv_t *disp_drv, lv_area_t *area) { // Always send full framebuffer if it's not in partial mode area->x1 = 0; @@ -419,7 +434,7 @@ void jd79653a_lv_fb_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t lv_disp_flush_ready(drv); } -void jd79653a_deep_sleep() +void jd79653a_deep_sleep(void) { jd79653a_spi_send_seq(power_off_seq, EPD_SEQ_LEN(power_off_seq)); jd79653a_wait_busy(1000); @@ -429,7 +444,7 @@ void jd79653a_deep_sleep() jd79653a_spi_send_data(&check_code, sizeof(check_code)); } -void jd79653a_init() +void jd79653a_init(void) { // Initialise event group jd79653a_evts = xEventGroupCreate(); diff --git a/lvgl_tft/jd79653a.h b/lvgl_tft/jd79653a.h index 6a2065a..b25e805 100644 --- a/lvgl_tft/jd79653a.h +++ b/lvgl_tft/jd79653a.h @@ -17,12 +17,12 @@ extern "C" #include "lvgl/lvgl.h" #endif -void jd79653a_init(); -void jd79653a_deep_sleep(); +void jd79653a_init(void); +void jd79653a_deep_sleep(void); -void jd79653a_lv_set_fb_cb(struct _disp_drv_t * disp_drv, uint8_t* buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, +void jd79653a_lv_set_fb_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); -void jd79653a_lv_rounder_cb(struct _disp_drv_t * disp_drv, lv_area_t *area); +void jd79653a_lv_rounder_cb(lv_disp_drv_t * disp_drv, lv_area_t *area); void jd79653a_lv_fb_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map); void jd79653a_fb_set_full_color(uint8_t color); diff --git a/lvgl_tft/ra8875.c b/lvgl_tft/ra8875.c index 7021a45..97f0d1e 100644 --- a/lvgl_tft/ra8875.c +++ b/lvgl_tft/ra8875.c @@ -26,8 +26,19 @@ #define BYTES_PER_PIXEL (LV_COLOR_DEPTH / 8) +#if defined (LV_HOR_RES_MAX) #define HDWR_VAL (LV_HOR_RES_MAX/8 - 1) +#else + /* ToDo Remove magic number 256u */ +#define HDWR_VAL (256u/8u - 1u) +#endif + +#if defined (LV_VER_RES_MAX) #define VDHR_VAL (LV_VER_RES_MAX - 1) +#else + /* ToDo Remove magic number 128u */ +#define VDHR_VAL (128u - 1u) +#endif #define VDIR_MASK (1 << 2) #define HDIR_MASK (1 << 3) @@ -234,7 +245,16 @@ void ra8875_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * colo // Set window if needed if ((x1 != area->x1) || (x2 != area->x2)) { LV_LOG_INFO("flush: set window (x1,x2): %d,%d -> %d,%d", x1, x2, area->x1, area->x2); - ra8875_set_window(area->x1, area->x2, 0, LV_VER_RES_MAX-1); + unsigned int ye = 0; + +#if LVGL_VERSION_MAJOR < 8 + ye = LV_VER_RES_MAX - 1; +#else + /* ToDo Get y end from driver information */ +#endif + + ra8875_set_window(area->x1, area->x2, 0, ye); + x1 = area->x1; x2 = area->x2; } @@ -248,7 +268,16 @@ void ra8875_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * colo // Update to future cursor location y = area->y2 + 1; - if (y >= LV_VER_RES_MAX) { + lv_coord_t ver_max = 0; + +#if LVGL_VERSION_MAJOR < 8 + ver_max = LV_VER_RES_MAX; +#else + /* ToDo Get vertical max from driver information */ + ver_max = lv_disp_get_ver_res((lv_disp_t *) drv); +#endif + + if (y >= ver_max) { y = 0; } diff --git a/lvgl_tft/sh1107.c b/lvgl_tft/sh1107.c index 6f787b2..84ab65c 100644 --- a/lvgl_tft/sh1107.c +++ b/lvgl_tft/sh1107.c @@ -35,6 +35,9 @@ static void sh1107_send_cmd(uint8_t cmd); static void sh1107_send_data(void * data, uint16_t length); static void sh1107_send_color(void * data, uint16_t length); +static lv_coord_t get_display_ver_res(lv_disp_drv_t *disp_drv); +static lv_coord_t get_display_hor_res(lv_disp_drv_t *disp_drv); + /********************** * STATIC VARIABLES **********************/ @@ -117,7 +120,7 @@ void sh1107_init(void) } } -void sh1107_set_px_cb(struct _disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, +void sh1107_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) { /* buf_w will be ignored, the configured CONFIG_LV_DISPLAY_HEIGHT and _WIDTH, @@ -126,10 +129,10 @@ void sh1107_set_px_cb(struct _disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t b uint8_t bit_index = 0; #if defined CONFIG_LV_DISPLAY_ORIENTATION_LANDSCAPE - byte_index = y + (( x>>3 ) * LV_VER_RES_MAX); + byte_index = y + (( x>>3 ) * get_display_ver_res(disp_drv)); bit_index = x & 0x7; #elif defined CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT - byte_index = x + (( y>>3 ) * LV_HOR_RES_MAX); + byte_index = x + (( y>>3 ) * get_display_hor_res(disp_drv)); bit_index = y & 0x7; #endif @@ -161,9 +164,9 @@ void sh1107_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * colo sh1107_send_cmd(0xB0 | i); // Set Page Start Address for Page Addressing Mode size = area->y2 - area->y1 + 1; #if defined CONFIG_LV_DISPLAY_ORIENTATION_LANDSCAPE - ptr = color_map + i * LV_VER_RES_MAX; + ptr = color_map + i * get_display_ver_res(drv); #else - ptr = color_map + i * LV_HOR_RES_MAX; + ptr = color_map + i * get_display_hor_res(drv); #endif if(i != row2){ sh1107_send_data( (void *) ptr, size); @@ -174,21 +177,21 @@ void sh1107_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * colo } } -void sh1107_rounder(struct _disp_drv_t * disp_drv, lv_area_t *area) +void sh1107_rounder(lv_disp_drv_t * disp_drv, lv_area_t *area) { // workaround: always send complete size display buffer area->x1 = 0; area->y1 = 0; - area->x2 = LV_HOR_RES_MAX-1; - area->y2 = LV_VER_RES_MAX-1; + area->x2 = get_display_hor_res(disp_drv) - 1; + area->y2 = get_display_ver_res(disp_drv) - 1; } -void sh1107_sleep_in() +void sh1107_sleep_in(void) { sh1107_send_cmd(0xAE); } -void sh1107_sleep_out() +void sh1107_sleep_out(void) { sh1107_send_cmd(0xAF); } @@ -218,3 +221,39 @@ static void sh1107_send_color(void * data, uint16_t length) gpio_set_level(SH1107_DC, 1); /*Data mode*/ disp_spi_send_colors(data, length); } + +static lv_coord_t get_display_ver_res(lv_disp_drv_t *disp_drv) +{ + lv_coord_t val = 0; + +#if LVGL_VERSION_MAJOR < 8 +#if defined CONFIG_LV_DISPLAY_ORIENTATION_LANDSCAPE + val = LV_VER_RES_MAX; +#endif +#else + /* ToDo Use display rotation API to get vertical size */ +#if defined CONFIG_LV_DISPLAY_ORIENTATION_LANDSCAPE + val = lv_disp_get_ver_res((lv_disp_t *) disp_drv); +#endif +#endif + + return val; +} + +static lv_coord_t get_display_hor_res(lv_disp_drv_t *disp_drv) +{ + lv_coord_t val = 0; + +#if LVGL_VERSION_MAJOR < 8 +#if defined CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT + val = LV_HOR_RES_MAX; +#endif +#else + /* ToDo Use display rotation API to get horizontal size */ +#if defined CONFIG_LV_DISPLAY_ORIENTATION_PORTRAIT + val = lv_disp_get_hor_res((lv_disp_t *) disp_drv); +#endif +#endif + + return val; +} diff --git a/lvgl_tft/sh1107.h b/lvgl_tft/sh1107.h index ba77a61..20beda3 100644 --- a/lvgl_tft/sh1107.h +++ b/lvgl_tft/sh1107.h @@ -39,8 +39,8 @@ extern "C" { void sh1107_init(void); void sh1107_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map); -void sh1107_rounder(struct _disp_drv_t * disp_drv, lv_area_t *area); -void sh1107_set_px_cb(struct _disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, +void sh1107_rounder(lv_disp_drv_t * disp_drv, lv_area_t *area); +void sh1107_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); void sh1107_sleep_in(void); void sh1107_sleep_out(void); diff --git a/lvgl_tft/uc8151d.c b/lvgl_tft/uc8151d.c index c0b67f3..472fc3d 100644 --- a/lvgl_tft/uc8151d.c +++ b/lvgl_tft/uc8151d.c @@ -45,8 +45,21 @@ #define PIN_BUSY CONFIG_LV_DISP_PIN_BUSY #define PIN_BUSY_BIT ((1ULL << (uint8_t)(CONFIG_LV_DISP_PIN_BUSY))) #define EVT_BUSY (1UL << 0UL) + +#if defined (LV_HOR_RES_MAX) #define EPD_WIDTH LV_HOR_RES_MAX +#else + /* ToDo Fix, 256 is just a magic number */ +#define EPD_WIDTH 256u +#endif + +#if defined (LV_VER_RES_MAX) #define EPD_HEIGHT LV_VER_RES_MAX +#else + /* ToDo Fix, 128 is just a magic number */ +#define EPD_HEIGHT 128u +#endif + #define EPD_ROW_LEN (EPD_HEIGHT / 8u) #define BIT_SET(a, b) ((a) |= (1U << (b))) @@ -105,7 +118,7 @@ static esp_err_t uc8151d_wait_busy(uint32_t timeout_ms) return ((bits & EVT_BUSY) != 0) ? ESP_OK : ESP_ERR_TIMEOUT; } -static void uc8151d_sleep() +static void uc8151d_sleep(void) { // Set VCOM to 0xf7 uc8151d_spi_send_cmd(0x50); @@ -122,7 +135,7 @@ static void uc8151d_sleep() static void uc8151d_reset(void); -static void uc8151d_panel_init() +static void uc8151d_panel_init(void) { // Hardware reset for 3 times - not sure why but it's from official demo code for (uint8_t cnt = 0; cnt < 3; cnt++) { @@ -186,7 +199,7 @@ void uc8151d_lv_fb_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t * LV_LOG_INFO("Ready"); } -void uc8151d_lv_set_fb_cb(struct _disp_drv_t *disp_drv, uint8_t *buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, +void uc8151d_lv_set_fb_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) { uint16_t byte_index = (x >> 3u) + (y * EPD_ROW_LEN); @@ -200,7 +213,7 @@ void uc8151d_lv_set_fb_cb(struct _disp_drv_t *disp_drv, uint8_t *buf, lv_coord_t } } -void uc8151d_lv_rounder_cb(struct _disp_drv_t *disp_drv, lv_area_t *area) +void uc8151d_lv_rounder_cb(lv_disp_drv_t *disp_drv, lv_area_t *area) { // Always send full framebuffer if it's not in partial mode area->x1 = 0; @@ -209,7 +222,7 @@ void uc8151d_lv_rounder_cb(struct _disp_drv_t *disp_drv, lv_area_t *area) area->y2 = EPD_HEIGHT - 1; } -void uc8151d_init() +void uc8151d_init(void) { // Initialise event group uc8151d_evts = xEventGroupCreate(); diff --git a/lvgl_tft/uc8151d.h b/lvgl_tft/uc8151d.h index e637f0e..3a27f8f 100644 --- a/lvgl_tft/uc8151d.h +++ b/lvgl_tft/uc8151d.h @@ -29,11 +29,11 @@ #include -void uc8151d_init(); -void uc8151d_lv_set_fb_cb(struct _disp_drv_t *disp_drv, uint8_t *buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, +void uc8151d_init(void); +void uc8151d_lv_set_fb_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); -void uc8151d_lv_rounder_cb(struct _disp_drv_t *disp_drv, lv_area_t *area); +void uc8151d_lv_rounder_cb(lv_disp_drv_t *disp_drv, lv_area_t *area); void uc8151d_lv_fb_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map); #endif //LVGL_DEMO_UC8151D_H From ff055b629e7d8d0cad7b65c7aa28c33789839f2c Mon Sep 17 00:00:00 2001 From: C47D Date: Fri, 7 Jan 2022 17:27:12 -0600 Subject: [PATCH 093/105] ili9488: Fix typo --- lvgl_tft/ili9488.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lvgl_tft/ili9488.c b/lvgl_tft/ili9488.c index 8a02eef..66c0496 100644 --- a/lvgl_tft/ili9488.c +++ b/lvgl_tft/ili9488.c @@ -212,7 +212,7 @@ static void ili9488_reset(lv_disp_drv_t *drv) display_port_gpio_rst(drv, 1); display_port_delay(drv, 100); #else - ili9341_send_cmd(drv, 0x01); + ili9488_send_cmd(drv, 0x01); display_port_delay(drv, 5); #endif } From 62704efd08678955ba52260d537a1e283b7d097a Mon Sep 17 00:00:00 2001 From: C47D Date: Fri, 7 Jan 2022 17:38:08 -0600 Subject: [PATCH 094/105] Remove semicolon from preprocessor --- lvgl_tft/GC9A01.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lvgl_tft/GC9A01.c b/lvgl_tft/GC9A01.c index 27902b5..b571818 100644 --- a/lvgl_tft/GC9A01.c +++ b/lvgl_tft/GC9A01.c @@ -229,7 +229,7 @@ static void GC9A01_set_orientation(uint8_t orientation) const uint8_t data[] = {0x08, 0xC8, 0x68, 0xA8}; #endif -#if (LV_USE_LOG == 1); +#if (LV_USE_LOG == 1) const char *orientation_str[] = { "PORTRAIT", "PORTRAIT_INVERTED", "LANDSCAPE", "LANDSCAPE_INVERTED" }; From 6af2ab1f1c9b39b1d176c0b804842791b9689cae Mon Sep 17 00:00:00 2001 From: C47D Date: Fri, 7 Jan 2022 18:30:56 -0600 Subject: [PATCH 095/105] EVE_commands: Remove unused code --- lvgl_tft/EVE_commands.c | 1 - 1 file changed, 1 deletion(-) diff --git a/lvgl_tft/EVE_commands.c b/lvgl_tft/EVE_commands.c index 90c347f..6c7a083 100644 --- a/lvgl_tft/EVE_commands.c +++ b/lvgl_tft/EVE_commands.c @@ -334,7 +334,6 @@ uint8_t EVE_busy(void) cmdOffset += 8; - BUFFER_SPI_BYTE BUFFER_SPI_BYTE(MEM_WRITE | 0x30); /* send Memory Write plus high address byte of REG_CMD_WRITE for EVE81x */ BUFFER_SPI_BYTE(0x20); /* send middle address byte of REG_CMD_WRITE for EVE81x */ BUFFER_SPI_BYTE(0xfc); /* send low address byte of REG_CMD_WRITE for EVE81x */ From 11f9c2b93fbddb6380a2b5175844b9bb17bd3755 Mon Sep 17 00:00:00 2001 From: C47D Date: Tue, 11 Jan 2022 18:14:57 -0600 Subject: [PATCH 096/105] pcd8544: Update driver --- lvgl_tft/pcd8544.c | 100 ++++++++++++++++++++++++--------------------- lvgl_tft/pcd8544.h | 8 +--- 2 files changed, 55 insertions(+), 53 deletions(-) diff --git a/lvgl_tft/pcd8544.c b/lvgl_tft/pcd8544.c index 49d067e..77321d8 100644 --- a/lvgl_tft/pcd8544.c +++ b/lvgl_tft/pcd8544.c @@ -6,15 +6,11 @@ * https://github.com/olikraus/u8g2 */ -#include "disp_spi.h" -#include "driver/gpio.h" - -#include -#include "freertos/FreeRTOS.h" -#include "freertos/task.h" - #include "pcd8544.h" +#include "disp_spi.h" +#include "display_port.h" + #define TAG "lv_pcd8544" /********************** @@ -27,24 +23,33 @@ /********************** * STATIC FUNCTIONS **********************/ +static inline void set_cmd_mode(lv_disp_drv_t * drv) +{ + display_port_gpio_dc(drv, 0); +} -static void pcd8544_send_cmd(uint8_t cmd) +static inline void set_data_mode(lv_disp_drv_t * drv) +{ + display_port_gpio_dc(drv, 1); +} + +static void pcd8544_send_cmd(lv_disp_drv_t *drv, uint8_t cmd) { disp_wait_for_pending_transactions(); - gpio_set_level(PCD8544_DC, 0); /*Command mode*/ + set_cmd_mode(drv); disp_spi_send_data(&cmd, 1); } -static void pcd8544_send_data(void * data, uint16_t length) +static void pcd8544_send_data(lv_disp_drv_t *drv, void * data, uint16_t length) { disp_wait_for_pending_transactions(); - gpio_set_level(PCD8544_DC, 1); /*Data mode*/ + set_data_mode(drv); disp_spi_send_data(data, length); } -static void pcd8544_send_colors(void * data, uint16_t length) +static void pcd8544_send_colors(lv_disp_drv_t *drv, void * data, uint16_t length) { - gpio_set_level(PCD8544_DC, 1); /*Data mode*/ + set_data_mode(drv); disp_spi_send_colors(data, length); } @@ -52,37 +57,38 @@ static void pcd8544_send_colors(void * data, uint16_t length) * GLOBAL FUNCTIONS **********************/ -void pcd8544_init(void){ - - // TODO: orientation - - // Initialize non-SPI GPIOs - gpio_pad_select_gpio(PCD8544_DC); - gpio_set_direction(PCD8544_DC, GPIO_MODE_OUTPUT); - gpio_pad_select_gpio(PCD8544_RST); - gpio_set_direction(PCD8544_RST, GPIO_MODE_OUTPUT); - - // Reset the display - gpio_set_level(PCD8544_RST, 0); - vTaskDelay(100 / portTICK_RATE_MS); - gpio_set_level(PCD8544_RST, 1); - vTaskDelay(100 / portTICK_RATE_MS); - - pcd8544_send_cmd(0x21); /* activate chip (PD=0), horizontal increment (V=0), enter extended command set (H=1) */ - pcd8544_send_cmd(0x06); /* temp. control: b10 = 2 */ - pcd8544_send_cmd(0x13); /* bias system 1:48 */ - pcd8544_send_cmd(0xc0); /* medium Vop = Contrast 0x40 = 64 */ - - pcd8544_send_cmd(0x20); /* activate chip (PD=0), horizontal increment (V=0), enter extended command set (H=0) */ - pcd8544_send_cmd(0x0c); /* display mode normal */ +void pcd8544_reset(lv_disp_drv_t *drv) +{ + display_port_gpio_rst(drv, 0); + display_port_delay(drv, 100); + display_port_gpio_rst(drv, 1); + display_port_delay(drv, 100); } -void pcd8544_set_contrast (uint8_t contrast){ +void pcd8544_init(lv_disp_drv_t *drv) +{ + // TODO: orientation + + // Reset the display + pcd8544_reset(drv); + + pcd8544_send_cmd(drv, 0x21); /* activate chip (PD=0), horizontal increment (V=0), enter extended command set (H=1) */ + pcd8544_send_cmd(drv, 0x06); /* temp. control: b10 = 2 */ + pcd8544_send_cmd(drv, 0x13); /* bias system 1:48 */ + pcd8544_send_cmd(drv, 0xc0); /* medium Vop = Contrast 0x40 = 64 */ + + pcd8544_send_cmd(drv, 0x20); /* activate chip (PD=0), horizontal increment (V=0), enter extended command set (H=0) */ + pcd8544_send_cmd(drv, 0x0c); /* display mode normal */ +} + +void pcd8544_set_contrast(lv_disp_drv_t *drv, uint8_t contrast) +{ if (contrast > 0x7f){ contrast = 0x7f; } - pcd8544_send_cmd(0x21); /* activate chip (PD=0), horizontal increment (V=0), enter extended command set (H=1) */ - pcd8544_send_cmd(0x80 | contrast); /* medium Vop = Contrast */ + + pcd8544_send_cmd(drv, 0x21); /* activate chip (PD=0), horizontal increment (V=0), enter extended command set (H=1) */ + pcd8544_send_cmd(drv, 0x80 | contrast); /* medium Vop = Contrast */ } void pcd8544_rounder(lv_disp_drv_t * disp_drv, lv_area_t *area){ @@ -112,7 +118,7 @@ void pcd8544_set_px_cb(lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w void pcd8544_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_map){ - pcd8544_send_cmd(0x20); /* activate chip (PD=0), horizontal increment (V=0), enter extended command set (H=0) */ + pcd8544_send_cmd(disp_drv, 0x20); /* activate chip (PD=0), horizontal increment (V=0), enter extended command set (H=0) */ uint8_t * buf = (uint8_t *) color_map; @@ -123,9 +129,9 @@ void pcd8544_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t // send complete frame buffer at once. // NOTE: disp_spi_send_colors triggers lv_disp_flush_ready - pcd8544_send_cmd(0x40); /* set Y address */ - pcd8544_send_cmd(0x80); /* set X address */ - pcd8544_send_colors(buf, disp_drv->hor_res * disp_drv->ver_res / 8); + pcd8544_send_cmd(disp_drv, 0x40); /* set Y address */ + pcd8544_send_cmd(disp_drv, 0x80); /* set X address */ + pcd8544_send_colors(disp_drv, buf, disp_drv->hor_res * disp_drv->ver_res / 8); } else { @@ -136,11 +142,11 @@ void pcd8544_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t uint16_t bank; uint16_t cols_to_update = area->x2 - area->x1 + 1; - for (bank = bank_start ; bank <= bank_end ; bank++ ){ - pcd8544_send_cmd(0x40 | bank ); /* set Y address */ - pcd8544_send_cmd(0x80 | area->x1 ); /* set X address */ + for (bank = bank_start ; bank <= bank_end ; bank++){ + pcd8544_send_cmd(disp_drv, 0x40 | bank); /* set Y address */ + pcd8544_send_cmd(disp_drv, 0x80 | area->x1); /* set X address */ uint16_t offset = bank * disp_drv->hor_res + area->x1; - pcd8544_send_data(&buf[offset], cols_to_update); + pcd8544_send_data(disp_drv, &buf[offset], cols_to_update); } lv_disp_flush_ready(disp_drv); diff --git a/lvgl_tft/pcd8544.h b/lvgl_tft/pcd8544.h index 24fcc71..de0dd4a 100644 --- a/lvgl_tft/pcd8544.h +++ b/lvgl_tft/pcd8544.h @@ -26,10 +26,6 @@ extern "C" { * DEFINES *********************/ -#define PCD8544_DC CONFIG_LV_DISP_PIN_DC -#define PCD8544_RST CONFIG_LV_DISP_PIN_RST -#define PCD8544_BCKL CONFIG_LV_DISP_PIN_BCKL - /********************** * TYPEDEFS **********************/ @@ -38,12 +34,12 @@ extern "C" { * GLOBAL PROTOTYPES **********************/ -void pcd8544_init(void); +void pcd8544_init(lv_disp_drv_t *drv); void pcd8544_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map); void pcd8544_rounder(lv_disp_drv_t * disp_drv, lv_area_t *area); void pcd8544_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); -void pcd8544_set_contrast(uint8_t contrast); +void pcd8544_set_contrast(lv_disp_drv_t *drv, uint8_t contrast); /********************** * MACROS From 6418f805bb133cf95229381a7d1416b44c119f09 Mon Sep 17 00:00:00 2001 From: C47D Date: Tue, 11 Jan 2022 18:15:22 -0600 Subject: [PATCH 097/105] display_config: Add missing defined --- display_config.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/display_config.h b/display_config.h index 7452b43..cdc3374 100644 --- a/display_config.h +++ b/display_config.h @@ -8,8 +8,8 @@ extern "C" { #include "sdkconfig.h" /* Configuration options for ST7789 display controllers */ -#if CONFIG_LV_DISP_USE_RST - #if CONFIG_LV_DISP_ST7789_SOFT_RESET +#if defined CONFIG_LV_DISP_USE_RST + #if defined CONFIG_LV_DISP_ST7789_SOFT_RESET #define ST7789_SOFT_RST #endif #else From 9b4eedd00f4634490008da55bda58259cc27177e Mon Sep 17 00:00:00 2001 From: C47D Date: Tue, 11 Jan 2022 18:17:09 -0600 Subject: [PATCH 098/105] disp_driver: Pass pointer to lv_disp_drv_t to pcd8544_init --- lvgl_tft/disp_driver.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lvgl_tft/disp_driver.c b/lvgl_tft/disp_driver.c index be55086..cae5768 100644 --- a/lvgl_tft/disp_driver.c +++ b/lvgl_tft/disp_driver.c @@ -44,7 +44,7 @@ void *disp_driver_init(lv_disp_drv_t *drv) #elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9163C ili9163c_init(); #elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_PCD8544 - pcd8544_init(); + pcd8544_init(drv); #endif return disp_backlight_init(); From 8dda9ded4f928536e3b61fbdc76ebc211718d431 Mon Sep 17 00:00:00 2001 From: Carlos Diaz Date: Wed, 26 Jan 2022 09:49:27 -0600 Subject: [PATCH 099/105] Cleanup lvgl_spi_config (#174) * lvgl_spi_conf: Arrange SPI host pins section * lvgl_spi_conf: Arrange touch pins section * lvgl_spi_conf: Arrange SPI host section * lvgl_spi_conf: Arrange SHARED_SPI_BUS section --- lvgl_spi_conf.h | 86 +++++++++++++++++++++++++++---------------------- 1 file changed, 48 insertions(+), 38 deletions(-) diff --git a/lvgl_spi_conf.h b/lvgl_spi_conf.h index 34e784f..c7e1672 100644 --- a/lvgl_spi_conf.h +++ b/lvgl_spi_conf.h @@ -18,25 +18,32 @@ extern "C" { * DEFINES *********************/ // DISPLAY PINS + +/* Mandatory pins are MOSI and CLK */ #define DISP_SPI_MOSI CONFIG_LV_DISP_SPI_MOSI +#define DISP_SPI_CLK CONFIG_LV_DISP_SPI_CLK + +/* Optional pins */ #if defined (CONFIG_LV_DISPLAY_USE_SPI_MISO) - #define DISP_SPI_MISO CONFIG_LV_DISP_SPI_MISO - #define DISP_SPI_INPUT_DELAY_NS CONFIG_LV_DISP_SPI_INPUT_DELAY_NS +#define DISP_SPI_MISO CONFIG_LV_DISP_SPI_MISO +#define DISP_SPI_INPUT_DELAY_NS CONFIG_LV_DISP_SPI_INPUT_DELAY_NS #else - #define DISP_SPI_MISO (-1) - #define DISP_SPI_INPUT_DELAY_NS (0) +#define DISP_SPI_MISO (-1) +#define DISP_SPI_INPUT_DELAY_NS (0U) #endif + #if defined(CONFIG_LV_DISP_SPI_IO2) #define DISP_SPI_IO2 CONFIG_LV_DISP_SPI_IO2 #else #define DISP_SPI_IO2 (-1) #endif + #if defined(CONFIG_LV_DISP_SPI_IO3) #define DISP_SPI_IO3 CONFIG_LV_DISP_SPI_IO3 #else #define DISP_SPI_IO3 (-1) #endif -#define DISP_SPI_CLK CONFIG_LV_DISP_SPI_CLK + #if defined (CONFIG_LV_DISPLAY_USE_SPI_CS) #define DISP_SPI_CS CONFIG_LV_DISP_SPI_CS #else @@ -50,26 +57,36 @@ extern "C" { #if defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X) && \ defined (CONFIG_LV_TOUCH_CONTROLLER_FT81X) - #define TP_SPI_MOSI CONFIG_LV_DISP_SPI_MOSI - #define TP_SPI_MISO CONFIG_LV_DISP_SPI_MISO - #define TP_SPI_CLK CONFIG_LV_DISP_SPI_CLK - #define TP_SPI_CS CONFIG_LV_DISP_SPI_CS +#define SHARED_SPI_BUS + +#define TP_SPI_MOSI CONFIG_LV_DISP_SPI_MOSI +#define TP_SPI_MISO CONFIG_LV_DISP_SPI_MISO +#define TP_SPI_CLK CONFIG_LV_DISP_SPI_CLK +#define TP_SPI_CS CONFIG_LV_DISP_SPI_CS #else - #define TP_SPI_MOSI CONFIG_LV_TOUCH_SPI_MOSI - #define TP_SPI_MISO CONFIG_LV_TOUCH_SPI_MISO - #define TP_SPI_CLK CONFIG_LV_TOUCH_SPI_CLK - #define TP_SPI_CS CONFIG_LV_TOUCH_SPI_CS +#define TP_SPI_MOSI CONFIG_LV_TOUCH_SPI_MOSI +#define TP_SPI_MISO CONFIG_LV_TOUCH_SPI_MISO +#define TP_SPI_CLK CONFIG_LV_TOUCH_SPI_CLK +#define TP_SPI_CS CONFIG_LV_TOUCH_SPI_CS #endif #endif #define ENABLE_TOUCH_INPUT CONFIG_LV_ENABLE_TOUCH +/* Display controller SPI host configuration */ #if defined (CONFIG_LV_TFT_DISPLAY_SPI2_HOST) #define TFT_SPI_HOST SPI2_HOST #elif defined (CONFIG_LV_TFT_DISPLAY_SPI3_HOST) #define TFT_SPI_HOST SPI3_HOST #endif +/* Touch controller SPI host configuration */ +#if defined (CONFIG_LV_TOUCH_CONTROLLER_SPI2_HOST) +#define TOUCH_SPI_HOST SPI2_HOST +#elif defined (CONFIG_LV_TOUCH_CONTROLLER_SPI3_HOST) +#define TOUCH_SPI_HOST SPI3_HOST +#endif + #if defined (CONFIG_LV_TFT_DISPLAY_SPI_HALF_DUPLEX) #define DISP_SPI_HALF_DUPLEX #else @@ -84,31 +101,25 @@ extern "C" { #define DISP_SPI_TRANS_MODE_SIO #endif -#if defined (CONFIG_LV_TOUCH_CONTROLLER_SPI2_HOST) -#define TOUCH_SPI_HOST SPI2_HOST -#elif defined (CONFIG_LV_TOUCH_CONTROLLER_SPI3_HOST) -#define TOUCH_SPI_HOST SPI3_HOST -#endif +/* Detect usage of shared SPI bus between display and indev controllers + * + * If the user sets the same MOSI and CLK pins for both display and indev + * controllers then we can assume the user is using the same SPI bus + * If so verify the user specified the same SPI bus for both */ +#if !defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X) -/* Handle the FT81X Special case */ -#if defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X) +#if defined (CONFIG_LV_TFT_DISPLAY_PROTOCOL_SPI) && \ + (CONFIG_LV_TFT_DISPLAY_PROTOCOL_SPI == 1) && \ + defined (CONFIG_LV_TOUCH_DRIVER_PROTOCOL_SPI) && \ + (TP_SPI_MOSI == DISP_SPI_MOSI) && (TP_SPI_CLK == DISP_SPI_CLK) -#if defined (CONFIG_LV_TOUCH_CONTROLLER_FT81X) -#define SHARED_SPI_BUS -#else -/* Empty */ -#endif - -#else -// Detect the use of a shared SPI Bus and verify the user specified the same SPI bus for both touch and tft -#if defined (CONFIG_LV_TOUCH_DRIVER_PROTOCOL_SPI) && TP_SPI_MOSI == DISP_SPI_MOSI && TP_SPI_CLK == DISP_SPI_CLK #if TFT_SPI_HOST != TOUCH_SPI_HOST #error You must specify the same SPI host (SPIx_HOST) for both display and touch driver -#endif - +#else #define SHARED_SPI_BUS #endif +#endif #endif /********************** @@ -134,7 +145,7 @@ extern "C" { #elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9341) #define SPI_TFT_CLOCK_SPEED_HZ (40*1000*1000) #elif defined(CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9163C) -#define SPI_TFT_CLOCK_SPEED_HZ (40 * 1000 * 1000) +#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) #elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_PCD8544) @@ -143,22 +154,21 @@ extern "C" { #define SPI_TFT_CLOCK_SPEED_HZ (40*1000*1000) #endif -#endif - +#endif /* CONFIG_LV_TFT_USE_CUSTOM_SPI_CLK_DIVIDER */ #if defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7789) -#define SPI_TFT_SPI_MODE (2) +#define SPI_TFT_SPI_MODE (2U) #else -#define SPI_TFT_SPI_MODE (0) +#define SPI_TFT_SPI_MODE (0U) #endif /* Touch driver */ #if (CONFIG_LV_TOUCH_CONTROLLER == TOUCH_CONTROLLER_STMPE610) #define SPI_TOUCH_CLOCK_SPEED_HZ (1*1000*1000) -#define SPI_TOUCH_SPI_MODE (1) +#define SPI_TOUCH_SPI_MODE (1U) #else #define SPI_TOUCH_CLOCK_SPEED_HZ (2*1000*1000) -#define SPI_TOUCH_SPI_MODE (0) +#define SPI_TOUCH_SPI_MODE (0U) #endif /********************** From 463721e291c9e35a68d02c82be436b5c9dd47980 Mon Sep 17 00:00:00 2001 From: Carlos Diaz Date: Wed, 2 Feb 2022 16:45:52 -0600 Subject: [PATCH 100/105] Cleanup lvgl_helpers (#171) * lvgl_spi_conf: Define TFT_SPI_HOST even when no SPI is choosen * lvgl_helpers: Let the SPI driver choose SPI DMA Channel Use SPI_DMA_CH1 only on ESP32 target. * lvgl_helpers: Move FT81X initialization to helper * lvgl_interface_init: Initial cleanup * lvgl_helpers: Replace spi_common_dma_t values with integers This enum was introduced in ESP-IDF v4.3 and can't be used in older versions of ESP-IDF. * lvgl_helpers: Rearrange includes * lvgl_tft: Remove gpio_pad_select_gpio from drivers init functions * lvgl_helpers: Use spi_host_device_t from v4.3 onwards * esp_backlight: Replace gpio with esp_rom API * il3820: Remove GPIO initialization from driver init * FT81x: Replace gpio_pad_select_gpio with esp_rom alias * Fix esp_rom_gpio.h path * FT81x: Fix esp_rom_gpio.h path * adcraw: Disable usage of gpio_pad_select_gpio * GC9A01: Remove usage of gpio_pad_select_gpio * ra8875: Remove usage of gpio_pad_select_gpio * Revert "esp_backlight: Replace gpio with esp_rom API" This reverts commit 24e4bf0b888e68f09bcf1b900afa41ef76db2371. * Revert "FT81x: Replace gpio_pad_select_gpio with esp_rom alias" This reverts commit 8c7bc4214012b4b08854d07751a47836c5738d99. * esp_lcd_backlight: Handle different versions of ESP-IDF * esp_lcd_backlight: Add missing header * lvgl_spi_conf: Add missing include * uc8151d/jd79653a: Fix compilation error when logging is enabled * FT81x: Handle ESP-IDF v4.3 rom_gpio * FT81x: Add missing include * Compilation error when SPI Host is not selected * lvgl_helpers.c: Enable init_ft81x only when FT81X is selected * adcraw: Handle gpio_pad_selection on multiple ESP-IDF versions * esp_lcd_backlight: Remove esp_rom functions * FT81x: Remove esp_rom functions * adcraw: Remove esp_rom functions --- lvgl_helpers.c | 105 ++++++++++++++++++------------- lvgl_helpers.h | 4 +- lvgl_spi_conf.h | 6 ++ lvgl_tft/GC9A01.c | 27 ++++---- lvgl_tft/hx8357.c | 69 ++++++++++---------- lvgl_tft/il3820.c | 36 +++++------ lvgl_tft/ili9481.c | 41 ++++++------ lvgl_tft/ili9486.c | 149 +++++++++++++++++++++----------------------- lvgl_tft/jd79653a.c | 3 + lvgl_tft/ra8875.c | 25 ++++---- lvgl_tft/sh1107.c | 46 +++++++------- lvgl_tft/st7735s.c | 64 +++++++++---------- lvgl_tft/st7796s.c | 54 ++++++++-------- lvgl_tft/uc8151d.c | 3 + lvgl_touch/adcraw.c | 30 ++++----- 15 files changed, 337 insertions(+), 325 deletions(-) diff --git a/lvgl_helpers.c b/lvgl_helpers.c index a8946f5..b382fb4 100644 --- a/lvgl_helpers.c +++ b/lvgl_helpers.c @@ -6,8 +6,11 @@ /********************* * INCLUDES *********************/ -#include "sdkconfig.h" #include "lvgl_helpers.h" + +#include "sdkconfig.h" + +#include "driver/spi_common.h" #include "esp_log.h" #include "esp_idf_version.h" @@ -47,6 +50,13 @@ */ static int calculate_spi_max_transfer_size(const int display_buffer_size); +#if defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X) +/** + * Handle FT81X initialization as it's a particular case + */ +static void init_ft81x(int dma_channel); +#endif + /********************** * STATIC VARIABLES **********************/ @@ -68,25 +78,20 @@ void lvgl_interface_init(void) ESP_LOGI(TAG, "Display hor size: %d, ver size: %d", LV_HOR_RES_MAX, LV_VER_RES_MAX); #endif - ESP_LOGI(TAG, "Display buffer size: %d", lvgl_get_display_buffer_size()); - -#if defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X) - ESP_LOGI(TAG, "Initializing SPI master for FT81X"); - size_t display_buffer_size = lvgl_get_display_buffer_size(); - int spi_max_transfer_size = calculate_spi_max_transfer_size(display_buffer_size); - lvgl_spi_driver_init(TFT_SPI_HOST, - DISP_SPI_MISO, DISP_SPI_MOSI, DISP_SPI_CLK, - spi_max_transfer_size, SPI_DMA_CH1, - DISP_SPI_IO2, DISP_SPI_IO3); + ESP_LOGI(TAG, "Display buffer size: %d", display_buffer_size); - disp_spi_add_device(TFT_SPI_HOST); - -#if defined (CONFIG_LV_TOUCH_CONTROLLER_FT81X) - touch_driver_init(); + /* SPI DMA Channel selection + * SPI_DMA_CH1 is only defined for ESP32, so let the driver choose which + * channel to use, and use the proven channel 1 on esp32 targets */ + int dma_channel = 3; +#if defined (CONFIG_IDF_TARGET_ESP32) + dma_channel = 1; #endif +#if defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X) + init_ft81x(dma_channel); return; #endif @@ -95,19 +100,19 @@ void lvgl_interface_init(void) ESP_LOGI(TAG, "Initializing SPI master"); int miso = DISP_SPI_MISO; - size_t display_buffer_size = lvgl_get_display_buffer_size(); int spi_max_transfer_size = calculate_spi_max_transfer_size(display_buffer_size); + /* Set the miso signal to be the selected for the touch driver */ #if defined (SHARED_SPI_BUS) miso = TP_SPI_MISO; #endif - lvgl_spi_driver_init(TFT_SPI_HOST, - miso, DISP_SPI_MOSI, DISP_SPI_CLK, - spi_max_transfer_size, SPI_DMA_CH1, - DISP_SPI_IO2, DISP_SPI_IO3); + lvgl_spi_driver_init(TFT_SPI_HOST, miso, DISP_SPI_MOSI, DISP_SPI_CLK, + spi_max_transfer_size, dma_channel, DISP_SPI_IO2, DISP_SPI_IO3); disp_spi_add_device(TFT_SPI_HOST); + + /* Add device for touch driver */ #if defined (SHARED_SPI_BUS) tp_spi_add_device(TOUCH_SPI_HOST); touch_driver_init(); @@ -122,26 +127,28 @@ void lvgl_interface_init(void) /* Touch controller initialization */ #if CONFIG_LV_TOUCH_CONTROLLER != TOUCH_CONTROLLER_NONE - #if defined (CONFIG_LV_TOUCH_DRIVER_PROTOCOL_SPI) - ESP_LOGI(TAG, "Initializing SPI master for touch"); +#if defined (CONFIG_LV_TOUCH_DRIVER_PROTOCOL_SPI) + ESP_LOGI(TAG, "Initializing SPI master for touch"); - lvgl_spi_driver_init(TOUCH_SPI_HOST, - TP_SPI_MISO, TP_SPI_MOSI, TP_SPI_CLK, - DMA_DEFAULT_TRANSFER_SIZE, SPI_DMA_CH2, - GPIO_NOT_USED, GPIO_NOT_USED); +#if defined (CONFIG_IDF_TARGET_ESP32) + dma_channel = 2; +#endif - tp_spi_add_device(TOUCH_SPI_HOST); + lvgl_spi_driver_init(TOUCH_SPI_HOST, TP_SPI_MISO, TP_SPI_MOSI, TP_SPI_CLK, + DMA_DEFAULT_TRANSFER_SIZE, dma_channel, GPIO_NOT_USED, GPIO_NOT_USED); - touch_driver_init(); - #elif defined (CONFIG_LV_I2C_TOUCH) - touch_driver_init(); - #elif defined (CONFIG_LV_TOUCH_DRIVER_ADC) - touch_driver_init(); - #elif defined (CONFIG_LV_TOUCH_DRIVER_DISPLAY) - touch_driver_init(); - #else - #error "No protocol defined for touch controller" - #endif + tp_spi_add_device(TOUCH_SPI_HOST); + + touch_driver_init(); +#elif defined (CONFIG_LV_I2C_TOUCH) + touch_driver_init(); +#elif defined (CONFIG_LV_TOUCH_DRIVER_ADC) + touch_driver_init(); +#elif defined (CONFIG_LV_TOUCH_DRIVER_DISPLAY) + touch_driver_init(); +#else +#error "No protocol defined for touch controller" +#endif #else #endif } @@ -254,7 +261,7 @@ size_t lvgl_get_display_buffer_size(void) * We could use the ESP_IDF_VERSION_VAL macro available in the "esp_idf_version.h" * header available since ESP-IDF v4. */ -bool lvgl_spi_driver_init(spi_host_device_t host, +bool lvgl_spi_driver_init(int host, int miso_pin, int mosi_pin, int sclk_pin, int max_transfer_sz, int dma_channel, @@ -286,12 +293,9 @@ bool lvgl_spi_driver_init(spi_host_device_t host, }; ESP_LOGI(TAG, "Initializing SPI bus..."); - #if defined (CONFIG_IDF_TARGET_ESP32C3) - dma_channel = SPI_DMA_CH_AUTO; - #endif #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 3, 0) - esp_err_t ret = spi_bus_initialize(host, &buscfg, (spi_dma_chan_t)dma_channel); + esp_err_t ret = spi_bus_initialize((spi_host_device_t) host, &buscfg, (spi_dma_chan_t)dma_channel); #else esp_err_t ret = spi_bus_initialize(host, &buscfg, dma_channel); #endif @@ -324,3 +328,20 @@ static int calculate_spi_max_transfer_size(const int display_buffer_size) return retval; } + +#if defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X) +static void init_ft81x(int dma_channel) +{ + size_t display_buffer_size = lvgl_get_display_buffer_size(); + int spi_max_transfer_size = calculate_spi_max_transfer_size(display_buffer_size); + + lvgl_spi_driver_init(TFT_SPI_HOST, DISP_SPI_MISO, DISP_SPI_MOSI, DISP_SPI_CLK, + spi_max_transfer_size, dma_channel, DISP_SPI_IO2, DISP_SPI_IO3); + + disp_spi_add_device(TFT_SPI_HOST); + +#if defined (CONFIG_LV_TOUCH_CONTROLLER_FT81X) + touch_driver_init(); +#endif +} +#endif diff --git a/lvgl_helpers.h b/lvgl_helpers.h index ca73431..6031036 100644 --- a/lvgl_helpers.h +++ b/lvgl_helpers.h @@ -14,8 +14,6 @@ extern "C" { *********************/ #include -#include "driver/spi_common.h" - #include "lvgl_spi_conf.h" #include "lvgl_tft/disp_driver.h" #include "lvgl_tft/esp_lcd_backlight.h" @@ -39,7 +37,7 @@ void lvgl_i2c_locking(void* leader); void lvgl_interface_init(void); /* Initialize SPI master */ -bool lvgl_spi_driver_init(spi_host_device_t host, int miso_pin, int mosi_pin, int sclk_pin, +bool lvgl_spi_driver_init(int host, int miso_pin, int mosi_pin, int sclk_pin, int max_transfer_sz, int dma_channel, int quadwp_pin, int quadhd_pin); /* Initialize display GPIOs, e.g. DC and RST pins */ diff --git a/lvgl_spi_conf.h b/lvgl_spi_conf.h index c7e1672..9b6d0ae 100644 --- a/lvgl_spi_conf.h +++ b/lvgl_spi_conf.h @@ -6,6 +6,8 @@ #ifndef LVGL_SPI_CONF_H #define LVGL_SPI_CONF_H +#include + #ifdef __cplusplus extern "C" { #endif @@ -73,11 +75,15 @@ extern "C" { #define ENABLE_TOUCH_INPUT CONFIG_LV_ENABLE_TOUCH +#if defined (CONFIG_LV_TFT_DISPLAY_PROTOCOL_SPI) /* Display controller SPI host configuration */ #if defined (CONFIG_LV_TFT_DISPLAY_SPI2_HOST) #define TFT_SPI_HOST SPI2_HOST #elif defined (CONFIG_LV_TFT_DISPLAY_SPI3_HOST) #define TFT_SPI_HOST SPI3_HOST +#else +#error SPI host not defined +#endif #endif /* Touch controller SPI host configuration */ diff --git a/lvgl_tft/GC9A01.c b/lvgl_tft/GC9A01.c index b571818..83e24e4 100644 --- a/lvgl_tft/GC9A01.c +++ b/lvgl_tft/GC9A01.c @@ -36,6 +36,7 @@ static void GC9A01_set_orientation(uint8_t orientation); static void GC9A01_send_cmd(uint8_t cmd); static void GC9A01_send_data(void * data, uint16_t length); static void GC9A01_send_color(void * data, uint16_t length); +static void GC9A01_reset(void); /********************** * STATIC VARIABLES @@ -110,20 +111,7 @@ 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); - - //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 + GC9A01_reset(); LV_LOG_INFO("Initialization."); @@ -241,3 +229,14 @@ static void GC9A01_set_orientation(uint8_t orientation) GC9A01_send_cmd(0x36); GC9A01_send_data((void *) &data[orientation], 1); } + +static void GC9A01_reset(void) +{ +#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 +} diff --git a/lvgl_tft/hx8357.c b/lvgl_tft/hx8357.c index a22287b..d7faf42 100644 --- a/lvgl_tft/hx8357.c +++ b/lvgl_tft/hx8357.c @@ -49,7 +49,7 @@ typedef struct { static void hx8357_send_cmd(uint8_t cmd); static void hx8357_send_data(void * data, uint16_t length); static void hx8357_send_color(void * data, uint16_t length); - +static void hx8357_reset(void); /********************** * INITIALIZATION ARRAYS @@ -156,44 +156,31 @@ static uint8_t displayType = HX8357D; void hx8357_init(void) { - //Initialize non-SPI GPIOs - gpio_pad_select_gpio(HX8357_DC); - gpio_set_direction(HX8357_DC, GPIO_MODE_OUTPUT); + hx8357_reset(); -#if HX8357_USE_RST - gpio_pad_select_gpio(HX8357_RST); - gpio_set_direction(HX8357_RST, GPIO_MODE_OUTPUT); + LV_LOG_INFO("Initialization."); - //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 + //Send all the commands + const uint8_t *addr = (displayType == HX8357B) ? initb : initd; + uint8_t cmd, x, numArgs; + while((cmd = *addr++) > 0) { // '0' command ends list + x = *addr++; + numArgs = x & 0x7F; + if (cmd != 0xFF) { // '255' is ignored + if (x & 0x80) { // If high bit set, numArgs is a delay time + hx8357_send_cmd(cmd); + } else { + hx8357_send_cmd(cmd); + hx8357_send_data((void *) addr, numArgs); + addr += numArgs; + } + } + if (x & 0x80) { // If high bit set... + vTaskDelay(numArgs * 5 / portTICK_RATE_MS); // numArgs is actually a delay time (5ms units) + } + } - LV_LOG_INFO("Initialization."); - - //Send all the commands - const uint8_t *addr = (displayType == HX8357B) ? initb : initd; - uint8_t cmd, x, numArgs; - while((cmd = *addr++) > 0) { // '0' command ends list - x = *addr++; - numArgs = x & 0x7F; - if (cmd != 0xFF) { // '255' is ignored - if (x & 0x80) { // If high bit set, numArgs is a delay time - hx8357_send_cmd(cmd); - } else { - hx8357_send_cmd(cmd); - hx8357_send_data((void *) addr, numArgs); - addr += numArgs; - } - } - if (x & 0x80) { // If high bit set... - vTaskDelay(numArgs * 5 / portTICK_RATE_MS); // numArgs is actually a delay time (5ms units) - } - } - - hx8357_set_rotation(1); + hx8357_set_rotation(1); #if HX8357_INVERT_COLORS hx8357_send_cmd(HX8357_INVON); @@ -286,3 +273,13 @@ static void hx8357_send_color(void * data, uint16_t length) gpio_set_level(HX8357_DC, 1); /*Data mode*/ disp_spi_send_colors(data, length); } + +static void hx8357_reset(void) +{ +#if HX8357_USE_RST + gpio_set_level(HX8357_RST, 0); + vTaskDelay(10 / portTICK_RATE_MS); + gpio_set_level(HX8357_RST, 1); + vTaskDelay(120 / portTICK_RATE_MS); +#endif +} diff --git a/lvgl_tft/il3820.c b/lvgl_tft/il3820.c index 31fea55..5179b27 100644 --- a/lvgl_tft/il3820.c +++ b/lvgl_tft/il3820.c @@ -100,6 +100,7 @@ static inline void il3820_set_window( uint16_t sx, uint16_t ex, uint16_t ys, uin static inline void il3820_set_cursor(uint16_t sx, uint16_t ys); static void il3820_update_display(void); static void il3820_clear_cntlr_mem(uint8_t ram_cmd, bool update); +static void il3820_reset(void); /* Required by LVGL */ void il3820_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map) @@ -195,26 +196,7 @@ void il3820_init(void) { uint8_t tmp[3] = {0}; - /* Initialize non-SPI GPIOs */ - gpio_pad_select_gpio(IL3820_DC_PIN); - gpio_set_direction(IL3820_DC_PIN, GPIO_MODE_OUTPUT); - - gpio_pad_select_gpio(IL3820_BUSY_PIN); - gpio_set_direction(IL3820_BUSY_PIN, GPIO_MODE_INPUT); - -#if IL3820_USE_RST - gpio_pad_select_gpio(IL3820_RST_PIN); - gpio_set_direction(IL3820_RST_PIN, GPIO_MODE_OUTPUT); - - /* 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); + il3820_reset(); /* Busy wait for the BUSY signal to go low */ il3820_waitbusy(IL3820_WAIT); @@ -416,3 +398,17 @@ static void il3820_clear_cntlr_mem(uint8_t ram_cmd, bool update) il3820_update_display(); } } + +static void il3820_reset(void) +{ +#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/ili9481.c b/lvgl_tft/ili9481.c index 565182d..d4b1a93 100644 --- a/lvgl_tft/ili9481.c +++ b/lvgl_tft/ili9481.c @@ -35,6 +35,7 @@ static void ili9481_set_orientation(uint8_t orientation); static void ili9481_send_cmd(uint8_t cmd); static void ili9481_send_data(void * data, uint16_t length); static void ili9481_send_color(void * data, uint16_t length); +static void ili9481_reset(void); /********************** * STATIC VARIABLES @@ -70,27 +71,10 @@ void ili9481_init(void) {0, {0}, 0xff}, }; - //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); - - //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 + ili9481_reset(); LV_LOG_INFO("Initialization."); - // Exit sleep - ili9481_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) { @@ -108,7 +92,8 @@ void ili9481_init(void) // Flush function based on mvturnho repo void ili9481_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map) { - uint32_t size = lv_area_get_width(area) * lv_area_get_height(area); + /* 3 is number of bytes in lv_color_t */ + uint32_t size = lv_area_get_width(area) * lv_area_get_height(area) * 3; lv_color16_t *buffer_16bit = (lv_color16_t *) color_map; uint8_t *mybuf; @@ -159,7 +144,9 @@ void ili9481_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * col /*Memory write*/ ili9481_send_cmd(ILI9481_CMD_MEMORY_WRITE); - ili9481_send_color((void *) mybuf, size * 3); + ili9481_send_color((void *) mybuf, size); + + /* FIXME: Can we free the memory even when it's being transferred? */ heap_caps_free(mybuf); } @@ -203,3 +190,17 @@ static void ili9481_set_orientation(uint8_t orientation) ili9481_send_cmd(ILI9481_CMD_MEMORY_ACCESS_CONTROL); ili9481_send_data((void *) &data[orientation], 1); } + +static void ili9481_reset(void) +{ +#if ILI9481_USE_RST + gpio_set_level(ILI9481_RST, 0); + vTaskDelay(100 / portTICK_RATE_MS); + gpio_set_level(ILI9481_RST, 1); + vTaskDelay(100 / portTICK_RATE_MS); +#else + // Exit sleep, software reset + ili9481_send_cmd(0x01); + vTaskDelay(100 / portTICK_RATE_MS); +#endif +} diff --git a/lvgl_tft/ili9486.c b/lvgl_tft/ili9486.c index 2283e54..f7b08a7 100644 --- a/lvgl_tft/ili9486.c +++ b/lvgl_tft/ili9486.c @@ -35,7 +35,7 @@ static void ili9486_set_orientation(uint8_t orientation); static void ili9486_send_cmd(uint8_t cmd); static void ili9486_send_data(void * data, uint16_t length); static void ili9486_send_color(void * data, uint16_t length); - +static void ili9486_reset(void); /********************** * STATIC VARIABLES **********************/ @@ -50,77 +50,62 @@ static void ili9486_send_color(void * data, uint16_t length); void ili9486_init(void) { - lcd_init_cmd_t ili_init_cmds[]={ - {0x11, {0}, 0x80}, - {0x3A, {0x55}, 1}, - {0x2C, {0x44}, 1}, - {0xC5, {0x00, 0x00, 0x00, 0x00}, 4}, - {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 */ - {0x00, {0}, 0xff}, - }; + lcd_init_cmd_t ili_init_cmds[]={ + {0x11, {0}, 0x80}, + {0x3A, {0x55}, 1}, + {0x2C, {0x44}, 1}, + {0xC5, {0x00, 0x00, 0x00, 0x00}, 4}, + {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 */ + {0x00, {0}, 0xff}, + }; - //Initialize non-SPI GPIOs - gpio_pad_select_gpio(ILI9486_DC); - gpio_set_direction(ILI9486_DC, GPIO_MODE_OUTPUT); + ili9486_reset(); -#if ILI9486_USE_RST - gpio_pad_select_gpio(ILI9486_RST); - gpio_set_direction(ILI9486_RST, GPIO_MODE_OUTPUT); + LV_LOG_INFO("ILI9486 Initialization."); - //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 - - LV_LOG_INFO("ILI9486 Initialization."); - - //Send all the commands - uint16_t cmd = 0; - while (ili_init_cmds[cmd].databytes!=0xff) { - ili9486_send_cmd(ili_init_cmds[cmd].cmd); - ili9486_send_data(ili_init_cmds[cmd].data, ili_init_cmds[cmd].databytes&0x1F); - if (ili_init_cmds[cmd].databytes & 0x80) { - vTaskDelay(100 / portTICK_RATE_MS); - } - cmd++; - } + //Send all the commands + uint16_t cmd = 0; + while (ili_init_cmds[cmd].databytes!=0xff) { + ili9486_send_cmd(ili_init_cmds[cmd].cmd); + ili9486_send_data(ili_init_cmds[cmd].data, ili_init_cmds[cmd].databytes&0x1F); + if (ili_init_cmds[cmd].databytes & 0x80) { + vTaskDelay(100 / portTICK_RATE_MS); + } + cmd++; + } ili9486_set_orientation(CONFIG_LV_DISPLAY_ORIENTATION); } void ili9486_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map) { - uint8_t data[4] = {0}; - uint32_t size = 0; + uint8_t data[4] = {0}; + /* 2 is the number of bytes in color depth */ + uint32_t size = lv_area_get_width(area) * lv_area_get_height(area) * 2; - /*Column addresses*/ - ili9486_send_cmd(0x2A); - data[0] = (area->x1 >> 8) & 0xFF; - data[1] = area->x1 & 0xFF; - data[2] = (area->x2 >> 8) & 0xFF; - data[3] = area->x2 & 0xFF; - ili9486_send_data(data, 4); + /*Column addresses*/ + ili9486_send_cmd(0x2A); + data[0] = (area->x1 >> 8) & 0xFF; + data[1] = area->x1 & 0xFF; + data[2] = (area->x2 >> 8) & 0xFF; + data[3] = area->x2 & 0xFF; + ili9486_send_data(data, 4); - /*Page addresses*/ - ili9486_send_cmd(0x2B); - data[0] = (area->y1 >> 8) & 0xFF; - data[1] = area->y1 & 0xFF; - data[2] = (area->y2 >> 8) & 0xFF; - data[3] = area->y2 & 0xFF; - ili9486_send_data(data, 4); + /*Page addresses*/ + ili9486_send_cmd(0x2B); + data[0] = (area->y1 >> 8) & 0xFF; + data[1] = area->y1 & 0xFF; + data[2] = (area->y2 >> 8) & 0xFF; + data[3] = area->y2 & 0xFF; + ili9486_send_data(data, 4); - /*Memory write*/ - ili9486_send_cmd(0x2C); - - size = lv_area_get_width(area) * lv_area_get_height(area); - - ili9486_send_color((void*) color_map, size * 2); + /*Memory write*/ + ili9486_send_cmd(0x2C); + ili9486_send_color((void*) color_map, size); } /********************** @@ -128,30 +113,30 @@ void ili9486_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * col **********************/ static void ili9486_send_cmd(uint8_t cmd) { - uint8_t to16bit[] = { - 0x00, cmd - }; + uint8_t to16bit[] = { + 0x00, cmd + }; - disp_wait_for_pending_transactions(); - gpio_set_level(ILI9486_DC, 0); /*Command mode*/ - disp_spi_send_data(to16bit, sizeof to16bit); + disp_wait_for_pending_transactions(); + gpio_set_level(ILI9486_DC, 0); /*Command mode*/ + disp_spi_send_data(to16bit, sizeof to16bit); } static void ili9486_send_data(void * data, uint16_t length) { - uint32_t i; - uint8_t to16bit[32]; - uint8_t * dummy = data; + uint32_t i; + uint8_t to16bit[32]; + uint8_t * dummy = data; - for(i=0; i < (length); i++) - { - to16bit[2*i+1] = dummy[i]; - to16bit[2*i] = 0x00; - } + for(i=0; i < (length); i++) + { + to16bit[2*i+1] = dummy[i]; + to16bit[2*i] = 0x00; + } - disp_wait_for_pending_transactions(); - gpio_set_level(ILI9486_DC, 1); /*Data mode*/ - disp_spi_send_data(to16bit, (length*2)); + disp_wait_for_pending_transactions(); + gpio_set_level(ILI9486_DC, 1); /*Data mode*/ + disp_spi_send_data(to16bit, (length*2)); } static void ili9486_send_color(void * data, uint16_t length) @@ -179,3 +164,13 @@ static void ili9486_set_orientation(uint8_t orientation) ili9486_send_cmd(0x36); ili9486_send_data((void *) &data[orientation], 1); } + +static void ili9486_reset(void) +{ +#if ILI9486_USE_RST + gpio_set_level(ILI9486_RST, 0); + vTaskDelay(100 / portTICK_RATE_MS); + gpio_set_level(ILI9486_RST, 1); + vTaskDelay(100 / portTICK_RATE_MS); +#endif +} diff --git a/lvgl_tft/jd79653a.c b/lvgl_tft/jd79653a.c index a9e5590..55737f9 100644 --- a/lvgl_tft/jd79653a.c +++ b/lvgl_tft/jd79653a.c @@ -417,8 +417,11 @@ void jd79653a_lv_rounder_cb(lv_disp_drv_t *disp_drv, lv_area_t *area) void jd79653a_lv_fb_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map) { +#if LV_USE_LOG + size_t len = ((area->x2 - area->x1 + 1) * (area->y2 - area->y1 + 1)) / 8; LV_LOG_INFO("x1: 0x%x, x2: 0x%x, y1: 0x%x, y2: 0x%x", area->x1, area->x2, area->y1, area->y2); LV_LOG_INFO("Writing LVGL fb with len: %u, partial counter: %u", len, partial_counter); +#endif uint8_t *buf = (uint8_t *) color_map; diff --git a/lvgl_tft/ra8875.c b/lvgl_tft/ra8875.c index 97f0d1e..7404da5 100644 --- a/lvgl_tft/ra8875.c +++ b/lvgl_tft/ra8875.c @@ -133,7 +133,7 @@ static void ra8875_configure_clocks(bool high_speed); static void ra8875_set_memory_write_cursor(unsigned int x, unsigned int y); static void ra8875_set_window(unsigned int xs, unsigned int xe, unsigned int ys, unsigned int ye); static void ra8875_send_buffer(uint8_t * data, size_t length, bool signal_flush); - +static void ra8875_reset(void); /********************** * STATIC VARIABLES **********************/ @@ -180,18 +180,7 @@ void ra8875_init(void) LV_LOG_INFO("Initializing RA8875..."); - // Initialize non-SPI GPIOs - -#if RA8875_USE_RST - gpio_pad_select_gpio(RA8875_RST); - gpio_set_direction(RA8875_RST, GPIO_MODE_OUTPUT); - - // 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 + ra8875_reset(); // Initalize RA8875 clocks (SPI must be decelerated before initializing clocks) disp_spi_change_device_speed(SPI_CLOCK_SPEED_SLOW_HZ); @@ -376,3 +365,13 @@ static void ra8875_send_buffer(uint8_t * data, size_t length, bool signal_flush) | (RA8875_MODE_DATA_WRITE); // Data write mode disp_spi_transaction(data, length, flags, NULL, prefix, 0); } + +static void ra8875_reset(void) +{ +#if RA8875_USE_RST + 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 +} diff --git a/lvgl_tft/sh1107.c b/lvgl_tft/sh1107.c index 84ab65c..76e9044 100644 --- a/lvgl_tft/sh1107.c +++ b/lvgl_tft/sh1107.c @@ -34,6 +34,7 @@ typedef struct { static void sh1107_send_cmd(uint8_t cmd); static void sh1107_send_data(void * data, uint16_t length); static void sh1107_send_color(void * data, uint16_t length); +static void sh1107_reset(void); static lv_coord_t get_display_ver_res(lv_disp_drv_t *disp_drv); static lv_coord_t get_display_hor_res(lv_disp_drv_t *disp_drv); @@ -93,31 +94,18 @@ void sh1107_init(void) {0, {0}, 0xff}, }; - //Initialize non-SPI GPIOs - gpio_pad_select_gpio(SH1107_DC); - gpio_set_direction(SH1107_DC, GPIO_MODE_OUTPUT); + sh1107_reset(); -#if SH1107_USE_RST - gpio_pad_select_gpio(SH1107_RST); - gpio_set_direction(SH1107_RST, GPIO_MODE_OUTPUT); - - //Reset the display - gpio_set_level(SH1107_RST, 0); - 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; - while (init_cmds[cmd].databytes!=0xff) { - sh1107_send_cmd(init_cmds[cmd].cmd); - sh1107_send_data(init_cmds[cmd].data, init_cmds[cmd].databytes&0x1F); - if (init_cmds[cmd].databytes & 0x80) { - vTaskDelay(100 / portTICK_RATE_MS); - } - cmd++; - } + //Send all the commands + uint16_t cmd = 0; + while (init_cmds[cmd].databytes!=0xff) { + sh1107_send_cmd(init_cmds[cmd].cmd); + sh1107_send_data(init_cmds[cmd].data, init_cmds[cmd].databytes&0x1F); + if (init_cmds[cmd].databytes & 0x80) { + vTaskDelay(100 / portTICK_RATE_MS); + } + cmd++; + } } void sh1107_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, @@ -257,3 +245,13 @@ static lv_coord_t get_display_hor_res(lv_disp_drv_t *disp_drv) return val; } + +static void sh1107_reset(void) +{ +#if SH1107_USE_RST + gpio_set_level(SH1107_RST, 0); + vTaskDelay(100 / portTICK_RATE_MS); + gpio_set_level(SH1107_RST, 1); + vTaskDelay(100 / portTICK_RATE_MS); +#endif +} diff --git a/lvgl_tft/st7735s.c b/lvgl_tft/st7735s.c index c2786a1..83835c6 100644 --- a/lvgl_tft/st7735s.c +++ b/lvgl_tft/st7735s.c @@ -39,6 +39,7 @@ static void st7735s_send_cmd(uint8_t cmd); static void st7735s_send_data(void * data, uint16_t length); static void st7735s_send_color(void * data, uint16_t length); static void st7735s_set_orientation(uint8_t orientation); +static void st7735s_reset(void); #ifdef CONFIG_LV_M5STICKC_HANDLE_AXP192 static void axp192_write_byte(uint8_t addr, uint8_t data); @@ -98,20 +99,7 @@ void st7735s_init(void) {0, {0}, 0xff} }; - //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); - - //Reset the display - gpio_set_level(ST7735S_RST, 0); - vTaskDelay(100 / portTICK_RATE_MS); - gpio_set_level(ST7735S_RST, 1); - vTaskDelay(100 / portTICK_RATE_MS); -#endif + st7735s_reset(); LV_LOG_INFO("ST7735S initialization."); @@ -137,29 +125,29 @@ void st7735s_init(void) void st7735s_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map) { - uint8_t data[4]; + uint8_t data[4] = {0}; - /*Column addresses*/ - st7735s_send_cmd(0x2A); - data[0] = (area->x1 >> 8) & 0xFF; - data[1] = (area->x1 & 0xFF) + (st7735s_portrait_mode ? COLSTART : ROWSTART); - data[2] = (area->x2 >> 8) & 0xFF; - data[3] = (area->x2 & 0xFF) + (st7735s_portrait_mode ? COLSTART : ROWSTART); - st7735s_send_data(data, 4); + /*Column addresses*/ + st7735s_send_cmd(0x2A); + data[0] = (area->x1 >> 8) & 0xFF; + data[1] = (area->x1 & 0xFF) + (st7735s_portrait_mode ? COLSTART : ROWSTART); + data[2] = (area->x2 >> 8) & 0xFF; + data[3] = (area->x2 & 0xFF) + (st7735s_portrait_mode ? COLSTART : ROWSTART); + st7735s_send_data(data, 4); - /*Page addresses*/ - st7735s_send_cmd(0x2B); - data[0] = (area->y1 >> 8) & 0xFF; - data[1] = (area->y1 & 0xFF) + (st7735s_portrait_mode ? ROWSTART : COLSTART); - data[2] = (area->y2 >> 8) & 0xFF; - data[3] = (area->y2 & 0xFF) + (st7735s_portrait_mode ? ROWSTART : COLSTART); - st7735s_send_data(data, 4); + /*Page addresses*/ + st7735s_send_cmd(0x2B); + data[0] = (area->y1 >> 8) & 0xFF; + data[1] = (area->y1 & 0xFF) + (st7735s_portrait_mode ? ROWSTART : COLSTART); + data[2] = (area->y2 >> 8) & 0xFF; + data[3] = (area->y2 & 0xFF) + (st7735s_portrait_mode ? ROWSTART : COLSTART); + st7735s_send_data(data, 4); - /*Memory write*/ - st7735s_send_cmd(0x2C); + /*Memory write*/ + st7735s_send_cmd(0x2C); - uint32_t size = lv_area_get_width(area) * lv_area_get_height(area); - st7735s_send_color((void*)color_map, size * 2); + uint32_t size = lv_area_get_width(area) * lv_area_get_height(area) * 2; + st7735s_send_color((void*)color_map, size); } void st7735s_sleep_in() @@ -227,6 +215,16 @@ static void st7735s_set_orientation(uint8_t orientation) st7735s_send_data((void *) &data[orientation], 1); } +static void st7735s_reset(void) +{ +#if ST7735S_USE_RST + gpio_set_level(ST7735S_RST, 0); + vTaskDelay(100 / portTICK_RATE_MS); + gpio_set_level(ST7735S_RST, 1); + vTaskDelay(100 / portTICK_RATE_MS); +#endif +} + #ifdef CONFIG_LV_M5STICKC_HANDLE_AXP192 static void axp192_write_byte(uint8_t addr, uint8_t data) diff --git a/lvgl_tft/st7796s.c b/lvgl_tft/st7796s.c index 75e9bd2..90e0d8c 100644 --- a/lvgl_tft/st7796s.c +++ b/lvgl_tft/st7796s.c @@ -36,6 +36,7 @@ static void st7796s_set_orientation(uint8_t orientation); static void st7796s_send_cmd(uint8_t cmd); static void st7796s_send_data(void *data, uint16_t length); static void st7796s_send_color(void *data, uint16_t length); +static void st7796s_reset(void); /********************** * STATIC VARIABLES @@ -79,37 +80,24 @@ void st7796s_init(void) {0, {0}, 0xff}, }; - //Initialize non-SPI GPIOs - gpio_pad_select_gpio(ST7796S_DC); - gpio_set_direction(ST7796S_DC, GPIO_MODE_OUTPUT); + st7796s_reset(); -#if ST7796S_USE_RST - gpio_pad_select_gpio(ST7796S_RST); - gpio_set_direction(ST7796S_RST, GPIO_MODE_OUTPUT); + LV_LOG_INFO("Initialization."); - //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 + //Send all the commands + uint16_t cmd = 0; + while (init_cmds[cmd].databytes != 0xff) + { + st7796s_send_cmd(init_cmds[cmd].cmd); + st7796s_send_data(init_cmds[cmd].data, init_cmds[cmd].databytes & 0x1F); + if (init_cmds[cmd].databytes & 0x80) + { + vTaskDelay(100 / portTICK_RATE_MS); + } + cmd++; + } - LV_LOG_INFO("Initialization."); - - //Send all the commands - uint16_t cmd = 0; - while (init_cmds[cmd].databytes != 0xff) - { - st7796s_send_cmd(init_cmds[cmd].cmd); - st7796s_send_data(init_cmds[cmd].data, init_cmds[cmd].databytes & 0x1F); - if (init_cmds[cmd].databytes & 0x80) - { - vTaskDelay(100 / portTICK_RATE_MS); - } - cmd++; - } - - st7796s_set_orientation(CONFIG_LV_DISPLAY_ORIENTATION); + st7796s_set_orientation(CONFIG_LV_DISPLAY_ORIENTATION); #if ST7796S_INVERT_COLORS == 1 st7796s_send_cmd(0x21); @@ -210,3 +198,13 @@ static void st7796s_set_orientation(uint8_t orientation) st7796s_send_cmd(0x36); st7796s_send_data((void *)&data[orientation], 1); } + +static void st7796s_reset(void) +{ +#if ST7796S_USE_RST + gpio_set_level(ST7796S_RST, 0); + vTaskDelay(100 / portTICK_RATE_MS); + gpio_set_level(ST7796S_RST, 1); + vTaskDelay(100 / portTICK_RATE_MS); +#endif +} diff --git a/lvgl_tft/uc8151d.c b/lvgl_tft/uc8151d.c index 472fc3d..9ebb76e 100644 --- a/lvgl_tft/uc8151d.c +++ b/lvgl_tft/uc8151d.c @@ -189,8 +189,11 @@ static void uc8151d_full_update(uint8_t *buf) void uc8151d_lv_fb_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map) { +#if LV_USE_LOG + size_t len = ((area->x2 - area->x1 + 1) * (area->y2 - area->y1 + 1)) / 8; LV_LOG_INFO("x1: 0x%x, x2: 0x%x, y1: 0x%x, y2: 0x%x", area->x1, area->x2, area->y1, area->y2); LV_LOG_INFO("Writing LVGL fb with len: %u", len); +#endif uint8_t *buf = (uint8_t *) color_map; uc8151d_full_update(buf); diff --git a/lvgl_touch/adcraw.c b/lvgl_touch/adcraw.c index c8da1b0..d26596e 100644 --- a/lvgl_touch/adcraw.c +++ b/lvgl_touch/adcraw.c @@ -136,21 +136,21 @@ void adcraw_init(void) static void setup_axis(gpio_num_t plus, gpio_num_t minus, gpio_num_t measure, gpio_num_t ignore) { - // Set GPIOs: - // - Float "ignore" and "measure" - gpio_pad_select_gpio(ignore); - gpio_set_direction(ignore, GPIO_MODE_DISABLE); - gpio_set_pull_mode(ignore, GPIO_FLOATING); - gpio_pad_select_gpio(measure); - gpio_set_direction(measure, GPIO_MODE_DISABLE); - gpio_set_pull_mode(measure, GPIO_FLOATING); - // - Set "plus" to 1, "minus" to 0 - gpio_config(&(gpio_config_t) { - .mode = GPIO_MODE_OUTPUT, - .pin_bit_mask = (1ULL << plus) | (1ULL << minus) - }); - gpio_set_level(plus, 1); - gpio_set_level(minus, 0); + // Set GPIOs: + // - Float "ignore" and "measure" + gpio_pad_select_gpio(ignore); + gpio_set_direction(ignore, GPIO_MODE_DISABLE); + gpio_set_pull_mode(ignore, GPIO_FLOATING); + gpio_pad_select_gpio(measure); + gpio_set_direction(measure, GPIO_MODE_DISABLE); + gpio_set_pull_mode(measure, GPIO_FLOATING); + // - Set "plus" to 1, "minus" to 0 + gpio_config(&(gpio_config_t) { + .mode = GPIO_MODE_OUTPUT, + .pin_bit_mask = (1ULL << plus) | (1ULL << minus) + }); + gpio_set_level(plus, 1); + gpio_set_level(minus, 0); } static void setup_adc(gpio_num_t measure) From 28d663f6b680a0d540cea654ceba7c02d3d0b5ca Mon Sep 17 00:00:00 2001 From: Carlos Diaz Date: Wed, 2 Feb 2022 16:51:28 -0600 Subject: [PATCH 101/105] Moving ESP-IDF specific files to `lv_port` (#175) * Move disp_spi.c and tp_spi.c to lv_port * Move esp_lcd_backlight to lv_port * Move disp_spi.h and tp_spi.h to lv_port --- CMakeLists.txt | 8 +++++--- {lvgl_tft => lv_port}/disp_spi.c | 0 {lvgl_tft => lv_port}/disp_spi.h | 0 {lvgl_tft => lv_port}/esp_lcd_backlight.c | 0 {lvgl_touch => lv_port}/tp_spi.c | 0 {lvgl_touch => lv_port}/tp_spi.h | 0 lvgl_helpers.c | 4 ++-- 7 files changed, 7 insertions(+), 5 deletions(-) rename {lvgl_tft => lv_port}/disp_spi.c (100%) rename {lvgl_tft => lv_port}/disp_spi.h (100%) rename {lvgl_tft => lv_port}/esp_lcd_backlight.c (100%) rename {lvgl_touch => lv_port}/tp_spi.c (100%) rename {lvgl_touch => lv_port}/tp_spi.h (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3bfc8f7..3f6cd98 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,7 +3,7 @@ if(ESP_PLATFORM) file(GLOB SOURCES *.c) set(LVGL_INCLUDE_DIRS . lvgl_tft) list(APPEND SOURCES "lvgl_tft/disp_driver.c") -list(APPEND SOURCES "lvgl_tft/esp_lcd_backlight.c") +list(APPEND SOURCES "lv_port/esp_lcd_backlight.c") # This are the source files used for mcu abstraction set(LV_PORT_PATH "lv_port") @@ -34,7 +34,7 @@ list(APPEND SOURCES "${LV_PORT_PATH}/lv_port_display_espressif.c") list(APPEND SOURCES "lvgl_tft/pcd8544.c") if(CONFIG_LV_TFT_DISPLAY_PROTOCOL_SPI) - list(APPEND SOURCES "lvgl_tft/disp_spi.c") + list(APPEND SOURCES "lv_port/disp_spi.c") endif() # Add touch driver to compilation only if it is selected in menuconfig @@ -61,7 +61,7 @@ if(CONFIG_LV_TOUCH_CONTROLLER) endif() if(CONFIG_LV_TOUCH_DRIVER_PROTOCOL_SPI) - list(APPEND SOURCES "lvgl_touch/tp_spi.c") + list(APPEND SOURCES "lv_port/tp_spi.c") endif() endif() @@ -69,6 +69,8 @@ if(CONFIG_LV_I2C) list(APPEND SOURCES "lvgl_i2c/i2c_manager.c") endif() +list(APPEND LVGL_INCLUDE_DIRS lv_port) + idf_component_register(SRCS ${SOURCES} INCLUDE_DIRS ${LVGL_INCLUDE_DIRS} REQUIRES lvgl) diff --git a/lvgl_tft/disp_spi.c b/lv_port/disp_spi.c similarity index 100% rename from lvgl_tft/disp_spi.c rename to lv_port/disp_spi.c diff --git a/lvgl_tft/disp_spi.h b/lv_port/disp_spi.h similarity index 100% rename from lvgl_tft/disp_spi.h rename to lv_port/disp_spi.h diff --git a/lvgl_tft/esp_lcd_backlight.c b/lv_port/esp_lcd_backlight.c similarity index 100% rename from lvgl_tft/esp_lcd_backlight.c rename to lv_port/esp_lcd_backlight.c diff --git a/lvgl_touch/tp_spi.c b/lv_port/tp_spi.c similarity index 100% rename from lvgl_touch/tp_spi.c rename to lv_port/tp_spi.c diff --git a/lvgl_touch/tp_spi.h b/lv_port/tp_spi.h similarity index 100% rename from lvgl_touch/tp_spi.h rename to lv_port/tp_spi.h diff --git a/lvgl_helpers.c b/lvgl_helpers.c index b382fb4..f6a539f 100644 --- a/lvgl_helpers.c +++ b/lvgl_helpers.c @@ -14,8 +14,8 @@ #include "esp_log.h" #include "esp_idf_version.h" -#include "lvgl_tft/disp_spi.h" -#include "lvgl_touch/tp_spi.h" +#include "disp_spi.h" +#include "tp_spi.h" #include "lvgl_spi_conf.h" From fc81c6da5a553ac8ba7f6f3bd482cd1f46e6f736 Mon Sep 17 00:00:00 2001 From: C47D Date: Wed, 2 Feb 2022 21:28:34 -0600 Subject: [PATCH 102/105] README: Update peripherals and display gpios helpers --- README.md | 5 +++++ examples/wemos_lolin_oled/hello_world/main/hello_world.c | 3 ++- lvgl_helpers.c | 2 +- lvgl_helpers.h | 2 +- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 522c0e1..e41ab85 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,11 @@ For a ready to use ESP32 project take look at the [lv_port_esp32](https://github **NOTE:** You need to set the display horizontal and vertical size, color depth and swap of RGB565 color on the LVGL configuration menuconfig (it's not handled automatically). +## MCU Configuration + +Example of SPI/I2C configuration peripherals is done with `lvgl_interface_init`. +Example of display gpios configuration, such as the DC, RST, Backlight is done with `lvgl_display_gpios_init` + ## Supported display controllers diff --git a/examples/wemos_lolin_oled/hello_world/main/hello_world.c b/examples/wemos_lolin_oled/hello_world/main/hello_world.c index 6ef1146..9e573b9 100644 --- a/examples/wemos_lolin_oled/hello_world/main/hello_world.c +++ b/examples/wemos_lolin_oled/hello_world/main/hello_world.c @@ -54,7 +54,8 @@ static void guiTask(void *pvParameter) /* Initialize the needed peripherals */ lvgl_interface_init(); /* Initialize needed GPIOs, e.g. backlight, reset GPIOs */ - display_bsp_init_io(); + lvgl_display_gpios_init(); + /* ToDo Initialize used display driver passing registered lv_disp_drv_t as parameter */ size_t display_buffer_size = lvgl_get_display_buffer_size(); diff --git a/lvgl_helpers.c b/lvgl_helpers.c index f6a539f..b5d23e2 100644 --- a/lvgl_helpers.c +++ b/lvgl_helpers.c @@ -153,7 +153,7 @@ void lvgl_interface_init(void) #endif } -void display_bsp_init_io(void) +void lvgl_display_gpios_init(void) { esp_err_t err = ESP_OK; gpio_config_t io_conf = { diff --git a/lvgl_helpers.h b/lvgl_helpers.h index 6031036..c166a23 100644 --- a/lvgl_helpers.h +++ b/lvgl_helpers.h @@ -41,7 +41,7 @@ bool lvgl_spi_driver_init(int host, int miso_pin, int mosi_pin, int sclk_pin, int max_transfer_sz, int dma_channel, int quadwp_pin, int quadhd_pin); /* Initialize display GPIOs, e.g. DC and RST pins */ -void display_bsp_init_io(void); +void lvgl_display_gpios_init(void); /* Get display buffer size */ size_t lvgl_get_display_buffer_size(void); From bb83ea90cb5149f9fddd67daed1eb2704e61786e Mon Sep 17 00:00:00 2001 From: C47D Date: Thu, 10 Feb 2022 11:31:12 -0600 Subject: [PATCH 103/105] Add display interface abtraction layer --- lv_port/lv_port_display_espressif.c | 96 +++++++++++++++++++++++++++++ lvgl_tft/display_port.h | 32 ++++++++++ 2 files changed, 128 insertions(+) diff --git a/lv_port/lv_port_display_espressif.c b/lv_port/lv_port_display_espressif.c index 1684767..7d3bd26 100644 --- a/lv_port/lv_port_display_espressif.c +++ b/lv_port/lv_port_display_espressif.c @@ -6,6 +6,29 @@ #include "sdkconfig.h" #include "driver/gpio.h" +#include "disp_spi.h" +#include "lvgl_i2c/i2c_manager.h" + +#include +#include + +/* NOTE: Needed by the I2C Manager */ +#define OLED_I2C_PORT (CONFIG_LV_I2C_DISPLAY_PORT) +/* FIXME: Be able to get display driver I2C address from Kconfig */ +#if defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_SSD1306) +#define OLED_I2C_ADDRESS 0x3C +#endif + +#define LV_DISPLAY_DC_CMD_MODE 0 +#define LV_DISPLAY_DC_DATA_MODE 1 + +/* Helper functions to get display communication interface kind, this can be + * implemented as users see fit, we're using the symbols created by Kconfig + * because is what we have available. + * Other ways to implement it is using the user_data poiter in lv_disp_drv_t */ +static inline bool display_interface_is_spi(lv_disp_drv_t * drv); +static inline bool display_interface_is_i2c(lv_disp_drv_t * drv); + void display_port_delay(lv_disp_drv_t *drv, uint32_t delay_ms) { (void) drv; @@ -55,3 +78,76 @@ bool display_port_gpio_is_busy(lv_disp_drv_t *drv) return device_busy; } + +void display_interface_send_cmd(lv_disp_drv_t *drv, uint32_t cmd, cmd_width_t cmd_width, void *args, size_t args_len) +{ + (void) drv; + + if (display_interface_is_spi(drv)) { + disp_wait_for_pending_transactions(); + display_port_gpio_dc(drv, LV_DISPLAY_DC_CMD_MODE); + + if (CMD_WIDTH_8BITS == cmd_width) { + disp_spi_send_data(&cmd, 1); + } + else if (CMD_WIDTH_16BITS == cmd_width) { + /* Send 16bits cmd */ + } + else { + /* Invalid cmd size */ + assert(0); + } + + if (args != CMD_WITHOUT_ARGS) { + display_port_gpio_dc(drv, LV_DISPLAY_DC_DATA_MODE); + disp_spi_send_data(args, args_len); + } + } + + if (display_interface_is_i2c(drv)) { + uint8_t *data = (uint8_t *) args; + lvgl_i2c_write(OLED_I2C_PORT, OLED_I2C_ADDRESS, cmd, data, args_len); + } +} + +void display_interface_send_data(lv_disp_drv_t *drv, void *data, size_t len) +{ + (void) drv; + + if (display_interface_is_spi(drv)) { + disp_wait_for_pending_transactions(); + display_port_gpio_dc(drv, LV_DISPLAY_DC_DATA_MODE); + disp_spi_send_colors(data, len); + /* lv_disp_flush_ready is called in the SPI xfer done callback */ + } + + if (display_interface_is_i2c(drv)) { + lvgl_i2c_write(OLED_I2C_PORT, OLED_I2C_ADDRESS, OLED_CONTROL_BYTE_DATA_STREAM, data, len); + } +} + +static inline bool display_interface_is_spi(lv_disp_drv_t * drv) +{ + (void) drv; + + bool retval = false; + +#if defined (CONFIG_LV_TFT_DISPLAY_PROTOCOL_SPI) + retval = true; +#endif + + return retval; +} + +static inline bool display_interface_is_i2c(lv_disp_drv_t * drv) +{ + (void) drv; + + bool retval = false; + +#if defined (CONFIG_LV_TFT_DISPLAY_PROTOCOL_I2C) + retval = true; +#endif + + return retval; +} diff --git a/lvgl_tft/display_port.h b/lvgl_tft/display_port.h index f0004d6..b2cb1d4 100644 --- a/lvgl_tft/display_port.h +++ b/lvgl_tft/display_port.h @@ -15,6 +15,16 @@ extern "C" #include #include +#define CMD_WITHOUT_ARGS NULL + +enum { + CMD_WIDTH_8BITS, + CMD_WIDTH_16BITS, + CMD_WIDTH_INVALID, +}; + +typedef uint8_t cmd_width_t; + /** * Busy wait delay port * @@ -56,6 +66,28 @@ void display_port_gpio_rst(lv_disp_drv_t *drv, uint8_t state); */ bool display_port_gpio_is_busy(lv_disp_drv_t *drv); +/** + * Send cmd to display + * + * @param drv Pointer to driver + * @param cmd Command to send + * @param cmd_width Width of the command (in bits) to be sent, see @ref cmd_width_t + * @param args Pointer to arguments, use CMD_WITHOUT_ARGS to send command without arguments + * @param args_len Arguments length (in bytes) to be sent + */ +void display_interface_send_cmd(lv_disp_drv_t *drv, uint32_t cmd, cmd_width_t cmd_width, void *args, size_t args_len); + +/** + * Send (image) data to display + * + * User must call lv_disp_flush after the image is sent + * + * @param drv Pointer to driver + * @param data Pointer to data to be sent + * @param len Data length (in bytes) to be sent + */ +void display_interface_send_data(lv_disp_drv_t *drv, void *data, size_t len); + #ifdef __cplusplus } /* extern "C" */ #endif From 9b64c063df01be4c9a8e58721f5eebfe4d3a6c91 Mon Sep 17 00:00:00 2001 From: C47D Date: Thu, 10 Feb 2022 11:41:15 -0600 Subject: [PATCH 104/105] Define default OLED_I2C_ADDRESS and other related symbols --- lv_port/lv_port_display_espressif.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lv_port/lv_port_display_espressif.c b/lv_port/lv_port_display_espressif.c index 7d3bd26..f4b4b5d 100644 --- a/lv_port/lv_port_display_espressif.c +++ b/lv_port/lv_port_display_espressif.c @@ -17,8 +17,15 @@ /* FIXME: Be able to get display driver I2C address from Kconfig */ #if defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_SSD1306) #define OLED_I2C_ADDRESS 0x3C +#else +#define OLED_I2C_ADDRESS 0x00 #endif +// Control byte +#define OLED_CONTROL_BYTE_CMD_SINGLE 0x80 +#define OLED_CONTROL_BYTE_CMD_STREAM 0x00 +#define OLED_CONTROL_BYTE_DATA_STREAM 0x40 + #define LV_DISPLAY_DC_CMD_MODE 0 #define LV_DISPLAY_DC_DATA_MODE 1 @@ -88,7 +95,8 @@ void display_interface_send_cmd(lv_disp_drv_t *drv, uint32_t cmd, cmd_width_t cm display_port_gpio_dc(drv, LV_DISPLAY_DC_CMD_MODE); if (CMD_WIDTH_8BITS == cmd_width) { - disp_spi_send_data(&cmd, 1); + uint8_t cmd_8bits = (uint8_t) cmd & 0xFFU; + disp_spi_send_data(&cmd_8bits, 1); } else if (CMD_WIDTH_16BITS == cmd_width) { /* Send 16bits cmd */ From d9d7f87e1ac57c391aa8f4f282722ca936675910 Mon Sep 17 00:00:00 2001 From: C47D Date: Thu, 10 Feb 2022 21:52:48 -0600 Subject: [PATCH 105/105] Add pre-commit configuration file to gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index c2ff946..de65033 100644 --- a/.gitignore +++ b/.gitignore @@ -60,3 +60,6 @@ build # Kconfig files sdkconfig sdkconfig.old + +# pre-commit configuration file +.pre-commit-config.yaml