diff --git a/TFT_Drivers/GC9D01_Defines.h b/TFT_Drivers/GC9D01_Defines.h new file mode 100644 index 00000000..de1b485d --- /dev/null +++ b/TFT_Drivers/GC9D01_Defines.h @@ -0,0 +1,35 @@ +// Change the width and height if required (defined in portrait mode) +// or use the constructor to over-ride defaults +#ifndef TFT_WIDTH + #define TFT_WIDTH 160 +#endif +#ifndef TFT_HEIGHT + #define TFT_HEIGHT 160 +#endif + +// Delay between some initialisation commands +#define TFT_INIT_DELAY 0x80 + +// Generic commands used by TFT_eSPI.cpp +#define TFT_NOP 0x00 +#define TFT_SWRST 0x01 + +#define TFT_CASET 0x2A +#define TFT_PASET 0x2B +#define TFT_RAMWR 0x2C + +#define TFT_RAMRD 0x2E +#define TFT_IDXRD 0x00 //0xDD // ILI9341 only, indexed control register read + +#define TFT_MADCTL 0x36 +#define TFT_MAD_MY 0x80 +#define TFT_MAD_MX 0x40 +#define TFT_MAD_MV 0x20 +#define TFT_MAD_ML 0x10 +#define TFT_MAD_BGR 0x00 +#define TFT_MAD_MH 0x04 +#define TFT_MAD_RGB 0x08 + + +#define TFT_INVOFF 0x20 +#define TFT_INVON 0x21 diff --git a/TFT_Drivers/GC9D01_Init.h b/TFT_Drivers/GC9D01_Init.h new file mode 100644 index 00000000..1d73b783 --- /dev/null +++ b/TFT_Drivers/GC9D01_Init.h @@ -0,0 +1,236 @@ + +// This is the command sequence that initialises the GC9D01 driver + +{ +writecommand(0xFE); +writecommand(0xEF); + +writecommand(0x80); +writedata(0xFF); + +writecommand(0x81); +writedata(0xFF); + +writecommand(0x82); +writedata(0xFF); + +writecommand(0x83); +writedata(0xFF); + +writecommand(0x84); +writedata(0xFF); + +writecommand(0x85); +writedata(0xFF); + +writecommand(0x86); +writedata(0xFF); + +writecommand(0x87); +writedata(0xFF); + +writecommand(0x88); +writedata(0xFF); + +writecommand(0x89); +writedata(0xFF); + +writecommand(0x8A); +writedata(0xFF); + +writecommand(0x8B); +writedata(0xFF); + +writecommand(0x8C); +writedata(0xFF); + +writecommand(0x8D); +writedata(0xFF); + +writecommand(0x8E); +writedata(0xFF); + +writecommand(0x8F); +writedata(0xFF); + +writecommand(0x3A); +writedata(0x05); + +writecommand(0xEC); +writedata(0x01); + +writecommand(0x74); +writedata(0x02); +writedata(0x0E); +writedata(0x00); +writedata(0x00); +writedata(0x00); +writedata(0x00); +writedata(0x00); + +writecommand(0x98); +writedata(0x3E); +writecommand(0x99); +writedata(0x3E); + +writecommand(0xB5); +writedata(0x0D); +writedata(0x0D); + +writecommand(0x60); +writedata(0x38); +writedata(0x0F); +writedata(0x79); +writedata(0x67); + +writecommand(0x61); +writedata(0x38); +writedata(0x11); +writedata(0x79); +writedata(0x67); + +writecommand(0x64); +writedata(0x38); +writedata(0x17); +writedata(0x71); +writedata(0x5F); +writedata(0x79); +writedata(0x67); + +writecommand(0x65); +writedata(0x38); +writedata(0x13); +writedata(0x71); +writedata(0x5B); +writedata(0x79); +writedata(0x67); + +writecommand(0x6A); +writedata(0x00); +writedata(0x00); + +writecommand(0x6C); +writedata(0x22); +writedata(0x02); +writedata(0x22); +writedata(0x02); +writedata(0x22); +writedata(0x22); +writedata(0x50); + +writecommand(0x6E); +writedata(0x03); +writedata(0x03); +writedata(0x01); +writedata(0x01); +writedata(0x00); +writedata(0x00); +writedata(0x0f); +writedata(0x0f); +writedata(0x0d); +writedata(0x0d); +writedata(0x0b); +writedata(0x0b); +writedata(0x09); +writedata(0x09); +writedata(0x00); +writedata(0x00); +writedata(0x00); +writedata(0x00); +writedata(0x0a); +writedata(0x0a); +writedata(0x0c); +writedata(0x0c); +writedata(0x0e); +writedata(0x0e); +writedata(0x10); +writedata(0x10); +writedata(0x00); +writedata(0x00); +writedata(0x02); +writedata(0x02); +writedata(0x04); +writedata(0x04); + +writecommand(0xbf); +writedata(0x01); + +writecommand(0xF9); +writedata(0x40); + +writecommand(0x9b); +writedata(0x3b); +writecommand(0x93); +writedata(0x33); +writedata(0x7f); +writedata(0x00); + +writecommand(0x7E); +writedata(0x30); + +writecommand(0x70); +writedata(0x0d); +writedata(0x02); +writedata(0x08); +writedata(0x0d); +writedata(0x02); +writedata(0x08); + +writecommand(0x71); +writedata(0x0d); +writedata(0x02); +writedata(0x08); + +writecommand(0x91); +writedata(0x0E); +writedata(0x09); + +writecommand(0xc3); +writedata(0x19); +writecommand(0xc4); +writedata(0x19); +writecommand(0xc9); +writedata(0x3c); + +writecommand(0xf0); +writedata(0x53); +writedata(0x15); +writedata(0x0a); +writedata(0x04); +writedata(0x00); +writedata(0x3e); + +writecommand(0xf2); +writedata(0x53); +writedata(0x15); +writedata(0x0a); +writedata(0x04); +writedata(0x00); +writedata(0x3a); + +writecommand(0xf1); +writedata(0x56); +writedata(0xa8); +writedata(0x7f); +writedata(0x33); +writedata(0x34); +writedata(0x5f); + +writecommand(0xf3); +writedata(0x52); +writedata(0xa4); +writedata(0x7f); +writedata(0x33); +writedata(0x34); +writedata(0xdf); + +writecommand(0x36); +writedata(0x00); + + +writecommand(0x11); +delay(200); + +writecommand(0x29); +writecommand(0x2C); +} diff --git a/TFT_Drivers/GC9D01_Rotation.h b/TFT_Drivers/GC9D01_Rotation.h new file mode 100644 index 00000000..1e8d5074 --- /dev/null +++ b/TFT_Drivers/GC9D01_Rotation.h @@ -0,0 +1,28 @@ + +// This is the command sequence that rotates the GC9D01 driver coordinate frame + + rotation = m % 4; + + writecommand(TFT_MADCTL); + switch (rotation) { + case 0: // Portrait + writedata(TFT_MAD_BGR); + _width = _init_width; + _height = _init_height; + break; + case 1: // Landscape (Portrait + 90) + writedata(TFT_MAD_MX | TFT_MAD_MV | TFT_MAD_BGR); + _width = _init_height; + _height = _init_width; + break; + case 2: // Inverter portrait + writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_BGR); + _width = _init_width; + _height = _init_height; + break; + case 3: // Inverted landscape + writedata(TFT_MAD_MV | TFT_MAD_MY | TFT_MAD_BGR); + _width = _init_height; + _height = _init_width; + break; + } diff --git a/TFT_config.h b/TFT_config.h index a5c7090e..01a4fef8 100644 --- a/TFT_config.h +++ b/TFT_config.h @@ -80,6 +80,8 @@ #define ILI9225_DRIVER #elif defined (CONFIG_TFT_GC9A01_DRIVER) #define GC9A01_DRIVER +#elif defined (CONFIG_TFT_GC9D01_DRIVER) + #define GC9D01_DRIVER #endif #ifdef CONFIG_TFT_RGB_ORDER diff --git a/TFT_eSPI.cpp b/TFT_eSPI.cpp index d537faeb..f33f49f4 100644 --- a/TFT_eSPI.cpp +++ b/TFT_eSPI.cpp @@ -757,6 +757,9 @@ void TFT_eSPI::init(uint8_t tc) #elif defined (GC9A01_DRIVER) #include "TFT_Drivers/GC9A01_Init.h" +#elif defined (GC9D01_DRIVER) + #include "TFT_Drivers/GC9D01_Init.h" + #elif defined (ILI9225_DRIVER) #include "TFT_Drivers/ILI9225_Init.h" @@ -858,6 +861,9 @@ void TFT_eSPI::setRotation(uint8_t m) #elif defined (GC9A01_DRIVER) #include "TFT_Drivers/GC9A01_Rotation.h" +#elif defined (GC9D01_DRIVER) + #include "TFT_Drivers/GC9D01_Rotation.h" + #elif defined (ILI9225_DRIVER) #include "TFT_Drivers/ILI9225_Rotation.h" diff --git a/User_Setup_Select.h b/User_Setup_Select.h index 6a516399..347d1df8 100644 --- a/User_Setup_Select.h +++ b/User_Setup_Select.h @@ -143,6 +143,8 @@ //#include // Setup file for Bw16-based boards with ST7735 160 x 80 TFT //#include // Setup file for Waveshare ESP32-S3-Touch-LCD-1.28 board with GC9A01 240*240 TFT +//#include // Setup file for Waveshare 0.71" round LCD board with 160 x 160 IPS + //#include // Template file for a setup @@ -259,6 +261,9 @@ #elif defined (GC9A01_DRIVER) #include "TFT_Drivers/GC9A01_Defines.h" #define TFT_DRIVER 0x9A01 +#elif defined (GC9D01_DRIVER) + #include "TFT_Drivers/GC9D01_Defines.h" + #define TFT_DRIVER 0x9D01 #elif defined (ILI9225_DRIVER) #include "TFT_Drivers/ILI9225_Defines.h" #define TFT_DRIVER 0x9225 diff --git a/User_Setups/Setup303_Waveshare_GC9D01.h b/User_Setups/Setup303_Waveshare_GC9D01.h new file mode 100644 index 00000000..02139b4f --- /dev/null +++ b/User_Setups/Setup303_Waveshare_GC9D01.h @@ -0,0 +1,44 @@ +// See SetupX_Template.h for all options available +#define USER_SETUP_ID 303 + +#define GC9D01_DRIVER + +#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red +#define TFT_INVERSION_OFF + +#define TFT_WIDTH 160 +#define TFT_HEIGHT 160 + + +// Pin definition published by Waveshare for ESP32-C6 +//#define TFT_MISO -1 +//#define TFT_MOSI 7 +//#define TFT_SCLK 6 +//#define TFT_CS 5 +//#define TFT_DC 4 +//#define TFT_RST 8 + +// Pin definition successfully tested with Raspberry Pi Pico 2W (RP2350) via SPI +//#define TFT_MISO -1 +#define TFT_MOSI 3 +#define TFT_SCLK 2 +#define TFT_CS 5 +#define TFT_DC 20 +#define TFT_RST 22 +#define TFT_BL 21 + + +#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_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts +#define SMOOTH_FONT + + + +#define SPI_FREQUENCY 27000000 +#define SPI_READ_FREQUENCY 20000000 +//#define SPI_TOUCH_FREQUENCY 2500000 \ No newline at end of file