aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/lcd
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/lcd')
-rw-r--r--drivers/lcd/s6d1121_lld.c306
-rw-r--r--drivers/lcd/s6d1121_lld.h44
-rw-r--r--drivers/lcd/ssd1289_lld.c246
-rw-r--r--drivers/lcd/ssd1289_lld.h32
4 files changed, 628 insertions, 0 deletions
diff --git a/drivers/lcd/s6d1121_lld.c b/drivers/lcd/s6d1121_lld.c
new file mode 100644
index 00000000..dfadc19d
--- /dev/null
+++ b/drivers/lcd/s6d1121_lld.c
@@ -0,0 +1,306 @@
+#include "s6d1121_lld.h"
+
+#ifdef LCD_USE_S6D1121
+
+#define LCD_RST_LOW palClearPad(LCD_RST_GPIO, LCD_RST_PIN)
+#define LCD_RST_HIGH palSetPad(LCD_RST_GPIO, LCD_RST_PIN)
+
+#define LCD_CS_LOW palClearPad(LCD_CS_GPIO, LCD_CS_PIN)
+#define LCD_CS_HIGH palSetPad(LCD_CS_GPIO, LCD_CS_PIN)
+
+#define LCD_RS_LOW palClearPad(LCD_RS_GPIO, LCD_RS_PIN)
+#define LCD_RS_HIGH palSetPad(LCD_RS_GPIO, LCD_RS_PIN)
+
+#define LCD_RD_LOW palClearPad(LCD_RD_GPIO, LCD_RD_PIN)
+#define LCD_RD_HIGH palSetPad(LCD_RD_GPIO, LCD_RD_PIN)
+
+#define LCD_WR_LOW palClearPad(LCD_WR_GPIO, LCD_WR_PIN)
+#define LCD_WR_HIGH palSetPad(LCD_WR_GPIO, LCD_WR_PIN)
+
+#define LCD_BL_LOW palClearPad(LCD_BL_GPIO, LCD_BL_PIN)
+#define LCD_BL_HIGH palSetPad(LCD_BL_GPIO, LCD_BL_PIN)
+
+static uint8_t orientation;
+extern uint16_t lcd_width, lcd_height;
+
+inline void lld_lcddelay(void)
+{
+ asm volatile ("nop");
+ asm volatile ("nop");
+}
+
+inline void lld_lcdwrite(uint16_t db)
+{
+ LCD_D4_GPIO->BSRR.W=((~db&0xFFF0)<<16)|(db&0xFFF0);
+ LCD_D0_GPIO->BSRR.W=((~db&0x000F)<<16)|(db&0x000F);
+
+ LCD_WR_LOW;
+ lld_lcddelay();
+ LCD_WR_HIGH;
+}
+
+static __inline uint16_t lcdReadData(void) {
+ uint16_t value=0;
+
+ LCD_RS_HIGH;
+ LCD_WR_HIGH;
+ LCD_RD_LOW;
+
+#ifndef STM32F4XX
+ // change pin mode to digital input
+ LCD_DATA_PORT->CRH = 0x47444444;
+ LCD_DATA_PORT->CRL = 0x47444444;
+#else
+
+#endif
+
+// value = palReadPort(LCD_DATA_PORT); // dummy
+// value = palReadPort(LCD_DATA_PORT);
+
+#ifndef STM32F4XX
+ // change pin mode back to digital output
+ LCD_DATA_PORT->CRH = 0x33333333;
+ LCD_DATA_PORT->CRL = 0x33333333;
+#else
+#endif
+ LCD_RD_HIGH;
+
+ return value;
+}
+
+static __inline uint16_t lcdReadReg(uint16_t lcdReg) {
+ uint16_t lcdRAM;
+
+ LCD_CS_LOW;
+ LCD_RS_LOW;
+ lld_lcdwrite(lcdReg);
+ LCD_RS_HIGH;
+ lcdRAM = lcdReadData();
+
+ LCD_CS_HIGH;
+
+ return lcdRAM;
+}
+
+void lcdWriteIndex(uint16_t lcdReg) {
+ LCD_RS_LOW;
+
+ lld_lcdwrite(lcdReg);
+
+ LCD_RS_HIGH;
+}
+
+void lcdWriteData(uint16_t lcdData) {
+ lld_lcdwrite(lcdData);
+}
+
+void lcdWriteReg(uint16_t lcdReg, uint16_t lcdRegValue) {
+ LCD_CS_LOW;
+
+ lcdWriteIndex(lcdReg);
+ lcdWriteData(lcdRegValue);
+
+ LCD_CS_HIGH;
+}
+
+void lld_lcdInit(void) {
+ // ChibiOS HAL has a nice and precise delay function,
+ // halPolledDelay(US2RTT(x)); or halPolledDelay(MS2RTT(x));
+ // Why Not use it?
+ // IO Default Configurations
+ palSetPadMode(LCD_CS_GPIO, LCD_CS_PIN, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST);
+ palSetPadMode(LCD_WR_GPIO, LCD_WR_PIN, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST);
+ palSetPadMode(LCD_RD_GPIO, LCD_RD_PIN, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST);
+ palSetPadMode(LCD_RST_GPIO, LCD_RST_PIN, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST);
+ palSetPadMode(LCD_RS_GPIO, LCD_RS_PIN, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST);
+ palSetPadMode(LCD_BL_GPIO, LCD_BL_PIN, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST);
+
+ palSetGroupMode(LCD_D0_GPIO, 0x0000000F, 0, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST);
+ palSetGroupMode(LCD_D4_GPIO, 0x0000FFF0, 0, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST);
+
+ LCD_CS_HIGH;
+ LCD_RST_HIGH;
+ LCD_RD_HIGH;
+ LCD_WR_HIGH;
+ LCD_BL_LOW;
+
+ // A Good idea to reset the module before using
+ LCD_RST_LOW;
+ halPolledDelay(MS2RTT(2));
+ LCD_RST_HIGH; // Hardware Reset
+ halPolledDelay(MS2RTT(2));
+
+ lcdWriteReg(0x11,0x2004);
+ lcdWriteReg(0x13,0xCC00);
+ lcdWriteReg(0x15,0x2600);
+ lcdWriteReg(0x14,0x252A);
+ lcdWriteReg(0x12,0x0033);
+ lcdWriteReg(0x13,0xCC04);
+
+ halPolledDelay(MS2RTT(1));
+
+ lcdWriteReg(0x13,0xCC06);
+
+ halPolledDelay(MS2RTT(1));
+
+ lcdWriteReg(0x13,0xCC4F);
+
+ halPolledDelay(MS2RTT(1));
+
+ lcdWriteReg(0x13,0x674F);
+ lcdWriteReg(0x11,0x2003);
+
+ halPolledDelay(MS2RTT(1));
+
+ // Gamma Setting
+ lcdWriteReg(0x30,0x2609);
+ lcdWriteReg(0x31,0x242C);
+ lcdWriteReg(0x32,0x1F23);
+ lcdWriteReg(0x33,0x2425);
+ lcdWriteReg(0x34,0x2226);
+ lcdWriteReg(0x35,0x2523);
+ lcdWriteReg(0x36,0x1C1A);
+ lcdWriteReg(0x37,0x131D);
+ lcdWriteReg(0x38,0x0B11);
+ lcdWriteReg(0x39,0x1210);
+ lcdWriteReg(0x3A,0x1315);
+ lcdWriteReg(0x3B,0x3619);
+ lcdWriteReg(0x3C,0x0D00);
+ lcdWriteReg(0x3D,0x000D);
+
+ lcdWriteReg(0x16,0x0007);
+ lcdWriteReg(0x02,0x0013);
+ lcdWriteReg(0x03,0x0003);
+ lcdWriteReg(0x01,0x0127);
+
+ halPolledDelay(MS2RTT(1));
+
+ lcdWriteReg(0x08,0x0303);
+ lcdWriteReg(0x0A,0x000B);
+ lcdWriteReg(0x0B,0x0003);
+ lcdWriteReg(0x0C,0x0000);
+ lcdWriteReg(0x41,0x0000);
+ lcdWriteReg(0x50,0x0000);
+ lcdWriteReg(0x60,0x0005);
+ lcdWriteReg(0x70,0x000B);
+ lcdWriteReg(0x71,0x0000);
+ lcdWriteReg(0x78,0x0000);
+ lcdWriteReg(0x7A,0x0000);
+ lcdWriteReg(0x79,0x0007);
+ lcdWriteReg(0x07,0x0051);
+
+ halPolledDelay(MS2RTT(1));
+
+ lcdWriteReg(0x07,0x0053);
+ lcdWriteReg(0x79,0x0000);
+}
+
+void lld_lcdSetCursor(uint16_t x, uint16_t y) {
+ if(PORTRAIT) {
+ lcdWriteReg(0x0020, x);
+ lcdWriteReg(0x0021, y);
+ } else if(LANDSCAPE) {
+ lcdWriteReg(0x0020, y);
+ lcdWriteReg(0x0021, x);
+ }
+}
+
+// Do not use now, will be fixed in future
+void lld_lcdSetOrientation(uint8_t newOrientation) {
+ orientation = newOrientation;
+
+ switch(orientation) {
+ case portrait:
+ lcdWriteReg(0x03, 0x03);
+ lcd_height = SCREEN_HEIGHT;
+ lcd_width = SCREEN_WIDTH;
+ break;
+ case landscape:
+ // Not implemented yet
+ lcd_height = SCREEN_WIDTH;
+ lcd_width = SCREEN_HEIGHT;
+ break;
+ case portraitInv:
+ // Not implemented yet
+ lcd_height = SCREEN_HEIGHT;
+ lcd_width = SCREEN_WIDTH;
+ break;
+ case landscapeInv:
+ // Not implemented yet
+ lcd_height = SCREEN_WIDTH;
+ lcd_width = SCREEN_HEIGHT;
+ break;
+ }
+}
+
+void lld_lcdSetWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) {
+ lld_lcdSetCursor(x0, y0);
+
+ switch(lcdGetOrientation()) {
+ case portrait:
+ lcdWriteReg(0x47, ((x0+x1-1) << 8) | x0);
+ lcdWriteReg(0x48, y0);
+ lcdWriteReg(0x47, y0+y1-1);
+ break;
+ case landscape:
+ lcdWriteReg(0x47, ((y0+y1-1) << 8) | y1);
+ lcdWriteReg(0x48, x0);
+ lcdWriteReg(0x47, x0+x1-1);
+ break;
+ case portraitInv:
+ lcdWriteReg(0x47, ((x0+x1-1) << 8) | x0);
+ lcdWriteReg(0x48, y0);
+ lcdWriteReg(0x47, y0+y1-1);
+ break;
+ case landscapeInv:
+ lcdWriteReg(0x47, ((y0+y1-1) << 8) | y1);
+ lcdWriteReg(0x48, x0);
+ lcdWriteReg(0x47, x0+x1-1);
+ break;
+ }
+}
+
+void lld_lcdClear(uint16_t color) {
+ uint32_t index = 0;
+
+ lld_lcdSetCursor(0,0);
+ LCD_CS_LOW;
+ lcdWriteIndex(0x0022);
+ for(index = 0; index < SCREEN_WIDTH * SCREEN_HEIGHT; index++)
+ lcdWriteData(color);
+ LCD_CS_HIGH;
+}
+
+// Do not use!
+uint16_t lld_lcdGetPixelColor(uint16_t x, uint16_t y) {
+ uint16_t dummy;
+
+ lld_lcdSetCursor(x,y);
+ LCD_CS_LOW;
+ lcdWriteIndex(0x0022);
+ dummy = lcdReadData();
+ dummy = lcdReadData();
+ LCD_CS_HIGH;
+
+ return dummy;
+}
+
+void lld_lcdDrawPixel(uint16_t x, uint16_t y, uint16_t color) {
+ lld_lcdSetCursor(x, y);
+ lcdWriteReg(0x0022, color);
+}
+
+uint16_t lld_lcdGetOrientation(void) {
+ return orientation;
+}
+
+uint16_t lld_lcdGetHeight(void) {
+ return lcd_height;
+}
+
+uint16_t lld_lcdGetWidth(void) {
+ return lcd_width;
+}
+
+#endif
+
diff --git a/drivers/lcd/s6d1121_lld.h b/drivers/lcd/s6d1121_lld.h
new file mode 100644
index 00000000..173f6e40
--- /dev/null
+++ b/drivers/lcd/s6d1121_lld.h
@@ -0,0 +1,44 @@
+#ifndef S6D1121_H
+#define S6D1121_H
+
+#include "glcd.h"
+#include "glcdconf.h"
+
+#ifdef LCD_USE_S6D1121
+
+// I/O assignments
+#define LCD_BL_GPIO GPIOB
+#define LCD_BL_PIN 8
+
+#define LCD_CS_GPIO GPIOD
+#define LCD_CS_PIN 7
+
+#define LCD_RS_GPIO GPIOD
+#define LCD_RS_PIN 11
+
+#define LCD_RST_GPIO GPIOD
+#define LCD_RST_PIN 10
+
+#define LCD_RD_GPIO GPIOD
+#define LCD_RD_PIN 9
+
+#define LCD_WR_GPIO GPIOD
+#define LCD_WR_PIN 8
+
+#define LCD_D0_GPIO GPIOD
+#define LCD_D4_GPIO GPIOE
+
+void lld_lcdInit(void);
+void lld_lcdSetCursor(uint16_t x, uint16_t y);
+void lld_lcdSetOrientation(uint8_t newOrientation);
+void lld_lcdSetWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1);
+void lld_lcdClear(uint16_t color);
+void lld_lcdDrawPixel(uint16_t x, uint16_t y, uint16_t color);
+uint16_t lld_lcdGetPixelColor(uint16_t x, uint16_t y);
+uint16_t lld_lcdGetOrientation(void);
+uint16_t lld_lcdGetHeight(void);
+uint16_t lld_lcdGetWidth(void);
+
+#endif
+#endif
+
diff --git a/drivers/lcd/ssd1289_lld.c b/drivers/lcd/ssd1289_lld.c
new file mode 100644
index 00000000..12782e31
--- /dev/null
+++ b/drivers/lcd/ssd1289_lld.c
@@ -0,0 +1,246 @@
+#include "ssd1289_lld.h"
+
+#ifdef LCD_USE_SSD1289
+
+uint8_t orientation;
+uint16_t DeviceCode;
+extern uint16_t lcd_width, lcd_height;
+
+static __inline void lld_lcdWriteIndex(uint16_t index) {
+ Clr_RS;
+ Set_RD;
+
+ palWritePort(LCD_DATA_PORT, index);
+
+ Clr_WR;
+ Set_WR;
+}
+
+static __inline void lld_lcdWriteData(uint16_t data) {
+ Set_RS;
+
+ palWritePort(LCD_DATA_PORT, data);
+
+ Clr_WR;
+ Set_WR;
+}
+
+static __inline void lld_lcdWriteReg(uint16_t lcdReg,uint16_t lcdRegValue) {
+ Clr_CS;
+ lld_lcdWriteIndex(lcdReg);
+ lld_lcdWriteData(lcdRegValue);
+ Set_CS;
+}
+
+static __inline uint16_t lld_lcdReadData(void) {
+ uint16_t value;
+
+ Set_RS;
+ Set_WR;
+ Clr_RD;
+
+ // change pin mode to digital input
+ LCD_DATA_PORT->CRH = 0x44444444;
+ LCD_DATA_PORT->CRL = 0x44444444;
+
+ value = palReadPort(LCD_DATA_PORT); // dummy
+ value = palReadPort(LCD_DATA_PORT);
+
+ // change pin mode back to digital output
+ LCD_DATA_PORT->CRH = 0x33333333;
+ LCD_DATA_PORT->CRL = 0x33333333;
+
+ Set_RD;
+
+ return value;
+}
+
+static __inline uint16_t lld_lcdReadReg(uint16_t lcdReg) {
+ uint16_t lcdRAM;
+
+ Clr_CS;
+ lld_lcdWriteIndex(lcdReg);
+ lcdRAM = lld_lcdReadData();
+
+ Set_CS;
+
+ return lcdRAM;
+}
+
+static __inline void lcdDelay(uint16_t us) {
+ chThdSleepMicroseconds(us);
+}
+
+void lld_lcdSetCursor(uint16_t x, uint16_t y) {
+ if(PORTRAIT) {
+ lld_lcdWriteReg(0x004e, x);
+ lld_lcdWriteReg(0x004f, y);
+ } else if(LANDSCAPE) {
+ lld_lcdWriteReg(0x004e, y);
+ lld_lcdWriteReg(0x004f, x);
+ }
+}
+
+void lld_lcdSetOrientation(uint8_t newOrientation) {
+ orientation = newOrientation;
+
+ switch(orientation) {
+ case portrait:
+ lld_lcdWriteReg(0x0001, 0x2B3F);
+ lld_lcdWriteReg(0x0011, 0x6070);
+ lcd_height = SCREEN_HEIGHT;
+ lcd_width = SCREEN_WIDTH;
+ break;
+ case landscape:
+ lld_lcdWriteReg(0x0001, 0x293F);
+ lld_lcdWriteReg(0x0011, 0x6078);
+ lcd_height = SCREEN_WIDTH;
+ lcd_width = SCREEN_HEIGHT;
+ break;
+ case portraitInv:
+ lld_lcdWriteReg(0x0001, 0x693F);
+ lld_lcdWriteReg(0x0011, 0x6040);
+ lcd_height = SCREEN_HEIGHT;
+ lcd_width = SCREEN_WIDTH;
+ break;
+ case landscapeInv:
+ lld_lcdWriteReg(0x0001, 0x6B3F);
+ lld_lcdWriteReg(0x0011, 0x6048);
+ lcd_height = SCREEN_WIDTH;
+ lcd_width = SCREEN_HEIGHT;
+ break;
+ }
+}
+
+void lld_lcdSetWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) {
+ lld_lcdSetCursor(x0, y0);
+
+ x1 -= x0;
+ y1 -= y0;
+
+ switch(lcdGetOrientation()) {
+ case portrait:
+ lld_lcdWriteReg(0x44, ((x0+x1-1) << 8) | x0);
+ lld_lcdWriteReg(0x45, y0);
+ lld_lcdWriteReg(0x46, y0+y1-1);
+ break;
+ case landscape:
+ lld_lcdWriteReg(0x44, ((y0+y1-1) << 8) | y1);
+ lld_lcdWriteReg(0x45, x0);
+ lld_lcdWriteReg(0x46, x0+x1-1);
+ break;
+ case portraitInv:
+ lld_lcdWriteReg(0x44, ((x0+x1-1) << 8) | x0);
+ lld_lcdWriteReg(0x45, y0);
+ lld_lcdWriteReg(0x46, y0+y1-1);
+ break;
+ case landscapeInv:
+ lld_lcdWriteReg(0x44, ((y0+y1-1) << 8) | y1);
+ lld_lcdWriteReg(0x45, x0);
+ lld_lcdWriteReg(0x46, x0+x1-1);
+ break;
+ }
+}
+
+void lld_lcdFillArea(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color) {
+ uint32_t index = 0, area;
+
+ area = ((x1-x0)*(y1-y0));
+
+ lld_lcdSetWindow(x0, y0, x1, y1);
+ Clr_CS;
+ lld_lcdWriteIndex(0x0022);
+ for(index = 0; index < area; index++)
+ lld_lcdWriteData(color);
+ Set_CS;
+}
+
+void lld_lcdClear(uint16_t color) {
+ uint32_t index = 0;
+
+ lld_lcdSetCursor(0, 0);
+ Clr_CS;
+ lld_lcdWriteIndex(0x0022);
+ for(index = 0; index < SCREEN_WIDTH * SCREEN_HEIGHT; index++)
+ lld_lcdWriteData(color);
+ Set_CS;
+}
+
+uint16_t lld_lcdGetPixelColor(uint16_t x, uint16_t y) {
+ uint16_t dummy;
+
+ lld_lcdSetCursor(x,y);
+ Clr_CS;
+ lld_lcdWriteIndex(0x0022);
+ dummy = lld_lcdReadData();
+ dummy = lld_lcdReadData();
+ Set_CS;
+
+ return dummy;
+}
+
+void lld_lcdDrawPixel(uint16_t x, uint16_t y, uint16_t color) {
+ lld_lcdSetCursor(x, y);
+ lld_lcdWriteReg(0x0022, color);
+}
+
+void lld_lcdInit(void) {
+ DeviceCode = lld_lcdReadReg(0x0000);
+
+ lld_lcdWriteReg(0x0000,0x0001); lcdDelay(5);
+ lld_lcdWriteReg(0x0003,0xA8A4); lcdDelay(5);
+ lld_lcdWriteReg(0x000C,0x0000); lcdDelay(5);
+ lld_lcdWriteReg(0x000D,0x080C); lcdDelay(5);
+ lld_lcdWriteReg(0x000E,0x2B00); lcdDelay(5);
+ lld_lcdWriteReg(0x001E,0x00B0); lcdDelay(5);
+ lld_lcdWriteReg(0x0001,0x2B3F); lcdDelay(5);
+ lld_lcdWriteReg(0x0002,0x0600); lcdDelay(5);
+ lld_lcdWriteReg(0x0010,0x0000); lcdDelay(5);
+ lld_lcdWriteReg(0x0011,0x6070); lcdDelay(5);
+ lld_lcdWriteReg(0x0005,0x0000); lcdDelay(5);
+ lld_lcdWriteReg(0x0006,0x0000); lcdDelay(5);
+ lld_lcdWriteReg(0x0016,0xEF1C); lcdDelay(5);
+ lld_lcdWriteReg(0x0017,0x0003); lcdDelay(5);
+ lld_lcdWriteReg(0x0007,0x0133); lcdDelay(5);
+ lld_lcdWriteReg(0x000B,0x0000); lcdDelay(5);
+ lld_lcdWriteReg(0x000F,0x0000); lcdDelay(5);
+ lld_lcdWriteReg(0x0041,0x0000); lcdDelay(5);
+ lld_lcdWriteReg(0x0042,0x0000); lcdDelay(5);
+ lld_lcdWriteReg(0x0048,0x0000); lcdDelay(5);
+ lld_lcdWriteReg(0x0049,0x013F); lcdDelay(5);
+ lld_lcdWriteReg(0x004A,0x0000); lcdDelay(5);
+ lld_lcdWriteReg(0x004B,0x0000); lcdDelay(5);
+ lld_lcdWriteReg(0x0044,0xEF00); lcdDelay(5);
+ lld_lcdWriteReg(0x0045,0x0000); lcdDelay(5);
+ lld_lcdWriteReg(0x0046,0x013F); lcdDelay(5);
+ lld_lcdWriteReg(0x0030,0x0707); lcdDelay(5);
+ lld_lcdWriteReg(0x0031,0x0204); lcdDelay(5);
+ lld_lcdWriteReg(0x0032,0x0204); lcdDelay(5);
+ lld_lcdWriteReg(0x0033,0x0502); lcdDelay(5);
+ lld_lcdWriteReg(0x0034,0x0507); lcdDelay(5);
+ lld_lcdWriteReg(0x0035,0x0204); lcdDelay(5);
+ lld_lcdWriteReg(0x0036,0x0204); lcdDelay(5);
+ lld_lcdWriteReg(0x0037,0x0502); lcdDelay(5);
+ lld_lcdWriteReg(0x003A,0x0302); lcdDelay(5);
+ lld_lcdWriteReg(0x003B,0x0302); lcdDelay(5);
+ lld_lcdWriteReg(0x0023,0x0000); lcdDelay(5);
+ lld_lcdWriteReg(0x0024,0x0000); lcdDelay(5);
+ lld_lcdWriteReg(0x0025,0x8000); lcdDelay(5);
+ lld_lcdWriteReg(0x004f,0x0000); lcdDelay(5);
+ lld_lcdWriteReg(0x004e,0x0000); lcdDelay(5);
+}
+
+uint16_t lld_lcdGetOrientation(void) {
+ return orientation;
+}
+
+uint16_t lld_lcdGetHeight(void) {
+ return lcd_height;
+}
+
+uint16_t lld_lcdGetWidth(void) {
+ return lcd_width;
+}
+
+#endif
+
diff --git a/drivers/lcd/ssd1289_lld.h b/drivers/lcd/ssd1289_lld.h
new file mode 100644
index 00000000..1a98356e
--- /dev/null
+++ b/drivers/lcd/ssd1289_lld.h
@@ -0,0 +1,32 @@
+#ifndef SSD1289_H
+#define SSD1289_H
+
+#include "glcd.h"
+#include "glcdconf.h"
+
+#ifdef LCD_USE_SSD1289
+
+#define Set_CS palSetPad(LCD_CMD_PORT, LCD_CS);
+#define Clr_CS palClearPad(LCD_CMD_PORT, LCD_CS);
+#define Set_RS palSetPad(LCD_CMD_PORT, LCD_RS);
+#define Clr_RS palClearPad(LCD_CMD_PORT, LCD_RS);
+#define Set_WR palSetPad(LCD_CMD_PORT, LCD_WR);
+#define Clr_WR palClearPad(LCD_CMD_PORT, LCD_WR);
+#define Set_RD palSetPad(LCD_CMD_PORT, LCD_RD);
+#define Clr_RD palClearPad(LCD_CMD_PORT, LCD_RD);
+
+void lld_lcdInit(void);
+void lld_lcdSetCursor(uint16_t x, uint16_t y);
+void lld_lcdSetOrientation(uint8_t newOrientation);
+void lld_lcdSetWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1);
+void lld_lcdClear(uint16_t color);
+void lld_lcdDrawPixel(uint16_t x, uint16_t y, uint16_t color);
+void lld_lcdFillArea(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color);
+uint16_t lld_lcdGetPixelColor(uint16_t x, uint16_t y);
+uint16_t lld_lcdGetOrientation(void);
+uint16_t lld_lcdGetHeight(void);
+uint16_t lld_lcdGetWidth(void);
+
+#endif
+#endif
+