Commit 7a3d6bca authored by Bodmer's avatar Bodmer

Minor performance improvements for ESP32

Remove legacy changes for double buffered SPI
Eliminate unecessary ESP32 SPI read/modify write
Eliminate two stage control bit changes (may impact some diplays with
setup/hold  timing and show ESP32 hardware register bug?)
Add single register write for CS and DC command
Make setAddrWindow smarter (as used in previous AVR library)
Improve compatibility with GFX sketches
Re-arrange comments slightly to improve positioning
parent c7735a8b
...@@ -78,6 +78,12 @@ void TFT_eSPI::loadFont(String fontName) ...@@ -78,6 +78,12 @@ void TFT_eSPI::loadFont(String fontName)
_gFontFilename = "/" + fontName + ".vlw"; _gFontFilename = "/" + fontName + ".vlw";
// Avoid a crash on the ESP32 if the file does not exist
if (SPIFFS.exists(_gFontFilename) == false) {
Serial.println("Font file " + fontName + " not found!");
return;
}
fontFile = SPIFFS.open( _gFontFilename, "r"); fontFile = SPIFFS.open( _gFontFilename, "r");
if(!fontFile) return; if(!fontFile) return;
...@@ -479,7 +485,6 @@ void TFT_eSPI::drawGlyph(uint16_t code) ...@@ -479,7 +485,6 @@ void TFT_eSPI::drawGlyph(uint16_t code)
void TFT_eSPI::showFont(uint32_t td) void TFT_eSPI::showFont(uint32_t td)
{ {
if(!fontLoaded) return; if(!fontLoaded) return;
// fontFile = SPIFFS.open( _gFontFilename, "r" );
if(!fontFile) if(!fontFile)
{ {
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
// Enumerate the different configurations // Enumerate the different configurations
#define INITR_GREENTAB 0x0 #define INITR_GREENTAB 0x0
#define INITR_REDTAB 0x1 #define INITR_REDTAB 0x1
#define INITR_BLACKTAB 0x2 #define INITR_BLACKTAB 0x2 // Display with no offsets
#define INITR_GREENTAB2 0x3 // Use if you get random pixels on two edges of green tab display #define INITR_GREENTAB2 0x3 // Use if you get random pixels on two edges of green tab display
#define INITR_GREENTAB3 0x4 // Use if you get random pixels on edge(s) of 128x128 screen #define INITR_GREENTAB3 0x4 // Use if you get random pixels on edge(s) of 128x128 screen
#define INITR_GREENTAB128 0x5 // Use if you only get part of 128x128 screen in rotation 0 & 1 #define INITR_GREENTAB128 0x5 // Use if you only get part of 128x128 screen in rotation 0 & 1
......
This diff is collapsed.
...@@ -103,6 +103,11 @@ ...@@ -103,6 +103,11 @@
#include <SPI.h> #include <SPI.h>
#ifdef ESP32
#include "soc/spi_reg.h"
#define SPI_NUM 0x3
#endif
#ifdef SMOOTH_FONT #ifdef SMOOTH_FONT
// Call up the SPIFFS FLASH filing system for the anti-aliased fonts // Call up the SPIFFS FLASH filing system for the anti-aliased fonts
#define FS_NO_GLOBALS #define FS_NO_GLOBALS
...@@ -127,16 +132,16 @@ ...@@ -127,16 +132,16 @@
#else #else
#if TFT_DC >= 32 #if TFT_DC >= 32
#define DC_C GPIO.out1_w1ts.val = (1 << (TFT_DC - 32)); \ #define DC_C GPIO.out1_w1tc.val = (1 << (TFT_DC - 32)); //\
GPIO.out1_w1tc.val = (1 << (TFT_DC - 32)) //GPIO.out1_w1tc.val = (1 << (TFT_DC - 32))
#define DC_D GPIO.out1_w1tc.val = (1 << (TFT_DC - 32)); \ #define DC_D GPIO.out1_w1ts.val = (1 << (TFT_DC - 32)); //\
GPIO.out1_w1ts.val = (1 << (TFT_DC - 32)) //GPIO.out1_w1ts.val = (1 << (TFT_DC - 32))
#else #else
#if TFT_DC >= 0 #if TFT_DC >= 0
#define DC_C GPIO.out_w1ts = (1 << TFT_DC); \ #define DC_C GPIO.out_w1tc = (1 << TFT_DC); //\
GPIO.out_w1tc = (1 << TFT_DC) //GPIO.out_w1tc = (1 << TFT_DC)
#define DC_D GPIO.out_w1tc = (1 << TFT_DC); \ #define DC_D GPIO.out_w1ts = (1 << TFT_DC); //\
GPIO.out_w1ts = (1 << TFT_DC) //GPIO.out_w1ts = (1 << TFT_DC)
#else #else
#define DC_C #define DC_C
#define DC_D #define DC_D
...@@ -166,14 +171,14 @@ ...@@ -166,14 +171,14 @@
#define CS_H #define CS_H
#else #else
#if TFT_CS >= 32 #if TFT_CS >= 32
#define CS_L GPIO.out1_w1ts.val = (1 << (TFT_CS - 32)); \ #define CS_L GPIO.out1_w1tc.val = (1 << (TFT_CS - 32)); //\
GPIO.out1_w1tc.val = (1 << (TFT_CS - 32)) //GPIO.out1_w1tc.val = (1 << (TFT_CS - 32))
#define CS_H GPIO.out1_w1tc.val = (1 << (TFT_CS - 32)); \ #define CS_H GPIO.out1_w1ts.val = (1 << (TFT_CS - 32)); //\
GPIO.out1_w1ts.val = (1 << (TFT_CS - 32)) //GPIO.out1_w1ts.val = (1 << (TFT_CS - 32))
#else #else
#if TFT_CS >= 0 #if TFT_CS >= 0
#define CS_L GPIO.out_w1ts = (1 << TFT_CS);GPIO.out_w1tc = (1 << TFT_CS) #define CS_L GPIO.out_w1tc = (1 << TFT_CS); //GPIO.out_w1tc = (1 << TFT_CS)
#define CS_H GPIO.out_w1tc = (1 << TFT_CS);GPIO.out_w1ts = (1 << TFT_CS) #define CS_H GPIO.out_w1ts = (1 << TFT_CS); //GPIO.out_w1ts = (1 << TFT_CS)
#else #else
#define CS_L #define CS_L
#define CS_H #define CS_H
...@@ -186,6 +191,18 @@ ...@@ -186,6 +191,18 @@
#endif #endif
#endif #endif
// Use single register write for CS_L and DC_C if pins are both in range 0-31
#ifdef ESP32
#if (TFT_CS >= 0) && (TFT_CS < 32) && (TFT_DC >= 0) && (TFT_DC < 32)
#define CS_L_DC_C GPIO.out_w1tc = ((1 << TFT_CS) | (1 << TFT_DC)); //\
//GPIO.out_w1tc = ((1 << TFT_CS) | (1 << TFT_DC))
#else
#define CS_L_DC_C CS_L; DC_C
#endif
#else // ESP8266
#define CS_L_DC_C CS_L; DC_C
#endif
// chip select signal for touchscreen // chip select signal for touchscreen
#ifndef TOUCH_CS #ifndef TOUCH_CS
#define T_CS_L // No macro allocated so it generates no code #define T_CS_L // No macro allocated so it generates no code
...@@ -206,6 +223,14 @@ ...@@ -206,6 +223,14 @@
#endif #endif
#endif #endif
#ifdef ESP8266
// Concatenate two 16 bit values for the SPI 32 bit register write
#define SPI_32(H,L) ( (H)<<16 | (L) )
#else
// Swap byte order for concatenated 16 bit window address or colors
// AB CD -> DCBA for SPI 32 bit register write
#define SPI_32(H,L) ( ((H)<<8 | (H)>>8) | (((L)<<8 | (L)>>8)<<16 ) )
#endif
#if defined (ESP32) && defined (ESP32_PARALLEL) #if defined (ESP32) && defined (ESP32_PARALLEL)
// Mask for the 8 data bits to set pin directions // Mask for the 8 data bits to set pin directions
...@@ -271,16 +296,57 @@ ...@@ -271,16 +296,57 @@
#define tft_Write_8(C) SPI.transfer(0); SPI.transfer(C) #define tft_Write_8(C) SPI.transfer(0); SPI.transfer(C)
#define tft_Write_16(C) SPI.write16(C) #define tft_Write_16(C) SPI.write16(C)
#define tft_Write_16S(C) SPI.write16(C<<8 | C>>8)
#define tft_Write_32(C) SPI.write32(C) #define tft_Write_32(C) SPI.write32(C)
#else #elif defined ESP8266
#define tft_Write_8(C) SPI.transfer(C) #define tft_Write_8(C) SPI.write(C)
#define tft_Write_16(C) SPI.write16(C) #define tft_Write_16(C) SPI.write16(C)
#define tft_Write_32(C) SPI.write32(C) #define tft_Write_32(C) SPI.write32(C)
#else // ESP32 using SPI with 16 bit color display
// ESP32 low level SPI writes for 8, 16 and 32 bit values
// to avoid the function call overhead
// Write 8 bits
#define tft_Write_8(C) \
WRITE_PERI_REG(SPI_MOSI_DLEN_REG(SPI_NUM), 8-1); \
WRITE_PERI_REG(SPI_W0_REG(SPI_NUM), C); \
SET_PERI_REG_MASK(SPI_CMD_REG(SPI_NUM), SPI_USR); \
while (READ_PERI_REG(SPI_CMD_REG(SPI_NUM))&SPI_USR);
// Write 16 bits with corrected endianess for 16 bit colours
#define tft_Write_16(C) \
WRITE_PERI_REG(SPI_MOSI_DLEN_REG(SPI_NUM), 16-1); \
WRITE_PERI_REG(SPI_W0_REG(SPI_NUM), C<<8 | C>>8); \
SET_PERI_REG_MASK(SPI_CMD_REG(SPI_NUM), SPI_USR); \
while (READ_PERI_REG(SPI_CMD_REG(SPI_NUM))&SPI_USR);
// Write 16 bits (used for ESP32_PARALLEL or ILI9488_DRIVER)
#define tft_Write_16S(C) \
WRITE_PERI_REG(SPI_MOSI_DLEN_REG(SPI_NUM), 16-1); \
WRITE_PERI_REG(SPI_W0_REG(SPI_NUM), C); \
SET_PERI_REG_MASK(SPI_CMD_REG(SPI_NUM), SPI_USR); \
while (READ_PERI_REG(SPI_CMD_REG(SPI_NUM))&SPI_USR);
// Write 32 bits
#define tft_Write_32(C) \
WRITE_PERI_REG(SPI_MOSI_DLEN_REG(SPI_NUM), 32-1); \
WRITE_PERI_REG(SPI_W0_REG(SPI_NUM), C); \
SET_PERI_REG_MASK(SPI_CMD_REG(SPI_NUM), SPI_USR); \
while (READ_PERI_REG(SPI_CMD_REG(SPI_NUM))&SPI_USR);
#endif
#ifndef ESP32_PARALLEL
// Support SPI TFT reads (not all displays support this)
#define tft_Read_8(C) SPI.transfer(C)
#endif #endif
#ifdef LOAD_GFXFF #ifdef LOAD_GFXFF
// We can include all the free fonts and they will only be built into // We can include all the free fonts and they will only be built into
// the sketch if they are used // the sketch if they are used
...@@ -406,6 +472,7 @@ template <typename T> static inline void ...@@ -406,6 +472,7 @@ template <typename T> static inline void
swap_coord(T& a, T& b) { T t = a; a = b; b = t; } swap_coord(T& a, T& b) { T t = a; a = b; b = t; }
#ifndef min #ifndef min
// Return minimum of two numbers, may already be defined
#define min(a,b) (((a) < (b)) ? (a) : (b)) #define min(a,b) (((a) < (b)) ? (a) : (b))
#endif #endif
...@@ -667,6 +734,10 @@ class TFT_eSPI : public Print { ...@@ -667,6 +734,10 @@ class TFT_eSPI : public Print {
void setAddrWindow(int32_t xs, int32_t ys, int32_t xe, int32_t ye); void setAddrWindow(int32_t xs, int32_t ys, int32_t xe, int32_t ye);
// These 3 functions are used together, for every startWrite() there must be an endWrite()
void startWrite(void); // Begin SPI transaction
void writeColor(uint16_t color, uint32_t len); // Write a colour without transaction overhead
void endWrite(void); // End SPI transaction
size_t write(uint8_t); size_t write(uint8_t);
...@@ -713,6 +784,8 @@ class TFT_eSPI : public Print { ...@@ -713,6 +784,8 @@ class TFT_eSPI : public Print {
uint32_t _init_width, _init_height; // Display w/h as input, used by setRotation() uint32_t _init_width, _init_height; // Display w/h as input, used by setRotation()
uint32_t _width, _height; // Display w/h as modified by current rotation uint32_t _width, _height; // Display w/h as modified by current rotation
uint32_t addr_row, addr_col; uint32_t addr_row, addr_col;
uint32_t xs_col, xe_col;
uint32_t ys_row, ye_row;
uint32_t fontsloaded; uint32_t fontsloaded;
...@@ -750,9 +823,4 @@ class TFT_eSPI : public Print { ...@@ -750,9 +823,4 @@ class TFT_eSPI : public Print {
// Load the Sprite Class // Load the Sprite Class
#include "Extensions/Sprite.h" #include "Extensions/Sprite.h"
// #ifdef ESP32
// // Load the Sprite Class
// #include "Extensions/pSprite.h"
// #endif
#endif #endif
...@@ -113,14 +113,15 @@ ...@@ -113,14 +113,15 @@
// but saves pins for other functions. // but saves pins for other functions.
// Use NodeMCU SD0=MISO, SD1=MOSI, CLK=SCLK to connect to TFT in overlap mode // Use NodeMCU SD0=MISO, SD1=MOSI, CLK=SCLK to connect to TFT in overlap mode
// In ESP8266 overlap mode the following must be defined
//#define TFT_SPI_OVERLAP
// In ESP8266 overlap mode the TFT chip select MUST connect to pin D3 // In ESP8266 overlap mode the TFT chip select MUST connect to pin D3
//#define TFT_CS PIN_D3 //#define TFT_CS PIN_D3
//#define TFT_DC PIN_D5 // Data Command control pin //#define TFT_DC PIN_D5 // Data Command control pin
//#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line) //#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line)
//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V //#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V
// In ESP8266 overlap mode the following must be defined
//#define TFT_SPI_OVERLAP
// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP32 SETUP ###### // ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP32 SETUP ######
...@@ -136,6 +137,9 @@ ...@@ -136,6 +137,9 @@
//#define TFT_RST -1 // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST //#define TFT_RST -1 // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST
//#define TFT_BL 32 // LED back-light (only for ST7789 with backlight control pin) //#define TFT_BL 32 // LED back-light (only for ST7789 with backlight control pin)
//#define TOUCH_CS 21 // Chip select pin (T_CS) of touch screen
//#define TFT_WR 22 // Write strobe for modified Raspberry Pi TFT only
// For the M5Stack module use these #define lines // For the M5Stack module use these #define lines
//#define TFT_MISO 19 //#define TFT_MISO 19
...@@ -146,10 +150,6 @@ ...@@ -146,10 +150,6 @@
//#define TFT_RST 33 // Reset pin (could connect to Arduino RESET pin) //#define TFT_RST 33 // Reset pin (could connect to Arduino RESET pin)
//#define TFT_BL 32 // LED back-light (required for M5Stack) //#define TFT_BL 32 // LED back-light (required for M5Stack)
//#define TOUCH_CS 21 // Chip select pin (T_CS) of touch screen
//#define TFT_WR 22 // Write strobe for modified Raspberry Pi TFT only
// ###### EDIT THE PINs BELOW TO SUIT YOUR ESP32 PARALLEL TFT SETUP ###### // ###### EDIT THE PINs BELOW TO SUIT YOUR ESP32 PARALLEL TFT SETUP ######
// The library supports 8 bit parallel TFTs with the ESP32, the pin // The library supports 8 bit parallel TFTs with the ESP32, the pin
......
...@@ -102,7 +102,7 @@ ...@@ -102,7 +102,7 @@
//#define TFT_BL PIN_D1 // LED back-light (only for ST7789 with backlight control pin) //#define TFT_BL PIN_D1 // LED back-light (only for ST7789 with backlight control pin)
//#define TOUCH_CS PIN_D2 // Chip select pin (T_CS) of touch screen //#define TOUCH_CS PIN_D1 // Chip select pin (T_CS) of touch screen
//#define TFT_WR PIN_D2 // Write strobe for modified Raspberry Pi TFT only //#define TFT_WR PIN_D2 // Write strobe for modified Raspberry Pi TFT only
...@@ -113,14 +113,15 @@ ...@@ -113,14 +113,15 @@
// but saves pins for other functions. // but saves pins for other functions.
// Use NodeMCU SD0=MISO, SD1=MOSI, CLK=SCLK to connect to TFT in overlap mode // Use NodeMCU SD0=MISO, SD1=MOSI, CLK=SCLK to connect to TFT in overlap mode
// In ESP8266 overlap mode the following must be defined
//#define TFT_SPI_OVERLAP
// In ESP8266 overlap mode the TFT chip select MUST connect to pin D3 // In ESP8266 overlap mode the TFT chip select MUST connect to pin D3
//#define TFT_CS PIN_D3 //#define TFT_CS PIN_D3
//#define TFT_DC PIN_D5 // Data Command control pin //#define TFT_DC PIN_D5 // Data Command control pin
//#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line) //#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line)
//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V //#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V
// In ESP8266 overlap mode the following must be defined
//#define TFT_SPI_OVERLAP
// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP32 SETUP ###### // ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP32 SETUP ######
...@@ -134,8 +135,10 @@ ...@@ -134,8 +135,10 @@
//#define TFT_DC 2 // Data Command control pin //#define TFT_DC 2 // Data Command control pin
//#define TFT_RST 4 // Reset pin (could connect to RST pin) //#define TFT_RST 4 // Reset pin (could connect to RST pin)
//#define TFT_RST -1 // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST //#define TFT_RST -1 // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST
//#define TFT_BL 32 // LED back-light (only for ST7789 with backlight control pin)
//#define TOUCH_CS 22 // Chip select pin (T_CS) of touch screen
//#define TFT_WR 21 // Write strobe for modified Raspberry Pi TFT only
// For the M5Stack module use these #define lines // For the M5Stack module use these #define lines
//#define TFT_MISO 19 //#define TFT_MISO 19
...@@ -144,11 +147,7 @@ ...@@ -144,11 +147,7 @@
//#define TFT_CS 14 // Chip select control pin //#define TFT_CS 14 // Chip select control pin
//#define TFT_DC 27 // Data Command control pin //#define TFT_DC 27 // Data Command control pin
//#define TFT_RST 33 // Reset pin (could connect to Arduino RESET pin) //#define TFT_RST 33 // Reset pin (could connect to Arduino RESET pin)
//#define TFT_BL 32 // LED back-light (required for M5Stack) //#define TFT_BL 32 // LED back-light (if needed)
//#define TOUCH_CS 21 // Chip select pin (T_CS) of touch screen
//#define TFT_WR 22 // Write strobe for modified Raspberry Pi TFT only
// ###### EDIT THE PINs BELOW TO SUIT YOUR ESP32 PARALLEL TFT SETUP ###### // ###### EDIT THE PINs BELOW TO SUIT YOUR ESP32 PARALLEL TFT SETUP ######
...@@ -209,9 +208,9 @@ ...@@ -209,9 +208,9 @@
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters #define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters #define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm #define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-. #define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:.
#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT //#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT
#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts #define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
// Comment out the #define below to stop the SPIFFS filing system and smooth font code being loaded // Comment out the #define below to stop the SPIFFS filing system and smooth font code being loaded
...@@ -263,4 +262,4 @@ ...@@ -263,4 +262,4 @@
// Transactions are automatically enabled by the library for an ESP32 (to use HAL mutex) // Transactions are automatically enabled by the library for an ESP32 (to use HAL mutex)
// so changing it here has no effect // so changing it here has no effect
//#define SUPPORT_TRANSACTIONS // #define SUPPORT_TRANSACTIONS
...@@ -6,6 +6,9 @@ drawChar KEYWORD2 ...@@ -6,6 +6,9 @@ drawChar KEYWORD2
setAddrWindow KEYWORD2 setAddrWindow KEYWORD2
setWindow KEYWORD2 setWindow KEYWORD2
readAddrWindow KEYWORD2 readAddrWindow KEYWORD2
startWrite KEYWORD2
writeColor KEYWORD2
endWrite KEYWORD2
pushColor KEYWORD2 pushColor KEYWORD2
pushColors KEYWORD2 pushColors KEYWORD2
fillScreen KEYWORD2 fillScreen KEYWORD2
......
{ {
"name": "TFT_eSPI", "name": "TFT_eSPI",
"version": "1.1.4", "version": "1.2.0",
"keywords": "tft, ePaper, display, ESP8266, NodeMCU, ESP32, M5Stack, ILI9341, ST7735, ILI9163, S6D02A1, ILI9486, ST7789", "keywords": "tft, ePaper, display, ESP8266, NodeMCU, ESP32, M5Stack, ILI9341, ST7735, ILI9163, S6D02A1, ILI9486, ST7789",
"description": "A TFT and ePaper SPI graphics library for ESP8266 and ESP32", "description": "A TFT and ePaper SPI graphics library for ESP8266 and ESP32",
"repository": "repository":
......
name=TFT_eSPI name=TFT_eSPI
version=1.1.4 version=1.2.0
author=Bodmer author=Bodmer
maintainer=Bodmer maintainer=Bodmer
sentence=A fast TFT graphics library for ESP8266 and ESP32 processors for the Arduino IDE sentence=A fast TFT graphics library for ESP8266 and ESP32 processors for the Arduino IDE
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment