ARM S3C2416 800*600 LCD驱动
作者:http://hi.baidu.com/arike/blog/item/bfba80b1a3491a41092302b1.html

点屏步骤:

  首先,我们了解一些TFT LCD的结构,如下图所示,主要由偏振片、虑色器基板、液晶、TFT基板、片振片、背光源组成。在虑色器基板和TFT基板封入扭曲向列型液晶(TN),构成液晶盒,虑色器基板上制作有透明的公共电极,TFT基板上制作了矩阵式薄模晶体管,用来开光象素电极的电压信号,为了使液晶层保持一定的厚度,在两块玻璃基板中间放有透明隔垫(聚酯模片或玻璃小球)。

    TFT LCD电信号部件组成:主要由背光电路和显示电路组成。
    背光电路: 3.5寸TFT LCD背光,大都采用白光LED作为背光源,一般由6个串连的白光LED组成(如下图),驱动电压大概20V左右,20mA电流左右,是一个耗电量很大的部件。对于电池供电系统,大都采用升压型DC/DC进行驱动,很多厂家都有推出专门针对串连白光LED的驱动器。

    显示电路:显示电路一般由Timing Controller、Source Driver、Gate Driver组成。有的IC把Timing Controller和Source Driver集成在一起了,也有的IC把三个部分都集成了。这三部分电路一般都集成在TFT LCD模组里面了,也有的TFT LCD把Timing Controller IC放到外面了(如SHARP的一些LCD)。
    SAMSUNG LTV350QV LCD框图分析(如下图):LTV350QV的DRIVER IC是S6F2002,
S6F2002集成了Timing Controller、Source Driver、Gate Driver部分和电源管理部分,164RGB X 240驱动能力,所以对于320 X 240 QVGA的分辨率,需要两片S6F2002。两片S6F2002,一片作为主控制器,一片作为从控制器,正是由于LVT350QV是有两片DRIVER IC驱动的缘故,如果上电时序配合不好,很容易出现显示异常(一半显示不正常,一半显示正常)。

    一个台湾TFT LCD框图分析(如下图):它的驱动IC主要有两片,一片集成了Timing Controller和Source Driver,另外一片是Gate Driver。


    TFT LCD常用信号解释:
    LED_Cathode/LED_Anode:LCD背光电源供电
    M/POL:液晶驱动极性转换型号,用于产生VCOM信号
    RESET:全局复位信号
    CS/SCL/SDI:LCD TCON IC的配置端口
    DATA[0:23]:LCD RGB24BIT数据信号,一般我们使用16BIT,因为在人的肉眼观察下16BIT的色彩和24BIT的色彩没有太大区别,而16BIT所需处理的数据量比24BIT小很多,一般情况我们把剩余的地位数据线连接到高位。
    HSYNC:水平同步时钟信号
    VSYNC:垂直同步时钟信号
    DOTCLK:象素时钟信号
    VDD:数字电源,一般是3.3V
    AVDD:模拟电源,一般是5V
    VGL:GATE OFF控制电压
    VGH:GATE ON控制电压
    VCOM:LCD公共驱动电极
    ENABLE:data enable信号

    TFT电路驱动原理:由CPU通过LCD接口送来的视频信号及时钟经过TCON的时序转换,RGB数据经过D/A转换送到SOURCE端,同时TCON产生移位时钟信号驱动GATE端,选通一行,打开这一行的所有晶体管, SOURCE向液晶电容充电,液晶产生灰度并保持,通过GATE的移位,继续向下面行写入液晶图像,当整个行写完,又重新从第一行开始。

    如果一直显示静止的图像,液晶电极上的电压就会一直不变,当撤销电压时,液晶很难回复原状,容易造成液晶损坏。解决这问题的方法就是改变液晶的控制电压的极性,也就是说即使是静止的图像,液晶电极上的电压也一直在翻转。一般的LCD都采用行翻转的形式,通过改变公共端的电压极性VCOM而达到翻转的目的。TCON IC一般会送出一个M或者POL的信号,我们用这个信号产生VCOM,一般的转换电路使用非们或者运方电路。通过调节VCOM的DC端,我们可以改变LCD的色彩,调节AC端,可以改变LCD的对比度。也许是由于行翻转的缘故,有的LCD会产生水平的条纹(Flicker现象),LTV350QV不怎么明显,一般的台湾LCD比较明显。



    点屏心得:
    常用点屏步骤:
1、    确保数据、时钟、电源等连接正常。
2、    确保LCD的几组工作电源VDD/AVDD/VGL/VGH正常。
3、    LCD配置:有的LCD的TCON IC需要使用SPI接口进行配置。
a)    配置的内容主要是时钟信号的极性、扫描方向等,还有一些TCON IC支持CCIR601/656/OSD功能等,主要根据实际情况配置。
b)    GAMMA校正:一般根据LCD厂家提供的参数进行校正,以前调LTV350QV就是因为厂家给的GAMMA参数不正确,造成色彩显示不正常。
c)    SPI时序:一般不同的LCD屏的SPI时序和寄存器都会有一些差别,我一般是根据时序图进行操作寄存器(如下图),通过写寄存器,只要LCD有反应了,表明SPI通讯基本没有什么问题了。

