diff --git a/Extensions/Button.cpp b/Extensions/Button.cpp index 51bb316..475c631 100644 --- a/Extensions/Button.cpp +++ b/Extensions/Button.cpp @@ -65,8 +65,8 @@ void TFT_eSPI_Button::drawButton(bool inverted, String long_name) { _gfx->drawRoundRect(_x1, _y1, _w, _h, r, outline); if (_gfx->textfont == 255) { - _gfx->setCursor(_x1 + (_w / 2) - (strlen(_label) * 3 * _textsize), - _y1 + (_h / 2) - (4 * _textsize)); + _gfx->setCursor(_x1 + (_w / 8), + _y1 + (_h / 4)); _gfx->setTextColor(text); _gfx->setTextSize(_textsize); _gfx->print(_label); diff --git a/Processors/TFT_eSPI_ESP32.c b/Processors/TFT_eSPI_ESP32.c index e82a358..e6d2d26 100644 --- a/Processors/TFT_eSPI_ESP32.c +++ b/Processors/TFT_eSPI_ESP32.c @@ -213,7 +213,7 @@ void TFT_eSPI::pushPixels(const void* data_in, uint32_t len) ***************************************************************************************/ /* void TFT_eSPI::pushBlock(uint16_t color, uint32_t len){ - + uint32_t color32 = (color<<8 | color >>8)<<16 | (color<<8 | color >>8); bool empty = true; volatile uint32_t* spi_w = (volatile uint32_t*)_spi_w; @@ -262,7 +262,7 @@ void TFT_eSPI::pushBlock(uint16_t color, uint32_t len){ void TFT_eSPI::pushBlock(uint16_t color, uint32_t len){ volatile uint32_t* spi_w = _spi_w; - uint32_t color32 = (color<<8 | color >>8)<<16 | (color<<8 | color >>8); + uint32_t color32 = (color<<8 | color >>8)<<16 | (color<<8 | color >>8); uint32_t i = 0; uint32_t rem = len & 0x1F; len = len - rem; @@ -287,7 +287,7 @@ void TFT_eSPI::pushBlock(uint16_t color, uint32_t len){ { while (*_spi_cmd&SPI_USR); *_spi_cmd = SPI_USR; - len -= 32; + len -= 32; } // Do not wait here @@ -315,7 +315,7 @@ void TFT_eSPI::pushSwapBytePixels(const void* data_in, uint32_t len){ data+=4; } while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR); - WRITE_PERI_REG(SPI_W0_REG(SPI_PORT), color[0]); + WRITE_PERI_REG(SPI_W0_REG(SPI_PORT), color[0]); WRITE_PERI_REG(SPI_W1_REG(SPI_PORT), color[1]); WRITE_PERI_REG(SPI_W2_REG(SPI_PORT), color[2]); WRITE_PERI_REG(SPI_W3_REG(SPI_PORT), color[3]); @@ -346,7 +346,7 @@ void TFT_eSPI::pushSwapBytePixels(const void* data_in, uint32_t len){ } while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR); WRITE_PERI_REG(SPI_MOSI_DLEN_REG(SPI_PORT), 255); - WRITE_PERI_REG(SPI_W0_REG(SPI_PORT), color[0]); + WRITE_PERI_REG(SPI_W0_REG(SPI_PORT), color[0]); WRITE_PERI_REG(SPI_W1_REG(SPI_PORT), color[1]); WRITE_PERI_REG(SPI_W2_REG(SPI_PORT), color[2]); WRITE_PERI_REG(SPI_W3_REG(SPI_PORT), color[3]); @@ -832,5 +832,5 @@ void TFT_eSPI::deInitDMA(void) } //////////////////////////////////////////////////////////////////////////////////////// -#endif // End of DMA FUNCTIONS +#endif // End of DMA FUNCTIONS //////////////////////////////////////////////////////////////////////////////////////// diff --git a/Processors/TFT_eSPI_RP2040.c b/Processors/TFT_eSPI_RP2040.c index d928faa..fdea719 100644 --- a/Processors/TFT_eSPI_RP2040.c +++ b/Processors/TFT_eSPI_RP2040.c @@ -154,12 +154,12 @@ void pioinit(uint32_t clock_freq) { // Create the pull stall bit mask pull_stall_mask = 1u << (PIO_FDEBUG_TXSTALL_LSB + pio_sm); - + // Create the assembler instruction for the jump to byte send routine pio_instr_jmp8 = pio_encode_jmp(program_offset + tft_io_offset_start_8); pio_instr_fill = pio_encode_jmp(program_offset + tft_io_offset_block_fill); pio_instr_addr = pio_encode_jmp(program_offset + tft_io_offset_set_addr_window); - + pio_instr_set_dc = pio_encode_set((pio_src_dest)0, 1); pio_instr_clr_dc = pio_encode_set((pio_src_dest)0, 0); } @@ -212,7 +212,7 @@ void pioinit(uint16_t clock_div, uint16_t fract_div) { // Create the pull stall bit mask pull_stall_mask = 1u << (PIO_FDEBUG_TXSTALL_LSB + pio_sm); - + // Create the instructions for the jumps to send routines pio_instr_jmp8 = pio_encode_jmp(program_offset + tft_io_offset_start_8); pio_instr_fill = pio_encode_jmp(program_offset + tft_io_offset_block_fill); @@ -235,7 +235,7 @@ void TFT_eSPI::pushBlock(uint16_t color, uint32_t len) if (len) { WAIT_FOR_STALL; pio->sm[pio_sm].instr = pio_instr_fill; - + TX_FIFO = color; TX_FIFO = --len; // Decrement first as PIO sends n+1 } @@ -368,13 +368,13 @@ uint8_t TFT_eSPI::readByte(void) b |= digitalRead(TFT_D7) << 7; digitalWrite(TFT_RD, HIGH); - busDir(0, OUTPUT); + busDir(0, OUTPUT); */ return b; } //////////////////////////////////////////////////////////////////////////////////////// -#elif defined (RPI_WRITE_STROBE) // For RPi TFT with write strobe +#elif defined (RPI_WRITE_STROBE) // For RPi TFT with write strobe //////////////////////////////////////////////////////////////////////////////////////// /*************************************************************************************** @@ -400,7 +400,7 @@ void TFT_eSPI::pushPixels(const void* data_in, uint32_t len) } //////////////////////////////////////////////////////////////////////////////////////// -#elif defined (SPI_18BIT_DRIVER) // SPI 18 bit colour +#elif defined (SPI_18BIT_DRIVER) // SPI 18 bit colour //////////////////////////////////////////////////////////////////////////////////////// /*************************************************************************************** @@ -420,7 +420,7 @@ void TFT_eSPI::pushBlock(uint16_t color, uint32_t len) uint32_t gb = g<<8 | b; // Must wait before changing to 16 bit while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; - spi_set_format(SPI_X, 16, (spi_cpol_t)0, (spi_cpha_t)0, SPI_MSB_FIRST); + hw_write_masked(&spi_get_hw(SPI_X)->cr0, (16 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS); while ( len > 1 ) { while (!spi_is_writable(SPI_X)){}; spi_get_hw(SPI_X)->dr = rg; while (!spi_is_writable(SPI_X)){}; spi_get_hw(SPI_X)->dr = br; @@ -429,7 +429,7 @@ void TFT_eSPI::pushBlock(uint16_t color, uint32_t len) } // Must wait before changing back to 8 bit while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; - spi_set_format(SPI_X, 8, (spi_cpol_t)0, (spi_cpha_t)0, SPI_MSB_FIRST); + hw_write_masked(&spi_get_hw(SPI_X)->cr0, (8 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS); } // Mop up the remaining pixels @@ -458,7 +458,7 @@ void TFT_eSPI::pushPixels(const void* data_in, uint32_t len){ } //////////////////////////////////////////////////////////////////////////////////////// -#else // Standard SPI 16 bit colour TFT +#else // Standard SPI 16 bit colour TFT //////////////////////////////////////////////////////////////////////////////////////// /*************************************************************************************** @@ -524,7 +524,7 @@ bool TFT_eSPI::dmaBusy(void) { #if !defined (RP2040_PIO_INTERFACE) // For SPI must also wait for FIFO to flush and reset format while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; - spi_set_format(SPI_X, 16, (spi_cpol_t)0, (spi_cpha_t)0, SPI_MSB_FIRST); + hw_write_masked(&spi_get_hw(SPI_X)->cr0, (16 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS); #endif return false; @@ -541,7 +541,7 @@ void TFT_eSPI::dmaWait(void) #if !defined (RP2040_PIO_INTERFACE) // For SPI must also wait for FIFO to flush and reset format while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; - spi_set_format(SPI_X, 16, (spi_cpol_t)0, (spi_cpha_t)0, SPI_MSB_FIRST); + hw_write_masked(&spi_get_hw(SPI_X)->cr0, (16 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS); #endif } @@ -624,12 +624,12 @@ void TFT_eSPI::pushImageDMA(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t bool TFT_eSPI::initDMA(bool ctrl_cs) { if (DMA_Enabled) return false; - + ctrl_cs = ctrl_cs; // stop unused parameter warning dma_tx_channel = dma_claim_unused_channel(true); dma_tx_config = dma_channel_get_default_config(dma_tx_channel); - + channel_config_set_transfer_data_size(&dma_tx_config, DMA_SIZE_16); #if !defined (RP2040_PIO_INTERFACE) channel_config_set_dreq(&dma_tx_config, spi_get_index(SPI_X) ? DREQ_SPI1_TX : DREQ_SPI0_TX); @@ -653,5 +653,5 @@ void TFT_eSPI::deInitDMA(void) } //////////////////////////////////////////////////////////////////////////////////////// -#endif // End of DMA FUNCTIONS +#endif // End of DMA FUNCTIONS //////////////////////////////////////////////////////////////////////////////////////// diff --git a/Processors/TFT_eSPI_RP2040.h b/Processors/TFT_eSPI_RP2040.h index 17fa163..da3d094 100644 --- a/Processors/TFT_eSPI_RP2040.h +++ b/Processors/TFT_eSPI_RP2040.h @@ -8,6 +8,11 @@ #ifndef _TFT_eSPI_RP2040H_ #define _TFT_eSPI_RP2040H_ +#ifndef ARDUINO_ARCH_MBED + #define FONT_FS_AVAILABLE + #define SPIFFS LittleFS +#endif + // Required for both the official and community board packages #include "hardware/dma.h" #include "hardware/pio.h" @@ -37,7 +42,7 @@ #endif // Processor specific code used by SPI bus transaction begin/end_tft_write functions - #define SET_BUS_WRITE_MODE spi_set_format(SPI_X, 8, (spi_cpol_t)0, (spi_cpha_t)0, SPI_MSB_FIRST) + #define SET_BUS_WRITE_MODE spi_set_format(SPI_X, 8, (spi_cpol_t)(TFT_SPI_MODE >> 1), (spi_cpha_t)(TFT_SPI_MODE & 0x1), SPI_MSB_FIRST) #define SET_BUS_READ_MODE // spi_set_format(SPI_X, 8, (spi_cpol_t)0, (spi_cpha_t)0, SPI_MSB_FIRST) #else // Processor specific code used by SPI bus transaction begin/end_tft_write functions @@ -98,7 +103,7 @@ #ifdef SMOOTH_FONT // Call up the filing system for the anti-aliased fonts //#define FS_NO_GLOBALS - //#include + #include #endif //////////////////////////////////////////////////////////////////////////////////////// @@ -183,7 +188,7 @@ #endif #else #ifdef TOUCH_CS - #error Touch screen not supported in parallel mode, use a separate library. + #error Touch screen not supported in parallel or SPI PIO mode, use a separate library. #endif #endif @@ -271,10 +276,10 @@ // This swaps to 8 bit mode, then back to 16 bit mode #define tft_Write_8(C) while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; \ - spi_set_format(SPI_X, 8, (spi_cpol_t)0, (spi_cpha_t)0, SPI_MSB_FIRST); \ + hw_write_masked(&spi_get_hw(SPI_X)->cr0, (8 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS); \ spi_get_hw(SPI_X)->dr = (uint32_t)(C); \ while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; \ - spi_set_format(SPI_X, 16, (spi_cpol_t)0, (spi_cpha_t)0, SPI_MSB_FIRST) + hw_write_masked(&spi_get_hw(SPI_X)->cr0, (16 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS) // Note: the following macros do not wait for the end of transmission diff --git a/TFT_Drivers/ST7789_Defines.h b/TFT_Drivers/ST7789_Defines.h index 72f7929..2027107 100644 --- a/TFT_Drivers/ST7789_Defines.h +++ b/TFT_Drivers/ST7789_Defines.h @@ -104,6 +104,7 @@ #define ST7789_TEOFF 0x34 // Tearing effect line off #define ST7789_TEON 0x35 // Tearing effect line on #define ST7789_MADCTL 0x36 // Memory data access control +#define ST7789_VSCRSADD 0x37 // Vertical screoll address #define ST7789_IDMOFF 0x38 // Idle mode off #define ST7789_IDMON 0x39 // Idle mode on #define ST7789_RAMWRC 0x3C // Memory write continue (ST7789V) diff --git a/TFT_eSPI.cpp b/TFT_eSPI.cpp index 4fa27ce..31481b4 100644 --- a/TFT_eSPI.cpp +++ b/TFT_eSPI.cpp @@ -3097,9 +3097,9 @@ void TFT_eSPI::setWindow(int32_t x0, int32_t y0, int32_t x1, int32_t y1) DC_C; #if !defined (SPI_18BIT_DRIVER) #if defined (RPI_DISPLAY_TYPE) // RPi TFT type always needs 16 bit transfers - spi_set_format(SPI_X, 16, (spi_cpol_t)0, (spi_cpha_t)0, SPI_MSB_FIRST); + hw_write_masked(&spi_get_hw(SPI_X)->cr0, (16 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS); #else - spi_set_format(SPI_X, 8, (spi_cpol_t)0, (spi_cpha_t)0, SPI_MSB_FIRST); + hw_write_masked(&spi_get_hw(SPI_X)->cr0, (8 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS); #endif #endif spi_get_hw(SPI_X)->dr = (uint32_t)TFT_CASET; @@ -3128,7 +3128,7 @@ void TFT_eSPI::setWindow(int32_t x0, int32_t y0, int32_t x1, int32_t y1) while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; #if !defined (SPI_18BIT_DRIVER) - spi_set_format(SPI_X, 16, (spi_cpol_t)0, (spi_cpha_t)0, SPI_MSB_FIRST); + hw_write_masked(&spi_get_hw(SPI_X)->cr0, (16 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS); #endif DC_D; #else @@ -3184,7 +3184,7 @@ void TFT_eSPI::readAddrWindow(int32_t xs, int32_t ys, int32_t w, int32_t h) #if (defined(ARDUINO_ARCH_RP2040) || defined (ARDUINO_ARCH_MBED)) && !defined(RP2040_PIO_INTERFACE) while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; DC_C; - spi_set_format(SPI_X, 8, (spi_cpol_t)0, (spi_cpha_t)0, SPI_MSB_FIRST); + hw_write_masked(&spi_get_hw(SPI_X)->cr0, (8 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS); spi_get_hw(SPI_X)->dr = (uint32_t)TFT_CASET; while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; @@ -3210,7 +3210,6 @@ void TFT_eSPI::readAddrWindow(int32_t xs, int32_t ys, int32_t w, int32_t h) spi_get_hw(SPI_X)->dr = (uint32_t)TFT_RAMRD; while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; - //spi_set_format(SPI_X, 8, (spi_cpol_t)0, (spi_cpha_t)0, SPI_MSB_FIRST); DC_D; // Flush the rx buffer and reset overflow flag @@ -3305,9 +3304,9 @@ void TFT_eSPI::drawPixel(int32_t x, int32_t y, uint32_t color) while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; #if defined (RPI_DISPLAY_TYPE) // RPi TFT type always needs 16 bit transfers - spi_set_format(SPI_X, 16, (spi_cpol_t)0, (spi_cpha_t)0, SPI_MSB_FIRST); + hw_write_masked(&spi_get_hw(SPI_X)->cr0, (16 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS); #else - spi_set_format(SPI_X, 8, (spi_cpol_t)0, (spi_cpha_t)0, SPI_MSB_FIRST); + hw_write_masked(&spi_get_hw(SPI_X)->cr0, (8 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS); #endif if (addr_col != x) { diff --git a/TFT_eSPI.h b/TFT_eSPI.h index a92696a..cb2367e 100644 --- a/TFT_eSPI.h +++ b/TFT_eSPI.h @@ -16,7 +16,7 @@ #ifndef _TFT_eSPIH_ #define _TFT_eSPIH_ -#define TFT_ESPI_VERSION "2.4.25" +#define TFT_ESPI_VERSION "2.4.27" // Bit level feature flags // Bit 0 set: viewport capability diff --git a/User_Setup_Select.h b/User_Setup_Select.h index e7bf96f..07e7981 100644 --- a/User_Setup_Select.h +++ b/User_Setup_Select.h @@ -19,7 +19,7 @@ // Only ONE line below should be uncommented. Add extra lines and files as needed. -#include // Default setup is root library folder +//#include // Default setup is root library folder //#include // Setup file configured for my ILI9341 //#include // Setup file configured for my ST7735 @@ -46,7 +46,7 @@ //#include // Setup file for ESP8266 and ILI9488 SPI bus TFT //#include // Setup file for ESP32 and ILI9488 SPI bus TFT -//#include // Setup file for ESP32 and TTGO T4 version 1.2 +#include // Setup file for ESP32 and TTGO T4 version 1.2 //#include // Setup file for ESP32 and TTGO T4 version 1.3 //#include // Setup file for ESP32 and TTGO TM ST7789 SPI bus TFT //#include // Setup file configured for ST7789 240 x 240 @@ -79,8 +79,9 @@ //#include // Setup file for LilyGo LilyPi with ILI9481 display //#include // Setup file for LilyGo LilyPi with ST7796 display -//#include // Setup file for Raspberry Pi Pico with SPI ILI9341 +//#include // Setup file for RP2040 with SPI ILI9341 //#include // Setup file for RP2040 with PIO SPI ILI9341 +//#include // Setup file for RP2040 with SPI ILI9341 //#include // Setup file for ESP32 S2 with SPI ILI9341 @@ -106,6 +107,11 @@ //#include +//#include // Setup file for Dustin Watts PCB with ILI9488 +//#include // Setup file for Dustin Watts PCB with ST7796 + + + #endif // USER_SETUP_LOADED @@ -218,7 +224,6 @@ #define TFT_DRIVER 0x0000 #else #define TFT_DRIVER 0x0000 - # error "####### NO TFT DRIVER DEFINED #######" #endif // These are the pins for ESP8266 boards diff --git a/User_Setups/Setup22_TTGO_T4_v1.3.h b/User_Setups/Setup22_TTGO_T4_v1.3.h index fe51989..603bc4e 100644 --- a/User_Setups/Setup22_TTGO_T4_v1.3.h +++ b/User_Setups/Setup22_TTGO_T4_v1.3.h @@ -12,7 +12,7 @@ #define TFT_SCLK 18 #define TFT_CS 27 -#define TFT_DC 32 // pin 26 for TTGO T4 v1.3 <<<<<<<<<<< Note +#define TFT_DC 32 // pin 26 for TTGO T4 v1.1 #define TFT_RST 5 #define LOAD_GLCD diff --git a/User_Setups/Setup62_RP2040_Nano_Connect_ILI9341.h b/User_Setups/Setup62_RP2040_Nano_Connect_ILI9341.h new file mode 100644 index 0000000..66d6a5a --- /dev/null +++ b/User_Setups/Setup62_RP2040_Nano_Connect_ILI9341.h @@ -0,0 +1,198 @@ +// USER DEFINED SETTINGS +// Set driver type, fonts to be loaded, pins used and SPI control method etc +// +// See the User_Setup_Select.h file if you wish to be able to define multiple +// setups and then easily select which setup file is used by the compiler. +// +// If this file is edited correctly then all the library example sketches should +// run without the need to make any more changes for a particular hardware setup! +// Note that some sketches are designed for a particular TFT pixel width/height + + +// ################################################################################## +// +// Section 1. Call up the right driver file and any options for it +// +// ################################################################################## + +// Tell the library to use 8 bit parallel mode (otherwise SPI is assumed) +//#define TFT_PARALLEL_8_BIT +//#define RP2040_PIO_SPI +// Display type - only define if RPi display +//#define RPI_DISPLAY_TYPE // 20MHz maximum SPI + +// Only define one driver, the other ones must be commented out +#define ILI9341_DRIVER +//#define ST7735_DRIVER // Define additional parameters below for this display +//#define ILI9163_DRIVER // Define additional parameters below for this display +//#define S6D02A1_DRIVER +//#define RPI_ILI9486_DRIVER // 20MHz maximum SPI +//#define HX8357D_DRIVER +//#define ILI9481_DRIVER +//#define ILI9486_DRIVER +//#define ILI9488_DRIVER // WARNING: Do not connect ILI9488 display SDO to MISO if other devices share the SPI bus (TFT SDO does NOT tristate when CS is high) +//#define ST7789_DRIVER // Full configuration option, define additional parameters below for this display +//#define ST7789_2_DRIVER // Minimal configuration option, define additional parameters below for this display +//#define R61581_DRIVER +//#define RM68140_DRIVER +//#define ST7796_DRIVER +//#define SSD1963_480_DRIVER +//#define SSD1963_800_DRIVER +//#define SSD1963_800ALT_DRIVER +//#define ILI9225_DRIVER + +// Some displays support SPI reads via the MISO pin, other displays have a single +// bi-directional SDA pin and the library will try to read this via the MOSI line. +// To use the SDA line for reading data from the TFT uncomment the following line: + +// #define TFT_SDA_READ // This option is for ESP32 ONLY, tested with ST7789 display only + +// For ST7735, ST7789 and ILI9341 ONLY, define the colour order IF the blue and red are swapped on your display +// Try ONE option at a time to find the correct colour order for your display + +// #define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue +// #define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +// For ST7789, ST7735 and ILI9163 ONLY, define the pixel width and height in portrait orientation +// #define TFT_WIDTH 80 +// #define TFT_WIDTH 128 +// #define TFT_WIDTH 240 // ST7789 240 x 240 and 240 x 320 +// #define TFT_HEIGHT 160 +// #define TFT_HEIGHT 128 +// #define TFT_HEIGHT 240 // ST7789 240 x 240 +// #define TFT_HEIGHT 320 // ST7789 240 x 320 + +// For ST7735 ONLY, define the type of display, originally this was based on the +// colour of the tab on the screen protector film but this is not always true, so try +// out the different options below if the screen does not display graphics correctly, +// e.g. colours wrong, mirror images, or tray pixels at the edges. +// Comment out ALL BUT ONE of these options for a ST7735 display driver, save this +// this User_Setup file, then rebuild and upload the sketch to the board again: + +// #define ST7735_INITB +// #define ST7735_GREENTAB +// #define ST7735_GREENTAB2 +// #define ST7735_GREENTAB3 +// #define ST7735_GREENTAB128 // For 128 x 128 display +// #define ST7735_GREENTAB160x80 // For 160 x 80 display (BGR, inverted, 26 offset) +// #define ST7735_REDTAB +// #define ST7735_BLACKTAB +// #define ST7735_REDTAB160x80 // For 160 x 80 display with 24 pixel offset + +// If colours are inverted (white shows as black) then uncomment one of the next +// 2 lines try both options, one of the options should correct the inversion. + +// #define TFT_INVERSION_ON +// #define TFT_INVERSION_OFF + + +// ################################################################################## +// +// Section 2. Define the pins that are used to interface with the display here +// +// ################################################################################## + +// If a backlight control signal is available then define the TFT_BL pin in Section 2 +// below. The backlight will be turned ON when tft.begin() is called, but the library +// needs to know if the LEDs are ON with the pin HIGH or LOW. If the LEDs are to be +// driven with a PWM signal or turned OFF/ON then this must be handled by the user +// sketch. e.g. with digitalWrite(TFT_BL, LOW); + +// #define TFT_BL 32 // LED back-light control pin +// #define TFT_BACKLIGHT_ON HIGH // Level to turn ON back-light (HIGH or LOW) + +// We must use hardware SPI, a minimum of 3 GPIO pins is needed. +// Typical setup for the RP2040 is : +// +// Display SDO/MISO to RP2040 pin D0 (or leave disconnected if not reading TFT) +// Display LED to RP2040 pin 3V3 or 5V +// Display SCK to RP2040 pin D2 +// Display SDI/MOSI to RP2040 pin D3 +// Display DC (RS/AO)to RP2040 pin D18 (can use another pin if desired) +// Display RESET to RP2040 pin D19 (can use another pin if desired) +// Display CS to RP2040 pin D20 (can use another pin if desired, or GND, see below) +// Display GND to RP2040 pin GND (0V) +// Display VCC to RP2040 5V or 3.3V (5v if display has a 5V to 3.3V regulator fitted) +// +// The DC (Data Command) pin may be labelled AO or RS (Register Select) +// +// With some displays such as the ILI9341 the TFT CS pin can be connected to GND if no more +// SPI devices (e.g. an SD Card) are connected, in this case comment out the #define TFT_CS +// line below so it is NOT defined. Other displays such at the ST7735 require the TFT CS pin +// to be toggled during setup, so in these cases the TFT_CS line must be defined and connected. + +// The TFT_eSPI library always uses GPIO numbers, this means the following pin designators +// must be used dependant on the RP2040 board package loaded +// For the Arduino Mbed package the GPIO numbers must be used prefixed with p: +#ifdef ARDUINO_ARCH_MBED + #define TFT_MISO p4 // Arduino pin D12 + #define TFT_MOSI p7 // Arduino pin D11 + #define TFT_SCLK p6 // Arduino pin D13 + #define TFT_CS p5 // Arduino pin D10 + #define TFT_DC p20 // Arduino pin D8 + #define TFT_RST p21 // Arduino pin D9 + #define TOUCH_CS p19 // Arduino pin D7 +#else // For Earle Philhower's package the Arduino Dx pin designations must be used: + #define TFT_MISO D12 + #define TFT_MOSI D11 + #define TFT_SCLK D13 + #define TFT_CS D10 // Chip select control pin + #define TFT_DC D8 // Data Command control pin + #define TFT_RST D9 // Reset pin (could connect to Arduino RESET pin) + #define TOUCH_CS D7 +#endif + + +// ################################################################################## +// +// Section 3. Define the fonts that are to be used here +// +// ################################################################################## + +// Comment out the #defines below with // to stop that font being loaded +// The ESP8366 and ESP32 have plenty of memory so commenting out fonts is not +// normally necessary. If all fonts are loaded the extra FLASH space required is +// about 17Kbytes. To save FLASH space only enable the fonts you need! + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#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_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_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_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 +// this will save ~20kbytes of FLASH +#define SMOOTH_FONT + + +// ################################################################################## +// +// Section 4. Other options +// +// ################################################################################## + +// For the RP2040 processor define the SPI port channel used, default is 0 +// #define TFT_SPI_PORT 1 // Set to 0 if SPI0 pins are used, or 1 if spi1 pins used + +// Define the SPI clock frequency, this affects the graphics rendering speed. Too +// fast and the TFT driver will not keep up and display corruption appears. +// With an ILI9341 display 40MHz works OK, 80MHz sometimes fails +// With a ST7735 display more than 27MHz may not work (spurious pixels and lines) +// With an ILI9163 display 27 MHz works OK. + +// #define SPI_FREQUENCY 1000000 +// #define SPI_FREQUENCY 5000000 +// #define SPI_FREQUENCY 10000000 +// #define SPI_FREQUENCY 20000000 +// #define SPI_FREQUENCY 32000000 + #define SPI_FREQUENCY 70000000 + +// Optional reduced SPI frequency for reading TFT +#define SPI_READ_FREQUENCY 20000000 + +// The XPT2046 requires a lower SPI clock rate of 2.5MHz so we define that here: +#define SPI_TOUCH_FREQUENCY 2500000 + diff --git a/library.json b/library.json index 2c61130..cfae810 100644 --- a/library.json +++ b/library.json @@ -1,6 +1,6 @@ { "name": "TFT_eSPI", - "version": "2.4.26", + "version": "2.4.27", "keywords": "Arduino, tft, ePaper, display, Pico, RP2040, STM32, ESP8266, NodeMCU, ESP32, M5Stack, ILI9341, ST7735, ILI9163, S6D02A1, ILI9481, ILI9486, ILI9488, ST7789, RM68140, SSD1351, SSD1963, ILI9225, HX8357D", "description": "A TFT and ePaper SPI graphics library with optimisation for Raspberry Pi Pico, ESP8266, ESP32 and STM32", "repository": diff --git a/library.properties b/library.properties index ccda940..b9bdd5f 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=TFT_eSPI -version=2.4.26 +version=2.4.27 author=Bodmer maintainer=Bodmer sentence=TFT graphics library for Arduino processors with performance optimisation for RP2040, STM32, ESP8266 and ESP32