本文以1024*768分辨率的TFT_16BPP真彩LCD为例,说明在WIN CE 4.2中驱动程序的修改事项,目标板的微处理器是S
3C
2410A
。
3. s 3c 2410disp.cpp
…/WINCE420/PLATFORM/SMDK2410/DRIVERS/DISPLAY/S 3C 2410LCD/s 3c 2410disp.cpp
该LCD的时序图如下图所示:
Note
:
LCD
时序的参数和时钟相位因不同
LCD
而异
,
请参考相应
LCD
的
datasheet.
在WIN CE 4.2中修改LCD驱动程序有五个相关文件,分别是:
1. …/WINCE420/PLATFORM/SMDK2410/INC/s2410.h
2. …/WINCE420/PLATFORM/SMDK2410/KERNEL/HAL/cfw.c
3. …/WINCE420/PLATFORM/SMDK2410/DRIVERS/DISPLAY/S 3C 2410LCD/s 3c 2410disp.cpp
4. …/WINCE420/PLATFORM/SMDK2410/FILES/config.bib
5. …/ WINCE420/PLATFORM/SMDK2410/FILES/platform.reg
1. …/WINCE420/PLATFORM/SMDK2410/INC/s2410.h
2. …/WINCE420/PLATFORM/SMDK2410/KERNEL/HAL/cfw.c
3. …/WINCE420/PLATFORM/SMDK2410/DRIVERS/DISPLAY/S 3C 2410LCD/s 3c 2410disp.cpp
4. …/WINCE420/PLATFORM/SMDK2410/FILES/config.bib
5. …/ WINCE420/PLATFORM/SMDK2410/FILES/platform.reg
1. s2410.h
…/WINCE420/PLATFORM/SMDK2410/INC/s2410.h
主要有 LCD 控制器的寄存器定义、 LCD 控制器的工作时序定义、分辨率的定义等等。红色部分为修改后的内容:
#define LCDTYPE TFT16BPP
#define LCD_TYPE TFTxxx_xxx
#define SCR_XSIZE_TFT (1280)
#define SCR_YSIZE_TFT (960)
#define LCD_XSIZE_TFT (1024)
#define LCD_YSIZE_TFT (768)
#define VBPD ((2-1)&0xff)
#define VFPD ((2-1)&0xff)
#define VSPW ((2-1) &0x 3f )
#define HBPD ((16-1)&0x 7f )
#define HFPD ((200-1)&0xff)
#define HSPW ((16-1)&0xff)
#define CLKVAL_TFT (1) // 这个值的定义在 LCD 初始化函数中并不用到 , 而是直接用数值表示。
2. cfw.c
…/WINCE420/PLATFORM/SMDK2410/KERNEL/HAL/cfw.c
红色部分为修改后的内容:
static void InitDisplay()
{
********
s2410LCD->rLCDCON1=(1<<8)|(MVAL_USED<<7)|(3<<5)|(12<<1)|0;
// CLKVAL_TFT = 1 , HCLK = 100MHz -> VCLK = 25MHz
// TFT LCD panel
//16 bpp for TFT
s2410LCD->rLCDCON2=(VBPD<<24)|(LINEVAL_TFT<<14)|(VFPD<<6)|(VSPW);
s2410LCD->rLCDCON3=(HBPD<<19)|(HOZVAL_TFT<<8)|(HFPD);
s2410LCD->rLCDCON4=(MVAL<<8)|(HSPW);
s2410LCD->rLCDCON5=
(1<<11)|(0<<10)|(0<<9)|(0<<8)|(0<<7)|(0<<6)|(0<<3)|(0<<1)|(1<<0);
// 5:6:5 Format
//The video data is fetched at VCLK falling edge
//VLINE/HSYNC pulse polarity-Normal
//VFRAME/VSYNC pulse polarity-Normal
//VD (video data) pulse polarity-Normal
//VDEN signal polarity-Normal
//Disable PWREN signal
//Byte swap Disable
//Half-Word swap Enable
********
}
…/WINCE420/PLATFORM/SMDK2410/INC/s2410.h
主要有 LCD 控制器的寄存器定义、 LCD 控制器的工作时序定义、分辨率的定义等等。红色部分为修改后的内容:
#define LCDTYPE TFT16BPP
#define LCD_TYPE TFTxxx_xxx
#define SCR_XSIZE_TFT (1280)
#define SCR_YSIZE_TFT (960)
#define LCD_XSIZE_TFT (1024)
#define LCD_YSIZE_TFT (768)
#define VBPD ((2-1)&0xff)
#define VFPD ((2-1)&0xff)
#define VSPW ((2-1) &0x 3f )
#define HBPD ((16-1)&0x 7f )
#define HFPD ((200-1)&0xff)
#define HSPW ((16-1)&0xff)
#define CLKVAL_TFT (1) // 这个值的定义在 LCD 初始化函数中并不用到 , 而是直接用数值表示。
2. cfw.c
…/WINCE420/PLATFORM/SMDK2410/KERNEL/HAL/cfw.c
红色部分为修改后的内容:
static void InitDisplay()
{
********
s2410LCD->rLCDCON1=(1<<8)|(MVAL_USED<<7)|(3<<5)|(12<<1)|0;
// CLKVAL_TFT = 1 , HCLK = 100MHz -> VCLK = 25MHz
// TFT LCD panel
//16 bpp for TFT
s2410LCD->rLCDCON2=(VBPD<<24)|(LINEVAL_TFT<<14)|(VFPD<<6)|(VSPW);
s2410LCD->rLCDCON3=(HBPD<<19)|(HOZVAL_TFT<<8)|(HFPD);
s2410LCD->rLCDCON4=(MVAL<<8)|(HSPW);
s2410LCD->rLCDCON5=
(1<<11)|(0<<10)|(0<<9)|(0<<8)|(0<<7)|(0<<6)|(0<<3)|(0<<1)|(1<<0);
// 5:6:5 Format
//The video data is fetched at VCLK falling edge
//VLINE/HSYNC pulse polarity-Normal
//VFRAME/VSYNC pulse polarity-Normal
//VD (video data) pulse polarity-Normal
//VDEN signal polarity-Normal
//Disable PWREN signal
//Byte swap Disable
//Half-Word swap Enable
********
}
红色部分为修改后的内容:
WORD TempBuffer[1025][768];
S 3C 2410DISP::S 3C 2410DISP (void)
{
********
m_nScreenWidth = 1024;
m_nScreenHeight = 768;
*********
}
到此修改工作基本完成,但还要一个问题:1024*768分辨率占用的显示缓冲区大小是:1024*768*2 = 1536 K Bytes,因此要确认所分配的内存空间够不够,是在config.bib文件中定义的。如果以前定义的足够大,后面的步骤可以省略了。
WORD TempBuffer[1025][768];
S 3C 2410DISP::S 3C 2410DISP (void)
{
********
m_nScreenWidth = 1024;
m_nScreenHeight = 768;
*********
}
到此修改工作基本完成,但还要一个问题:1024*768分辨率占用的显示缓冲区大小是:1024*768*2 = 1536 K Bytes,因此要确认所分配的内存空间够不够,是在config.bib文件中定义的。如果以前定义的足够大,后面的步骤可以省略了。
3. s 3c 2410disp.cpp
…/WINCE420/PLATFORM/SMDK2410/DRIVERS/DISPLAY/S 3C 2410LCD/s 3c 2410disp.cpp