5#include "TinyGPU/Drivers/DisplayDriver.h"
6#include "TinyGPU/Abstractions/IQSPIBus.h"
7#include "TinyGPU/Abstractions/QSPIBusBitBang.h"
8#include "TinyGPU/Emulation.h"
11#include "TinyGPU/Abstractions/QSPIBusESP32.h"
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35template <
typename RGB_T =
RGB565>
43 int8_t d3, size_t width, size_t height,
44 uint32_t pclkHz = 40000000
52 ownedBus_ =
new QSPIBusESP32(cs, sclk, d0, d1, d2, d3,
53 width * height *
sizeof(RGB_T), pclkHz, host);
56 ownedBus_ =
new QSPIBusBitBang(cs, sclk, d0, d1, d2, d3);
82 bool writeData(ISurface<RGB_T>& surface, size_t x, size_t y)
override {
83 static_assert(
sizeof(RGB_T) == 2,
84 "writeData assumes a 16bpp RGB_T (RGB565) stored in "
86 if (
bus_ ==
nullptr)
return false;
87 if (!setAddressWindow(x, y, surface.width(), surface.height())) {
108 return bus_ !=
nullptr && bus_->writeCommand(cmd, param, len);
112 const uint8_t caset[4] = {
113 static_cast<uint8_t>(x >> 8),
static_cast<uint8_t>(x & 0xFF),
114 static_cast<uint8_t>((x + w - 1) >> 8),
115 static_cast<uint8_t>((x + w - 1) & 0xFF)};
116 const uint8_t raset[4] = {
117 static_cast<uint8_t>(y >> 8),
static_cast<uint8_t>(y & 0xFF),
118 static_cast<uint8_t>((y + h - 1) >> 8),
119 static_cast<uint8_t>((y + h - 1) & 0xFF)};
120 return writeCommand(0x2A, caset, 4) && writeCommand(0x2B, raset, 4);
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150template <
typename RGB_T =
RGB565>
163 int8_t d3, size_t width = 480, size_t height = 272,
164 uint32_t pclkHz = 32000000)
173 static_assert(
sizeof(RGB_T) == 2,
174 "NV3041ADriver assumes a 16bpp RGB_T (RGB565)");
176 if (!beginBus())
return false;
178 for (size_t i = 0; i <
sizeof(kInitOps) /
sizeof(kInitOps[0]); ++i) {
179 const uint8_t cmd = kInitOps[i][0];
180 const uint8_t data = kInitOps[i][1];
181 writeCommand(cmd, &data, 1);
182 if (cmd == 0x11) delay(120);
201 static constexpr uint8_t kInitOps[][2] = {
206 {0x44, 0x15}, {0x45, 0x15},
208 {0xc1, 0xbb}, {0xc2, 0x05}, {0xc3, 0x10},
209 {0xc6, 0x3e}, {0xc7, 0x25}, {0xc8, 0x11},
210 {0x7a, 0x5f}, {0x6f, 0x44}, {0x78, 0x70},
211 {0xc9, 0x00}, {0x67, 0x21},
212 {0x51, 0x0a}, {0x52, 0x76}, {0x53, 0x0a}, {0x54, 0x76},
213 {0x46, 0x0a}, {0x47, 0x2a}, {0x48, 0x0a}, {0x49, 0x1a},
214 {0x56, 0x43}, {0x57, 0x42}, {0x58, 0x3c}, {0x59, 0x64},
215 {0x5a, 0x41}, {0x5b, 0x3c}, {0x5c, 0x02}, {0x5d, 0x3c},
216 {0x5e, 0x1f}, {0x60, 0x80}, {0x61, 0x3f}, {0x62, 0x21},
217 {0x63, 0x07}, {0x64, 0xe0}, {0x65, 0x02},
218 {0xca, 0x20}, {0xcb, 0x52}, {0xcc, 0x10}, {0xcD, 0x42},
219 {0xD0, 0x20}, {0xD1, 0x52}, {0xD2, 0x10}, {0xD3, 0x42},
220 {0xD4, 0x0a}, {0xD5, 0x32},
222 {0x80, 0x00}, {0xA0, 0x00}, {0x81, 0x07}, {0xA1, 0x06},
223 {0x82, 0x02}, {0xA2, 0x01}, {0x86, 0x11}, {0xA6, 0x10},
224 {0x87, 0x27}, {0xA7, 0x27}, {0x83, 0x37}, {0xA3, 0x37},
225 {0x84, 0x35}, {0xA4, 0x35}, {0x85, 0x3f}, {0xA5, 0x3f},
226 {0x88, 0x0b}, {0xA8, 0x0b}, {0x89, 0x14}, {0xA9, 0x14},
227 {0x8a, 0x1a}, {0xAa, 0x1a}, {0x8b, 0x0a}, {0xAb, 0x0a},
228 {0x8c, 0x14}, {0xAc, 0x08}, {0x8d, 0x17}, {0xAd, 0x07},
229 {0x8e, 0x16}, {0xAe, 0x06}, {0x8f, 0x1B}, {0xAf, 0x07},
230 {0x90, 0x04}, {0xB0, 0x04}, {0x91, 0x0A}, {0xB1, 0x0A},
231 {0x92, 0x16}, {0xB2, 0x15},
Base driver for QSPI ("4-wire quad SPI") TFT panels: 1 clock, 1 chip-select, 4 data lines,...
Definition: DisplayDriverQSPI.h:36
bool writeCommand(uint8_t cmd, const uint8_t *param=nullptr, size_t len=0)
Definition: DisplayDriverQSPI.h:106
~DisplayDriverQSPI() override
Definition: DisplayDriverQSPI.h:71
bool beginBus()
Definition: DisplayDriverQSPI.h:104
static constexpr uint8_t kCmdRamWrite
Definition: DisplayDriverQSPI.h:99
IQSPIBus * bus_
Definition: DisplayDriverQSPI.h:123
size_t width_
Definition: DisplayDriverQSPI.h:124
void end() override
Definition: DisplayDriverQSPI.h:67
size_t height_
Definition: DisplayDriverQSPI.h:124
size_t height() const override
Definition: DisplayDriverQSPI.h:76
DisplayDriverQSPI(int8_t cs, int8_t sclk, int8_t d0, int8_t d1, int8_t d2, int8_t d3, size_t width, size_t height, uint32_t pclkHz=40000000, spi_host_device_t host=SPI3_HOST)
Definition: DisplayDriverQSPI.h:42
DisplayDriverQSPI(IQSPIBus &bus, size_t width, size_t height)
Definition: DisplayDriverQSPI.h:64
bool writeData(ISurface< RGB_T > &surface, size_t x, size_t y) override
Definition: DisplayDriverQSPI.h:82
size_t width() const override
Definition: DisplayDriverQSPI.h:75
bool setAddressWindow(size_t x, size_t y, size_t w, size_t h) override
Definition: DisplayDriverQSPI.h:111
bool writeData(ISurface< RGB_T > &surface) override
Definition: DisplayDriverQSPI.h:78
Definition: DisplayDriver.h:49
Abstraction over the transport used by DisplayDriverQSPI (see TinyGPU/Drivers/DisplayDriverQSPI....
Definition: IQSPIBus.h:24
virtual bool begin()=0
Sets up the bus (pins/peripheral). Returns false on failure.
Driver for the New Vision NV3041A QSPI TFT controller (480x272 panels on Guition/Sunton JC4827W543-cl...
Definition: DisplayDriverQSPI.h:151
NV3041ADriver(IQSPIBus &bus, size_t width=480, size_t height=272)
Bus-injection constructor - see DisplayDriverQSPI's equivalent.
Definition: DisplayDriverQSPI.h:169
NV3041ADriver(int8_t cs, int8_t sclk, int8_t d0, int8_t d1, int8_t d2, int8_t d3, size_t width=480, size_t height=272, uint32_t pclkHz=32000000)
Definition: DisplayDriverQSPI.h:162
bool begin() override
Definition: DisplayDriverQSPI.h:172
RGB color stored in 16-bit RGB565 format, byte-swapped from the conventional bit layout.
Definition: RGB565.h:24
Definition: DSIBusESP32.h:19
void delay(unsigned long ms)
Definition: EmulationDesktop.h:52