From 152f7ade216585d7da67eda34bc6ebffdba0ff8b Mon Sep 17 00:00:00 2001 From: bsx Date: Wed, 15 Jun 2011 16:17:42 +0200 Subject: [PATCH] switched LCD code from manual SPI to builtin --- Makefile | 2 +- lcd/display.c | 192 +++++++++++++++++++++----------------------------- lcd/display.h | 2 - 3 files changed, 80 insertions(+), 116 deletions(-) diff --git a/Makefile b/Makefile index 2780415..7bbacb5 100644 --- a/Makefile +++ b/Makefile @@ -28,8 +28,8 @@ OBJS += $(TARGET)_handlers.o LPC1xxx_startup.o LDLIBS = -lm LDLIBS += -Lmodules -lmodules LDLIBS += -Lfilesystem -lfat -LDLIBS += -Lcore -lcore LDLIBS += -Llcd -llcd +LDLIBS += -Lcore -lcore OCFLAGS = --strip-unneeded LD_PATH = lpc1xxx diff --git a/lcd/display.c b/lcd/display.c index e40ed08..829dfc7 100644 --- a/lcd/display.c +++ b/lcd/display.c @@ -1,6 +1,7 @@ #include #include #include "lpc134x.h" +#include "core/ssp/ssp.h" #include "gpio/gpio.h" #include "basic/basic.h" @@ -11,152 +12,117 @@ uint8_t lcdBuffer[RESX*RESY_B]; int inverted = 0; -#define CS RB_LCD_CS -#define SCK RB_SPI_SCK -#define SDA RB_SPI_MOSI -#define RST RB_LCD_RST +#define TYPE_CMD 0 +#define TYPE_DATA 1 -void lcdWrite(uint8_t cd, uint8_t data) -{ - uint8_t i; - - gpioSetDir(SDA, 1); - gpioSetValue(SCK, 0); - //delayms(0); - gpioSetValue(CS, 0); - //delayms(0); - - gpioSetValue(SDA, cd); - //delayms(0); - gpioSetValue(SCK, 1); - //delayms(0); - - for(i=0; i<8; i++){ - gpioSetValue(SCK, 0); - //delayms(0); - if( data & 0x80 ) - gpioSetValue(SDA, 1); - else - gpioSetValue(SDA, 0); - data <<= 1; - gpioSetValue(SCK, 1); - //delayms(1); - } - gpioSetValue(CS, 0); - //delayms(0); +static void select() { + /* the LCD requires 9-Bit frames */ + uint32_t configReg = ( SSP_SSP0CR0_DSS_9BIT // Data size = 9-bit + | SSP_SSP0CR0_FRF_SPI // Frame format = SPI + | SSP_SSP0CR0_SCR_8); // Serial clock rate = 8 + SSP_SSP0CR0 = configReg; + gpioSetValue(RB_LCD_CS, 0); } -void lcdRead(uint8_t data) -{ - uint8_t i; - - gpioSetDir(SDA, 1); - gpioSetValue(SCK, 0); - delayms(1); - gpioSetValue(CS, 0); - delayms(1); - - gpioSetValue(SDA, 0); - delayms(1); - gpioSetValue(SCK, 1); - delayms(1); - - for(i=0; i<8; i++){ - gpioSetValue(SCK, 0); - delayms(1); - if( data & 0x80 ) - gpioSetValue(SDA, 1); - else - gpioSetValue(SDA, 0); - data <<= 1; - gpioSetValue(SCK, 1); - delayms(1); - } - - gpioSetDir(SDA, 0); - for(i=0; i<8; i++){ - gpioSetValue(SCK, 0); - delayms(1); - gpioSetValue(SCK, 1); - delayms(1); - } - - gpioSetValue(CS, 0); - delayms(1); +static void deselect() { + gpioSetValue(RB_LCD_CS, 1); + /* reset the bus to 8-Bit frames that everyone else uses */ + uint32_t configReg = ( SSP_SSP0CR0_DSS_8BIT // Data size = 8-bit + | SSP_SSP0CR0_FRF_SPI // Frame format = SPI + | SSP_SSP0CR0_SCR_8); // Serial clock rate = 8 + SSP_SSP0CR0 = configReg; } -void lcdInit(void) -{ - //IOCON_SWCLK_PIO0_10 = 0x51; - gpioSetValue(RST, 1); - gpioSetValue(CS, 1); +static void lcdWrite(uint8_t cd, uint8_t data) { + uint16_t frame = 0x0; + + frame = cd << 8; + frame |= data; + + while ((SSP_SSP0SR & (SSP_SSP0SR_TNF_NOTFULL | SSP_SSP0SR_BSY_BUSY)) != SSP_SSP0SR_TNF_NOTFULL); + SSP_SSP0DR = frame; + while ((SSP_SSP0SR & (SSP_SSP0SR_BSY_BUSY|SSP_SSP0SR_RNE_NOTEMPTY)) != SSP_SSP0SR_RNE_NOTEMPTY); + /* clear the FIFO */ + frame = SSP_SSP0DR; +} + +void lcdInit(void) { + sspInit(0, sspClockPolarity_Low, sspClockPhase_RisingEdge); + + gpioSetValue(RB_LCD_CS, 1); + gpioSetValue(RB_LCD_RST, 1); + + gpioSetDir(RB_LCD_CS, gpioDirection_Output); + gpioSetDir(RB_LCD_RST, gpioDirection_Output); - gpioSetDir(RST, 1); - gpioSetDir(CS, 1); - gpioSetDir(SCK, 1); - - delayms(100); - gpioSetValue(RST, 0); + gpioSetValue(RB_LCD_RST, 0); delayms(100); - gpioSetValue(RST, 1); + gpioSetValue(RB_LCD_RST, 1); delayms(100); - lcdWrite(0,0xE2); + select(); + + lcdWrite(TYPE_CMD,0xE2); delayms(5); - lcdWrite(0,0xAF); - lcdWrite(0,0xA4); - lcdWrite(0,0x2F); - lcdWrite(0,0xB0); - lcdWrite(0,0x10); - lcdWrite(0,0x00); + lcdWrite(TYPE_CMD,0xAF); + lcdWrite(TYPE_CMD,0xA4); + lcdWrite(TYPE_CMD,0x2F); + lcdWrite(TYPE_CMD,0xB0); + lcdWrite(TYPE_CMD,0x10); + lcdWrite(TYPE_CMD,0x00); uint16_t i; for(i=0; i<100; i++) - lcdWrite(1,0x00); + lcdWrite(TYPE_DATA,0x00); + + deselect(); } void lcdFill(char f){ - int x; - for(x=0;x