aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/lcd/ssd1289_lld.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/lcd/ssd1289_lld.c')
-rw-r--r--drivers/lcd/ssd1289_lld.c134
1 files changed, 74 insertions, 60 deletions
diff --git a/drivers/lcd/ssd1289_lld.c b/drivers/lcd/ssd1289_lld.c
index 831f0eda..5a14d238 100644
--- a/drivers/lcd/ssd1289_lld.c
+++ b/drivers/lcd/ssd1289_lld.c
@@ -9,11 +9,12 @@ extern uint16_t lcd_width, lcd_height;
static uint16_t buf[((SCREEN_HEIGHT > SCREEN_WIDTH ) ? SCREEN_HEIGHT : SCREEN_WIDTH)];
#ifdef LCD_USE_GPIO
+
static __inline void lld_lcdWriteIndex(uint16_t index) {
Clr_RS;
Set_RD;
- palWritePort(LCD_DATA_PORT, index);
+ lld_lcdWriteGPIO(index);
Clr_WR;
Set_WR;
@@ -22,7 +23,7 @@ static __inline void lld_lcdWriteIndex(uint16_t index) {
static __inline void lld_lcdWriteData(uint16_t data) {
Set_RS;
- palWritePort(LCD_DATA_PORT, data);
+ lld_lcdWriteGPIO(data);
Clr_WR;
Set_WR;
@@ -30,8 +31,10 @@ static __inline void lld_lcdWriteData(uint16_t data) {
static __inline void lld_lcdWriteReg(uint16_t lcdReg,uint16_t lcdRegValue) {
Clr_CS;
+
lld_lcdWriteIndex(lcdReg);
lld_lcdWriteData(lcdRegValue);
+
Set_CS;
}
@@ -42,16 +45,7 @@ static __inline uint16_t lld_lcdReadData(void) {
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;
+ value = lld_lcdReadGPIO();
Set_RD;
@@ -72,6 +66,7 @@ static __inline uint16_t lld_lcdReadReg(uint16_t lcdReg) {
__inline void lld_lcdWriteStreamStart(void) {
Clr_CS;
+
lld_lcdWriteIndex(0x0022);
}
@@ -85,7 +80,7 @@ __inline void lld_lcdWriteStream(uint16_t *buffer, uint16_t size) {
Set_RS;
for(i = 0; i < size; i++) {
- palWritePort(LCD_DATA_PORT, buffer[i]);
+ lld_lcdWriteGPIO(buffer[i]);
Clr_WR;
Set_WR;
}
@@ -112,6 +107,10 @@ __inline void lld_lcdReadStream(uint16_t *buffer, size_t size) {
#endif
+#ifdef LCD_USE_SPI
+ /* TODO */
+#endif
+
#ifdef LCD_USE_FSMC
#define LCD_REG (*((volatile uint16_t *) 0x60000000)) /* RS = 0 */
@@ -173,15 +172,30 @@ __inline void lld_lcdReadStream(uint16_t *buffer, size_t size) {
}
#endif
-#ifdef LCD_USE_SPI
-/* TODO! */
-#endif
-
-static __inline void lcdDelay(uint16_t us) {
+static __inline void lld_lcdDelay(uint16_t us) {
chThdSleepMicroseconds(us);
}
-
+void lld_lcdSetPowerMode(uint8_t powerMode) {
+ switch(powerMode) {
+ case powerOff:
+ lld_lcdWriteReg(0x0010, 0x0000); // leave sleep mode
+ lld_lcdWriteReg(0x0007, 0x0000); // halt operation
+ lld_lcdWriteReg(0x0000, 0x0000); // turn off oszillator
+ lld_lcdWriteReg(0x0010, 0x0001); // enter sleepmode
+ break;
+ case powerOn:
+ lld_lcdWriteReg(0x0010, 0x0000); // leave sleep mode
+ lld_lcdInit();
+ break;
+ case sleepOn:
+ lld_lcdWriteReg(0x0010, 0x0001); // enter sleep mode
+ break;
+ case sleepOff:
+ lld_lcdWriteReg(0x0010, 0x0000); // leave sleep mode
+ break;
+ }
+}
void lld_lcdSetCursor(uint16_t x, uint16_t y) {
/* Reg 0x004E is an 8 bit value
@@ -334,47 +348,47 @@ void lld_lcdInit(void) {
#endif
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);
+ lld_lcdWriteReg(0x0000,0x0001); lld_lcdDelay(5);
+ lld_lcdWriteReg(0x0003,0xA8A4); lld_lcdDelay(5);
+ lld_lcdWriteReg(0x000C,0x0000); lld_lcdDelay(5);
+ lld_lcdWriteReg(0x000D,0x080C); lld_lcdDelay(5);
+ lld_lcdWriteReg(0x000E,0x2B00); lld_lcdDelay(5);
+ lld_lcdWriteReg(0x001E,0x00B0); lld_lcdDelay(5);
+ lld_lcdWriteReg(0x0001,0x2B3F); lld_lcdDelay(5);
+ lld_lcdWriteReg(0x0002,0x0600); lld_lcdDelay(5);
+ lld_lcdWriteReg(0x0010,0x0000); lld_lcdDelay(5);
+ lld_lcdWriteReg(0x0011,0x6070); lld_lcdDelay(5);
+ lld_lcdWriteReg(0x0005,0x0000); lld_lcdDelay(5);
+ lld_lcdWriteReg(0x0006,0x0000); lld_lcdDelay(5);
+ lld_lcdWriteReg(0x0016,0xEF1C); lld_lcdDelay(5);
+ lld_lcdWriteReg(0x0017,0x0003); lld_lcdDelay(5);
+ lld_lcdWriteReg(0x0007,0x0133); lld_lcdDelay(5);
+ lld_lcdWriteReg(0x000B,0x0000); lld_lcdDelay(5);
+ lld_lcdWriteReg(0x000F,0x0000); lld_lcdDelay(5);
+ lld_lcdWriteReg(0x0041,0x0000); lld_lcdDelay(5);
+ lld_lcdWriteReg(0x0042,0x0000); lld_lcdDelay(5);
+ lld_lcdWriteReg(0x0048,0x0000); lld_lcdDelay(5);
+ lld_lcdWriteReg(0x0049,0x013F); lld_lcdDelay(5);
+ lld_lcdWriteReg(0x004A,0x0000); lld_lcdDelay(5);
+ lld_lcdWriteReg(0x004B,0x0000); lld_lcdDelay(5);
+ lld_lcdWriteReg(0x0044,0xEF00); lld_lcdDelay(5);
+ lld_lcdWriteReg(0x0045,0x0000); lld_lcdDelay(5);
+ lld_lcdWriteReg(0x0046,0x013F); lld_lcdDelay(5);
+ lld_lcdWriteReg(0x0030,0x0707); lld_lcdDelay(5);
+ lld_lcdWriteReg(0x0031,0x0204); lld_lcdDelay(5);
+ lld_lcdWriteReg(0x0032,0x0204); lld_lcdDelay(5);
+ lld_lcdWriteReg(0x0033,0x0502); lld_lcdDelay(5);
+ lld_lcdWriteReg(0x0034,0x0507); lld_lcdDelay(5);
+ lld_lcdWriteReg(0x0035,0x0204); lld_lcdDelay(5);
+ lld_lcdWriteReg(0x0036,0x0204); lld_lcdDelay(5);
+ lld_lcdWriteReg(0x0037,0x0502); lld_lcdDelay(5);
+ lld_lcdWriteReg(0x003A,0x0302); lld_lcdDelay(5);
+ lld_lcdWriteReg(0x003B,0x0302); lld_lcdDelay(5);
+ lld_lcdWriteReg(0x0023,0x0000); lld_lcdDelay(5);
+ lld_lcdWriteReg(0x0024,0x0000); lld_lcdDelay(5);
+ lld_lcdWriteReg(0x0025,0x8000); lld_lcdDelay(5);
+ lld_lcdWriteReg(0x004f,0x0000); lld_lcdDelay(5);
+ lld_lcdWriteReg(0x004e,0x0000); lld_lcdDelay(5);
}
uint16_t lld_lcdGetOrientation(void) {