diff options
author | Tectu <joel@unormal.org> | 2012-06-10 23:51:36 +0200 |
---|---|---|
committer | Tectu <joel@unormal.org> | 2012-06-10 23:51:36 +0200 |
commit | 12427eb272c06d1114138ef1f7b6af03c4aae566 (patch) | |
tree | bee4de5de04b4de34a1652892bc4fe1f93483131 | |
parent | 8b2f6ae66d60eee6cf5f3d3bd5fad5ac4a48f4bc (diff) | |
download | uGFX-12427eb272c06d1114138ef1f7b6af03c4aae566.tar.gz uGFX-12427eb272c06d1114138ef1f7b6af03c4aae566.tar.bz2 uGFX-12427eb272c06d1114138ef1f7b6af03c4aae566.zip |
ssd1289 support
-rw-r--r-- | drivers/ssd1289_lld.c | 119 | ||||
-rw-r--r-- | drivers/ssd1289_lld.h | 11 | ||||
-rw-r--r-- | glcd.c | 110 | ||||
-rw-r--r-- | glcd.h | 1 |
4 files changed, 126 insertions, 115 deletions
diff --git a/drivers/ssd1289_lld.c b/drivers/ssd1289_lld.c index af33d187..495a4fc7 100644 --- a/drivers/ssd1289_lld.c +++ b/drivers/ssd1289_lld.c @@ -2,10 +2,11 @@ #ifdef LCD_USE_SSD1289 +uint8_t orientation; extern uint16_t DeviceCode; extern uint16_t lcd_width, lcd_height; -__inline void lcdWriteIndex(uint16_t index) { +static __inline void lcdWriteIndex(uint16_t index) { Clr_RS; Set_RD; @@ -15,7 +16,7 @@ __inline void lcdWriteIndex(uint16_t index) { Set_WR; } -__inline void lcdWriteData(uint16_t data) { +static __inline void lcdWriteData(uint16_t data) { Set_RS; palWritePort(LCD_DATA_PORT, data); @@ -24,14 +25,14 @@ __inline void lcdWriteData(uint16_t data) { Set_WR; } -__inline void lcdWriteReg(uint16_t lcdReg,uint16_t lcdRegValue) { +static __inline void lcdWriteReg(uint16_t lcdReg,uint16_t lcdRegValue) { Clr_CS; lcdWriteIndex(lcdReg); lcdWriteData(lcdRegValue); Set_CS; } -__inline uint16_t lcdReadData(void) { +static __inline uint16_t lcdReadData(void) { uint16_t value; Set_RS; @@ -54,7 +55,7 @@ __inline uint16_t lcdReadData(void) { return value; } -__inline uint16_t lcdReadReg(uint16_t lcdReg) { +static __inline uint16_t lcdReadReg(uint16_t lcdReg) { uint16_t lcdRAM; Clr_CS; @@ -66,6 +67,110 @@ __inline uint16_t lcdReadReg(uint16_t lcdReg) { return lcdRAM; } +static __inline void lcdDelay(uint16_t us) { + chThdSleepMicroseconds(us); +} + +void lld_lcdSetCursor(uint16_t x, uint16_t y) { + if(PORTRAIT) { + lcdWriteReg(0x004e, x); + lcdWriteReg(0x004f, y); + } else if(LANDSCAPE) { + lcdWriteReg(0x004e, y); + lcdWriteReg(0x004f, x); + } +} + +void lld_lcdSetOrientation(uint8_t newOrientation) { + orientation = newOrientation; + + switch(orientation) { + case portrait: + lcdWriteReg(0x0001, 0x2B3F); + lcdWriteReg(0x0011, 0x6070); + lcd_height = SCREEN_HEIGHT; + lcd_width = SCREEN_WIDTH; + break; + case landscape: + lcdWriteReg(0x0001, 0x293F); + lcdWriteReg(0x0011, 0x6078); + lcd_height = SCREEN_WIDTH; + lcd_width = SCREEN_HEIGHT; + break; + case portraitInv: + lcdWriteReg(0x0001, 0x693F); + lcdWriteReg(0x0011, 0x6040); + lcd_height = SCREEN_HEIGHT; + lcd_width = SCREEN_WIDTH; + break; + case landscapeInv: + lcdWriteReg(0x0001, 0x6B3F); + 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) { + lcdSetCursor(x0, y0); + + switch(lcdGetOrientation()) { + case portrait: + lcdWriteReg(0x44, ((x0+x1-1) << 8) | x0); + lcdWriteReg(0x45, y0); + lcdWriteReg(0x46, y0+y1-1); + break; + case landscape: + lcdWriteReg(0x44, ((y0+y1-1) << 8) | y1); + lcdWriteReg(0x45, x0); + lcdWriteReg(0x46, x0+x1-1); + break; + case portraitInv: + lcdWriteReg(0x44, ((x0+x1-1) << 8) | x0); + lcdWriteReg(0x45, y0); + lcdWriteReg(0x46, y0+y1-1); + break; + case landscapeInv: + lcdWriteReg(0x44, ((y0+y1-1) << 8) | y1); + lcdWriteReg(0x45, x0); + lcdWriteReg(0x46, x0+x1-1); + break; + } +} + +void lld_lcdClear(uint16_t color) { + uint32_t index = 0; + + lld_lcdSetCursor(0,0); + Clr_CS; + lcdWriteIndex(0x0022); + for(index = 0; index < SCREEN_WIDTH * SCREEN_HEIGHT; index++) + lcdWriteData(color); + Set_CS; +} + +uint16_t lld_lcdGetPixelColor(uint16_t x, uint16_t y) { + uint16_t dummy; + + lld_lcdSetCursor(x,y); + Clr_CS; + lcdWriteIndex(0x0022); + dummy = lcdReadData(); + dummy = lcdReadData(); + Set_CS; + + if( DeviceCode==0x7783 || DeviceCode==0x4531 || DeviceCode==0x8989 ) + return dummy; + else + return lcdBGR2RGB(dummy); +} + +void lld_lcdDrawPixel(uint16_t x, uint16_t y, uint16_t color) { + lld_lcdSetCursor(x, y); + lcdWriteReg(0x0022, color); +} + void lld_lcdInit(void) { DeviceCode = lcdReadReg(0x0000); @@ -108,8 +213,8 @@ void lld_lcdInit(void) { lcdWriteReg(0x0023,0x0000); lcdDelay(5); lcdWriteReg(0x0024,0x0000); lcdDelay(5); lcdWriteReg(0x0025,0x8000); lcdDelay(5); - lcdWriteReg(0x004f,0); lcdDelay(5); - lcdWriteReg(0x004e,0); lcdDelay(5); + lcdWriteReg(0x004f,0x0000); lcdDelay(5); + lcdWriteReg(0x004e,0x0000); lcdDelay(5); } uint16_t lld_lcdGetHeight(void) { diff --git a/drivers/ssd1289_lld.h b/drivers/ssd1289_lld.h index 80e40dea..dfe52165 100644 --- a/drivers/ssd1289_lld.h +++ b/drivers/ssd1289_lld.h @@ -5,12 +5,13 @@ #ifndef LCD_USE_SSD1289 -void lcdWriteIndex(uint16_t index); -void lcdWriteData(uint16_t data); -void lcdWriteReg(uint16_t lcdReg, uint16_t lcdRegValue); -uint16_t lcdReadData(void); -uint16_t lcdReadReg(uint16_t lcdReg); uint16_t lld_lcdInit(void); +void lld_lcdSetCursor(uint16_t x, uint16_t y); +void lld_lcdSetOrientation(uint8_t newOrientation); +void lld_lcdSetWindow(x0, y0, x1, y1); +void lld_lcdClear(uint16_t color); +void lld_lcdDrawPixel(uint16_t x, uint16_ty, uint16_t color); +uint16_t lld_lcdGetPixelColor(uint16_t x, uint16_t y); uint16_t lld_lcdGetHeight(void); uint16_t lld_lcdGetWidth(void); @@ -2,7 +2,7 @@ #include "fonts.h"
#include <math.h>
-uint8_t orientation;
+extern uint8_t orientation;
uint16_t DeviceCode;
uint8_t font_width = 8, font_height = 16;
uint16_t lcd_width, lcd_height;
@@ -16,62 +16,11 @@ uint16_t lcdGetWidth(void) { }
static void lcdSetCursor(uint16_t x, uint16_t y) {
- if(DeviceCode==0x8989) {
- if(PORTRAIT) {
- lcdWriteReg(0x004e, x);
- lcdWriteReg(0x004f, y);
- } else if(LANDSCAPE) {
- lcdWriteReg(0x004e, y);
- lcdWriteReg(0x004f, x);
- }
- }
- else if(DeviceCode==0x9919) {
- if(PORTRAIT) {
- lcdWriteReg(0x004e, x);
- lcdWriteReg(0x004f, y);
- } else if(LANDSCAPE) {
- lcdWriteReg(0x004e, y);
- lcdWriteReg(0x004f, x);
- }
- } else {
- lcdWriteReg(0x0020, x);
- lcdWriteReg(0x0021, y);
- }
-}
-
-void lcdDelay(uint16_t us) {
- chThdSleepMicroseconds(us);
+ lld_lcdSetCursor(x, y);
}
void lcdSetOrientation(uint8_t newOrientation) {
- orientation = newOrientation;
-
- switch(orientation) {
- case portrait:
- lcdWriteReg(0x0001, 0x2B3F);
- lcdWriteReg(0x0011, 0x6070);
- lcd_height = SCREEN_HEIGHT;
- lcd_width = SCREEN_WIDTH;
- break;
- case landscape:
- lcdWriteReg(0x0001, 0x293F);
- lcdWriteReg(0x0011, 0x6078);
- lcd_height = SCREEN_WIDTH;
- lcd_width = SCREEN_HEIGHT;
- break;
- case portraitInv:
- lcdWriteReg(0x0001, 0x693F);
- lcdWriteReg(0x0011, 0x6040);
- lcd_height = SCREEN_HEIGHT;
- lcd_width = SCREEN_WIDTH;
- break;
- case landscapeInv:
- lcdWriteReg(0x0001, 0x6B3F);
- lcdWriteReg(0x0011, 0x6048);
- lcd_height = SCREEN_WIDTH;
- lcd_width = SCREEN_HEIGHT;
- break;
- }
+ lld_lcdSetOrientation(newOrientation);
}
uint16_t lcdGetOrientation(void) {
@@ -79,62 +28,19 @@ uint16_t lcdGetOrientation(void) { }
void lcdSetWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) {
- lcdSetCursor(x0, y0);
-
- switch(lcdGetOrientation()) {
- case portrait:
- lcdWriteReg(0x44, ((x0+x1-1) << 8) | x0);
- lcdWriteReg(0x45, y0);
- lcdWriteReg(0x46, y0+y1-1);
- break;
- case landscape:
- lcdWriteReg(0x44, ((y0+y1-1) << 8) | y1);
- lcdWriteReg(0x45, x0);
- lcdWriteReg(0x46, x0+x1-1);
- break;
- case portraitInv:
- lcdWriteReg(0x44, ((x0+x1-1) << 8) | x0);
- lcdWriteReg(0x45, y0);
- lcdWriteReg(0x46, y0+y1-1);
- break;
- case landscapeInv:
- lcdWriteReg(0x44, ((y0+y1-1) << 8) | y1);
- lcdWriteReg(0x45, x0);
- lcdWriteReg(0x46, x0+x1-1);
- break;
- }
+ lld_lcdSetWindow(x0, y0, x1, y1);
}
void lcdClear(uint16_t color) {
- uint32_t index = 0;
-
- lcdSetCursor(0,0);
- Clr_CS;
- lcdWriteIndex(0x0022);
- for(index = 0; index < SCREEN_WIDTH * SCREEN_HEIGHT; index++)
- lcdWriteData(color);
- Set_CS;
+ lld_lcdClear(color);
}
uint16_t lcdGetPixelColor(uint16_t x, uint16_t y) {
- uint16_t dummy;
-
- lcdSetCursor(x,y);
- Clr_CS;
- lcdWriteIndex(0x0022);
- dummy = lcdReadData();
- dummy = lcdReadData();
- Set_CS;
-
- if( DeviceCode==0x7783 || DeviceCode==0x4531 || DeviceCode==0x8989 )
- return dummy;
- else
- return lcdBGR2RGB(dummy);
+ lld_lcdGetPixelColor(x, y);
}
-void lcdDrawPixel(uint16_t x, uint16_t y, uint16_t point) {
- lcdSetCursor(x, y);
- lcdWriteReg(0x0022, point);
+void lcdDrawPixel(uint16_t x, uint16_t y, uint16_t color) {
+ lld_lcdDrawPixel(x, y, color);
}
void lcdDrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color) {
@@ -51,7 +51,6 @@ void lcdDrawRectString(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint8 void lcdDrawCircle(uint16_t x, uint16_t y, uint16_t radius, uint8_t filled, uint16_t color);
void lcdDrawString(uint16_t x, uint16_t y, unsigned char *str, uint16_t color, uint16_t bkColor);
void lcdDrawChar(uint16_t x, uint16_t y, unsigned char c, uint16_t charcolor, uint16_t bkColor);
-void lcdDelay(uint16_t us);
uint16_t lcdGetHeight(void);
uint16_t lcdGetWidth(void);
uint16_t lcdGetOrientation(void);
|