Wince设计LCD显示的地方有三个文件:
S3c2440a_lcd.h (d:/wince500/platform/smdk2440/src/inc) 7528 2009-11-14
Init.c (d:/wince500/platform/smdk2440/src/kernel/oal) 13050 2009-11-14
S3c2440disp.cpp (d:/wince500/platform/smdk2440/src/drivers/display) 33090 2009-11-14
1、S3c2440a_lcd.h文件主要定义LCD的分辨率、时序等参数需要修改的参数如下:
#define LCD_VBPD 2 //((7)&0xff) //((2)&0xff)
#define LCD_VFPD 2 //((43-1)&0xff) //((6)&0xff)
#define LCD_VSPW 10 //((4-1) &0x3f) //((10) &0x3f)
#define LCD_HBPD 2 //((48)&0x7f) //((37)&0x7f)
#define LCD_HFPD 2 //((16)&0xff) //((20)&0xff)
#define LCD_HSPW 41 //((128)&0xff) //((41)&0xff)
#define CLKVAL_TFT (4) // VCLK = HCLK / ((CLKVAL + 1) * 2) -> About 7 Mhz
#define LCD_CON5 ((0<<12) |(1<<11) | (0<<10) | (1<<9) | (1<<8) | (0<<7) | (0<<6) | (1<<3) | (1<<2) |(0<<1) | (0))
LCD_CON5的配置主要依据S3C2440 datasheet中的描述,看截图1:
2、init.c文件中的InitDisplay(void)函数主要负责LCD控制器的初始化并显示一张LOGO。因为在S3c2440a_lcd.h文件修改的一些参数这里用到了,所以在此修改的参数不多,主要修改三个地方。
13
(0 << 0) ; // disable LCD
*4)) >> 1);
*2 / 1);
显示LOGO部分代码也要修改,16BPP负责ARM内存对齐原则,用memcpy函数把LOGO数值copy到显示缓冲区就可以了,当然大小端要处理好。24BPP颜色有效部分3字节而实际占有了4字节,这是字对齐原则。代码如下:
typedef DWORD (*FBT)[LCD_XSIZE_TFT];
#if BPP16 //16BPP
memcpy((void*)IMAGE_FRAMEBUFFER_UA_BASE,ScreenBitmap, LCD_ARRAY_SIZE_TFT_16BIT);
#else //24BPP
int x,y,p =0;
DWORD c;
FBT frameBuffer16BitTft;
frameBuffer16BitTft =(FBT) IMAGE_FRAMEBUFFER_UA_BASE;
for( y = 0 ; y < LCD_YSIZE_TFT ; y++ )
{
for( x = 0 ; x < LCD_XSIZE_TFT ; x++ )
{
c = ScreenBitmap[p] | (ScreenBitmap[p+1]<<8) |(ScreenBitmap[p+2]<<16) ;
if ( ( x < LCD_XSIZE_TFT) && ( y < LCD_YSIZE_TFT) )
frameBuffer16BitTft[y][x] = c ;
p += 3 ;
}
}
#endif
3、S3c2440disp.cpp文件是LCD驱动的主文件和初始化入口,wince的GDI图形系统通过调用S3C2440DISP()的得到显示参数(实现分辨率、颜色深度动态撤换?!)。这个文件修改三处即OK。如下图所示:
重新编译NK,运行可看效果。
S3c2440a_lcd.h (d:/wince500/platform/smdk2440/src/inc) 7528 2009-11-14
Init.c (d:/wince500/platform/smdk2440/src/kernel/oal) 13050 2009-11-14
S3c2440disp.cpp (d:/wince500/platform/smdk2440/src/drivers/display) 33090 2009-11-14
1、S3c2440a_lcd.h文件主要定义LCD的分辨率、时序等参数需要修改的参数如下:
#define LCD_VBPD 2 //((7)&0xff) //((2)&0xff)
#define LCD_VFPD 2 //((43-1)&0xff) //((6)&0xff)
#define LCD_VSPW 10 //((4-1) &0x3f) //((10) &0x3f)
#define LCD_HBPD 2 //((48)&0x7f) //((37)&0x7f)
#define LCD_HFPD 2 //((16)&0xff) //((20)&0xff)
#define LCD_HSPW 41 //((128)&0xff) //((41)&0xff)
#define CLKVAL_TFT (4) // VCLK = HCLK / ((CLKVAL + 1) * 2) -> About 7 Mhz
#define LCD_CON5 ((0<<12) |(1<<11) | (0<<10) | (1<<9) | (1<<8) | (0<<7) | (0<<6) | (1<<3) | (1<<2) |(0<<1) | (0))
LCD_CON5的配置主要依据S3C2440 datasheet中的描述,看截图1:
2、init.c文件中的InitDisplay(void)函数主要负责LCD控制器的初始化并显示一张LOGO。因为在S3c2440a_lcd.h文件修改的一些参数这里用到了,所以在此修改的参数不多,主要修改三个地方。
13
(0 << 0) ; // disable LCD
*4)) >> 1);
*2 / 1);
显示LOGO部分代码也要修改,16BPP负责ARM内存对齐原则,用memcpy函数把LOGO数值copy到显示缓冲区就可以了,当然大小端要处理好。24BPP颜色有效部分3字节而实际占有了4字节,这是字对齐原则。代码如下:
typedef DWORD (*FBT)[LCD_XSIZE_TFT];
#if BPP16 //16BPP
memcpy((void*)IMAGE_FRAMEBUFFER_UA_BASE,ScreenBitmap, LCD_ARRAY_SIZE_TFT_16BIT);
#else //24BPP
int x,y,p =0;
DWORD c;
FBT frameBuffer16BitTft;
frameBuffer16BitTft =(FBT) IMAGE_FRAMEBUFFER_UA_BASE;
for( y = 0 ; y < LCD_YSIZE_TFT ; y++ )
{
for( x = 0 ; x < LCD_XSIZE_TFT ; x++ )
{
c = ScreenBitmap[p] | (ScreenBitmap[p+1]<<8) |(ScreenBitmap[p+2]<<16) ;
if ( ( x < LCD_XSIZE_TFT) && ( y < LCD_YSIZE_TFT) )
frameBuffer16BitTft[y][x] = c ;
p += 3 ;
}
}
#endif
3、S3c2440disp.cpp文件是LCD驱动的主文件和初始化入口,wince的GDI图形系统通过调用S3C2440DISP()的得到显示参数(实现分辨率、颜色深度动态撤换?!)。这个文件修改三处即OK。如下图所示:
重新编译NK,运行可看效果。