📄 lcd.c
字号:
LCD_DCLK_Hi; // CLOCK = High
LCD_DSERI_Hi; // data = High
udelay(DELAY);
if(flag==0)
{
//start a new communication for write command data.
LCD_DEN_Lo; // EN = Low CS Low
udelay(DELAY);
//send start byte first for command data write.
start_byte = LDIC_STARTBYTE_CMDWRITE;
spi_sendbyte(start_byte);
spi_sendbyte((UINT8)(conf_data>> 8));
spi_sendbyte((UINT8)conf_data);
LCD_DEN_Hi; // EN = High CS high
LCD_DCLK_Hi; // CLOCK = High
LCD_DSERI_Hi; // data = High
}
}
#else
#error "ERROR: Unknown project define." __FILE__
#endif
else
{
DELAY = conf_data * LCD_DELAY_1MS;
udelay(DELAY);
}
}
/*********************************************************************
;* Project Name : s3c2443x
;*
;* Copyright 2007.05.25 by amoi Electronics, Inc.
;* All rights reserved.
;* Init LCD Panel for QVGA
;**********************************************************************/
void Init_LCDPanel(void)
{
s8 i=0;
if(g_s2440IOP==NULL)
{
g_s2440IOP = (S3C24X0_GPIO *)S3C24X0_GetBase_GPIO();
}
printf("Init_LCDPanel start \r\n");
//LCD Power ON and Reset
CLRREG32(&g_s2440IOP->GPCCON,(3<<(LCD_RESET_C0IO*2)));
SETREG32(&g_s2440IOP->GPCCON,(1<<(LCD_RESET_C0IO*2)));
//LCD module poweron sequence.
#if defined(LCD_TM240320LNFWUGWA5)
CLRREG32(&g_s2440IOP->GPDCON,(3<<(LCD_SD_D10IO*2)));
SETREG32(&g_s2440IOP->GPDCON,(1<<(LCD_SD_D10IO*2)));
SETREG32(&g_s2440IOP->GPDDAT,LCD_SD);
udelay(50);
CLRREG32(&g_s2440IOP->GPDDAT,LCD_SD);
udelay(50);
#elif defined(LCD_L4F00242T05)
CLRREG32(&g_s2440IOP->GPDCON,(3<<(LCD_SD_D10IO*2)));
SETREG32(&g_s2440IOP->GPDCON,(1<<(LCD_SD_D10IO*2)));
SETREG32(&g_s2440IOP->GPDUP,LCD_SD);
CLRREG32(&g_s2440IOP->GPDDAT,LCD_SD);
udelay(50);
#endif
CLRREG32(&g_s2440IOP->GPCDAT, LCD_RESET);
udelay(100);
SETREG32(&g_s2440IOP->GPCDAT, LCD_RESET);
udelay(1000*100);
initspi();
///////////////////////////////////////////////////////////////////
// Init Lcd panel Function
//////////////////////////////////////////////////////////////////
while(i<dimof(Conf_data))
{
spi_write_config(&Conf_data[i]);
i++;
}
udelay(LCD_DELAY_1MS*10);
}
static void Init_LCDController(void)
{
unsigned int clkval_calc; // 040507
u32 regdata;
printf("Init_LCDController \r\n");
if(g_s2440LCD==NULL)
{
g_s2440LCD = (S3C24X0_LCD*)S3C24X0_GetBase_LCD();
}
//init lcd controller for vga
clkval_calc = (s16)(get_HCLK()/(2*LCD_VCLK))-1;
printf("\n clkval_calc = %d \n", clkval_calc);
regdata = (clkval_calc << 8) | /* VCLK = HCLK / ((CLKVAL + 1) * 2) -> About 5.48 Mhz */
(0<< 7) | /* 0 : Each Frame */
(LCD_TYPE<< 5) | /* TFT LCD Pannel */
(LCD_TYPE_TFT16BPP<< 1) | /* 16bpp Mode */
(0 << 0) ; /* Disable LCD Output */
OUTREG32(&g_s2440LCD->LCDCON1, regdata);
regdata = (LCD_VBPD << 24) | /* VBPD : 2 */
(LCD_LINEVAL_TFT << 14) | /* Vertical Size : 640 - 1 */
(LCD_VFPD << 6) | /* VFPD : 16 */
(LCD_VSPW << 0) ; /* VSPW : 2 */
OUTREG32(&g_s2440LCD->LCDCON2, regdata);
regdata = (LCD_HBPD << 19) | /* HBPD : 8 */
(LCD_HOZVAL_TFT << 8) | /* HOZVAL_TFT : 480 - 1 */
(LCD_HFPD << 0) ; /* HFPD : 104 */
OUTREG32(&g_s2440LCD->LCDCON3, regdata);
regdata = (LCD_MVAL << 8) | /* MVAL : 13 */
(LCD_HSPW << 0) ; /* HSPW : 8 */
OUTREG32(&g_s2440LCD->LCDCON4, regdata);
regdata = (0 << 12) | /* BPP24BL : LSB valid */
(1 << 11) | /* FRM565 MODE : 5:6:5 Format */
(1 << 10) | /* INVVCLK : VCLK Falling Edge */
#if defined(LCD_L4F00242T05)
(1 << 9) | /* INVVLINE : Inverted Polarity */
(1 << 8) | /* INVVFRAME : Inverted Polarity */
#else
(0 << 9) | /* INVVLINE : Inverted Polarity */
(0 << 8) | /* INVVFRAME : Inverted Polarity */
#endif
(0 << 7) | /* INVVD : Normal */
(0 << 6) | /* INVVDEN : Normal */
(0 << 5) | /* INVPWREN : Normal */
(0 << 4) | /* INVENDLINE : Normal */
(1 << 3) | /* PWREN : Disable PWREN */
(0 << 2) | /* ENLEND : Disable LEND signal */
(0 << 1) | /* BSWP : Swap Disable */
(1 << 0) ; /* HWSWP : Swap Enable */
SETREG32(&g_s2440LCD->LCDCON5, regdata);
printf("\n panel_info.s3c.screen = %x \n", panel_info.s3c.screen);
regdata = (((panel_info.s3c.screen - VAR_MAP_OFF) >> 22) << 21) |
((M5D((panel_info.s3c.screen - VAR_MAP_OFF) >> 1)) << 0);
OUTREG32(&g_s2440LCD->LCDSADDR1,regdata);
regdata = M5D(((panel_info.s3c.screen - VAR_MAP_OFF) + (LCD_XSIZE_TFT * LCD_YSIZE_TFT * 2)) >> 1);
OUTREG32(&g_s2440LCD->LCDSADDR2, regdata);
regdata = (((LCD_XSIZE_TFT - LCD_XSIZE_TFT) / 1) << 11) | (LCD_XSIZE_TFT / 1);
OUTREG32(&g_s2440LCD->LCDSADDR3, regdata);
CLRREG32(&g_s2440LCD->LPCSEL, 0x17);
OUTREG32(&g_s2440LCD->TPAL, 0x0);
}
void BootInitDisplay(void)
{
u32 regdata;
if(g_s2440IOP==NULL)
{
g_s2440IOP = (S3C24X0_GPIO *)S3C24X0_GetBase_GPIO();
}
if(g_s2440LCD==NULL)
{
g_s2440LCD = (S3C24X0_LCD *)S3C24X0_GetBase_LCD();
}
if(g_sCLKPWRReg == NULL)
{
g_sCLKPWRReg = (S3C24X0_CLOCK_POWER *)S3C24X0_GetBase_CLOCK_POWER();
}
// Turn on LCD device clock
if(!(INREG32(&g_sCLKPWRReg->CLKCON) & LCD_CTL_CLK_ON))
{
SETREG32(&g_sCLKPWRReg->CLKCON, LCD_CTL_CLK_ON);
}
printf("BootInitDisplay start \r\n");
//FrenzWang Pause
//configr the hardware pins for lcd
regdata=((3<<(LCD_PCLK_C1IO*2))|
(3<<(LCD_HCLK_C2IO*2))|
(3<<(LCD_VCLK_C3IO*2))|
(3<<(LCD_DEN_C4IO*2))|
(3<<(LCD_BLUE0_C11IO*2))|
(3<<(LCD_BLUE1_C12IO*2))|
(3<<(LCD_BLUE2_C13IO*2))|
(3<<(LCD_BLUE3_C14IO*2))|
(3<<(LCD_BLUE4_C15IO*2))
);
CLRREG32(&g_s2440IOP->GPCCON, regdata);
regdata = ((2<<(LCD_PCLK_C1IO*2))|
(2<<(LCD_HCLK_C2IO*2))|
(2<<(LCD_VCLK_C3IO*2))|
(2<<(LCD_DEN_C4IO*2))|
(2<<(LCD_BLUE0_C11IO*2))|
(2<<(LCD_BLUE1_C12IO*2))|
(2<<(LCD_BLUE2_C13IO*2))|
(2<<(LCD_BLUE3_C14IO*2))|
(2<<(LCD_BLUE4_C15IO*2))
);
SETREG32(&g_s2440IOP->GPCCON, regdata);
regdata = ((1<<(LCD_PCLK_C1IO))|
(1<<(LCD_HCLK_C2IO))|
(1<<(LCD_VCLK_C3IO))|
(1<<(LCD_DEN_C4IO))|
(1<<(LCD_BLUE0_C11IO))|
(1<<(LCD_BLUE1_C12IO))|
(1<<(LCD_BLUE2_C13IO))|
(1<<(LCD_BLUE3_C14IO))|
(1<<(LCD_BLUE4_C15IO))
);
SETREG32(&g_s2440IOP->GPCUP, regdata);
regdata = ((3<<(LCD_GREEN0_D2IO*2))|
(3<<(LCD_GREEN1_D3IO*2))|
(3<<(LCD_GREEN2_D4IO*2))|
(3<<(LCD_GREEN3_D5IO*2))|
(3<<(LCD_GREEN4_D6IO*2))|
(3<<(LCD_GREEN5_D7IO*2))|
(3<<(LCD_RED0_D11IO*2))|
(3<<(LCD_RED1_D12IO*2))|
(3<<(LCD_RED2_D13IO*2))|
(3<<(LCD_RED3_D14IO*2))|
(3<<(LCD_RED4_D15IO*2))
);
CLRREG32(&g_s2440IOP->GPDCON, regdata);
regdata = ((2<<(LCD_GREEN0_D2IO*2))|
(2<<(LCD_GREEN1_D3IO*2))|
(2<<(LCD_GREEN2_D4IO*2))|
(2<<(LCD_GREEN3_D5IO*2))|
(2<<(LCD_GREEN4_D6IO*2))|
(2<<(LCD_GREEN5_D7IO*2))|
(2<<(LCD_RED0_D11IO*2))|
(2<<(LCD_RED1_D12IO*2))|
(2<<(LCD_RED2_D13IO*2))|
(2<<(LCD_RED3_D14IO*2))|
(2<<(LCD_RED4_D15IO*2))
);
SETREG32(&g_s2440IOP->GPDCON, regdata);
regdata = ((1<<(LCD_GREEN0_D2IO))|
(1<<(LCD_GREEN1_D3IO))|
(1<<(LCD_GREEN2_D4IO))|
(1<<(LCD_GREEN3_D5IO))|
(1<<(LCD_GREEN4_D6IO))|
(1<<(LCD_GREEN5_D7IO))|
(1<<(LCD_RED0_D11IO))|
(1<<(LCD_RED1_D12IO))|
(1<<(LCD_RED2_D13IO))|
(1<<(LCD_RED3_D14IO))|
(1<<(LCD_RED4_D15IO))
);
SETREG32(&g_s2440IOP->GPDUP, regdata);
Init_LCDPanel();
Init_LCDController();
}
void BootStartDisplay(void )
{
s8 i=0;
printf("BootStartDisplay start \r\n");
//Enable lcd controller.
SETREG32(&g_s2440LCD->LCDCON1, 1);
// Display a bitmap image on the LCD...
memcpy((void *)panel_info.s3c.screen, newplus_logo, sizeof(newplus_logo));
//Enable panel display.
while(i<dimof(Conf_data_PnlOn))
{
spi_write_config(&Conf_data_PnlOn[i]);
i++;
}
}
void BootStopDisplay(void )
{
CLRREG32(&g_s2440LCD->LCDCON1, 1);
}
void BootDeinitDisplay(void)
{
g_s2440LCD->LCDCON1 = 0;
g_s2440LCD->LCDCON2 = 0;
g_s2440LCD->LCDCON3 = 0;
g_s2440LCD->LCDCON4 = 0;
g_s2440LCD->LCDCON5 = 0;
g_s2440LCD->LCDSADDR1 = 0;
g_s2440LCD->LCDSADDR2 = 0;
g_s2440LCD->LCDSADDR3 = 0;
g_s2440LCD->LPCSEL = 0;
g_s2440LCD->TPAL = 0;
g_s2440IOP=NULL;
g_s2440LCD=NULL;
if(INREG32(&g_sCLKPWRReg->CLKCON) & LCD_CTL_CLK_ON)
{
CLRREG32(&g_sCLKPWRReg->CLKCON, LCD_CTL_CLK_ON);
}
g_sCLKPWRReg = NULL;
return;
}
void lcd_ctrl_init (void *lcdbase)
{
//reset_lcd( );
//init_lcd_register( );
s3cfb_init_mem(lcdbase, &panel_info);
BootInitDisplay();
BootStartDisplay();
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -