diff --git a/CHANGLELOG.md b/CHANGLELOG.md index d9029bb7..1e3b1874 100644 --- a/CHANGLELOG.md +++ b/CHANGLELOG.md @@ -63,7 +63,7 @@ - Prepare support for ESP32-S2 - **Breaking:** Removed support for ESP8266! -Updated libraries to ArduinoJson 6.19.3, ArduinoStreamUtils 1.6.2, TFT_eSPI 2.4.42, LovyanGFX 0.4.14 and Adafruit STMPE610 1.1.4 +Updated libraries to ArduinoJson 6.19.3, ArduinoStreamUtils 1.6.2, TFT_eSPI 2.4.43, LovyanGFX 0.4.15 and Adafruit STMPE610 1.1.4 ## v0.6.2 diff --git a/platformio.ini b/platformio.ini index 2e45733a..d66edcb9 100644 --- a/platformio.ini +++ b/platformio.ini @@ -98,11 +98,11 @@ src_filter = +<*> -<.git/> - - - - -getInt("wr", TFT_WR); cfg.pin_rs = prefs->getInt("rs", TFT_DC); cfg.freq_write = prefs->getUInt("write_freq", SPI_FREQUENCY); - uint8_t port = prefs->getUInt("port", 0); + uint8_t port = prefs->getUInt("i2s_port", 0); switch(port) { #if SOC_I2S_NUM > 1 case 1: @@ -81,7 +81,7 @@ static lgfx::Bus_Parallel8* init_parallel_8_bus(Preferences* prefs, int8_t data_ cfg.pin_wr = prefs->getInt("wr", TFT_WR); cfg.pin_rs = prefs->getInt("rs", TFT_DC); cfg.freq_write = prefs->getUInt("write_freq", SPI_FREQUENCY); - uint8_t port = prefs->getUInt("port", 0); + uint8_t port = prefs->getUInt("i2s_port", 0); switch(port) { #if SOC_I2S_NUM > 1 case 1: @@ -169,7 +169,7 @@ static lgfx::Bus_SPI* init_spi_bus(Preferences* prefs) return bus; } -static void init_panel(lgfx::Panel_Device* panel, Preferences* prefs) +static void configure_panel(lgfx::Panel_Device* panel, Preferences* prefs) { auto cfg = panel->config(); // Get the structure for display panel settings. @@ -194,14 +194,15 @@ static void init_panel(lgfx::Panel_Device* panel, Preferences* prefs) prefs->getUInt("dummy_read_bits", 1); // bits of dummy read before reading data other than pixels cfg.readable = prefs->getBool("readable", false); // true if data can be read -// #ifdef INVERT_COLORS // This is configurable un Web UI -// cfg.invert = -// prefs->getBool("invert", INVERT_COLORS != 0); // true if the light and darkness of the panel is reversed -// #else - cfg.invert = prefs->getBool("invert", false); // true if the light and darkness of the panel is reversed + // #ifdef INVERT_COLORS // This is configurable un Web UI + // cfg.invert = + // prefs->getBool("invert", INVERT_COLORS != 0); // true if the light and darkness of the panel is reversed + // #else + cfg.invert = prefs->getBool("invert", false); // true if the light and darkness of the panel is reversed // #endif #ifdef TFT_RGB_ORDER - cfg.rgb_order = prefs->getBool("rgb_order", true); // true if the red and blue of the panel are swapped + cfg.rgb_order = + prefs->getBool("rgb_order", TFT_RGB_ORDER != 0); // true if the red and blue of the panel are swapped #else cfg.rgb_order = prefs->getBool("rgb_order", false); // true if the red and blue of the panel are swapped #endif @@ -211,94 +212,80 @@ static void init_panel(lgfx::Panel_Device* panel, Preferences* prefs) panel->config(cfg); } -void LovyanGfx::init(int w, int h) +// Initialize the bus +lgfx::IBus* _init_bus(Preferences* preferences) { - LOG_TRACE(TAG_TFT, F(D_SERVICE_STARTING)); + if(!preferences) return nullptr; - Preferences preferences; - preferences.begin("tft", false); - - lgfx::IBus* bus; - { // Initialize the bus - char key[8]; - int8_t data_pins[16] = {TFT_D0, TFT_D1, TFT_D2, TFT_D3, TFT_D4, TFT_D5, TFT_D6, TFT_D7, - TFT_D8, TFT_D9, TFT_D10, TFT_D11, TFT_D12, TFT_D13, TFT_D14, TFT_D15}; - for(uint8_t i = 0; i < 16; i++) { - snprintf(key, sizeof(key), "d%d", i + 1); - data_pins[i] = preferences.getInt(key, data_pins[i]); - LOG_DEBUG(TAG_TFT, F("D%d: %d"), i + 1, data_pins[i]); - } - - LOG_DEBUG(TAG_TFT, F("%s - %d"), __FILE__, __LINE__); - bool is_8bit = true; - bool is_16bit = true; - for(uint8_t i = 0; i < 16; i++) { - if(i < 8) is_8bit = is_8bit && (data_pins[i] >= 0); - is_16bit = is_16bit && (data_pins[i] >= 0); - } - - LOG_DEBUG(TAG_TFT, F("%s - %d"), __FILE__, __LINE__); -#if defined(ESP32S2) - if(is_16bit) { - is_8bit = false; - bus = init_parallel_16_bus(&preferences, data_pins, 16); - } else -#endif // ESP32S2 - if(is_8bit) { - is_16bit = false; - bus = init_parallel_8_bus(&preferences, data_pins, 8); - } else { - bus = init_spi_bus(&preferences); - } + char key[8]; + int8_t data_pins[16] = {TFT_D0, TFT_D1, TFT_D2, TFT_D3, TFT_D4, TFT_D5, TFT_D6, TFT_D7, + TFT_D8, TFT_D9, TFT_D10, TFT_D11, TFT_D12, TFT_D13, TFT_D14, TFT_D15}; + for(uint8_t i = 0; i < 16; i++) { + snprintf(key, sizeof(key), "d%d", i + 1); + data_pins[i] = preferences->getInt(key, data_pins[i]); + LOG_DEBUG(TAG_TFT, F("D%d: %d"), i + 1, data_pins[i]); } - uint32_t tft_driver = preferences.getUInt("DRIVER", get_tft_driver()); + LOG_DEBUG(TAG_TFT, F("%s - %d"), __FILE__, __LINE__); + bool is_8bit = true; + bool is_16bit = true; + for(uint8_t i = 0; i < 16; i++) { + if(i < 8) is_8bit = is_8bit && (data_pins[i] >= 0); + is_16bit = is_16bit && (data_pins[i] >= 0); + } + + LOG_DEBUG(TAG_TFT, F("%s - %d"), __FILE__, __LINE__); +#if defined(ESP32S2) + if(is_16bit) { + is_8bit = false; + return init_parallel_16_bus(preferences, data_pins, 16); + } else +#endif // ESP32S2 + if(is_8bit) { + is_16bit = false; + return init_parallel_8_bus(preferences, data_pins, 8); + } else { + return init_spi_bus(preferences); + } + return nullptr; +} + +lgfx::Panel_Device* LovyanGfx::_init_panel(lgfx::IBus* bus) +{ + lgfx::Panel_Device* panel = nullptr; switch(tft_driver) { case 0x9341: { - auto panel = new lgfx::Panel_ILI9341(); - panel->setBus(bus); - init_panel(panel, &preferences); - tft.setPanel(panel); + panel = new lgfx::Panel_ILI9341(); LOG_DEBUG(TAG_TFT, F("%s - %d"), __FILE__, __LINE__); break; } case 0x9342: { - auto panel = new lgfx::Panel_ILI9342(); - panel->setBus(bus); - init_panel(panel, &preferences); - tft.setPanel(panel); + panel = new lgfx::Panel_ILI9342(); LOG_DEBUG(TAG_TFT, F("%s - %d"), __FILE__, __LINE__); break; } case 0x9481: { - auto panel = new lgfx::Panel_ILI9481(); - panel->setBus(bus); - init_panel(panel, &preferences); - tft.setPanel(panel); + panel = new lgfx::Panel_ILI9481(); LOG_DEBUG(TAG_TFT, F("%s - %d"), __FILE__, __LINE__); break; } case 0x9488: { - auto panel = new lgfx::Panel_ILI9488(); - panel->setBus(bus); - init_panel(panel, &preferences); - tft.setPanel(panel); + panel = new lgfx::Panel_ILI9488(); + LOG_DEBUG(TAG_TFT, F("%s - %d"), __FILE__, __LINE__); + break; + } + case 0x7789: { + panel = new lgfx::Panel_ST7789(); LOG_DEBUG(TAG_TFT, F("%s - %d"), __FILE__, __LINE__); break; } case 0x7796: { - auto panel = new lgfx::Panel_ST7796(); - panel->setBus(bus); - init_panel(panel, &preferences); - tft.setPanel(panel); + panel = new lgfx::Panel_ST7796(); LOG_DEBUG(TAG_TFT, F("%s - %d"), __FILE__, __LINE__); break; } case 0x8357D: { - auto panel = new lgfx::Panel_HX8357D(); - panel->setBus(bus); - init_panel(panel, &preferences); - tft.setPanel(panel); + panel = new lgfx::Panel_HX8357D(); LOG_DEBUG(TAG_TFT, F("%s - %d"), __FILE__, __LINE__); break; } @@ -306,6 +293,26 @@ void LovyanGfx::init(int w, int h) LOG_FATAL(TAG_TFT, F(D_SERVICE_START_FAILED ": %s line %d"), __FILE__, __LINE__); } } + + return panel; +} + +void LovyanGfx::init(int w, int h) +{ + LOG_TRACE(TAG_TFT, F(D_SERVICE_STARTING)); + + Preferences preferences; + preferences.begin("tft", false); + + lgfx::IBus* bus = _init_bus(&preferences); + this->tft_driver = preferences.getUInt("DRIVER", get_tft_driver()); + lgfx::Panel_Device* panel = _init_panel(bus); + if(panel != nullptr) { + panel->setBus(bus); + configure_panel(panel, &preferences); + } + tft.setPanel(panel); + LOG_DEBUG(TAG_TFT, F("%s - %d"), __FILE__, __LINE__); /* TFT init */ @@ -589,10 +596,10 @@ uint32_t LovyanGfx::get_tft_driver() return 0xED; #elif defined(ST7789_DRIVER) return 0x7789; -#elif defined(R61581_DRIVER) - return 0x61581; #elif defined(ST7789_2_DRIVER) return 0x77892; +#elif defined(R61581_DRIVER) + return 0x61581; #elif defined(RM68140_DRIVER) return 0x68140; #else diff --git a/src/drv/tft/tft_driver_lovyangfx.h b/src/drv/tft/tft_driver_lovyangfx.h index fa76ffc5..949972ec 100644 --- a/src/drv/tft/tft_driver_lovyangfx.h +++ b/src/drv/tft/tft_driver_lovyangfx.h @@ -137,9 +137,13 @@ class LovyanGfx : BaseTft { } private: + uint32_t tft_driver; + uint32_t get_tft_driver(); uint32_t get_touch_driver(); + lgfx::Panel_Device* _init_panel(lgfx::IBus* bus); + void tftOffsetInfo(uint8_t pin, uint8_t x_offset, uint8_t y_offset) { if(x_offset != 0) { diff --git a/user_setups/esp32/lanbon_l8.ini b/user_setups/esp32/lanbon_l8.ini index ee17597d..778373a4 100644 --- a/user_setups/esp32/lanbon_l8.ini +++ b/user_setups/esp32/lanbon_l8.ini @@ -16,8 +16,21 @@ build_flags = -D HASP_MODEL="Lanbon L8" ;region -- TFT_eSPI build options ------------------------ - ${lcd.st7789v} -D LANBONL8 + ; -D USER_SETUP_LOADED=1 + -D LGFX_USE_V1=1 + -D ST7789_DRIVER=1 + ;-D CGRAM_OFFSET=1 ; Library will add offsets required + -D TFT_SDA_READ ; Read from display, it only provides an SDA pin + -D TFT_WIDTH=240 + -D TFT_HEIGHT=320 + -D TFT_ROTATION=2 ; see TFT_ROTATION values + ; -D TFT_INVERSION_OFF ; for normal colors + ; -D TFT_RGB_ORDER=1 ; Colour order Red-Green-Blue + -D TFT_RGB_ORDER=0 ; Colour order Blue-Green-Red + -D SPI_FREQUENCY=60000000 + -D SPI_READ_FREQUENCY=6000000 + -D SUPPORT_TRANSACTIONS -D TFT_RST=18 ; FCP pin2 RESET -D TFT_SCLK=19 ; FCP pin3 SCL -D TFT_DC=21 ; FCP pin4 D/C @@ -44,7 +57,8 @@ build_flags = lib_deps = ${env.lib_deps} ${esp32.lib_deps} - ${tft_espi.lib_deps} + ${lovyangfx.lib_deps} + ;${tft_espi.lib_deps} ; FT6336U is 6x faster then FocalTech Library ;git+https://github.com/lewisxhe/FocalTech_Library.git ${ft6336.lib_deps}