是用LPC2478的LCD控制器驱动4位单色STN 320x240屏,在uboot下初始化并显示,void LcdInit(void)
{
unsigned int i;
static const unsigned char message1[] = "\r\nEntering InitLCD()";
static const unsigned char message2[] = "\r\nEntering GenerateTestPattern()";
static const unsigned char message3[] = "\r\nEntering EnableLCD()";
static const unsigned char message4[] = "\r\nExiting LcdInit()\r\n";
unsigned char *pMsg = (unsigned char *)message1 - (unsigned char *)TEXT_BASE;
LCD_INIT_STRUCTURE mylcd;
#if 0
mylcd.xsize = 320;
mylcd.horiz_front_porch = 20;
mylcd.horiz_back_porch = 38;
mylcd.horiz_sync_pulse = 30;
mylcd.ysize = 240;
mylcd.vert_front_porch = 5;
mylcd.vert_back_porch = 15;
mylcd.vert_sync_pulse = 3;
mylcd.color_mode = COLOR_MODE_24BPP;
mylcd.hclk_divider = 14;
#else
mylcd.xsize = 320;
mylcd.horiz_front_porch = 20;
mylcd.horiz_back_porch = 38;
mylcd.horiz_sync_pulse = 30;
mylcd.ysize = 240;
mylcd.vert_front_porch = 5;
mylcd.vert_back_porch = 15;
mylcd.vert_sync_pulse = 3;
mylcd.color_mode = COLOR_MODE_4BPP;
mylcd.hclk_divider = 8;
/* XXX - Ivan */
#endif
for(i=0; i<(sizeof(message1)-1); i++)
{
while((U0LSR & (1<<5)) == 0);
U0THR = *pMsg++;
}
lpc24xx_InitLCD(mylcd);
pMsg = (unsigned char *)message2 - (unsigned char *)TEXT_BASE;
for(i=0; i<(sizeof(message2)-1); i++)
{
while((U0LSR & (1<<5)) == 0);
U0THR = *pMsg++;
}
//lpc24xx_show**bmp();
lpc24xx_GenerateTestPattern();
pMsg = (unsigned char *)message3 - (unsigned char *)TEXT_BASE;
for(i=0; i<(sizeof(message3)-1); i++)
{
while((U0LSR & (1<<5)) == 0);
U0THR = *pMsg++;
}
lpc24xx_EnableLCD();
pMsg = (unsigned char *)message4 - (unsigned char *)TEXT_BASE;
for(i=0; i<(sizeof(message4)-1); i++)
{
while((U0LSR & (1<<5)) == 0);
U0THR = *pMsg++;
}
}
void lpc24xx_InitLCD(LCD_INIT_STRUCTURE lcd)
{
/* this needs to run from the ROM so skip that section for now */
#ifdef LCD_USE_MALLOC
framebuffer = malloc(framebuffer_size);
#else
framebuffer = (void *)LCD_FRAMEBUFFER_START; //显示buf地址,0xa0f00000
#endif
PINSEL4 = PINSEL4 & (~(0xfffff << 0)) | 0xfffff; //只使用lcd0~lcd3
PINSEL11 = PINSEL11 & (~0xf << 0) \
| (1 << 0);
PCONP |= 1<<20; /* Turn On LCD PCLK */
delay_Ns(200);
LCD_CTRL = (1 << LCD_CTRL_LCDEN);
delay_Ns(20);
LCD_UPBASE = ((uint32_t)framebuffer&0xfffffff8); /* make sure the framebuffer is DWORD aligned - fixme */
//LCD_LPBASE = ((uint32_t)framebuffer&0xfffffff8);
//LCD_CTRL = 0;
LCD_CFG = (uint32_t)lcd.hclk_divider << LCD_CFG_CLKDIV;
LCD_TIMH = ((((uint32_t)lcd.horiz_back_porch-1) << LCD_TIMH_HBP ) | \
(((uint32_t)lcd.horiz_front_porch-1) << LCD_TIMH_HFP) | \
(((uint32_t)lcd.horiz_sync_pulse-1) << LCD_TIMH_HSW ) | \
(((lcd.xsize / 16) - 1) << LCD_TIMH_PPL ) );
LCD_TIMV = ( (((uint32_t)lcd.vert_back_porch) << LCD_TIMV_VBP ) | \
(((uint32_t)lcd.vert_front_porch) << LCD_TIMV_VFP) | \
(((uint32_t)lcd.vert_sync_pulse) << LCD_TIMV_VSW ) | \
(( lcd.ysize-1) << LCD_TIMV_LPP ) );
LCD_POL = ( (((uint32_t)0 ) << LCD_POL_PCD_HI ) | \
(((uint32_t)0 ) << LCD_POL_BCD ) | \
(((uint32_t)lcd.xsize-1 ) << LCD_POL_CPL ) | \
(((uint32_t)0 ) << LCD_POL_IOE ) | \
(((uint32_t)0 ) << LCD_POL_IPC ) | \
(((uint32_t)1 ) << LCD_POL_IHS ) | \
(((uint32_t)0 ) << LCD_POL_IVS ) | \
(((uint32_t)6 ) << LCD_POL_ACB ) | \
(((uint32_t)0 ) << LCD_POL_CLKSEL ) | \
(((uint32_t)4 ) << LCD_POL_PCD_LO ) );
LCD_LE = (10 << 0) | (1 << 16);
LCD_INTMSK = 0; /* disable LCD interrupt */
//LCD_UPBASE = ((uint32_t)framebuffer&0xfffffff8); /* make sure the framebuffer is DWORD aligned - fixme */
//LCD_LPBASE = ((uint32_t)framebuffer&0xfffffff8);
LCD_CTRL = ( /*(((uint32_t) 1 ) << LCD_CTRL_BGR ) | \*/
/* (((uint32_t) 1 ) << LCD_CTRL_LCDTFT ) | \*/
(((uint32_t) 0 ) << LCD_CTRL_LCDMONO8) | \
(((uint32_t) 1 ) << LCD_CTRL_LCDBW) | \
(((uint32_t)lcd.color_mode ) << LCD_CTRL_LCDBPP ) );
delay_Ns(20);
LCD_CTRL |= (((uint32_t) 1 ) << LCD_CTRL_LCDPWR);
delay_Ns(20);
}
void lpc24xx_GenerateTestPattern(uint8_t pattern)
{
uint32_t cntr;
uint32_t * ptr;
// if ( (framebuffer == 0) || (framebuffer_size == 0))
// return;
#ifdef LCD_USE_MALLOC
ptr = framebuffer;
#else
ptr = (void *)LCD_FRAMEBUFFER_START;
#endif
{
int x, y;
unsigned char *posy;
unsigned char *posy1;
int LCDx_bpp_res;
LCDx_bpp_res = ((320) * (16))/8;
for(y=0 ; y <( 240); y++)
{
posy = (unsigned char *)(LCD_FRAMEBUFFER_START+ y*LCDx_bpp_res);
for(x=0;x < LCDx_bpp_res ; x++)
{
posy1=(unsigned char *)((unsigned int)(posy+x)^1);
*(posy1)= boot_screenMap[y*LCDx_bpp_res+x];// 这一个图片数组38400,水平扫描,16位灰色 320x240
}
}
}
在uboot的命令行中,使用md a0f0000查看SDRAM的内容,已经是boot_screenMap数组的内容了但是屏幕上无显示
}
|