Skip to content

Commit 56ac666

Browse files
Merge pull request #699 from lupinitylabs/master
Add support for the GC9D01 driver
2 parents 3de6c1b + 944a116 commit 56ac666

File tree

4 files changed

+271
-0
lines changed

4 files changed

+271
-0
lines changed

keywords.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ Arduino_G KEYWORD1
3838
Arduino_GC9106 KEYWORD1
3939
Arduino_GC9107 KEYWORD1
4040
Arduino_GC9A01 KEYWORD1
41+
Arduino_GC9D01 KEYWORD1
4142
Arduino_GFX KEYWORD1
4243
Arduino_HWSPI KEYWORD1
4344
Arduino_HX8347C KEYWORD1

src/Arduino_GFX_Library.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
#include "display/Arduino_DSI_Display.h"
5555
#include "display/Arduino_GC9A01.h"
5656
#include "display/Arduino_GC9C01.h"
57+
#include "display/Arduino_GC9D01.h"
5758
#include "display/Arduino_GC9106.h"
5859
#include "display/Arduino_GC9107.h"
5960
#include "display/Arduino_HX8347C.h"

src/display/Arduino_GC9D01.cpp

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
#include "Arduino_GC9D01.h"
2+
#include "SPI.h"
3+
4+
Arduino_GC9D01::Arduino_GC9D01(
5+
Arduino_DataBus *bus, int8_t rst, uint8_t r,
6+
bool ips, int16_t w, int16_t h,
7+
uint8_t col_offset1, uint8_t row_offset1, uint8_t col_offset2, uint8_t row_offset2)
8+
: Arduino_TFT(bus, rst, r, ips, w, h, col_offset1, row_offset1, col_offset2, row_offset2)
9+
{
10+
}
11+
12+
bool Arduino_GC9D01::begin(int32_t speed)
13+
{
14+
_override_datamode = SPI_MODE0; // always use SPI_MODE0
15+
16+
return Arduino_TFT::begin(speed);
17+
}
18+
19+
void Arduino_GC9D01::writeAddrWindow(int16_t x, int16_t y, uint16_t w, uint16_t h)
20+
{
21+
if ((x != _currentX) || (w != _currentW) || (y != _currentY) || (h != _currentH))
22+
{
23+
_bus->writeC8D16D16(GC9D01_CASET, x + _xStart, x + w - 1 + _xStart);
24+
_bus->writeC8D16D16(GC9D01_RASET, y + _yStart, y + h - 1 + _yStart);
25+
26+
_currentX = x;
27+
_currentY = y;
28+
_currentW = w;
29+
_currentH = h;
30+
}
31+
32+
_bus->writeCommand(GC9D01_RAMWR); // write to RAM
33+
}
34+
35+
/**************************************************************************/
36+
/*!
37+
@brief Set origin of (0,0) and orientation of TFT display
38+
@param m The index for rotation, from 0-3 inclusive
39+
*/
40+
/**************************************************************************/
41+
void Arduino_GC9D01::setRotation(uint8_t r)
42+
{
43+
Arduino_TFT::setRotation(r);
44+
switch (_rotation % 4)
45+
{
46+
case 1: // Landscape (Portrait + 90°)
47+
r = GC9D01_MADCTL_MX | GC9D01_MADCTL_MV | GC9D01_MADCTL_BGR;
48+
break;
49+
case 2: // Inverter Portrait
50+
r = GC9D01_MADCTL_MX | GC9D01_MADCTL_MY | GC9D01_MADCTL_BGR;
51+
break;
52+
case 3: // Inverted Landscape
53+
r = GC9D01_MADCTL_MV | GC9D01_MADCTL_MY | GC9D01_MADCTL_BGR;
54+
break;
55+
default: // case 0: (Portrait)
56+
r = GC9D01_MADCTL_BGR;
57+
break;
58+
}
59+
_bus->beginWrite();
60+
_bus->writeC8D8(GC9D01_MADCTL, r);
61+
_bus->endWrite();
62+
}
63+
64+
void Arduino_GC9D01::invertDisplay(bool i)
65+
{
66+
_bus->sendCommand(_ips ? (i ? GC9D01_INVOFF : GC9D01_INVON) : (i ? GC9D01_INVON : GC9D01_INVOFF));
67+
}
68+
69+
void Arduino_GC9D01::displayOn(void)
70+
{
71+
_bus->sendCommand(GC9D01_SLPOUT);
72+
delay(GC9D01_SLPOUT_DELAY);
73+
}
74+
75+
void Arduino_GC9D01::displayOff(void)
76+
{
77+
_bus->sendCommand(GC9D01_SLPIN);
78+
delay(GC9D01_SLPIN_DELAY);
79+
}
80+
81+
void Arduino_GC9D01::tftInit()
82+
{
83+
if (_rst != GFX_NOT_DEFINED)
84+
{
85+
pinMode(_rst, OUTPUT);
86+
digitalWrite(_rst, HIGH);
87+
delay(GC9D01_RST_DELAY);
88+
digitalWrite(_rst, LOW);
89+
delay(GC9D01_RST_DELAY);
90+
digitalWrite(_rst, HIGH);
91+
delay(GC9D01_RST_DELAY);
92+
}
93+
else
94+
{
95+
// Software Rest
96+
}
97+
98+
_bus->batchOperation(GC9D01_init_operations, sizeof(GC9D01_init_operations));
99+
100+
invertDisplay(false);
101+
}

