TinyGPU
Loading...
Searching...
No Matches
DisplayDriverSPI.h
Go to the documentation of this file.
1#pragma once
2#include <Arduino.h>
3#include <SPI.h>
4#include <stdint.h>
5
7
8namespace tinygpu {
9
10/**
11 * @brief Common base class for SPI-based display drivers.
12 *
13 * Handles SPI pin setup, hardware reset, address window, and SPI data helpers.
14 * Specific display drivers should inherit from this and implement their own
15 * init sequence.
16 */
18 public:
19 DisplayDriverSPI(SPIClass& spi, int8_t cs, int8_t dc, int8_t rst = -1,
20 size_t xOffset = 0, size_t yOffset = 0)
21 : spi_(spi),
22 cs_(cs),
23 dc_(dc),
24 rst_(rst),
27
28
29 bool writeData(ISurface& surface) override {
30 setAddressWindow(0, 0, surface.width(), surface.height());
31 digitalWrite(dc_, HIGH);
32 digitalWrite(cs_, LOW);
33 spi_.writeBytes(surface.data(), surface.size());
34 digitalWrite(cs_, HIGH);
35 return true;
36 }
37
38 protected:
40 int8_t cs_, dc_, rst_;
42
43 bool setAddressWindow(size_t x, size_t y, size_t w, size_t h) override {
45 writeData16(x + xOffset_, x + xOffset_ + w - 1);
47 writeData16(y + yOffset_, y + yOffset_ + h - 1);
49 return true;
50 }
51
53 pinMode(cs_, OUTPUT);
54 pinMode(dc_, OUTPUT);
55 if (rst_ >= 0) {
56 pinMode(rst_, OUTPUT);
57 digitalWrite(rst_, LOW);
58 delay(20);
59 digitalWrite(rst_, HIGH);
60 delay(150);
61 }
62 digitalWrite(cs_, HIGH);
63 }
64
65 void writeCommand(uint8_t cmd) {
66 digitalWrite(dc_, LOW);
67 digitalWrite(cs_, LOW);
68 spi_.transfer(cmd);
69 digitalWrite(cs_, HIGH);
70 }
71
72 void writeData16(uint16_t d1, uint16_t d2) {
73 digitalWrite(dc_, HIGH);
74 digitalWrite(cs_, LOW);
75 spi_.transfer(d1 >> 8);
76 spi_.transfer(d1 & 0xFF);
77 spi_.transfer(d2 >> 8);
78 spi_.transfer(d2 & 0xFF);
79 digitalWrite(cs_, HIGH);
80 }
81
82 void writeData8(uint8_t data) {
83 digitalWrite(dc_, HIGH);
84 digitalWrite(cs_, LOW);
85 spi_.transfer(data);
86 digitalWrite(cs_, HIGH);
87 }
88};
89
90/**
91 * @brief Driver for ST7735 SPI display controller.
92 *
93 * Handles initialization and address window logic for ST7735 displays.
94 */
96 public:
97 ST7735Driver(SPIClass& spi, int8_t cs, int8_t dc, int8_t rst = -1)
98 : DisplayDriverSPI(spi, cs, dc, rst, 2, 1) {}
99 bool begin() override {
101 writeCommand(0x01);
102 delay(150);
103 writeCommand(0x11);
104 delay(120);
105 writeCommand(0x3A);
106 writeData8(0x05);
107 writeCommand(0x29);
108 return true;
109 }
110};
111
112/**
113 * @brief Driver for ST7789 SPI display controller.
114 *
115 * Handles initialization and address window logic for ST7789 displays.
116 */
118 public:
119 ST7789Driver(SPIClass& spi, int8_t cs, int8_t dc, int8_t rst = -1)
120 : DisplayDriverSPI(spi, cs, dc, rst, 0, 0) {}
123 writeCommand(0x01);
124 delay(150);
125 writeCommand(0x11);
126 delay(120);
127 writeCommand(0x3A);
128 writeData8(0x55);
129 writeCommand(0x29);
130 return true;
131 }
132};
133
134/**
135 * @brief Driver for ILI9341 SPI display controller.
136 *
137 * Handles initialization and address window logic for ILI9341 displays.
138 */
140 public:
141 ILI9341Driver(SPIClass& spi, int8_t cs, int8_t dc, int8_t rst = -1)
142 : DisplayDriverSPI(spi, cs, dc, rst, 0, 0) {}
145 writeCommand(0x01);
146 delay(150);
147 writeCommand(0x28);
148 writeCommand(0x3A);
149 writeData8(0x55);
150 writeCommand(0x11);
151 delay(120);
152 writeCommand(0x29);
153 }
154};
155
156/**
157 * @brief Driver for HX8357 SPI display controller.
158 *
159 * Handles initialization and address window logic for HX8357 displays.
160 */
162 public:
163 HX8357Driver(SPIClass& spi, int8_t cs, int8_t dc, int8_t rst = -1)
164 : DisplayDriverSPI(spi, cs, dc, rst, 0, 0) {}
167 writeCommand(0x01);
168 delay(150);
169 writeCommand(0x11);
170 delay(120);
171 writeCommand(0x3A);
172 writeData8(0x55);
173 writeCommand(0x29);
174 return true;
175 }
176};
177
178} // namespace tinygpu
Common base class for SPI-based display drivers.
Definition: DisplayDriverSPI.h:17
SPIClass & spi_
Definition: DisplayDriverSPI.h:39
int8_t dc_
Definition: DisplayDriverSPI.h:40
size_t xOffset_
Definition: DisplayDriverSPI.h:41
size_t yOffset_
Definition: DisplayDriverSPI.h:41
int8_t cs_
Definition: DisplayDriverSPI.h:40
int8_t rst_
Definition: DisplayDriverSPI.h:40
void setupPinsAndReset()
Definition: DisplayDriverSPI.h:52
void writeCommand(uint8_t cmd)
Definition: DisplayDriverSPI.h:65
DisplayDriverSPI(SPIClass &spi, int8_t cs, int8_t dc, int8_t rst=-1, size_t xOffset=0, size_t yOffset=0)
Definition: DisplayDriverSPI.h:19
bool setAddressWindow(size_t x, size_t y, size_t w, size_t h) override
Definition: DisplayDriverSPI.h:43
void writeData8(uint8_t data)
Definition: DisplayDriverSPI.h:82
bool writeData(ISurface &surface) override
Definition: DisplayDriverSPI.h:29
void writeData16(uint16_t d1, uint16_t d2)
Definition: DisplayDriverSPI.h:72
Driver for HX8357 SPI display controller.
Definition: DisplayDriverSPI.h:161
HX8357Driver(SPIClass &spi, int8_t cs, int8_t dc, int8_t rst=-1)
Definition: DisplayDriverSPI.h:163
bool begin() override
Definition: DisplayDriverSPI.h:165
Driver for ILI9341 SPI display controller.
Definition: DisplayDriverSPI.h:139
ILI9341Driver(SPIClass &spi, int8_t cs, int8_t dc, int8_t rst=-1)
Definition: DisplayDriverSPI.h:141
bool begin() override
Definition: DisplayDriverSPI.h:143
Driver for ST7735 SPI display controller.
Definition: DisplayDriverSPI.h:95
ST7735Driver(SPIClass &spi, int8_t cs, int8_t dc, int8_t rst=-1)
Definition: DisplayDriverSPI.h:97
bool begin() override
Definition: DisplayDriverSPI.h:99
Driver for ST7789 SPI display controller.
Definition: DisplayDriverSPI.h:117
ST7789Driver(SPIClass &spi, int8_t cs, int8_t dc, int8_t rst=-1)
Definition: DisplayDriverSPI.h:119
bool begin() override
Definition: DisplayDriverSPI.h:121
Definition: AVIWriter.h:9