VCLK信号的频率取决于LCDCON1寄存器中的CLKVAL域。VCLK和CLKVAL的关系如下,其中CLKVAL的最小值是0:
VCLK(Hz)=HCLK/[(CLKVAL+1)×2] (3)
帧频率是VSYNC信号的频率,它与LCDCON1和LCDCON2/3/4寄存器的VSYNC、VBPD、VFPD、LINEVAL、HSYNC、HBPD、HFPD、HOZVAL和CLKVAL都有关系。大多数LCD驱动器都需要与显示器相匹配的帧频率,帧频率计算公式如下:
FrameRate=1/{[(VSPW+1)+(VBPD+1)+(LINEVAL+1)+(VFPD+1)]×[(HSPW+1)+
(HBPD+1)+(HFPD+1)+(HOZVAL+1)]×[2×(CLKVAL+1)/(HCLK)]} (4)
参照CJM10C0101的参数和公式(1)、(2),可得出HOZVAL=639;LINEVAL=479。其余主要寄存器的值在下面给出。
3 CJM10C0101的逻辑、时序要求[2]
各时间参数见表1。

根据时序要求,我们设定VM/VDEN信号作LCD的ENAB信号,VCLK信号作LCD的NCLK信号。要想得到合适的VM和VCLK波形,就要正确设定寄存器的值,根据寄存器的值与VM和VCLK波形的关系,我们设定了如下关键寄存器的值:
HSPW=10;HBPD=100;HFPD=47;
VSPW=1;VBPD=37;VFPD=4
S3C2410的HCLK工作频率为100MHz左右,因此根据公式(3)设CLKVAL=1。这些值将在驱动程序中得到具体体现。

4 硬件驱动电路组成
因为开发板引出管脚有限,只引出了16根视频数据线,所以我们只利用这16根数据线扩充为18根作CJM10C0101的数据输入线,即RB信号的最低两位共用一根数据线。CJM10C0101要求其电源电压Vdd典型值为5V,并且LCD数据和控制信号的高电平输入电压V在[3.5V,Vdd]范围内,低电平输入电压Vil在[0,1.5V]范围内,故用4片74LVC4245进行3~5V的逻辑电平转换,具体电路如图4。同时考虑到通用性,使74LVC4245的电源为3V/5V可选,这样也能驱动3V逻辑电平的TFT-LCD。

5 嵌入式Linux下驱动程序的开发[6]
FrameBuffer是出现在Linux2.2.xx内核当中的一种驱动程序接口,对应的源文件在linux/drivers/video/目录下,总的抽象设备文件为fbcon.c。这种接口将显示设备抽象为帧缓冲区。用户可以将它看成是显示内存的一个映像。
在使用帧缓冲时,Linux是将显卡置于图形模式下的。
我们根据以上对LCD各主要寄存器设置的分析得出的结果,开发了基于FrameBuffer机制的S3C2410 fb驱动程序。下面是经过调试成功的部分代码,作用是对显示屏幕初始化和设置LCD控制寄存器的值。
/*s3c2410fb.c */
………………
#ifdef CONFIG-S3C2410-SMDK
static struct s3c2410fb-mach-info xxx-stn-info-initdata={
pixclock:174757, bpp:16,
#ifdef CONFIG-FB-S3C2410-EMUL //显示屏幕初始化
xres: 96,
#else
xres: 640,
#endif
yres: 480,
hsync-len: 5, vsync2len: 1,
left-margin: 7, upper-margin: 1,
right-margin: 3, lower-margin: 3,
sync: 0, cmap-static: 1,
reg:{ //设置LCD控制寄存器的值
lcdcon1:LCD1-BPP-16T|LCD1-PNR-TFT|LCD1-CLKVAL(1),
lcdcon2:LCD2-VBPD(37)|LCD2-VFPD(4)|LCD2-VSPW(1),
lcdcon3:LCD3-HBPD(100)|LCD3-HFPD(47),
lcdcon4:LCD4-HSPW(10)|LCD4-MVAL(13),
lcdcon5:LCD5-FRM565|LCD5-HWSWP|LCD5-PWREN,
},
};
#endif
………………