src/display/Arduino_GC9D01.h

Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
#pragma once
2+
3+
#include "./Arduino_GFX.h"
4+
#include "../Arduino_TFT.h"
5+
6+
#define GC9D01_TFTWIDTH 160
7+
#define GC9D01_TFTHEIGHT 160
8+
9+
#define GC9D01_RST_DELAY 200 ///< delay ms wait for reset finish
10+
#define GC9D01_SLPIN_DELAY 200 ///< delay ms wait for sleep in finish
11+
#define GC9D01_SLPOUT_DELAY 200 ///< delay ms wait for sleep out finish
12+
13+
#define GC9D01_NOP 0x00
14+
#define GC9D01_SWRESET 0x01
15+
#define GC9D01_RDDID 0x04
16+
#define GC9D01_RDDST 0x09
17+
18+
#define GC9D01_SLPIN 0x10
19+
#define GC9D01_SLPOUT 0x11
20+
#define GC9D01_PTLON 0x12
21+
#define GC9D01_NORON 0x13
22+
23+
#define GC9D01_INVOFF 0x20
24+
#define GC9D01_INVON 0x21
25+
#define GC9D01_DISPOFF 0x28
26+
#define GC9D01_DISPON 0x29
27+
28+
#define GC9D01_CASET 0x2A // Column Address Set
29+
#define GC9D01_RASET 0x2B // Page Address Set
30+
#define GC9D01_RAMWR 0x2C // Memory Write
31+
#define GC9D01_RAMRD 0x2E // Memory Read
32+
33+
#define GC9D01_PTLAR 0x30 // Partial Area
34+
#define GC9D01_COLMOD 0x3A // Pixel fmt set
35+
#define GC9D01_MADCTL 0x36 // Memory Access Ctl
36+
37+
#define GC9D01_MADCTL_MY 0x80
38+
#define GC9D01_MADCTL_MX 0x40
39+
#define GC9D01_MADCTL_MV 0x20
40+
#define GC9D01_MADCTL_ML 0x10
41+
#define GC9D01_MADCTL_MH 0x04
42+
#define GC9D01_MADCTL_RGB 0x08
43+
#define GC9D01_MADCTL_BGR 0x00
44+
45+
#define GC9D01_RDID1 0xDA // Read ID1
46+
#define GC9D01_RDID2 0xDB // Read ID2
47+
#define GC9D01_RDID3 0xDC // Read ID3
48+
//#define GC9D01_RDID4 0xDD
49+
50+
static const uint8_t GC9D01_init_operations[] = {
51+
BEGIN_WRITE,
52+
WRITE_COMMAND_8, 0xFE, // internal reg enable
53+
WRITE_COMMAND_8, 0xEF, // internal reg enable
54+
WRITE_C8_D8, 0x80, 0xFF,
55+
WRITE_C8_D8, 0x81, 0xFF,
56+
WRITE_C8_D8, 0x82, 0xFF,
57+
WRITE_C8_D8, 0x83, 0xFF,
58+
WRITE_C8_D8, 0x84, 0xFF,
59+
WRITE_C8_D8, 0x85, 0xFF,
60+
WRITE_C8_D8, 0x86, 0xFF,
61+
WRITE_C8_D8, 0x87, 0xFF,
62+
WRITE_C8_D8, 0x88, 0xFF,
63+
WRITE_C8_D8, 0x89, 0xFF,
64+
WRITE_C8_D8, 0x8A, 0xFF,
65+
WRITE_C8_D8, 0x8B, 0xFF,
66+
WRITE_C8_D8, 0x8C, 0xFF,
67+
WRITE_C8_D8, 0x8D, 0xFF,
68+
WRITE_C8_D8, 0x8E, 0xFF,
69+
WRITE_C8_D8, 0x8F, 0xFF,
70+
WRITE_C8_D8, 0x3A, 0x05, // Pixel Format Set (18bpp)
71+
WRITE_C8_D8, 0xEC, 0x01, // Inversion mode
72+
73+
WRITE_COMMAND_8, 0x74,
74+
WRITE_BYTES, 7, 0x02, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00,
75+
76+
WRITE_C8_D8, 0x98, 0x3E,
77+
WRITE_C8_D8, 0x99, 0x3E,
78+
WRITE_C8_D16, 0xB5, 0x0D, 0x0D, // Blanking Porch Control
79+
80+
WRITE_COMMAND_8, 0x60,
81+
WRITE_BYTES, 4, 0x38, 0x0F, 0x79, 0x67,
82+
83+
WRITE_COMMAND_8, 0x61,
84+
WRITE_BYTES, 4, 0x38, 0x11, 0x79, 0x67,
85+
86+
WRITE_COMMAND_8, 0x64,
87+
WRITE_BYTES, 6, 0x38, 0x17, 0x71, 0x5F, 0x79, 0x67,
88+
89+
WRITE_COMMAND_8, 0x65,
90+
WRITE_BYTES, 6, 0x38, 0x13, 0x71, 0x5B, 0x79, 0x67,
91+
92+
WRITE_C8_D16, 0x6A, 0x00, 0x00,
93+
94+
WRITE_COMMAND_8, 0x6C,
95+
WRITE_BYTES, 7, 0x22, 0x02, 0x22, 0x02, 0x22, 0x22, 0x50,
96+
97+
WRITE_COMMAND_8, 0x6E,
98+
WRITE_BYTES, 32, 0x03, 0x03, 0x01, 0x01, 0x00, 0x00,
99+
0x0f, 0x0f, 0x0d, 0x0d, 0x0b, 0x0b, 0x09, 0x09, 0x00, 0x00,
100+
0x00, 0x00, 0x0a, 0x0a, 0x0c, 0x0c, 0x0e, 0x0e, 0x10, 0x10,
101+
0x00, 0x00, 0x02, 0x02, 0x04, 0x04,
102+
103+
WRITE_C8_D8, 0xBF, 0x01, // Dual signal gate mode
104+
WRITE_C8_D8, 0xF9, 0x40,
105+
WRITE_C8_D8, 0x9B, 0x3B,
106+
107+
WRITE_COMMAND_8, 0x93,
108+
WRITE_BYTES, 3, 0x33, 0x7F, 0x00,
109+
110+
WRITE_C8_D8, 0x7E, 0x30,
111+
112+
WRITE_COMMAND_8, 0x70,
113+
WRITE_BYTES, 6, 0x0D, 0x02, 0x08, 0x0D, 0x02, 0x08,
114+
115+
WRITE_COMMAND_8, 0x71,
116+
WRITE_BYTES, 3, 0x0D, 0x02, 0x08,
117+
118+
WRITE_C8_D16, 0x91, 0x0E, 0x09,
119+
WRITE_C8_D8, 0xC3, 0x19, // Voltage Level Power control 2
120+
WRITE_C8_D8, 0xC4, 0x19, // Voltage Level Power control 3
121+
WRITE_C8_D8, 0xC9, 0x3C, // Voltage Level Power control 4
122+
123+
WRITE_COMMAND_8, 0xF0, // Set Gamma 1
124+
WRITE_BYTES, 6, 0x53, 0x15, 0x0A, 0x04, 0x00, 0x3E,
125+
126+
WRITE_COMMAND_8, 0xF2, // Set Gamma 3
127+
WRITE_BYTES, 6, 0x53, 0x15, 0x0A, 0x04, 0x00, 0x3A,
128+
129+
WRITE_COMMAND_8, 0xF1, // Set Gamma 2
130+
WRITE_BYTES, 6, 0x56, 0xA8, 0x7F, 0x33, 0x34, 0x5F,
131+
132+
WRITE_COMMAND_8, 0xF3, // Set Gamma 4
133+
WRITE_BYTES, 6, 0x52, 0xA4, 0x7F, 0x33, 0x34, 0xDF,
134+
135+
WRITE_C8_D8, 0x36, 0x00, // Memory Access Control
136+
137+
WRITE_COMMAND_8, GC9D01_SLPOUT, // Sleep OUT
138+
END_WRITE,
139+
140+
DELAY, GC9D01_SLPOUT_DELAY, // 200 ms
141+
142+
BEGIN_WRITE,
143+
WRITE_COMMAND_8, GC9D01_DISPON, // Display on
144+
WRITE_COMMAND_8, 0x2C, // Memory Write
145+
END_WRITE,
146+
147+
DELAY, 10};
148+
149+
class Arduino_GC9D01 : public Arduino_TFT
150+
{
151+
public:
152+
Arduino_GC9D01(
153+
Arduino_DataBus *bus, int8_t rst = GFX_NOT_DEFINED, uint8_t r = 0,
154+
bool ips = false, int16_t w = GC9D01_TFTWIDTH, int16_t h = GC9D01_TFTHEIGHT,
155+
uint8_t col_offset1 = 0, uint8_t row_offset1 = 0, uint8_t col_offset2 = 0, uint8_t row_offset2 = 0);
156+
157+
bool begin(int32_t speed = GFX_NOT_DEFINED) override;
158+
void writeAddrWindow(int16_t x, int16_t y, uint16_t w, uint16_t h) override;
159+
void setRotation(uint8_t r) override;
160+
void invertDisplay(bool) override;
161+
void displayOn() override;
162+
void displayOff() override;
163+
164+
protected:
165+
void tftInit() override;
166+
167+
private:
168+
};

0 commit comments

Comments
 (0)