From d191a285e9df37b3ff9d48692dc2bd4f5ed6709e Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Sat, 9 Mar 2024 17:38:45 +0100 Subject: [PATCH 1/6] [P116] Add alternative model selections for ST7789 --- lib/Adafruit_ST77xx/Adafruit_ST7789.cpp | 174 ++++++++++++++++++++- lib/Adafruit_ST77xx/Adafruit_ST7789.h | 18 ++- lib/Adafruit_ST77xx/Adafruit_ST77xx.h | 36 +++++ src/_P116_ST77xx.ino | 25 ++- src/src/PluginStructs/P116_data_struct.cpp | 35 ++++- src/src/PluginStructs/P116_data_struct.h | 25 ++- 6 files changed, 295 insertions(+), 18 deletions(-) diff --git a/lib/Adafruit_ST77xx/Adafruit_ST7789.cpp b/lib/Adafruit_ST77xx/Adafruit_ST7789.cpp index 9fd2f00e41..dca4b69971 100644 --- a/lib/Adafruit_ST77xx/Adafruit_ST7789.cpp +++ b/lib/Adafruit_ST77xx/Adafruit_ST7789.cpp @@ -76,6 +76,165 @@ static const uint8_t PROGMEM ST77XX_DISPON , ST_CMD_DELAY, // 9: Main screen turn on, no args, delay 10 }; // 10 ms delay +#if ST7789_EXTRA_INIT +static const uint8_t PROGMEM // Source: https://github.com/Xinyuan-LilyGO/TTGO-T-Display + alt1_st7789[] = { // Init commands for 7789 screens Alternative 1 + 20, // 20 commands in list: + ST77XX_SLPOUT, ST_CMD_DELAY, // 1: Out of sleep mode, no args, w/delay + 120, // 120 ms delay + ST77XX_NORON, ST_CMD_DELAY, // 2: Normal display on, no args, w/delay + 10, // 10 ms delay + ST77XX_MADCTL, 1, // 3: Mem access ctrl (directions), 1 arg: + 0x08, // Row/col addr, bottom-top refresh + 0xB6, 2, // 4: ?JXL240 datasheet? + 0x0A, 0x82, + ST77XX_COLMOD, 1+ ST_CMD_DELAY, // 5: Set color mode, 1 arg + delay: + 0x55, // 16-bit color + 10, // 10 ms delay + ST77XX_PORCTRL, 5, // 6: Porch control, Framerate setting + 0x0c, 0x0c, 0x00, 0x33, 0x33, + ST77XX_GCTRL, 1, // 7: Gate control, Voltages VGH/VGL + 0x35, + ST77XX_VCOMS, 1, // 8: Power settings + 0x28, + ST77XX_LCMCTRL, 1, // 9: LCM Control + 0x0C, + ST77XX_VDVVRHEN, 2, // 10: VDV & VRH command enable + 0x01, 0xFF, + ST77XX_VRHS, 1, // 11: VRH set + 0x10, + ST77XX_VDVSET, 1, // 12: VDV set + 0x20, + ST77XX_FRCTR2, 1, // 13: FR Control 2 + 0x0F, + ST77XX_PWCTRL1, 2, // 14: Power Control 1 + 0xA4, 0xA1, + ST77XX_PVGAMCTRL, 14, // 15: Positive Voltage Gamma control + 0xD0, 0x00, 0x02, 0x07, 0x0A, 0x28, 0x32, 0x44, 0x42, 0x06, 0x0E, 0x12, 0x14, 0x17, + ST77XX_NVGAMCTRL, 14, // 16: Negative Voltage Gamma control + 0xD0, 0x00, 0x02, 0x07, 0x0A, 0x28, 0x31, 0x54, 0x47, 0x0E, 0x1C, 0x17, 0x1B, 0x1E, + ST77XX_INVON, ST_CMD_DELAY, // 17: hack + 10, + ST77XX_CASET , 4, // 18: Column addr set, 4 args, no delay: + 0x00, + 0, // XSTART = 0 + 0, + 240, // XEND = 240 + ST77XX_RASET , 4, // 19: Row addr set, 4 args, no delay: + 0x00, + 0, // YSTART = 0 + 320>>8, + 320&0xFF, // YEND = 320 + ST77XX_DISPON, ST_CMD_DELAY, // 20: Main screen turn on, no args, delay + 120 // 120 ms delay + }; + +static const uint8_t PROGMEM // Source: https://github.com/Bodmer/TFT_eSPI (ST7789_init.h, _NOT_ INIT_SEQUENCE_3) + alt2_st7789[] = { // Init commands for 7789 screens Alternative 2 + 21, // 21 commands in list: + ST77XX_SLPOUT, ST_CMD_DELAY, // 1: Out of sleep mode, no args, w/delay + 120, // 120 ms delay + ST77XX_NORON, ST_CMD_DELAY, // 2: Normal display on, no args, w/delay + 10, // 10 ms delay + ST77XX_MADCTL, 1, // 3: Mem access ctrl (directions), 1 arg: + 0x08, // Row/col addr, bottom-top refresh + 0xB6, 2, // 4: ?JXL240 datasheet? + 0x0A, 0x82, + ST77XX_RAMCTRL, 2, // 5: RAM control + 0x00, 0xE0, // 5 to 6-bit conversion: r0 = r5, b0 = b5 + ST77XX_COLMOD, 1+ ST_CMD_DELAY, // 6: Set color mode, 1 arg + delay: + 0x55, // 16-bit color + 10, // 10 ms delay + ST77XX_PORCTRL, 5, // 7: Porch control, Framerate setting + 0x0c, 0x0c, 0x00, 0x33, 0x33, + ST77XX_GCTRL, 1, // 8: Gate control, Voltages VGH/VGL + 0x35, + ST77XX_VCOMS, 1, // 9: Power settings + 0x28, + ST77XX_LCMCTRL, 1, // 10: LCM Control + 0x0C, + ST77XX_VDVVRHEN, 2, // 11: VDV & VRH command enable + 0x01, 0xFF, + ST77XX_VRHS, 1, // 12: VRH set + 0x10, + ST77XX_VDVSET, 1, // 13: VDV set + 0x20, + ST77XX_FRCTR2, 1, // 14: FR Control 2 + 0x0F, + ST77XX_PWCTRL1, 2, // 15: Power Control 1 + 0xA4, 0xA1, + ST77XX_PVGAMCTRL, 14, // 16: Positive Voltage Gamma control + 0xD0, 0x00, 0x02, 0x07, 0x0A, 0x28, 0x32, 0x44, 0x42, 0x06, 0x0E, 0x12, 0x14, 0x17, + ST77XX_NVGAMCTRL, 14, // 17: Negative Voltage Gamma control + 0xD0, 0x00, 0x02, 0x07, 0x0A, 0x28, 0x31, 0x54, 0x47, 0x0E, 0x1C, 0x17, 0x1B, 0x1E, + ST77XX_INVON, ST_CMD_DELAY, // 18: hack + 10, + ST77XX_CASET , 4, // 19: Column addr set, 4 args, no delay: + 0x00, + 0, // XSTART = 0 + 0, + 239, // XEND = 239 + ST77XX_RASET , 4, // 20: Row addr set, 4 args, no delay: + 0x00, + 0, // YSTART = 0 + 319>>8, + 319&0xFF, // YEND = 319 + ST77XX_DISPON, ST_CMD_DELAY, // 21: Main screen turn on, no args, delay + 120 // 120 ms delay + }; + +static const uint8_t PROGMEM // Source: https://github.com/Bodmer/TFT_eSPI (ST7789_init.h, _WITH_ INIT_SEQUENCE_3) + alt3_st7789[] = { // Init commands for 7789 screens Alternative 2 + 18, // 18 commands in list: + ST77XX_SLPOUT, ST_CMD_DELAY, // 1: Out of sleep mode, no args, w/delay + 120, // 120 ms delay + ST77XX_NORON, ST_CMD_DELAY, // 2: Normal display on, no args, w/delay + 10, // 10 ms delay + ST77XX_MADCTL, 1, // 3: Mem access ctrl (directions), 1 arg: + 0x08, // Row/col addr, bottom-top refresh + 0xB6, 2, // 4: ?JXL240 datasheet? + 0x0A, 0x82, + ST77XX_COLMOD, 1+ ST_CMD_DELAY, // 5: Set color mode, 1 arg + delay: + 0x55, // 16-bit color + 10, // 10 ms delay + ST77XX_PORCTRL, 5, // 6: Porch control, Framerate setting + 0x0c, 0x0c, 0x00, 0x33, 0x33, + ST77XX_GCTRL, 1, // 7: Gate control, Voltages VGH/VGL + 0x75, + ST77XX_VCOMS, 1, // 8: Power settings + 0x28, + ST77XX_LCMCTRL, 1, // 9: LCM Control + 0x2C, + ST77XX_VDVVRHEN, 1, // 10: VDV & VRH command enable + 0x01, + ST77XX_VRHS, 1, // 11: VRH set + 0x1F, + ST77XX_FRCTR2, 1, // 12: FR Control 2 + 0x13, + ST77XX_PWCTRL1, 1, // 13: Power Control 1 + 0xA7, + ST77XX_PWCTRL1, 2, // 14: Power Control 1 + 0xA4, 0xA1, + 0xD6, 1, // 15: ? + 0xA1, + ST77XX_PVGAMCTRL, 14, // 16: Positive Voltage Gamma control + 0xF0, 0x05, 0x0A, 0x06, 0x06, 0x03, 0x2B, 0x32, 0x43, 0x36, 0x11, 0x10, 0x2B, 0x32, + ST77XX_NVGAMCTRL, 14, // 17: Negative Voltage Gamma control + 0xF0, 0x08, 0x0C, 0x0B, 0x09, 0x24, 0x2B, 0x22, 0x43, 0x38, 0x15, 0x16, 0x2F, 0x37, + // ST77XX_CASET , 4, // 18: Column addr set, 4 args, no delay: + // 0x00, + // 0, // XSTART = 0 + // 0, + // 239, // XEND = 239 + // ST77XX_RASET , 4, // 19: Row addr set, 4 args, no delay: + // 0x00, + // 0, // YSTART = 0 + // 319>>8, + // 319&0xFF, // YEND = 319 + ST77XX_DISPON, ST_CMD_DELAY, // 18: Main screen turn on, no args, delay + 120 // 120 ms delay + }; +#endif // if ST7789_EXTRA_INIT // clang-format on /**************************************************************************/ @@ -88,7 +247,7 @@ static const uint8_t PROGMEM the defines only, the values are NOT the same!) */ /**************************************************************************/ -void Adafruit_ST7789::init(uint16_t width, uint16_t height, uint8_t mode) { +void Adafruit_ST7789::init(uint16_t width, uint16_t height, uint8_t mode, uint8_t init_seq) { // Save SPI data mode. commonInit() calls begin() (in Adafruit_ST77xx.cpp), // which in turn calls initSPI() (in Adafruit_SPITFT.cpp), passing it the // value of spiMode. It's done this way because begin() really should not @@ -123,7 +282,18 @@ void Adafruit_ST7789::init(uint16_t width, uint16_t height, uint8_t mode) { windowWidth = width; windowHeight = height; - displayInit(generic_st7789); + const uint8_t *init_ = generic_st7789; + + #if ST7789_EXTRA_INIT + if (1 == init_seq) { + init_ = alt1_st7789; + } else if (2 == init_seq) { + init_ = alt2_st7789; + } else if (3 == init_seq) { + init_ = alt3_st7789; + } + #endif // if ST7789_EXTRA_INIT + displayInit(init_); setRotation(0); } diff --git a/lib/Adafruit_ST77xx/Adafruit_ST7789.h b/lib/Adafruit_ST77xx/Adafruit_ST7789.h index 7fe09d6f02..865780bc06 100644 --- a/lib/Adafruit_ST77xx/Adafruit_ST7789.h +++ b/lib/Adafruit_ST77xx/Adafruit_ST7789.h @@ -3,6 +3,22 @@ #include "Adafruit_ST77xx.h" +/** + * 2024-03-09 tonhuisman: Add additional initialization sequences for ST7789 displays, with the intention to get 'm working + * on some devices that seem to use peculiarly configured hardware like LiliGO TTGO T-Display (16MB flash), + * and possibly the T-Display S3 + * By default only enabled on ESP32, unless -D ST7789_EXTRA_INIT=1 is defined, f.e. via the build script + */ + +#ifndef ST7789_EXTRA_INIT // Enable setting from 'outside', like Platformio.ini +# ifdef ESP8266 +# define ST7789_EXTRA_INIT 0 +# endif // ifdef ESP8266 +# ifdef ESP32 +# define ST7789_EXTRA_INIT 1 +# endif // ifdef ESP32 +#endif + /// Subclass of ST77XX type display for ST7789 TFT Driver class Adafruit_ST7789 : public Adafruit_ST77xx { public: @@ -14,7 +30,7 @@ class Adafruit_ST7789 : public Adafruit_ST77xx { #endif // end !ESP8266 void setRotation(uint8_t m); - void init(uint16_t width, uint16_t height, uint8_t spiMode = SPI_MODE0); + void init(uint16_t width, uint16_t height, uint8_t spiMode = SPI_MODE0, uint8_t init_seq = 0u); protected: uint8_t _colstart2 = 0, ///< Offset from the right diff --git a/lib/Adafruit_ST77xx/Adafruit_ST77xx.h b/lib/Adafruit_ST77xx/Adafruit_ST77xx.h index fcf0c6f6e8..2ad2a63263 100644 --- a/lib/Adafruit_ST77xx/Adafruit_ST77xx.h +++ b/lib/Adafruit_ST77xx/Adafruit_ST77xx.h @@ -63,6 +63,42 @@ #define ST77XX_MADCTL 0x36 #define ST77XX_COLMOD 0x3A +#define ST77XX_RAMCTRL 0xB0 // RAM control +#define ST77XX_RGBCTRL 0xB1 // RGB control +#define ST77XX_PORCTRL 0xB2 // Porch control +#define ST77XX_FRCTRL1 0xB3 // Frame rate control +#define ST77XX_PARCTRL 0xB5 // Partial mode control +#define ST77XX_GCTRL 0xB7 // Gate control +#define ST77XX_GTADJ 0xB8 // Gate on timing adjustment +#define ST77XX_DGMEN 0xBA // Digital gamma enable +#define ST77XX_VCOMS 0xBB // VCOMS setting +#define ST77XX_LCMCTRL 0xC0 // LCM control +#define ST77XX_IDSET 0xC1 // ID setting +#define ST77XX_VDVVRHEN 0xC2 // VDV and VRH command enable +#define ST77XX_VRHS 0xC3 // VRH set +#define ST77XX_VDVSET 0xC4 // VDV setting +#define ST77XX_VCMOFSET 0xC5 // VCOMS offset set +#define ST77XX_FRCTR2 0xC6 // FR Control 2 +#define ST77XX_CABCCTRL 0xC7 // CABC control +#define ST77XX_REGSEL1 0xC8 // Register value section 1 +#define ST77XX_REGSEL2 0xCA // Register value section 2 +#define ST77XX_PWMFRSEL 0xCC // PWM frequency selection +#define ST77XX_PWCTRL1 0xD0 // Power control 1 +#define ST77XX_VAPVANEN 0xD2 // Enable VAP/VAN signal output +#define ST77XX_CMD2EN 0xDF // Command 2 enable +#define ST77XX_PVGAMCTRL 0xE0 // Positive voltage gamma control +#define ST77XX_NVGAMCTRL 0xE1 // Negative voltage gamma control +#define ST77XX_DGMLUTR 0xE2 // Digital gamma look-up table for red +#define ST77XX_DGMLUTB 0xE3 // Digital gamma look-up table for blue +#define ST77XX_GATECTRL 0xE4 // Gate control +#define ST77XX_SPI2EN 0xE7 // SPI2 enable +#define ST77XX_PWCTRL2 0xE8 // Power control 2 +#define ST77XX_EQCTRL 0xE9 // Equalize time control +#define ST77XX_PROMCTRL 0xEC // Program control +#define ST77XX_PROMEN 0xFA // Program mode enable +#define ST77XX_NVMSET 0xFC // NVM setting +#define ST77XX_PROMACT 0xFE // Program action + #define ST77XX_MADCTL_MY 0x80 #define ST77XX_MADCTL_MX 0x40 #define ST77XX_MADCTL_MV 0x20 diff --git a/src/_P116_ST77xx.ino b/src/_P116_ST77xx.ino index ef010cd917..3352d91492 100644 --- a/src/_P116_ST77xx.ino +++ b/src/_P116_ST77xx.ino @@ -8,6 +8,9 @@ // History: +// 2024-03-09 tonhuisman: Add support for alternative initialization sequences for ST7789 displays, like used on +// some LilyGO models like the TTGO T-Display (16 MB Flash), and possibly the T-Display S3 +// By default only enabled on ESP32 builds // 2023-02-27 tonhuisman: Implement support for getting config values, see AdafruitGFX_Helper.h changelog for details // 2022-07-06 tonhuisman: Add support for ST7735sv M5Stack StickC (Inverted colors) // 2021-11-16 tonhuisman: P116: Change state from Development to Testing @@ -80,16 +83,16 @@ boolean Plugin_116(uint8_t function, struct EventStruct *event, String& string) case PLUGIN_WEBFORM_SHOW_GPIO_DESCR: { - const char* separator = event->String1.c_str(); // contains the NewLine sequence + const char *separator = event->String1.c_str(); // contains the NewLine sequence string = strformat( F("CS: %s%sDC: %s%s RES: %s%sBtn: %s%sBckl: : %s"), - formatGpioLabel(PIN(0), false).c_str(), + formatGpioLabel(PIN(0), false).c_str(), separator, - formatGpioLabel(PIN(1), false).c_str(), + formatGpioLabel(PIN(1), false).c_str(), separator, - formatGpioLabel(PIN(2), false).c_str(), + formatGpioLabel(PIN(2), false).c_str(), separator, - formatGpioLabel(P116_CONFIG_BUTTON_PIN, false).c_str(), + formatGpioLabel(P116_CONFIG_BUTTON_PIN, false).c_str(), separator, formatGpioLabel(P116_CONFIG_BACKLIGHT_PIN, false).c_str()); success = true; @@ -146,6 +149,11 @@ boolean Plugin_116(uint8_t function, struct EventStruct *event, String& string) ST77xx_type_toString(ST77xx_type_e::ST7789vw_240x240), ST77xx_type_toString(ST77xx_type_e::ST7789vw_240x280), ST77xx_type_toString(ST77xx_type_e::ST7789vw_135x240), + # if P116_EXTRA_ST7789 + ST77xx_type_toString(ST77xx_type_e::ST7789vw1_135x240), + ST77xx_type_toString(ST77xx_type_e::ST7789vw2_135x240), + ST77xx_type_toString(ST77xx_type_e::ST7789vw3_135x240), + # endif // if P116_EXTRA_ST7789 ST77xx_type_toString(ST77xx_type_e::ST7796s_320x480) }; const int optionValues4[] = { @@ -157,9 +165,14 @@ boolean Plugin_116(uint8_t function, struct EventStruct *event, String& string) static_cast(ST77xx_type_e::ST7789vw_240x240), static_cast(ST77xx_type_e::ST7789vw_240x280), static_cast(ST77xx_type_e::ST7789vw_135x240), + # if P116_EXTRA_ST7789 + static_cast(ST77xx_type_e::ST7789vw1_135x240), + static_cast(ST77xx_type_e::ST7789vw2_135x240), + static_cast(ST77xx_type_e::ST7789vw3_135x240), + # endif // if P116_EXTRA_ST7789 static_cast(ST77xx_type_e::ST7796s_320x480) }; - constexpr int optCount4 = sizeof(optionValues4) / sizeof(optionValues4[0]); + constexpr int optCount4 = NR_ELEMENTS(optionValues4); addFormSelector(F("TFT display model"), F("type"), optCount4, diff --git a/src/src/PluginStructs/P116_data_struct.cpp b/src/src/PluginStructs/P116_data_struct.cpp index 3e88fcf499..44327c7461 100644 --- a/src/src/PluginStructs/P116_data_struct.cpp +++ b/src/src/PluginStructs/P116_data_struct.cpp @@ -15,6 +15,11 @@ const __FlashStringHelper* ST77xx_type_toString(const ST77xx_type_e& device) { case ST77xx_type_e::ST7789vw_240x240: return F("ST7789 240 x 240px"); case ST77xx_type_e::ST7789vw_240x280: return F("ST7789 240 x 280px"); case ST77xx_type_e::ST7789vw_135x240: return F("ST7789 135 x 240px"); + # if P116_EXTRA_ST7789 + case ST77xx_type_e::ST7789vw1_135x240: return F("ST7789 135 x 240px (alt1)"); + case ST77xx_type_e::ST7789vw2_135x240: return F("ST7789 135 x 240px (alt2)"); + case ST77xx_type_e::ST7789vw3_135x240: return F("ST7789 135 x 240px (alt3)"); + # endif // if P116_EXTRA_ST7789 case ST77xx_type_e::ST7796s_320x480: return F("ST7796 320 x 480px"); } return F("Unsupported type!"); @@ -53,6 +58,11 @@ void ST77xx_type_toResolution(const ST77xx_type_e& device, y = 280; break; case ST77xx_type_e::ST7789vw_135x240: + # if P116_EXTRA_ST7789 + case ST77xx_type_e::ST7789vw1_135x240: + case ST77xx_type_e::ST7789vw2_135x240: + case ST77xx_type_e::ST7789vw3_135x240: + # endif // if P116_EXTRA_ST7789 x = 135; y = 240; break; @@ -163,11 +173,28 @@ bool P116_data_struct::plugin_init(struct EventStruct *event) { case ST77xx_type_e::ST7789vw_240x240: case ST77xx_type_e::ST7789vw_240x280: case ST77xx_type_e::ST7789vw_135x240: + # if P116_EXTRA_ST7789 + case ST77xx_type_e::ST7789vw1_135x240: + case ST77xx_type_e::ST7789vw2_135x240: + case ST77xx_type_e::ST7789vw3_135x240: + # endif // if P116_EXTRA_ST7789 { st7789 = new (std::nothrow) Adafruit_ST7789(PIN(0), PIN(1), PIN(2)); if (nullptr != st7789) { - st7789->init(_xpix, _ypix, SPI_MODE2); + uint8_t init_seq = 0; // Default/original initialisation + + # if P116_EXTRA_ST7789 + + if (ST77xx_type_e::ST7789vw1_135x240 == _device) { + init_seq = 1; + } else if (ST77xx_type_e::ST7789vw2_135x240 == _device) { + init_seq = 2; + } else if (ST77xx_type_e::ST7789vw3_135x240 == _device) { + init_seq = 3; + } + # endif // if P116_EXTRA_ST7789 + st7789->init(_xpix, _ypix, SPI_MODE2, init_seq); st77xx = st7789; } break; @@ -330,7 +357,7 @@ bool P116_data_struct::plugin_read(struct EventStruct *event) { gfxHelper->setColumnRowMode(bitRead(P116_CONFIG_FLAGS, P116_CONFIG_FLAG_USE_COL_ROW)); // Restore column mode int16_t curX, curY; gfxHelper->getCursorXY(curX, curY); // Get current X and Y coordinates, - UserVar.setFloat(event->TaskIndex, 0, curX); // and put into Values + UserVar.setFloat(event->TaskIndex, 0, curX); // and put into Values UserVar.setFloat(event->TaskIndex, 1, curY); } } @@ -385,8 +412,8 @@ bool P116_data_struct::plugin_write(struct EventStruct *event, st77xx->fillScreen(_bgcolor); } else if (equals(arg1, F("backlight"))) { - String arg2 = parseString(string, 3); - int32_t nArg2{}; + String arg2 = parseString(string, 3); + int32_t nArg2{}; if ((P116_CONFIG_BACKLIGHT_PIN != -1) && // All is valid? validIntFromString(arg2, nArg2) && diff --git a/src/src/PluginStructs/P116_data_struct.h b/src/src/PluginStructs/P116_data_struct.h index 2144ebd8ff..baf735f5ba 100644 --- a/src/src/PluginStructs/P116_data_struct.h +++ b/src/src/PluginStructs/P116_data_struct.h @@ -4,11 +4,21 @@ #include "../../_Plugin_Helper.h" #ifdef USES_P116 -# include // include Adafruit graphics library -# include // include Adafruit ST77xx TFT library -# include // include Adafruit ST7735 TFT library -# include // include Adafruit ST7789 TFT library -# include // include Adafruit ST7796 TFT library +# include // include Adafruit graphics library +# include // include Adafruit ST77xx TFT library +# include // include Adafruit ST7735 TFT library +# include // include Adafruit ST7789 TFT library +# include // include Adafruit ST7796 TFT library + +# if defined(ST7789_EXTRA_INIT) && !ST7789_EXTRA_INIT +# define P116_EXTRA_ST7789 0 // This will get disabled for ESP8266 in Adafruit_ST7789.h +# endif // if defined(ST7789_EXTRA_INIT) && !ST7789_EXTRA_INIT +# if defined(LIMIT_BUILD_SIZE) and !defined(P116_EXTRA_ST7789) +# define P116_EXTRA_ST7789 0 +# endif // if defined(LIMIT_BUILD_SIZE) and !defined(P116_EXTRA_ST7789) +# ifndef P116_EXTRA_ST7789 +# define P116_EXTRA_ST7789 1 +# endif // ifndef P116_EXTRA_ST7789 # include "../Helpers/AdafruitGFX_helper.h" // Use Adafruit graphics helper object # include "../CustomBuild/StorageLayout.h" @@ -74,6 +84,11 @@ enum class ST77xx_type_e : uint8_t { ST7789vw_135x240 = 6u, ST7796s_320x480 = 7u, ST7735s_80x160_M5 = 8u, + # if P116_EXTRA_ST7789 + ST7789vw1_135x240 = 9u, + ST7789vw2_135x240 = 10u, + ST7789vw3_135x240 = 11u, + # endif // if P116_EXTRA_ST7789 }; enum class P116_CommandTrigger : uint8_t { From 294a6a31a9cf6dcc02fa1d2f9239f191087ac179 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Sun, 17 Mar 2024 22:09:20 +0100 Subject: [PATCH 2/6] [P116] Add alternative model selection for ST7735 --- lib/Adafruit_ST77xx/Adafruit_ST7735.cpp | 64 ++++++++++++++++++++++ lib/Adafruit_ST77xx/Adafruit_ST7735.h | 17 ++++++ lib/Adafruit_ST77xx/Adafruit_ST7789.cpp | 60 ++++++++++++++++---- lib/Adafruit_ST77xx/Adafruit_ST7789.h | 1 + lib/Adafruit_ST77xx/Adafruit_ST77xx.h | 3 + src/_P116_ST77xx.ino | 10 ++++ src/src/PluginStructs/P116_data_struct.cpp | 17 +++++- src/src/PluginStructs/P116_data_struct.h | 16 +++++- 8 files changed, 175 insertions(+), 13 deletions(-) diff --git a/lib/Adafruit_ST77xx/Adafruit_ST7735.cpp b/lib/Adafruit_ST77xx/Adafruit_ST7735.cpp index 2ddd4e2429..f08561baee 100644 --- a/lib/Adafruit_ST77xx/Adafruit_ST7735.cpp +++ b/lib/Adafruit_ST77xx/Adafruit_ST7735.cpp @@ -181,6 +181,17 @@ static const uint8_t PROGMEM 0x00, 0x00, // XSTART = 0 0x00, 0x9F }, // XEND = 159 + #if ST7735_EXTRA_INIT + Rcmd2black135x240[] = { // 7735R init, part 2 (mini 160x80) + 2, // 2 commands in list: + ST77XX_CASET, 4, // 1: Column addr set, 4 args, no delay: + 0x00, 0x00, // XSTART = 0 + 0x00, 135, // XEND = 135 + ST77XX_RASET, 4, // 2: Row addr set, 4 args, no delay: + 0x00, 0x00, // XSTART = 0 + 240 >> 8, 240 & 0xFF }, // XEND = 240 + #endif // if ST7735_EXTRA_INIT + Rcmd3[] = { // 7735R init, part 3 (red or green tab) 4, // 4 commands in list: ST7735_GMCTRP1, 16 , // 1: Gamma Adjustments (pos. polarity), 16 args + delay: @@ -243,6 +254,15 @@ void Adafruit_ST7735::initR(uint8_t options) { sendCommand(ST77XX_INVON, &data, 0); // Write twice... _colstart = 26; _rowstart = 1; + #if ST7735_EXTRA_INIT + } else if (options == INITR_BLACKTAB135x240) { + _height = ST7735_TFTHEIGHT_240; + _width = ST7735_TFTWIDTH_135; + displayInit(Rcmd2black135x240); + const uint8_t data = 0x00; + sendCommand(ST77XX_INVON, &data, 0); + sendCommand(ST77XX_INVON, &data, 0); // Write twice... + #endif // if ST7735_EXTRA_INIT } else { // colstart, rowstart left at default '0' values displayInit(Rcmd2red); @@ -288,6 +308,10 @@ void Adafruit_ST7735::setRotation(uint8_t m) { case 0: if ((tabcolor == INITR_BLACKTAB) || (tabcolor == INITR_MINI160x80)) { madctl = ST77XX_MADCTL_MX | ST77XX_MADCTL_MY | ST77XX_MADCTL_RGB; + #if ST7735_EXTRA_INIT + } else if (tabcolor == INITR_BLACKTAB135x240) { + madctl = ST77XX_MADCTL_MY | ST77XX_MADCTL_MV | ST77XX_MADCTL_RGB; + #endif // if ST7735_EXTRA_INIT } else { madctl = ST77XX_MADCTL_MX | ST77XX_MADCTL_MY | ST7735_MADCTL_BGR; } @@ -298,6 +322,13 @@ void Adafruit_ST7735::setRotation(uint8_t m) { } else if (tabcolor == INITR_MINI160x80) { _height = ST7735_TFTHEIGHT_160; _width = ST7735_TFTWIDTH_80; + #if ST7735_EXTRA_INIT + } else if (tabcolor == INITR_BLACKTAB135x240) { + _height = ST7735_TFTHEIGHT_240; + _width = ST7735_TFTWIDTH_135; + _colstart = 52; + _rowstart = 40; + #endif // if ST7735_EXTRA_INIT } else { _height = ST7735_TFTHEIGHT_160; _width = ST7735_TFTWIDTH_128; @@ -308,6 +339,10 @@ void Adafruit_ST7735::setRotation(uint8_t m) { case 1: if ((tabcolor == INITR_BLACKTAB) || (tabcolor == INITR_MINI160x80)) { madctl = ST77XX_MADCTL_MY | ST77XX_MADCTL_MV | ST77XX_MADCTL_RGB; + #if ST7735_EXTRA_INIT + } else if (tabcolor == INITR_BLACKTAB135x240) { + madctl = ST77XX_MADCTL_MX | ST77XX_MADCTL_MY | ST77XX_MADCTL_RGB; + #endif // if ST7735_EXTRA_INIT } else { madctl = ST77XX_MADCTL_MY | ST77XX_MADCTL_MV | ST7735_MADCTL_BGR; } @@ -318,6 +353,13 @@ void Adafruit_ST7735::setRotation(uint8_t m) { } else if (tabcolor == INITR_MINI160x80) { _width = ST7735_TFTHEIGHT_160; _height = ST7735_TFTWIDTH_80; + #if ST7735_EXTRA_INIT + } else if (tabcolor == INITR_BLACKTAB135x240) { + _width = ST7735_TFTHEIGHT_240; + _height = ST7735_TFTWIDTH_135; + _colstart = 52; + _rowstart = 40; + #endif // if ST7735_EXTRA_INIT } else { _width = ST7735_TFTHEIGHT_160; _height = ST7735_TFTWIDTH_128; @@ -328,6 +370,10 @@ void Adafruit_ST7735::setRotation(uint8_t m) { case 2: if ((tabcolor == INITR_BLACKTAB) || (tabcolor == INITR_MINI160x80)) { madctl = ST77XX_MADCTL_RGB; + #if ST7735_EXTRA_INIT + } else if (tabcolor == INITR_BLACKTAB135x240) { + madctl = ST77XX_MADCTL_MX | ST77XX_MADCTL_MV | ST77XX_MADCTL_RGB; + #endif // if ST7735_EXTRA_INIT } else { madctl = ST7735_MADCTL_BGR; } @@ -338,6 +384,13 @@ void Adafruit_ST7735::setRotation(uint8_t m) { } else if (tabcolor == INITR_MINI160x80) { _height = ST7735_TFTHEIGHT_160; _width = ST7735_TFTWIDTH_80; + #if ST7735_EXTRA_INIT + } else if (tabcolor == INITR_BLACKTAB135x240) { + _height = ST7735_TFTHEIGHT_240; + _width = ST7735_TFTWIDTH_135; + _colstart = 52; + _rowstart = 40; + #endif // if ST7735_EXTRA_INIT } else { _height = ST7735_TFTHEIGHT_160; _width = ST7735_TFTWIDTH_128; @@ -348,6 +401,10 @@ void Adafruit_ST7735::setRotation(uint8_t m) { case 3: if ((tabcolor == INITR_BLACKTAB) || (tabcolor == INITR_MINI160x80)) { madctl = ST77XX_MADCTL_MX | ST77XX_MADCTL_MV | ST77XX_MADCTL_RGB; + #if ST7735_EXTRA_INIT + } else if (tabcolor == INITR_BLACKTAB135x240) { + madctl = ST77XX_MADCTL_RGB; + #endif // if ST7735_EXTRA_INIT } else { madctl = ST77XX_MADCTL_MX | ST77XX_MADCTL_MV | ST7735_MADCTL_BGR; } @@ -358,6 +415,13 @@ void Adafruit_ST7735::setRotation(uint8_t m) { } else if (tabcolor == INITR_MINI160x80) { _width = ST7735_TFTHEIGHT_160; _height = ST7735_TFTWIDTH_80; + #if ST7735_EXTRA_INIT + } else if (tabcolor == INITR_BLACKTAB135x240) { + _width = ST7735_TFTHEIGHT_240; + _height = ST7735_TFTWIDTH_135; + _colstart = 52; + _rowstart = 40; + #endif // if ST7735_EXTRA_INIT } else { _width = ST7735_TFTHEIGHT_160; _height = ST7735_TFTWIDTH_128; diff --git a/lib/Adafruit_ST77xx/Adafruit_ST7735.h b/lib/Adafruit_ST77xx/Adafruit_ST7735.h index 6d138bce3c..935dda4e30 100644 --- a/lib/Adafruit_ST77xx/Adafruit_ST7735.h +++ b/lib/Adafruit_ST77xx/Adafruit_ST7735.h @@ -3,6 +3,22 @@ #include "Adafruit_ST77xx.h" +/** + * 2024-03-17 tonhuisman: Add additional initialization sequences for ST7735 displays, with the intention to get 'm working + * on some devices that seem to use peculiarly configured hardware like LiliGO TTGO T-Display (16MB flash), + * and possibly the T-Display S3 + * By default only enabled on ESP32, unless -D ST7735_EXTRA_INIT=1 is defined, f.e. via the build script + */ + +#ifndef ST7735_EXTRA_INIT // Enable setting from 'outside', like Platformio.ini +# ifdef ESP8266 +# define ST7735_EXTRA_INIT 0 +# endif // ifdef ESP8266 +# ifdef ESP32 +# define ST7735_EXTRA_INIT 1 +# endif // ifdef ESP32 +#endif + // some flags for initR() :( #define INITR_GREENTAB 0x00 #define INITR_REDTAB 0x01 @@ -14,6 +30,7 @@ #define INITR_MINI160x80 0x04 #define INITR_HALLOWING 0x05 #define INITR_GREENTAB160x80 0x06 +#define INITR_BLACKTAB135x240 0x07 // Some register settings #define ST7735_MADCTL_BGR 0x08 diff --git a/lib/Adafruit_ST77xx/Adafruit_ST7789.cpp b/lib/Adafruit_ST77xx/Adafruit_ST7789.cpp index dca4b69971..6467aeb53b 100644 --- a/lib/Adafruit_ST77xx/Adafruit_ST7789.cpp +++ b/lib/Adafruit_ST77xx/Adafruit_ST7789.cpp @@ -79,7 +79,7 @@ static const uint8_t PROGMEM #if ST7789_EXTRA_INIT static const uint8_t PROGMEM // Source: https://github.com/Xinyuan-LilyGO/TTGO-T-Display alt1_st7789[] = { // Init commands for 7789 screens Alternative 1 - 20, // 20 commands in list: + 21, // 21 commands in list: ST77XX_SLPOUT, ST_CMD_DELAY, // 1: Out of sleep mode, no args, w/delay 120, // 120 ms delay ST77XX_NORON, ST_CMD_DELAY, // 2: Normal display on, no args, w/delay @@ -125,8 +125,10 @@ static const uint8_t PROGMEM // Source: https://github.com/Xinyuan-LilyGO 0, // YSTART = 0 320>>8, 320&0xFF, // YEND = 320 - ST77XX_DISPON, ST_CMD_DELAY, // 20: Main screen turn on, no args, delay - 120 // 120 ms delay + ST77XX_INVON, ST_CMD_DELAY, // 20: Normal display on, no args, w/delay + 10, // 10 ms delay + ST77XX_DISPON, ST_CMD_DELAY, // 21: Main screen turn on, no args, delay + 255 // 120 ms delay }; static const uint8_t PROGMEM // Source: https://github.com/Bodmer/TFT_eSPI (ST7789_init.h, _NOT_ INIT_SEQUENCE_3) @@ -260,6 +262,8 @@ void Adafruit_ST7789::init(uint16_t width, uint16_t height, uint8_t mode, uint8_ // (Might get added similarly to other display types as needed on a // case-by-case basis.) + _init_seq = init_seq; + commonInit(NULL); if (width < 240) { @@ -285,11 +289,11 @@ void Adafruit_ST7789::init(uint16_t width, uint16_t height, uint8_t mode, uint8_ const uint8_t *init_ = generic_st7789; #if ST7789_EXTRA_INIT - if (1 == init_seq) { + if (1 == _init_seq) { init_ = alt1_st7789; - } else if (2 == init_seq) { + } else if (2 == _init_seq) { init_ = alt2_st7789; - } else if (3 == init_seq) { + } else if (3 == _init_seq) { init_ = alt3_st7789; } #endif // if ST7789_EXTRA_INIT @@ -310,28 +314,64 @@ void Adafruit_ST7789::setRotation(uint8_t m) { switch (rotation) { case 0: - madctl = ST77XX_MADCTL_MX | ST77XX_MADCTL_MY | ST77XX_MADCTL_RGB; + #if ST7789_EXTRA_INIT + if (_init_seq > 0) { + madctl = ST77XX_MADCTL_BGR; + _colstart = 52; + _rowstart = 40; + } else + #endif // if ST7789_EXTRA_INIT + { + madctl = ST77XX_MADCTL_MX | ST77XX_MADCTL_MY | ST77XX_MADCTL_RGB; + } _xstart = _colstart; _ystart = _rowstart; _width = windowWidth; _height = windowHeight; break; case 1: - madctl = ST77XX_MADCTL_MY | ST77XX_MADCTL_MV | ST77XX_MADCTL_RGB; + #if ST7789_EXTRA_INIT + if (_init_seq > 0) { + madctl = ST77XX_MADCTL_MX | ST77XX_MADCTL_MV | ST77XX_MADCTL_BGR; + _colstart = 40; + _rowstart = 53; + } else + #endif // if ST7789_EXTRA_INIT + { + madctl = ST77XX_MADCTL_MY | ST77XX_MADCTL_MV | ST77XX_MADCTL_RGB; + } _xstart = _rowstart; _ystart = _colstart; _height = windowWidth; _width = windowHeight; break; case 2: - madctl = ST77XX_MADCTL_RGB; + #if ST7789_EXTRA_INIT + if (_init_seq > 0) { + madctl = ST77XX_MADCTL_MX | ST77XX_MADCTL_MY | ST77XX_MADCTL_RGB; + _colstart2 = 53; + _rowstart2 = 40; + } else + #endif // if ST7789_EXTRA_INIT + { + madctl = ST77XX_MADCTL_RGB; + } _xstart = _colstart2; _ystart = _rowstart2; _width = windowWidth; _height = windowHeight; break; case 3: - madctl = ST77XX_MADCTL_MX | ST77XX_MADCTL_MV | ST77XX_MADCTL_RGB; + #if ST7789_EXTRA_INIT + if (_init_seq > 0) { + madctl = ST77XX_MADCTL_MV | ST77XX_MADCTL_MY | ST77XX_MADCTL_BGR; + _colstart2 = 40; + _rowstart2 = 52; + } else + #endif // if ST7789_EXTRA_INIT + { + madctl = ST77XX_MADCTL_MX | ST77XX_MADCTL_MV | ST77XX_MADCTL_RGB; + } _xstart = _rowstart2; _ystart = _colstart2; _height = windowWidth; diff --git a/lib/Adafruit_ST77xx/Adafruit_ST7789.h b/lib/Adafruit_ST77xx/Adafruit_ST7789.h index 865780bc06..4714a9968d 100644 --- a/lib/Adafruit_ST77xx/Adafruit_ST7789.h +++ b/lib/Adafruit_ST77xx/Adafruit_ST7789.h @@ -39,6 +39,7 @@ class Adafruit_ST7789 : public Adafruit_ST77xx { private: uint16_t windowWidth; uint16_t windowHeight; + uint8_t _init_seq = 0u; }; #endif // _ADAFRUIT_ST7789H_ diff --git a/lib/Adafruit_ST77xx/Adafruit_ST77xx.h b/lib/Adafruit_ST77xx/Adafruit_ST77xx.h index 2ad2a63263..9a299b51f9 100644 --- a/lib/Adafruit_ST77xx/Adafruit_ST77xx.h +++ b/lib/Adafruit_ST77xx/Adafruit_ST77xx.h @@ -33,8 +33,10 @@ #define ST7735_TFTWIDTH_128 128 // for 1.44 and mini #define ST7735_TFTWIDTH_80 80 // for mini +#define ST7735_TFTWIDTH_135 135 #define ST7735_TFTHEIGHT_128 128 // for 1.44" display #define ST7735_TFTHEIGHT_160 160 // for 1.8" and mini display +#define ST7735_TFTHEIGHT_240 240 #define ST_CMD_DELAY 0x80 // special signifier for command lists @@ -104,6 +106,7 @@ #define ST77XX_MADCTL_MV 0x20 #define ST77XX_MADCTL_ML 0x10 #define ST77XX_MADCTL_RGB 0x00 +#define ST77XX_MADCTL_BGR 0x08 #define ST77XX_RDID1 0xDA #define ST77XX_RDID2 0xDB diff --git a/src/_P116_ST77xx.ino b/src/_P116_ST77xx.ino index 3352d91492..ac85828e88 100644 --- a/src/_P116_ST77xx.ino +++ b/src/_P116_ST77xx.ino @@ -8,6 +8,10 @@ // History: +// 2024-03-17 tonhuisman: Add support for another alternative initialization for ST7735 displays, as the display controller +// used on the LilyGO TTGO T-Display (16 MB) seems to be a ST7735, despite being documented as ST7789 +// By default (also) only enabled on ESP32 builds +// Disabled the ST7789 alternatives for now, as that's not verified on any hardware // 2024-03-09 tonhuisman: Add support for alternative initialization sequences for ST7789 displays, like used on // some LilyGO models like the TTGO T-Display (16 MB Flash), and possibly the T-Display S3 // By default only enabled on ESP32 builds @@ -145,6 +149,9 @@ boolean Plugin_116(uint8_t function, struct EventStruct *event, String& string) ST77xx_type_toString(ST77xx_type_e::ST7735s_128x160), ST77xx_type_toString(ST77xx_type_e::ST7735s_80x160), ST77xx_type_toString(ST77xx_type_e::ST7735s_80x160_M5), + # if P116_EXTRA_ST7735 + ST77xx_type_toString(ST77xx_type_e::ST7735s_135x240), + # endif // if P116_EXTRA_ST7735 ST77xx_type_toString(ST77xx_type_e::ST7789vw_240x320), ST77xx_type_toString(ST77xx_type_e::ST7789vw_240x240), ST77xx_type_toString(ST77xx_type_e::ST7789vw_240x280), @@ -161,6 +168,9 @@ boolean Plugin_116(uint8_t function, struct EventStruct *event, String& string) static_cast(ST77xx_type_e::ST7735s_128x160), static_cast(ST77xx_type_e::ST7735s_80x160), static_cast(ST77xx_type_e::ST7735s_80x160_M5), + # if P116_EXTRA_ST7735 + static_cast(ST77xx_type_e::ST7735s_135x240), + # endif // if P116_EXTRA_ST7735 static_cast(ST77xx_type_e::ST7789vw_240x320), static_cast(ST77xx_type_e::ST7789vw_240x240), static_cast(ST77xx_type_e::ST7789vw_240x280), diff --git a/src/src/PluginStructs/P116_data_struct.cpp b/src/src/PluginStructs/P116_data_struct.cpp index 44327c7461..1aa994c334 100644 --- a/src/src/PluginStructs/P116_data_struct.cpp +++ b/src/src/PluginStructs/P116_data_struct.cpp @@ -11,6 +11,9 @@ const __FlashStringHelper* ST77xx_type_toString(const ST77xx_type_e& device) { case ST77xx_type_e::ST7735s_128x160: return F("ST7735 128 x 160px"); case ST77xx_type_e::ST7735s_80x160: return F("ST7735 80 x 160px"); case ST77xx_type_e::ST7735s_80x160_M5: return F("ST7735 80 x 160px (Color inverted)"); + # if P116_EXTRA_ST7735 + case ST77xx_type_e::ST7735s_135x240: return F("ST7735 135 x 240px"); + # endif // if P116_EXTRA_ST7735 case ST77xx_type_e::ST7789vw_240x320: return F("ST7789 240 x 320px"); case ST77xx_type_e::ST7789vw_240x240: return F("ST7789 240 x 240px"); case ST77xx_type_e::ST7789vw_240x280: return F("ST7789 240 x 280px"); @@ -63,6 +66,9 @@ void ST77xx_type_toResolution(const ST77xx_type_e& device, case ST77xx_type_e::ST7789vw2_135x240: case ST77xx_type_e::ST7789vw3_135x240: # endif // if P116_EXTRA_ST7789 + # if P116_EXTRA_ST7735 + case ST77xx_type_e::ST7735s_135x240: + # endif // if P116_EXTRA_ST7735 x = 135; y = 240; break; @@ -154,7 +160,16 @@ bool P116_data_struct::plugin_init(struct EventStruct *event) { initRoptions = INITR_GREENTAB160x80; // 80x160px ST7735sv, inverted (M5Stack StickC) } - // fall through + // fall through + # if P116_EXTRA_ST7735 + case ST77xx_type_e::ST7735s_135x240: + + if (initRoptions == 0xFF) { + initRoptions = INITR_BLACKTAB135x240; // 135x240px + } + + // fall through + # endif // if P116_EXTRA_ST7735 case ST77xx_type_e::ST7735s_80x160: { if (initRoptions == 0xFF) { diff --git a/src/src/PluginStructs/P116_data_struct.h b/src/src/PluginStructs/P116_data_struct.h index baf735f5ba..675102456e 100644 --- a/src/src/PluginStructs/P116_data_struct.h +++ b/src/src/PluginStructs/P116_data_struct.h @@ -11,14 +11,23 @@ # include // include Adafruit ST7796 TFT library # if defined(ST7789_EXTRA_INIT) && !ST7789_EXTRA_INIT -# define P116_EXTRA_ST7789 0 // This will get disabled for ESP8266 in Adafruit_ST7789.h +# define P116_EXTRA_ST7789 0 // This will get disabled for ESP8266 in Adafruit_ST7789.h # endif // if defined(ST7789_EXTRA_INIT) && !ST7789_EXTRA_INIT # if defined(LIMIT_BUILD_SIZE) and !defined(P116_EXTRA_ST7789) # define P116_EXTRA_ST7789 0 # endif // if defined(LIMIT_BUILD_SIZE) and !defined(P116_EXTRA_ST7789) # ifndef P116_EXTRA_ST7789 -# define P116_EXTRA_ST7789 1 +# define P116_EXTRA_ST7789 0 // Disabled by default (not verified on any hardware yet) # endif // ifndef P116_EXTRA_ST7789 +# if defined(ST7735_EXTRA_INIT) && !ST7735_EXTRA_INIT +# define P116_EXTRA_ST7735 0 // This will get disabled for ESP8266 in Adafruit_ST7735.h +# endif // if defined(ST7735_EXTRA_INIT) && !ST7735_EXTRA_INIT +# if defined(LIMIT_BUILD_SIZE) and !defined(P116_EXTRA_ST7789) +# define P116_EXTRA_ST7735 0 +# endif // if defined(LIMIT_BUILD_SIZE) and !defined(P116_EXTRA_ST7735) +# ifndef P116_EXTRA_ST7735 +# define P116_EXTRA_ST7735 1 +# endif // ifndef P116_EXTRA_ST7735 # include "../Helpers/AdafruitGFX_helper.h" // Use Adafruit graphics helper object # include "../CustomBuild/StorageLayout.h" @@ -89,6 +98,9 @@ enum class ST77xx_type_e : uint8_t { ST7789vw2_135x240 = 10u, ST7789vw3_135x240 = 11u, # endif // if P116_EXTRA_ST7789 + # if P116_EXTRA_ST7735 + ST7735s_135x240 = 12u, + # endif // if P116_EXTRA_ST7735 }; enum class P116_CommandTrigger : uint8_t { From 9567b3327938778ee04aa9f6202225758110b9a4 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Mon, 25 Mar 2024 21:57:19 +0100 Subject: [PATCH 3/6] [P116] Fine-tuning the rotation column-offset for ST7735 135x240 display --- lib/Adafruit_ST77xx/Adafruit_ST7735.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Adafruit_ST77xx/Adafruit_ST7735.cpp b/lib/Adafruit_ST77xx/Adafruit_ST7735.cpp index f08561baee..4f688a90f2 100644 --- a/lib/Adafruit_ST77xx/Adafruit_ST7735.cpp +++ b/lib/Adafruit_ST77xx/Adafruit_ST7735.cpp @@ -326,7 +326,7 @@ void Adafruit_ST7735::setRotation(uint8_t m) { } else if (tabcolor == INITR_BLACKTAB135x240) { _height = ST7735_TFTHEIGHT_240; _width = ST7735_TFTWIDTH_135; - _colstart = 52; + _colstart = 53; _rowstart = 40; #endif // if ST7735_EXTRA_INIT } else { @@ -419,7 +419,7 @@ void Adafruit_ST7735::setRotation(uint8_t m) { } else if (tabcolor == INITR_BLACKTAB135x240) { _width = ST7735_TFTHEIGHT_240; _height = ST7735_TFTWIDTH_135; - _colstart = 52; + _colstart = 53; _rowstart = 40; #endif // if ST7735_EXTRA_INIT } else { From 3fa9a3603ab247459094d10960931ec4e3d7f630 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Mon, 25 Mar 2024 22:02:23 +0100 Subject: [PATCH 4/6] [P116] Documentation improvement. --- docs/source/Plugin/P116_commands.repl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/Plugin/P116_commands.repl b/docs/source/Plugin/P116_commands.repl index 50d2b90622..6a6702d432 100644 --- a/docs/source/Plugin/P116_commands.repl +++ b/docs/source/Plugin/P116_commands.repl @@ -28,7 +28,7 @@ " | ``st77xxcmd,clear`` "," - | Clear the display, using the default background color. + | Clear the display, using the **default** background color. For clearing with a custom background color see the ``,clear[,]`` command. " " | ``st77xxcmd,backlight,`` From bdbf0527f9a41a10cc247a2f639e95819576427d Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Mon, 25 Mar 2024 22:03:45 +0100 Subject: [PATCH 5/6] [P095] Documentation improvement. --- docs/source/Plugin/P095_commands.repl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/Plugin/P095_commands.repl b/docs/source/Plugin/P095_commands.repl index e88f9821ec..98b3cf2ddf 100644 --- a/docs/source/Plugin/P095_commands.repl +++ b/docs/source/Plugin/P095_commands.repl @@ -31,7 +31,7 @@ " | ``tftcmd,clear`` "," - | Clear the display, using the default background color. + | Clear the display, using the **default** background color. For clearing with a custom background color see the ``,clear[,]`` command. " " | ``tftcmd,backlight,`` From 66ed1b55b179234f931a90951bfd4a998cad2c99 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Tue, 26 Mar 2024 21:19:09 +0100 Subject: [PATCH 6/6] [P116] Update documentation for supported displays --- docs/source/Plugin/P116.rst | 7 ++++++- .../Plugin/P116_TFTDisplayModelOptions.png | Bin 35569 -> 45263 bytes 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/source/Plugin/P116.rst b/docs/source/Plugin/P116.rst index 6e2a42d139..afddf033a0 100644 --- a/docs/source/Plugin/P116.rst +++ b/docs/source/Plugin/P116.rst @@ -28,7 +28,7 @@ The ST7735, ST7789 and ST7796 chip families drive color TFT displays in various This plugin supports these display models: -* **ST7735** with resolutions 128 x 128, 128 x 160 and 80 x 160 pixels +* **ST7735** with resolutions 128 x 128, 128 x 160, 80 x 160 and 135 x 240 pixels * **ST7789** with resolutions 240 x 320, 240 x 240, 240 x 280 and 135 x 240 pixels * **ST7796** with resolution of 320 x 480 pixels. @@ -140,6 +140,7 @@ Available options: * *ST7735 128 x 160px* Allows 16 lines of text in the smallest font scaling setting. * *ST7735 80 x 160px* Allows 16 lines of text in the smallest font scaling setting. * *ST7735 80 x 160px (Color inverted)* Special color inverted configuration as used in f.e. M5Stack StickC. +* *ST7735 135 x 240px* Added to support a revision of the TTGO T-Display 16MB Flash module, that won't work with the ST7789 driver, the seller is claiming to use, but does work with this specially crafted ST7735 driver. * *ST7789 240 x 320px* Allows 32 lines of text in the smallest font scaling setting. Predefined text only goes to 24, extra lines can be displayed from rules or external commands. * *ST7789 240 x 240px* Allows 24 lines of text in the smallest font scaling setting. * *ST7789 240 x 280px* Allows 28 lines of text in the smallest font scaling setting. Predefined text only goes to 24, extra lines can be displayed from rules or external commands. @@ -260,6 +261,10 @@ Change log .. versionadded:: 2.0 ... + |added| 2024-03-26 Add support for ST7735, 135x240 resolution + + |added| 2022-07-06 Add support for ST7735 (Color inverted), for M5StickC support + |added| 2021-11-06 Add support for ST7796 displays |added| 2021-08 Moved from an external forum to ESPEasy. diff --git a/docs/source/Plugin/P116_TFTDisplayModelOptions.png b/docs/source/Plugin/P116_TFTDisplayModelOptions.png index a17199a9ce8602403257fb427fc1ceecbd9b5a55..6719b106c60a44aec9a01d71c266334ab3347d08 100644 GIT binary patch literal 45263 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

M?ya>c=osoeG~ijmS^Ua!$6EFn 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

C;oI@H3pIXv*ls(1kDV$nKsp*( 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 F0sz0EVF~~M