s3c2416 AT070TN83的LCD wince6.0驱动移植

来源:互联网 发布:python idle怎么用 编辑:程序博客网 时间:2024/05/20 21:20

原文作者地址:http://blog.csdn.net/anthone_ligang/article/details/6837369


1 LCD外部引脚介绍

        VSYNC: 帧同步信号,表示扫描1帧的开始,一帧也就是LCD显示的一个画面。

         HSYNC: 行同步信号,表示扫描1行的开始。

         VDEN:数据使能信号。

         VD[23:0] : LCD像素数据输出端口。

         VCLK:像素时钟信号。

2 LCD控制寄存器介绍

         VSPW:帧同步信号的脉宽,单位为1行(Line)的时间。

         VFPD: 帧同步信号的前肩,单位为1行(Line)的时间。

         VBPD: 帧同步信号的后肩,单位为1行(Line)的时间。

         LINEVAL :帧显示尺寸-1,即屏行宽-1,对于800*480分配率的LCD屏,那么LINEVAL=480-1=479,请记住,是屏行宽,也就是LCD屏显示一帧数据所需要的行的数目。

         HBPD:行同步信号的后肩,单位为1VCLK的时间。

         HFPD:行同步信号的前肩,单位为1VCLK的时间。

         HSPW:行同步信号的脉宽,单位为1VCLK的时间。

         HOZVAL:行显示尺寸-1,即屏列宽-1,对于800*480分配率的LCD屏,那么HOZVAL=800-1=799,请记住,是屏列宽,也就是LCD屏显示一行数据所需要的像素(pixel)的数目。

3 通用TFT型LCD时序图如下:

图一

           由图一可知:扫描一帧所需的时间:=((VSPW+1)+(VBPD+1)+( LINEVAL+1)+(VFPD+1))

                                  扫描一行所所需的时间:= ((HSPW+1)+(HSPD+1)+(HFPD+1)+ (HOZVAL+1))个VCLK时间。

            而VCLK时间由LCD寄存器VIDCON0内的CLKVAL决定:VCLK=HCLK/(CLKVAL+1)  ------>这个公式是S3C2416的LCD控制器的,其他CPU的不一定一样。

           因此扫描一帧所需的时间:T=[(VSPW+1)+(VBPD+1)+(LINEVAL+1)+(VFPD+1)]*[(HSPW+1)+(HSPD+1)+(HFPD+1)+ (HOZVAL+1)]* HCLK/ (CLKVAL+1),即帧频率为:1/T。

4确定LCD参数

           下面就看如何根据基于TFT LCD: AT070TN83  来配置S3C2416 LCD控制器的相关寄存器值

4.1确定VSPW,VBPD,VFPD和LINEVAL时序参数

           S3C2416关于帧参数的寄存器设置如下图所示

图二

           VSPW表示VSYNC(帧同步信号)的脉冲宽度,是按照行来计算的,结合下图,在这里VSPW+1的长度就表示VSYNC脉冲高电平的宽度

图3

            那么对于AT070TN83屏,这个值应该是多少的?看下图

图四

             结合AT070TN83的数据手册,可知Tw=3,也就是VSPW+1=3,那么到这里就可以确定VSPW=2。

             根据时序图和数据手册,可知Tvbp =29,VBPD+1=Tvbp ,那么到这里就可以确定VBPD=28。

             根据数据手册可知Tvp=525,Tvw=3,Tvbp=29,tw=480,而VFPD+1=Tvp-Tvw-Tvbp-Tw,所以VFPD+1=525-480-29-3=13,那么到这里就可以确定VFPD=12。

             LINEVAL :帧显示尺寸-1,即屏行宽-1,对于800*480分配率的LCD屏,那么LINEVAL=480-1=479,请记住,是屏行宽,也就是LCD屏显示一帧数据所需要的行的数目

4.2确定HSPW,HBPD,HFPD和HOZVAL时序参数

            结合AT070TN83的数据手册,可知Thw=48,也就是HSPW+1=Thw,那么到这里就可以确定HSPW=47。

            可知Thw=48,也就是HSPW+1=Thw,那么到这里就可以确定HSPW=47。

            可知Thbp=40,也就是HBPD+1=Thbp,那么到这里就可以确定HBPD=39。

            可知Thfp=Thp-Thw-Thbp-Thv=928-48-40-800,也就是HFPD+1=Thfp,那么到这里就可以确定HBPD=39。

            HOZVAL:帧显示尺寸-1,即屏列宽-1,对于800*480分配率的LCD屏,那么HOZVAL=800-1=799,请记住,是屏列宽,也就是LCD屏显示一帧数据所需要的列的数目。

5确定LCD的时钟频率

           LCD的时钟频率主要是由CLKVAL决定的,而对于VCLK和CLKVAL的关系,请看下图

图五

               我在这里CLKSEL_F是选择HCLK,所以就有VCLK=HCLK/(CLKVAL+1)  ------>这个公式是S3C2416的LCD控制器的,其他CPU的不一定一样,根据前面的介绍我们知道扫描一帧所需的时间:T=n*VCLK=n*HCLK/(CLKVAL+1)=[(VSPW+1)+(VBPD+1)+(LINEVAL+1)+(VFPD+1)]*[(HSPW+1)+(HSPD+1)+(HFPD+1)+ (HOZVAL+1)]* HCLK/ (CLKVAL+1),在此n表示扫描一帧数据需需要的VCLK的总数

              那么TFT LCD: AT070TN83对VCLK的参数要求是多少呢?看下图

             

                                                                                                                         图六

          由图6可知,AT070TN83的VCLK时钟频率所需要的典型值是33MHZ,而我们的系统的HCLK=400/3MHZ,而RGB_VCLK (Hz) =HCLK/ [CLKVAL+1],所以可以算出CLKVAL+1 = HCLK/ VCLK,从而可以算出CLKVAL=3,但有可能在系统跑起来之后,会出现动态映像有斜影的情况,这个就可能是VCLK设置过大,可以适当减小VCLK,即增大CLKVAL的值,实际测试时,选择CLKVAL=3会出现斜影,而假若频率固定在26M左右,wince6.0LCD显示就正常了。注意,友坚的2416开发板提供的BSP包,CLKVALDE 参数是通过一个公式计算出来的,需要和上面讲到的所以参数都有关系,还有一个刷新频率的参数也有关系,一般刷新频率UTLCD_FRAME_RATE为60HZ,可以更改这个参数来调整 CLKVAL,而友坚的BSP包在很多地方设置CLKVAL,需要足以改完。  在Bootloader\Eboot.Whimory 的main.c中有设置,这个主要是用来做开机启动logo用的。第二个地方是在Oal\Oallib的init.c和init_back.c中,还有最后一个地方是在 Drivers\Display\s3c2416_lcdc_lib 的s3c2416_lcd_con.c 中,  修改完后,将NK下载到开发板中,测试LCD的CLK时钟线,看输出的频率是否和预设的值一样,如果不一样继续查找是否还有地方没有更改到。

6 HSYNC,VSYNC,VCLK信号是否需要反转

         先看LCD控制器默认情况下送出来的TFT LCD屏的时序图

                                                                                                 图七

            再来看AT070TN83所需要的时序图

                                                                                                                      图八

              结合图7和图8,所以需要反转HSYNC,VSYNC信号输出,这样才能输出满足AT070TN83所需要的时序图,这样就需要设置S3C2416 LCD控制器VIDCON1的下面几位,如果DE所对应的时钟线时序也相反,IVCLK也需要置起来。

图九

 

 

原创粉丝点击