8#include <ssd2119_drv.h>
9#include "pixel_stream_const.h"
46#if !defined(PORTRAIT) && !defined(PORTRAIT_FLIP) && \
47 !defined(LANDSCAPE) && !defined(LANDSCAPE_FLIP)
58#define HORIZ_DIRECTION 0x28
59#define VERT_DIRECTION 0x20
60#define MAPPED_X(x, y) (319 - (y))
61#define MAPPED_Y(x, y) (x)
64#define HORIZ_DIRECTION 0x00
65#define VERT_DIRECTION 0x08
66#define MAPPED_X(x, y) (319 - (x))
67#define MAPPED_Y(x, y) (239 - (y))
70#define HORIZ_DIRECTION 0x18
71#define VERT_DIRECTION 0x10
72#define MAPPED_X(x, y) (y)
73#define MAPPED_Y(x, y) (239 - (x))
76#define HORIZ_DIRECTION 0x30
77#define VERT_DIRECTION 0x38
78#define MAPPED_X(x, y) (x)
79#define MAPPED_Y(x, y) (y)
86 const uint8_t DEVICE_CODE_READ_REG = 0x00;
87 const uint8_t OSC_START_REG = 0x00;
88 const uint8_t DRV_OUTPUT_CTRL_REG = 0x01;
89 const uint8_t LCD_DRIVE_AC_CTRL_REG = 0x02;
90 const uint8_t PWR_CTRL_1_REG = 0x03;
91 const uint8_t DISPLAY_CTRL_REG = 0x07;
92 const uint8_t FRAME_CYCLE_CTRL_REG = 0x0B;
93 const uint8_t PWR_CTRL_2_REG = 0x0C;
94 const uint8_t PWR_CTRL_3_REG = 0x0D;
95 const uint8_t PWR_CTRL_4_REG = 0x0E;
96 const uint8_t GATE_SCAN_START_REG = 0x0F;
97 const uint8_t SLEEP_MODE_1_REG = 0x10;
98 const uint8_t ENTRY_MODE_REG = 0x11;
99 const uint8_t SLEEP_MODE_2_REG = 0x12;
100 const uint8_t GEN_IF_CTRL_REG = 0x15;
101 const uint8_t HORZ_PORCH_REG = 0x16;
102 const uint8_t VERT_PORCH_REG = 0x17;
103 const uint8_t PWR_CTRL_5_REG = 0x1E;
104 const uint8_t UNIFORMITY_REG = 0x20;
105 const uint8_t RAM_DATA_REG = 0x22;
106 const uint8_t FRAME_FREQ_REG = 0x25;
107 const uint8_t ANALOG_SET_REG = 0x26;
108 const uint8_t VCOM_OTP_1_REG = 0x28;
109 const uint8_t VCOM_OTP_2_REG = 0x29;
110 const uint8_t GAMMA_CTRL_1_REG = 0x30;
111 const uint8_t GAMMA_CTRL_2_REG = 0x31;
112 const uint8_t GAMMA_CTRL_3_REG = 0x32;
113 const uint8_t GAMMA_CTRL_4_REG = 0x33;
114 const uint8_t GAMMA_CTRL_5_REG = 0x34;
115 const uint8_t GAMMA_CTRL_6_REG = 0x35;
116 const uint8_t GAMMA_CTRL_7_REG = 0x36;
117 const uint8_t GAMMA_CTRL_8_REG = 0x37;
118 const uint8_t GAMMA_CTRL_9_REG = 0x3A;
119 const uint8_t GAMMA_CTRL_10_REG = 0x3B;
120 const uint8_t VERT_SCRL_CTRL_1_REG = 0x41;
121 const uint8_t VERT_SCRL_CTRL_2_REG = 0x42;
122 const uint8_t V_RAM_POS_REG = 0x44;
123 const uint8_t H_RAM_START_REG = 0x45;
124 const uint8_t H_RAM_END_REG = 0x46;
125 const uint8_t FIRST_WIN_START_REG = 0x48;
126 const uint8_t FIRST_WIN_END_REG = 0x49;
127 const uint8_t SECOND_WIN_START_REG = 0x4A;
128 const uint8_t SECOND_WIN_END_REG = 0x4B;
129 const uint8_t X_RAM_ADDR_REG = 0x4E;
130 const uint8_t Y_RAM_ADDR_REG = 0x4F;
133#define ENTRY_MODE_DEFAULT 0x6830
134#define MAKE_ENTRY_MODE(x) ((ENTRY_MODE_DEFAULT & 0xFF00) | (x))
139 : _spi(spi), _rst_pin(rst_pin), _dc_pin(dc_pin), _lcd(lcd), _mutex(
mutex)
144 spi.generateCS(
false);
147 _rst_pin.gpioMode(GPIO::OUTPUT | GPIO::INIT_HIGH);
148 _dc_pin. gpioMode(GPIO::OUTPUT | GPIO::INIT_HIGH);
151 _rst_pin.gpioWrite(LOW); task::sleep_ms(100);
152 _rst_pin.gpioWrite(HIGH); task::sleep_ms(100);
158 writeCmdData(SSD2119::SLEEP_MODE_1_REG, 0x0001);
161 writeCmdData(SSD2119::PWR_CTRL_2_REG, 0x0005);
162 writeCmdData(SSD2119::PWR_CTRL_3_REG, 0x000A);
163 writeCmdData(SSD2119::PWR_CTRL_4_REG, 0x2E00);
164 writeCmdData(SSD2119::PWR_CTRL_5_REG, 0x00B2);
166 writeCmdData(SSD2119::VCOM_OTP_1_REG, 0x0006);
167 writeCmdData(SSD2119::OSC_START_REG, 0x0001);
168 writeCmdData(SSD2119::DRV_OUTPUT_CTRL_REG, 0x30EF);
169 writeCmdData(SSD2119::LCD_DRIVE_AC_CTRL_REG,0x0600);
172 writeCmdData(SSD2119::SLEEP_MODE_1_REG, 0x0000);
175 writeCmdData(SSD2119::ENTRY_MODE_REG, ENTRY_MODE_DEFAULT);
176 writeCmdData(SSD2119::SLEEP_MODE_2_REG, 0x0999);
177 writeCmdData(SSD2119::ANALOG_SET_REG, 0x3800);
178 writeCmdData(SSD2119::DISPLAY_CTRL_REG, 0x0033);
181 writeCmdData(SSD2119::GAMMA_CTRL_1_REG, 0x0000);
182 writeCmdData(SSD2119::GAMMA_CTRL_2_REG, 0x0303);
183 writeCmdData(SSD2119::GAMMA_CTRL_3_REG, 0x0407);
184 writeCmdData(SSD2119::GAMMA_CTRL_4_REG, 0x0301);
185 writeCmdData(SSD2119::GAMMA_CTRL_5_REG, 0x0301);
186 writeCmdData(SSD2119::GAMMA_CTRL_6_REG, 0x0403);
187 writeCmdData(SSD2119::GAMMA_CTRL_7_REG, 0x0707);
188 writeCmdData(SSD2119::GAMMA_CTRL_8_REG, 0x0400);
189 writeCmdData(SSD2119::GAMMA_CTRL_9_REG, 0x0a00);
190 writeCmdData(SSD2119::GAMMA_CTRL_10_REG, 0x1000);
194ssd2119_drv::~ssd2119_drv()
198uint16_t ssd2119_drv::getSizeX()
200#if defined(LANDSCAPE) || defined(LANDSCAPE_FLIP)
207uint16_t ssd2119_drv::getSizeY()
209#if defined(LANDSCAPE) || defined(LANDSCAPE_FLIP)
216void ssd2119_drv::drawPixel(uint16_t x, uint16_t y, color_t c)
218 color_t color = convertColor(c, LCD::COLORTYPE_RGB565);
219 if (_mutex) _mutex->lock();
221 writeCmdData(SSD2119::X_RAM_ADDR_REG, MAPPED_X(x, y));
222 writeCmdData(SSD2119::Y_RAM_ADDR_REG, MAPPED_Y(x, y));
223 writeCmdData(SSD2119::RAM_DATA_REG, color);
225 if (_mutex) _mutex->unlock();
228void ssd2119_drv::drawHLine(uint16_t xs, uint16_t y, uint16_t xe, color_t c)
230 color_t color = convertColor(c, LCD::COLORTYPE_RGB565);
231 if (_mutex) _mutex->lock();
233 setCursorLtoR(xs, y);
236 _tx_buffer[index++] = color >> 8;
237 _tx_buffer[index++] = color & 0xff;
239 writeDataBuffer(index);
241 if (_mutex) _mutex->unlock();
244void ssd2119_drv::drawVLine(uint16_t x, uint16_t ys, uint16_t ye, color_t c)
246 color_t color = convertColor(c, LCD::COLORTYPE_RGB565);
247 if (_mutex) _mutex->lock();
249 setCursorTtoB(x, ys);
252 _tx_buffer[index++] = color >> 8;
253 _tx_buffer[index++] = color & 0xff;
255 writeDataBuffer(index);
257 if (_mutex) _mutex->unlock();
260void ssd2119_drv::drawArea(uint16_t xs, uint16_t ys, uint16_t xe, uint16_t ye,
263 bool color_conversion = (ps.getColorType() != LCD::COLORTYPE_RGB565);
264 if (_mutex) _mutex->lock();
266 for (
int y = ys; y <= ye; y++) {
267 setCursorLtoR(xs, y);
269 for (
int x = xs; x <= xe; x++) {
270 color_t color = ps.getNext();
271 if (color_conversion) {
272 color = convertColor(color, LCD::COLORTYPE_RGB565);
274 _tx_buffer[index++] = color >> 8;
275 _tx_buffer[index++] = color & 0xff;
277 writeDataBuffer(index);
280 if (_mutex) _mutex->unlock();
283void ssd2119_drv::fillArea(uint16_t xs, uint16_t ys, uint16_t xe, uint16_t ye,
287 drawArea(xs, ys, xe, ye, ps);
291void ssd2119_drv::clearScreen(color_t c)
293 fillArea(0, 0, getSizeX(), getSizeY(), c);
296void ssd2119_drv::setCursorLtoR(uint16_t x, uint16_t y)
298 writeCmdData(SSD2119::ENTRY_MODE_REG, MAKE_ENTRY_MODE(HORIZ_DIRECTION));
299 writeCmdData(SSD2119::X_RAM_ADDR_REG, MAPPED_X(x, y));
300 writeCmdData(SSD2119::Y_RAM_ADDR_REG, MAPPED_Y(x, y));
301 writeCommand(SSD2119::RAM_DATA_REG);
304void ssd2119_drv::setCursorTtoB(uint16_t x, uint16_t y)
306 writeCmdData(SSD2119::ENTRY_MODE_REG, MAKE_ENTRY_MODE(VERT_DIRECTION));
307 writeCmdData(SSD2119::X_RAM_ADDR_REG, MAPPED_X(x, y));
308 writeCmdData(SSD2119::Y_RAM_ADDR_REG, MAPPED_Y(x, y));
309 writeCommand(SSD2119::RAM_DATA_REG);
334void ssd2119_drv::writeDataBuffer(
int len)
336 _spi.spiTx(_tx_buffer, len);
339void ssd2119_drv::writeCommand(uint8_t cmd)
342 _dc_pin.gpioWrite(LOW);
344 _dc_pin.gpioWrite(HIGH);
347void ssd2119_drv::writeCmdData(uint8_t cmd, uint16_t data)
350 _dc_pin.gpioWrite(LOW);
352 _dc_pin.gpioWrite(HIGH);
354 data = __builtin_bswap16(data);
355 _spi.spiTx((uint8_t *)&data, 2);