From a8bc50e96bc7342ada06e4140db94546679c4480 Mon Sep 17 00:00:00 2001 From: gemu2015 Date: Mon, 16 Nov 2020 06:35:43 +0100 Subject: [PATCH] add ili9341-2 --- .../ILI9341-gemu-1.0/ILI9341_2.cpp | 411 ++++++++++++++++++ lib/lib_display/ILI9341-gemu-1.0/ILI9341_2.h | 179 ++++++++ tasmota/xdsp_08_ILI9488.ino | 1 + tasmota/xdsp_12_ST7789.ino | 1 + tasmota/xdsp_13_ILI9341-2.ino | 121 ++++++ 5 files changed, 713 insertions(+) create mode 100644 lib/lib_display/ILI9341-gemu-1.0/ILI9341_2.cpp create mode 100644 lib/lib_display/ILI9341-gemu-1.0/ILI9341_2.h create mode 100644 tasmota/xdsp_13_ILI9341-2.ino diff --git a/lib/lib_display/ILI9341-gemu-1.0/ILI9341_2.cpp b/lib/lib_display/ILI9341-gemu-1.0/ILI9341_2.cpp new file mode 100644 index 000000000..482f3fa77 --- /dev/null +++ b/lib/lib_display/ILI9341-gemu-1.0/ILI9341_2.cpp @@ -0,0 +1,411 @@ +/*! +* @file ILI9341_2.cpp +* +* @mainpage Adafruit ILI9341 TFT Displays +* +* @section intro_sec Introduction +* +* This is the documentation for Adafruit's ILI9341 driver for the +* Arduino platform. +* +* This library works with the Adafruit 2.8" Touch Shield V2 (SPI) +* http://www.adafruit.com/products/1651 +* +* Adafruit 2.4" TFT LCD with Touchscreen Breakout w/MicroSD Socket - ILI9341 +* https://www.adafruit.com/product/2478 +* +* 2.8" TFT LCD with Touchscreen Breakout Board w/MicroSD Socket - ILI9341 +* https://www.adafruit.com/product/1770 +* +* 2.2" 18-bit color TFT LCD display with microSD card breakout - ILI9340 +* https://www.adafruit.com/product/1770 +* +* TFT FeatherWing - 2.4" 320x240 Touchscreen For All Feathers +* https://www.adafruit.com/product/3315 +* +* These displays use SPI to communicate, 4 or 5 pins are required +* to interface (RST is optional). +* +* Adafruit invests time and resources providing this open source code, +* please support Adafruit and open-source hardware by purchasing +* products from Adafruit! +* +* @section dependencies Dependencies +* +* This library depends on +* Adafruit_GFX being present on your system. Please make sure you have +* installed the latest version before using this library. +* +* @section author Author +* +* Written by Limor "ladyada" Fried for Adafruit Industries. +* +* @section license License +* +* BSD license, all text here must be included in any redistribution. +* +*/ + +#ifdef ESP32 +#include "ILI9341_2.h" +#include + + +// ESP32 uses 2. SPI BUS, ESP8266 uses software spi +#ifdef ESP32 +#undef ILI9341_2_DIMMER +#define ILI9341_2_DIMMER +#undef ESP32_PWM_CHANNEL +#define ESP32_PWM_CHANNEL 1 +#define ILI9341_2_HWSPI +#endif + + +const uint16_t ili9341_2_colors[]={ILI9341_2_BLACK,ILI9341_2_WHITE,ILI9341_2_RED,ILI9341_2_GREEN,ILI9341_2_BLUE,ILI9341_2_CYAN,ILI9341_2_MAGENTA,\ + ILI9341_2_YELLOW,ILI9341_2_NAVY,ILI9341_2_DARKGREEN,ILI9341_2_DARKCYAN,ILI9341_2_MAROON,ILI9341_2_PURPLE,ILI9341_2_OLIVE,\ +ILI9341_2_LIGHTGREY,ILI9341_2_DARKGREY,ILI9341_2_ORANGE,ILI9341_2_GREENYELLOW,ILI9341_2_PINK}; + +uint16_t ILI9341_2::GetColorFromIndex(uint8_t index) { + if (index>=sizeof(ili9341_2_colors)/2) index=0; + return ili9341_2_colors[index]; +} + +static const uint8_t PROGMEM ili9341_2_initcmd[] = { + 0xEF, 3, 0x03, 0x80, 0x02, + 0xCF, 3, 0x00, 0xC1, 0x30, + 0xED, 4, 0x64, 0x03, 0x12, 0x81, + 0xE8, 3, 0x85, 0x00, 0x78, + 0xCB, 5, 0x39, 0x2C, 0x00, 0x34, 0x02, + 0xF7, 1, 0x20, + 0xEA, 2, 0x00, 0x00, + ILI9341_2_PWCTR1 , 1, 0x23, // Power control VRH[5:0] + ILI9341_2_PWCTR2 , 1, 0x10, // Power control SAP[2:0];BT[3:0] + ILI9341_2_VMCTR1 , 2, 0x3e, 0x28, // VCM control + ILI9341_2_VMCTR2 , 1, 0x86, // VCM control2 + ILI9341_2_MADCTL , 1, 0x48, // Memory Access Control + ILI9341_2_VSCRSADD, 1, 0x00, // Vertical scroll zero + ILI9341_2_PIXFMT , 1, 0x55, + ILI9341_2_FRMCTR1 , 2, 0x00, 0x18, + ILI9341_2_DFUNCTR , 3, 0x08, 0x82, 0x27, // Display Function Control + 0xF2, 1, 0x00, // 3Gamma Function Disable + ILI9341_2_GAMMASET , 1, 0x01, // Gamma curve selected + ILI9341_2_GMCTRP1 , 15, 0x0F, 0x31, 0x2B, 0x0C, 0x0E, 0x08, // Set Gamma + 0x4E, 0xF1, 0x37, 0x07, 0x10, 0x03, 0x0E, 0x09, 0x00, + ILI9341_2_GMCTRN1 , 15, 0x00, 0x0E, 0x14, 0x03, 0x11, 0x07, // Set Gamma + 0x31, 0xC1, 0x48, 0x08, 0x0F, 0x0C, 0x31, 0x36, 0x0F, + ILI9341_2_SLPOUT , 0x80, // Exit Sleep + ILI9341_2_DISPON , 0x80, // Display on +// ILI9341_2_DISPOFF , 0x80, // Display on + 0x00 // End of list +}; + + +ILI9341_2::ILI9341_2(int8_t cs, int8_t mosi, int8_t miso, int8_t sclk, int8_t res, int8_t dc, int8_t bp) : Renderer(ILI9341_2_TFTWIDTH, ILI9341_2_TFTHEIGHT) { + _cs = cs; + _mosi = mosi; + _miso = miso; + _sclk = sclk; + _res = res; + _dc = dc; + _bp = bp; + _hwspi = 0; +} + +#define ILI9341_2_CS_LOW digitalWrite( _cs, LOW); +#define ILI9341_2_CS_HIGH digitalWrite( _cs, HIGH); + + +void ILI9341_2::writecmd(uint8_t d) { + digitalWrite( _dc, LOW); +#ifdef ILI9341_2_HWSPI + spi2->write(d); +#else + spiwrite(d); +#endif + digitalWrite( _dc, HIGH); +} + +void ILI9341_2::init(uint16_t width, uint16_t height) { + //sspi2 = SPISettings(2500000, MSBFIRST, SPI_MODE3); + +#ifdef ILI9341_2_HWSPI + spi2 = new SPIClass(HSPI); + spi2->setDataMode(SPI_MODE3); + spi2->setBitOrder(MSBFIRST); + spi2->setFrequency(40000000); + spi2->begin(_sclk, _miso, _mosi, -1); +#else + pinMode(_mosi, OUTPUT); + digitalWrite(_mosi,HIGH); + pinMode(_sclk, OUTPUT); + digitalWrite(_sclk,LOW); + pinMode(_miso, INPUT); +#endif + + pinMode(_cs, OUTPUT); + digitalWrite(_cs,HIGH); + pinMode(_dc, OUTPUT); + digitalWrite(_dc,HIGH); + pinMode(_bp, OUTPUT); + digitalWrite(_bp,HIGH); + pinMode(_res, OUTPUT); + digitalWrite(_res,HIGH); + + + if (_bp>=0) { +#ifdef ILI9341_2_DIMMER + ledcSetup(ESP32_PWM_CHANNEL,4000,8); + ledcAttachPin(_bp,ESP32_PWM_CHANNEL); + ledcWrite(ESP32_PWM_CHANNEL,128); +#else + pinMode(_bp, OUTPUT); +#endif + } + + pinMode(_res, OUTPUT); + digitalWrite(_res, HIGH); + delay(100); + digitalWrite(_res, LOW); + delay(100); + digitalWrite(_res, HIGH); + delay(200); + + uint8_t cmd, x, numArgs; + const uint8_t *addr = ili9341_2_initcmd; + + while ((cmd = pgm_read_byte(addr++)) > 0) { + ILI9341_2_CS_LOW + writecmd(cmd); + x = pgm_read_byte(addr++); + numArgs = x & 0x7F; + +#ifdef ILI9341_2_HWSPI + while (numArgs--) spi2->write(pgm_read_byte(addr++)); +#else + while (numArgs--) spiwrite(pgm_read_byte(addr++)); +#endif + + ILI9341_2_CS_HIGH + if(x & 0x80) delay(120); + } + +// endWrite(); +} + +void ILI9341_2::DisplayInit(int8_t p,int8_t size,int8_t rot,int8_t font) { + setRotation(rot); + setTextFont(font&3); + setTextSize(size&7); + setTextColor(ILI9341_2_WHITE,ILI9341_2_BLACK); + setCursor(0,0); + fillScreen(ILI9341_2_BLACK); +} + +void ILI9341_2::setAddrWindow(uint16_t x, uint16_t y, uint16_t w, uint16_t h) { + uint32_t xa = ((uint32_t)x << 16) | (x+w-1); + uint32_t ya = ((uint32_t)y << 16) | (y+h-1); + writecmd(ILI9341_2_CASET); // Column addr set +#ifdef ILI9341_2_HWSPI + spi2->write32(xa); +#else + spiwrite32(xa); +#endif + writecmd(ILI9341_2_PASET); // Row addr set + +#ifdef ILI9341_2_HWSPI + spi2->write32(ya); +#else + spiwrite32(ya); +#endif + writecmd(ILI9341_2_RAMWR); // write to RAM +} + +void ILI9341_2::drawPixel(int16_t x, int16_t y, uint16_t color) { + + + if((x < 0) ||(x >= _width) || (y < 0) || (y >= _height)) return; + + ILI9341_2_CS_LOW + + setAddrWindow(x,y,1,1); + +#ifdef ILI9341_2_HWSPI + spi2->write16(color); +#else + spiwrite16(color); +#endif + ILI9341_2_CS_HIGH + +} + +void ILI9341_2::setRotation(uint8_t m) { + rotation = m % 4; // can't be higher than 3 + switch (rotation) { + case 0: + m = (MADCTL_2_MX | MADCTL_2_BGR); + _width = ILI9341_2_TFTWIDTH; + _height = ILI9341_2_TFTHEIGHT; + break; + case 1: + m = (MADCTL_2_MV | MADCTL_2_BGR); + _width = ILI9341_2_TFTHEIGHT; + _height = ILI9341_2_TFTWIDTH; + break; + case 2: + m = (MADCTL_2_MY | MADCTL_2_BGR); + _width = ILI9341_2_TFTWIDTH; + _height = ILI9341_2_TFTHEIGHT; + break; + case 3: + m = (MADCTL_2_MX | MADCTL_2_MY | MADCTL_2_MV | MADCTL_2_BGR); + _width = ILI9341_2_TFTHEIGHT; + _height = ILI9341_2_TFTWIDTH; + break; + } + + ILI9341_2_CS_LOW + writecmd(ILI9341_2_MADCTL); + spiwrite(m); + ILI9341_2_CS_HIGH +} + +void ILI9341_2::drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color) { + + // Rudimentary clipping + if((x >= _width) || (y >= _height)) return; + if((y+h-1) >= _height) h = _height-y; + + ILI9341_2_CS_LOW + + setAddrWindow(x, y, 1, h); + + while (h--) { +#ifdef ILI9341_2_HWSPI + spi2->write16(color); +#else + spiwrite16(color); +#endif + } + + ILI9341_2_CS_HIGH + +} + +void ILI9341_2::drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color) { + + // Rudimentary clipping + if((x >= _width) || (y >= _height)) return; + if((x+w-1) >= _width) w = _width-x; + + ILI9341_2_CS_LOW + + setAddrWindow(x, y, w, 1); + + while (w--) { +#ifdef ILI9341_2_HWSPI + spi2->write16(color); +#else + spiwrite16(color); +#endif + } + + ILI9341_2_CS_HIGH +} + +void ILI9341_2::fillScreen(uint16_t color) { + fillRect(0, 0, _width, _height, color); +} + +// fill a rectangle +void ILI9341_2::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color) { + + // rudimentary clipping (drawChar w/big text requires this) + if((x >= _width) || (y >= _height)) return; + if((x + w - 1) >= _width) w = _width - x; + if((y + h - 1) >= _height) h = _height - y; + + ILI9341_2_CS_LOW + + setAddrWindow(x, y, w-1, h-1); + + for (y=h; y>0; y--) { + for (x=w; x>0; x--) { +#ifdef ILI9341_2_HWSPI + spi2->write16(color); +#else + spiwrite16(color); +#endif + } + } + ILI9341_2_CS_HIGH +} + +void ILI9341_2::DisplayOnff(int8_t on) { + if (on) { + writecmd(ILI9341_2_DISPON); //Display on + if (_bp>=0) { +#ifdef ILI9341_2_DIMMER + ledcWrite(ESP32_PWM_CHANNEL,dimmer); +#else + digitalWrite(_bp,HIGH); +#endif + } + } else { + writecmd(ILI9341_2_DISPOFF); + if (_bp>=0) { +#ifdef ILI9341_2_DIMMER + ledcWrite(ESP32_PWM_CHANNEL,0); +#else + digitalWrite(_bp,LOW); +#endif + } + } +} + +// dimmer 0-100 +void ILI9341_2::dim(uint8_t dim) { + dimmer = dim; + if (dimmer>15) dimmer=15; + dimmer=((float)dimmer/15.0)*255.0; +#ifdef ESP32 + ledcWrite(ESP32_PWM_CHANNEL,dimmer); +#endif +} + + +void ILI9341_2::spiwrite(uint8_t c) { + +#ifdef ILI9341_2_HWSPI + spi2->write(c); +#else + for (uint8_t bit = 0x80; bit; bit >>= 1) { + digitalWrite(_sclk, LOW); + if (c & bit) digitalWrite(_mosi, HIGH); + else digitalWrite(_mosi, LOW); + digitalWrite(_sclk, HIGH); + } +#endif + +} + +void ILI9341_2::spiwrite16(uint16_t c) { +#ifdef ILI9341_2_HWSPI + spi2->write16(c); +#else + spiwrite(c>>8); + spiwrite(c); +#endif +} + +void ILI9341_2::spiwrite32(uint32_t c) { +#ifdef ILI9341_2_HWSPI + spi2->write32(c); +#else + spiwrite(c>>24); + spiwrite(c>>16); + spiwrite(c>>8); + spiwrite(c); +#endif +} + +#endif diff --git a/lib/lib_display/ILI9341-gemu-1.0/ILI9341_2.h b/lib/lib_display/ILI9341-gemu-1.0/ILI9341_2.h new file mode 100644 index 000000000..d1483dae1 --- /dev/null +++ b/lib/lib_display/ILI9341-gemu-1.0/ILI9341_2.h @@ -0,0 +1,179 @@ +/*************************************************** + STM32 Support added by Jaret Burkett at OSHlab.com + + This is our library for the Adafruit ILI9341_2 Breakout and Shield + ----> http://www.adafruit.com/products/1651 + + Check out the links above for our tutorials and wiring diagrams + These displays use SPI to communicate, 4 or 5 pins are required to + interface (RST is optional) + Adafruit invests time and resources providing this open source code, + please support Adafruit and open-source hardware by purchasing + products from Adafruit! + + Written by Limor Fried/Ladyada for Adafruit Industries. + MIT license, all text above must be included in any redistribution + ****************************************************/ + +#ifndef _ILI9341_2H_ +#define _ILI9341_2H_ + +#include "Arduino.h" +#include +#include + +#define ILI9341_2_TFTWIDTH 320 +#define ILI9341_2_TFTHEIGHT 480 + +#define ILI9341_2_NOP 0x00 ///< No-op register +#define ILI9341_2_SWRESET 0x01 ///< Software reset register +#define ILI9341_2_RDDID 0x04 ///< Read display identification information +#define ILI9341_2_RDDST 0x09 ///< Read Display Status + +#define ILI9341_2_SLPIN 0x10 ///< Enter Sleep Mode +#define ILI9341_2_SLPOUT 0x11 ///< Sleep Out +#define ILI9341_2_PTLON 0x12 ///< Partial Mode ON +#define ILI9341_2_NORON 0x13 ///< Normal Display Mode ON + +#define ILI9341_2_RDMODE 0x0A ///< Read Display Power Mode +#define ILI9341_2_RDMADCTL 0x0B ///< Read Display MADCTL +#define ILI9341_2_RDPIXFMT 0x0C ///< Read Display Pixel Format +#define ILI9341_2_RDIMGFMT 0x0D ///< Read Display Image Format +#define ILI9341_2_RDSELFDIAG 0x0F ///< Read Display Self-Diagnostic Result + +#define ILI9341_2_INVOFF 0x20 ///< Display Inversion OFF +#define ILI9341_2_INVON 0x21 ///< Display Inversion ON +#define ILI9341_2_GAMMASET 0x26 ///< Gamma Set +#define ILI9341_2_DISPOFF 0x28 ///< Display OFF +#define ILI9341_2_DISPON 0x29 ///< Display ON + +#define ILI9341_2_CASET 0x2A ///< Column Address Set +#define ILI9341_2_PASET 0x2B ///< Page Address Set +#define ILI9341_2_RAMWR 0x2C ///< Memory Write +#define ILI9341_2_RAMRD 0x2E ///< Memory Read + +#define ILI9341_2_PTLAR 0x30 ///< Partial Area +#define ILI9341_2_MADCTL 0x36 ///< Memory Access Control +#define ILI9341_2_VSCRSADD 0x37 ///< Vertical Scrolling Start Address +#define ILI9341_2_PIXFMT 0x3A ///< COLMOD: Pixel Format Set + +#define ILI9341_2_FRMCTR1 0xB1 ///< Frame Rate Control (In Normal Mode/Full Colors) +#define ILI9341_2_FRMCTR2 0xB2 ///< Frame Rate Control (In Idle Mode/8 colors) +#define ILI9341_2_FRMCTR3 0xB3 ///< Frame Rate control (In Partial Mode/Full Colors) +#define ILI9341_2_INVCTR 0xB4 ///< Display Inversion Control +#define ILI9341_2_DFUNCTR 0xB6 ///< Display Function Control + +#define ILI9341_2_PWCTR1 0xC0 ///< Power Control 1 +#define ILI9341_2_PWCTR2 0xC1 ///< Power Control 2 +#define ILI9341_2_PWCTR3 0xC2 ///< Power Control 3 +#define ILI9341_2_PWCTR4 0xC3 ///< Power Control 4 +#define ILI9341_2_PWCTR5 0xC4 ///< Power Control 5 +#define ILI9341_2_VMCTR1 0xC5 ///< VCOM Control 1 +#define ILI9341_2_VMCTR2 0xC7 ///< VCOM Control 2 + +#define ILI9341_2_RDID1 0xDA ///< Read ID 1 +#define ILI9341_2_RDID2 0xDB ///< Read ID 2 +#define ILI9341_2_RDID3 0xDC ///< Read ID 3 +#define ILI9341_2_RDID4 0xDD ///< Read ID 4 + +#define ILI9341_2_GMCTRP1 0xE0 ///< Positive Gamma Correction +#define ILI9341_2_GMCTRN1 0xE1 ///< Negative Gamma Correction + + +// Color definitions +#define ILI9341_2_BLACK 0x0000 /* 0, 0, 0 */ +#define ILI9341_2_NAVY 0x000F /* 0, 0, 128 */ +#define ILI9341_2_DARKGREEN 0x03E0 /* 0, 128, 0 */ +#define ILI9341_2_DARKCYAN 0x03EF /* 0, 128, 128 */ +#define ILI9341_2_MAROON 0x7800 /* 128, 0, 0 */ +#define ILI9341_2_PURPLE 0x780F /* 128, 0, 128 */ +#define ILI9341_2_OLIVE 0x7BE0 /* 128, 128, 0 */ +#define ILI9341_2_LIGHTGREY 0xC618 /* 192, 192, 192 */ +#define ILI9341_2_DARKGREY 0x7BEF /* 128, 128, 128 */ +#define ILI9341_2_BLUE 0x001F /* 0, 0, 255 */ +#define ILI9341_2_GREEN 0x07E0 /* 0, 255, 0 */ +#define ILI9341_2_CYAN 0x07FF /* 0, 255, 255 */ +#define ILI9341_2_RED 0xF800 /* 255, 0, 0 */ +#define ILI9341_2_MAGENTA 0xF81F /* 255, 0, 255 */ +#define ILI9341_2_YELLOW 0xFFE0 /* 255, 255, 0 */ +#define ILI9341_2_WHITE 0xFFFF /* 255, 255, 255 */ +#define ILI9341_2_ORANGE 0xFD20 /* 255, 165, 0 */ +#define ILI9341_2_GREENYELLOW 0xAFE5 /* 173, 255, 47 */ +#define ILI9341_2_PINK 0xF81F + + +#define MADCTL_2_MY 0x80 ///< Bottom to top +#define MADCTL_2_MX 0x40 ///< Right to left +#define MADCTL_2_MV 0x20 ///< Reverse Mode +#define MADCTL_2_ML 0x10 ///< LCD refresh Bottom to top +#define MADCTL_2_RGB 0x00 ///< Red-Green-Blue pixel order +#define MADCTL_2_BGR 0x08 ///< Blue-Green-Red pixel order +#define MADCTL_2_MH 0x04 ///< LCD refresh right to left + + +class ILI9341_2 : public Renderer { + + public: + + ILI9341_2(int8_t cs, int8_t mosi, int8_t miso, int8_t sclk, int8_t res, int8_t dc, int8_t bp); + + void init(uint16_t width, uint16_t height); + /* + void begin(void); + void DisplayInit(int8_t p,int8_t size,int8_t rot,int8_t font); + void setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1); + void setScrollArea(uint16_t topFixedArea, uint16_t bottomFixedArea); + void scroll(uint16_t pixels); + void pushColor(uint16_t color); + void pushColors(uint16_t *data, uint8_t len, boolean first); + //void drawImage(const uint8_t* img, uint16_t x, uint16_t y, uint16_t w, uint16_t h); + void fillScreen(uint16_t color); + void drawPixel(int16_t x, int16_t y, uint16_t color); + void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color); + void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color); + void fillRect(int16_t x, int16_t y, int16_t w, int16_t h,uint16_t color); + void setRotation(uint8_t r); + void invertDisplay(boolean i); + uint16_t color565(uint8_t r, uint8_t g, uint8_t b); + void DisplayOnff(int8_t on); + void writecommand(uint8_t c); + void writedata(uint8_t d); + void write16BitColor(uint16_t color); + void commandList(uint8_t *addr); + void hw_spi_init(); + void dim(uint8_t contrast);*/ + uint16_t GetColorFromIndex(uint8_t index); + + private: + SPIClass *spi2; + SPISettings sspi2; + void writecmd(uint8_t d); + void setAddrWindow(uint16_t x, uint16_t y, uint16_t w, uint16_t h); + void drawPixel(int16_t x, int16_t y, uint16_t color); + void DisplayOnff(int8_t on); + void setRotation(uint8_t m); + void DisplayInit(int8_t p,int8_t size,int8_t rot,int8_t font); + void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color); + void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color); + void fillScreen(uint16_t color); + void fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color); + void dim(uint8_t dim); + + + void spiwrite(uint8_t c); + void spiwrite16(uint16_t c); + void spiwrite32(uint32_t c); + + uint8_t tabcolor; + uint8_t dimmer; + int8_t _cs; + int8_t _mosi; + int8_t _miso; + int8_t _sclk; + int8_t _res; + int8_t _dc; + int8_t _bp; + int8_t _hwspi; +}; + +#endif diff --git a/tasmota/xdsp_08_ILI9488.ino b/tasmota/xdsp_08_ILI9488.ino index 2e8abc434..712491e6a 100644 --- a/tasmota/xdsp_08_ILI9488.ino +++ b/tasmota/xdsp_08_ILI9488.ino @@ -102,6 +102,7 @@ void ILI9488_InitDriver() ili9488->begin(); renderer = ili9488; renderer->DisplayInit(DISPLAY_INIT_MODE,Settings.display_size,Settings.display_rotate,Settings.display_font); + renderer->dim(Settings.display_dimmer); #ifdef SHOW_SPLASH // Welcome text diff --git a/tasmota/xdsp_12_ST7789.ino b/tasmota/xdsp_12_ST7789.ino index b84e17f77..59339e54f 100644 --- a/tasmota/xdsp_12_ST7789.ino +++ b/tasmota/xdsp_12_ST7789.ino @@ -121,6 +121,7 @@ void ST7789_InitDriver() st7789->init(Settings.display_width,Settings.display_height); renderer = st7789; renderer->DisplayInit(DISPLAY_INIT_MODE,Settings.display_size,Settings.display_rotate,Settings.display_font); + renderer->dim(Settings.display_dimmer); #ifdef SHOW_SPLASH // Welcome text diff --git a/tasmota/xdsp_13_ILI9341-2.ino b/tasmota/xdsp_13_ILI9341-2.ino new file mode 100644 index 000000000..0caaa1f6e --- /dev/null +++ b/tasmota/xdsp_13_ILI9341-2.ino @@ -0,0 +1,121 @@ +/* + xdsp_13_ILI9341-TTGO-TS.ino - Display ILI9341 support for Tasmota + + Copyright (C) 2020 Gerhard Mutz and Theo Arends + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +//#ifdef USE_SPI +#ifdef USE_SPI +#ifdef USE_DISPLAY +#ifdef USE_DISPLAY_ILI9341_2 + +#define XDSP_13 13 + +#undef COLORED +#define COLORED 1 +#undef UNCOLORED +#define UNCOLORED 0 + + +// using font 8 is opional (num=3) +// very badly readable, but may be useful for graphs +#undef USE_TINY_FONT +#define USE_TINY_FONT + + +#include + +extern uint8_t *buffer; +extern uint8_t color_type; +ILI9341_2 *ili9341_2; + + +#undef BACKPLANE_PIN +#define BACKPLANE_PIN 4 + +/*********************************************************************************************/ + +void ILI9341_2_InitDriver() +{ + if (!Settings.display_model) { + Settings.display_model = XDSP_13; + } + + if (XDSP_13 == Settings.display_model) { + + if (Settings.display_width != ILI9341_2_TFTWIDTH) { + Settings.display_width = ILI9341_2_TFTWIDTH; + } + if (Settings.display_height != ILI9341_2_TFTHEIGHT) { + Settings.display_height = ILI9341_2_TFTHEIGHT; + } + + // disable screen buffer + buffer=NULL; + + // default colors + fg_color = ILI9341_2_WHITE; + bg_color = ILI9341_2_BLACK; + + + // init renderer, may use hardware spi, however we use SSPI defintion because SD card uses SPI definition (2 spi busses) + if (PinUsed(GPIO_SSPI_CS) && PinUsed(GPIO_OLED_RESET) && PinUsed(GPIO_BACKLIGHT) && PinUsed(GPIO_SSPI_MOSI) && PinUsed(GPIO_SSPI_MISO) && PinUsed(GPIO_SSPI_SCLK) && PinUsed(GPIO_SSPI_DC)) { + ili9341_2 = new ILI9341_2(Pin(GPIO_SSPI_CS), Pin(GPIO_SSPI_MOSI), Pin(GPIO_SSPI_MISO), Pin(GPIO_SSPI_SCLK), Pin(GPIO_OLED_RESET), Pin(GPIO_SSPI_DC), Pin(GPIO_BACKLIGHT)); + } else { + return; + } + ili9341_2->init(Settings.display_width,Settings.display_height); + renderer = ili9341_2; + renderer->DisplayInit(DISPLAY_INIT_MODE,Settings.display_size,Settings.display_rotate,Settings.display_font); + renderer->dim(Settings.display_dimmer); + +#ifdef SHOW_SPLASH + // Welcome text + renderer->setTextFont(2); + renderer->setTextColor(ILI9341_2_WHITE,ILI9341_2_BLACK); + renderer->DrawStringAt(30, 100, "ILI9341 TFT!", ILI9341_2_WHITE,0); + delay(1000); +#endif + + color_type = COLOR_COLOR; + + } +} + +/*********************************************************************************************/ +/*********************************************************************************************\ + * Interface +\*********************************************************************************************/ +bool Xdsp13(uint8_t function) +{ + bool result = false; + + if (FUNC_DISPLAY_INIT_DRIVER == function) { + ILI9341_2_InitDriver(); + } + else if (XDSP_13 == Settings.display_model) { + switch (function) { + case FUNC_DISPLAY_MODEL: + result = true; + break; + } + } + return result; +} + +#endif // USE_DISPLAY_ILI9341_2 +#endif // USE_DISPLAY +#endif // USE_SPI