4、    时钟设置:
a)    一般的LCD SPEC中都会给出关于时序的参数以及时序图,我们按照图中进行设置就可以了。如下图:我们就可以知道时钟频率、脉冲宽度、前扫、回扫等。

        通过如下图的画面我们就可以知道HSYNC和VSYNC时钟极性为负。

    通过下图我们就可以知道是上升沿锁存数据,下降沿改变数据了

    通过以上步骤LCD上面应该会出现美丽动人的画面了,有可能图像位置还会有一些偏差,不过没关系,看着屏幕的图像调节前扫、回扫进行左右上下移动就OK了。
    图像异常处理:
    图像颜色不正常:有可能时钟型号极性反,还有可能VCOM调节不正常。
    出现水波纹:确保电源VDD/AVDD/VGL/VGH纹波足够小,确保VCOM波形正确,VCOM电路端的电源稳定。

 

 

 

继续

 

 介绍了S3C2410的LCD控制器的数据和控制管脚,并给出了LCD的控制流程和TFT-LCD的控制器设置规则。参照TFT-LCD CJM10C0101的逻辑要求和时序要求设计了其驱动电路,设置了各主要LCD寄存器。

  开发了CJM10C0101在嵌入式LINUX下的显示驱动程序,并在CJM10C0101上显示了清晰稳定的画面。实验表明这套装置通用性好,能驱动大部分的TFT-LCD;可移植性强,经过少许修改即可应用在其他嵌入式系统中。它是S3C2410驱动TFT-LCD的一套较佳的解决方案。

  1 引言

  随着科技的发展,ARM在社会各个方面的应用越来越广。S3C2410是三星公司生产的基于ARM920T内核的RISC微处理器,主频可达203MHz,适用于信息家电、SmartPhone、Tablet、手持设备、移动终端等领域。其中,集成的LCD控制器具有通用性,可与大多数的LCD显示模块接口。CJM10C0101是一种用非晶硅TFT作为开关器件的有源矩阵液晶显示器,该模块包括TFT-LCD显示屏!驱动电路和背光源,其接口为TTL电平。分辨率为640×480像素,用18bit数据信号能显示262144色。6点视角是最佳视角。

  在以三星ARM芯片S3C2410为核心,USB、UART、LCD、TOUCHPANEL等作为输入输出设备,FLASH和SDRAM作存储器,加上固化在FLASH里面的嵌入式LINUX组成的嵌入式系统中,我们致力于使此系统用本国生产的TFT-LCD作显示输出,因此研究设计了驱动CJM10C0101型26.4cm(10.4in)TFTLCD的硬件适配电路与嵌入式LINUX下的显示驱动程序。

  2 S3C2410 LCD控制器介绍

  2.1 管脚

  S3C2410 LCD控制器用于传输视频数据和产生必要的控制信号,像VFRAME、VLINE、VCLK、VM等等。除了控制信号,S3C2410还有输出视频数据的端口VD[23:0],如图1示。

  将要用到的管脚描述如下:VCLK-像素时钟信号;VD[23:0]-LCD像素输出端口;VM/VDEN/TP-LCD驱动器的AC偏置信号(STN)/数据使能信号(TFT)/SECTFT源驱动器数据加载脉冲信号。

  2.2 寄存器介绍

  S3C2410的LCD控制寄存器主要有:LCDCON1寄存器、LCDCON2寄存器、LCDCON3寄存器、LCDCON4寄存器和LCDCON5寄存器等,详情请见参考文献[1]。

  2.3 控制流程

  LCD控制器由REGBANK、LCDCDMA、VIDPRCS、TIMEGEN和LPC3600组成(见图2)。

  REGBANK有17个可编程寄存器组和256×16的调色板存储器,用来设定LCD控制器。LCDCDMA是一个专用DMA,自动从帧存储器传输视频数据到LCD控制器,用这个特殊的DMA,视频数据可不经过CPU干涉就显示在屏幕上。

  VIDPRCS接受从LCDCDMA来的视频数据并在将其改变到合适数据格式后经VD[23:0]将之送到LCD驱动器,如4/8单扫描或4双扫描显示模式。

  TIMEGEN由可编程逻辑组成,以支持不同LCD驱动器的接口时序和速率的不同要求。TIMEGEN产生VFRAME、VLINE、VCLK、VM信号等。

  数据流描述如下:FIFO存储器位于LCDCDMA。当FIFO空或部分空时,LCDCDMA要求从基于突发传输模式的帧存储器中取来数据,存入要显示的图像数据,而这个帧存储器是LCD控制器在RAM中开辟的一片缓冲区。当这个传输请求被存储控制器中的总线仲裁器接收到后,从系统存储器到内部FIFO就会成功传输4个字。FIFO的总大小是28个字,其中低位FIFOL是12个字,高位FIFOH是16个字。S3C2410有两个FIFO来支持双扫描显示模式。在单扫描模式下,只使用一个FIFO(FIFOH)。

  2.4 TFT控制器操作

  S3C2410支持STN-LCD和TFT-LCD,这里我们只介绍其对TFT-LCD的控制。

  TIMEGEN产生LCD驱动器的控制信号,如VSYNC、HSYNC、VCLK、VDEN和LEND等。这些控制信号与REGBANK寄存器组中的LCDCON1/2/3/4/5寄存器的配置关系相当密切,基于LCD控制寄存器中的这些可编程配置,TIMEGEN产生可编程控制信号来支持不同类型的LCD驱动器。

  VSYNC和HSYNC脉冲的产生依赖于LCDCON2/3寄存器的HOZVAL域和LINEVAL域的配置。HOZVAL和LINEVAL的值由LCD屏的尺寸决定,如下公式:

  HOZVAL=水平显示尺寸-1    (1)

 

  LINEVAL=垂直显示尺寸-1   (2)

 

 

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
………………