void SwapBuffer(){
LPC_LCD->UPBASE = (VIDEOWAITBUFFER_BASE_ADDR) & ~7UL ;
LPC_LCD->LPBASE = (VIDEOWAITBUFFER_BASE_ADDR) & ~7UL ;
DMI_SDRAM->TransferType = GPDMA_TRANSFERTYPE_M2M;
DMI_SDRAM->TransferSize = 4000;
DMI_SDRAM->TransferWidth = 2;
for(j=0;j<6;j++){
for(i=0;i<8;i++){
DMI_SDRAM->ChannelNum = i;
DMI_SDRAM->SrcMemAddr = VIDEOWAITBUFFER_BASE_ADDR+4000*i*4+16000*8*j;
DMI_SDRAM->DstMemAddr = VIDEOBUFFER_BASE_ADDR+4000*i*4+16000*8*j;
GPDMA_Setup(DMI_SDRAM);
GPDMA_ChannelCmd(i,ENABLE);
}
for(i=0;i<200000;i++);
}
LPC_LCD->UPBASE = (VIDEOBUFFER_BASE_ADDR) & ~7UL ;
LPC_LCD->LPBASE = (VIDEOBUFFER_BASE_ADDR) & ~7UL ;
.
.
.
.
|
voidInitSDMEM(){
uint32_t i=0;
volatile unsigned long Dummy;
PINSEL_ConfigPin(2,16,1); // /CAS
PINSEL_ConfigPin(2,17,1); // /RAS
PINSEL_ConfigPin(2,18,1); // CLK
PINSEL_ConfigPin(2,24,1); // CKE
PINSEL_ConfigPin(2,28,1); // LDQM
PINSEL_ConfigPin(2,29,1); // UDQM
PINSEL_ConfigPin(2,20,1); // /DYCS
for(;i<16;i++){
PINSEL_ConfigPin(3,i,1); // DATA(i)
}
for(i=0;i<15;i++){
PINSEL_ConfigPin(4,i,1); // DATA(i)
}
PINSEL_ConfigPin(4,25,1); // /WE
LPC_SC->PCONP |= (1<<11); // Power on EMC Clock
LPC_SC->EMCDLYCTL |= (4 <<16); // CLK = 100MHz According datasheet
LPC_EMC->DynamicControl = 0x0183; // NOP COMMAND
for(i= 200*30; i;i--);
LPC_EMC->DynamicControl = 0x0103; // PALL COMMAND
LPC_EMC->Control = 1;
LPC_EMC->DynamicReadConfig = 1;
LPC_EMC->DynamicRP = P2C(SDRAM_TRP);
LPC_EMC->DynamicRAS = P2C(SDRAM_TRAS);
LPC_EMC->DynamicSREX = P2C(SDRAM_TXSR);
LPC_EMC->DynamicAPR = SDRAM_TAPR;
LPC_EMC->DynamicDAL = SDRAM_TDAL+P2C(SDRAM_TRP);
LPC_EMC->DynamicWR = SDRAM_TWR;
LPC_EMC->DynamicRC = P2C(SDRAM_TRC);
LPC_EMC->DynamicRFC = P2C(SDRAM_TRFC);
LPC_EMC->DynamicXSR = P2C(SDRAM_TXSR);
LPC_EMC->DynamicRRD = P2C(SDRAM_TRRD);
LPC_EMC->DynamicMRD = SDRAM_TMRD;
LPC_EMC->DynamicConfig0 = 0x0080680;
LPC_EMC->DynamicRefresh = 0x100;//P2C(SDRAM_REFRESH) >> 4;
LPC_EMC->DynamicRasCas0 = 0x303;
LPC_EMC->DynamicControl = 0x00000083; // MODE COMMAND
Dummy = *((volatile uint32_t *)(SDRAM_BASE_ADDR | (0x33<<12)));
LPC_EMC->DynamicControl = 0x0000;
for(i = 100000; i;i--);
}
#define REFRESH_FREQ 100//Hz
#define LCDDCLK(uint8_t)(120000000*((1.0/REFRESH_FREQ)/(TFTLCD_X_SIZE*TFTLCD_Y_SIZE)))
void TFTLCDInit(){
uint32_t i;
TFTLCDConfigPins();
LPC_LCD->CRSR_CTRL &=~(1<<0);
LPC_SC->PCONP |= 1;//Power On LCD Controller
LPC_LCD->TIMH = (HSW - 1)<<8 | (HFP - 1)<<16 | (HBP - 1)<<24;
LPC_LCD->TIMV = (LPP - 1)<<0 | (VSW - 1)<<10 | (VFP)<<16 | (VBP)<<24;
LPC_LCD->POL = LCDDCLK | ( (ACB - 1)<<6 ) | (IVS<<11) | (IHS<<12) | (IPC<<13) | (CPL-1)<<16; // ~40Hz Refresh
LPC_LCD->CTRL = (6 << 1) | (1 << 5);
LPC_LCD->UPBASE = VIDEOBUFFER_BASE_ADDR & ~7UL ;
LPC_LCD->LPBASE = VIDEOBUFFER_BASE_ADDR & ~7UL ;
for (i = 0; i < ( sizeof(LPC_LCD->PAL) / sizeof(LPC_LCD->PAL[0]) ); i++)
LPC_LCD->PAL = 0; //Clear the color palette with black
LPC_LCD->CTRL |= (1<<0);/* LCD enable control bit */
for(i = TFTLCD_PWR_ENA_DIS_DLY; i; i--);
LPC_LCD->CTRL |= (1<<11);/* enable power */
}
|
void TFTLCDInit(){
uint32_t i;
TFTLCDConfigPins();
LPC_LCD->CRSR_CTRL &=~(1<<0);
LPC_SC->PCONP |= 1;//Power On LCD Controller
LPC_LCD->TIMH = (HSW - 1)<<8 | (HFP - 1)<<16 | (HBP - 1)<<24;
LPC_LCD->TIMV = (LPP - 1)<<0 | (VSW - 1)<<10 | (VFP)<<16 | (VBP)<<24;
LPC_LCD->POL = LCDDCLK | ( (ACB - 1)<<6 ) | (IVS<<11) | (IHS<<12) | (IPC<<13) | (CPL-1)<<16;
LPC_LCD->CTRL = (6 << 1) | (1 << 5);
LPC_LCD->UPBASE = VIDEOBUFFER_BASE_ADDR & ~7UL ;
for (i = 0; i < ( sizeof(LPC_LCD->PAL) / sizeof(LPC_LCD->PAL[0]) ); i++)
LPC_LCD->PAL = 0; //Clear the color palette with black
LPC_LCD->CTRL |= (1<<0);/* LCD enable control bit */
for(i = TFTLCD_PWR_ENA_DIS_DLY; i; i--);
LPC_LCD->CTRL |= (1<<11);/* enable power */
}
.
.
.
void SwapBuffer(){
uint32_t i=0,j=0;
LPC_LCD->UPBASE = (VIDEOWAITBUFFER_BASE_ADDR) & ~7UL ;
DMI_SDRAM->TransferType = GPDMA_TRANSFERTYPE_M2M;
DMI_SDRAM->TransferSize = 4000;
DMI_SDRAM->TransferWidth = 2;
for(j=0;j<6;j++){
for(i=0;i<8;i++){
DMI_SDRAM->ChannelNum = i;
DMI_SDRAM->SrcMemAddr = VIDEOWAITBUFFER_BASE_ADDR+4000*i*4+16000*8*j;
DMI_SDRAM->DstMemAddr = VIDEOBUFFER_BASE_ADDR+4000*i*4+16000*8*j;
GPDMA_Setup(DMI_SDRAM);
GPDMA_ChannelCmd(i,ENABLE);
}
for(i=0;i<68000;i++); // a short delay
}
LPC_LCD->UPBASE = (VIDEOBUFFER_BASE_ADDR) & ~7UL ;
}
.
.
.
void SetPixel(uint16_t X, uint16_t Y, RGB16 color)
{
uint16_t *pLCDbuf = (uint16_t *)VIDEOWAITBUFFER_BASE_ADDR; /* LCD buffer start address */
pLCDbuf[ Y * SCREEN_WIDTH + X ] = color.A | color.B<<8;
}
.
.
.
// An Analog Watch Drawing
void DrawWatch(uint16_t x,uint16_t y){
double m=20,h=0,s=0,ma,ha,sa;
ClearScreen(White);
while(1){
Delay(0x5FFF);
ClearScreen(White);
sa = (-0.5+s/30.0)*3.14;
ma = (-0.5+m/30.0)*3.14;
ha = (-0.5+h/24.0)*3.14+((m/360)*3.14);
DrawCircle(x,y,100,LightGrey,3);
DrawLine(cos(ha)*-20.0+x,sin(ha)*-20.0+y,cos(ha)*60.0+x,sin(ha)*60.0+y,LightGrey,3);
DrawLine(cos(ma)*-20.0+x,sin(ma)*-20.0+y,cos(ma)*80.0+x,sin(ma)*80.0+y,LightGrey,3);
DrawLine(cos(sa)*-30.0+x,sin(sa)*-30.0+y,cos(sa)*80.0+x,sin(sa)*80.0+y,Red,2);
SwapBuffer();
s = RTC_GetTime(LPC_RTC,RTC_TIMETYPE_SECOND);
m = RTC_GetTime(LPC_RTC,RTC_TIMETYPE_MINUTE);
h = RTC_GetTime(LPC_RTC,RTC_TIMETYPE_HOUR);
}
}
|