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); } } |