ARM的LCD控制寄存器和原理(抖动算法和FRC)

S3C44B0X内置的LCD控制器的作用是将显示缓存(在系统存储器中)的LCD数据传输到外部LCD驱动器,并产生必须的LCD控制信号。

它支持灰度LCD和彩色LCD。在灰度LCD上,使用基于时间抖动算法(time-basedditheringalgorithm)和FRC(FrameRateControl)方法,可以支持单色、4级灰度和16级灰度模式的灰度LCD。在彩色LCD上,可以支持256种色彩。不同尺寸的LCD具有不同数量的垂直和水平象素、数据接口、数据宽度、接口时间和刷新率。LCD控制器可以进行编程控制相应的寄存器值,以适应不同的LCD显示板。

LCD控制器逻辑框图

 

 

图1为LCD控制器的逻辑框图。从框图可以看出LCD控制器是用来实现传输显示数据及产生必要的控制信号,如VFRAME、VLINE、VCLK和VM。除了控制信号,还有显示数据的数据端口VD[7:0]。

LCD控制器包括REGBANK、LCDDMA、VIDPRCS和TIMEGEN。
REGBANK有18个可编程寄存器,用于配置LCD控制器。LCDDMA为专用DMA,可以自动地将显示数据从帧内存传送到LCD驱动器中。通过专用DMA,可以实现在不需要CPU介入的情况下显示数据。VIDPRCS从LCDDMA接收数据,将相应格式的数据通过TIMEGEN(包含可编程逻辑),以支持常见的LCD驱动器所需要的不同接口时间和速率的要求。TIMEGEN部分产生VFRAME,VLINE,VCLK和VM等信号。
LCD控制器提供下列外部接口信号:
VFRAME:LCD控制器和驱动器之间的帧同步信号。通知LCD屏新的一帧显示,LCD控制器在一个完整帧显示后发出VFRAME信号。
VLINE:LCD控制器和驱动器间同步脉冲信号。LCD驱动器通过它将水平移位寄存器的内容显示到LCD屏上。LCD控制器在一整行数据全部传输到LCD驱动器后发出VLINE信号。

VCLK:LCD控制器和驱动器之间的象素时钟信号。
VM:LCD驱动器所使用的交流信号。驱动器用VM打开或关闭象素的行和列电压极性。
VD[3:0]:LCD象素数据输出端口。
VD[7:4]:LCD象素数据输出端口。
LCD控制器的寄存器
LCD控制器通过18个可编程寄存器来配置LCD显示模块的尺寸、显示模式、接口数据宽度等。

 

 

S3C44B0X的LCD控制
2008-06-15 00:09

控制器简介

       在复杂的PC机中,我们经常提到显示卡这个东西,相信大家对显示卡的原理都不陌生。LCD控制器就相当于嵌入式系统的显示卡。它负责把显存中的LCD图形数据传输到LCD驱动器,并产生必须的LCD控制信号。显存与系统存储器共用主存空间。这样做有几个好处:节约存储器,提高空间利用率,符合嵌入式系统的设计精神;显存设置在主存空间内,对显存的操作,实际上就是对主存的操作,简化程序编制。
图1 控制器系统框图
LCD控制器使用L CDCDMA,把显存数据输入LCD控制器。LCDCDMA是专用DMA,在不用CPU参与的情况下,自动传输显存的视频数据到LCD控制器。控制器中有一个24字的FIFO 存储区。其中12个FIFOL,12个FIFOH,在单扫描模式下仅12个FIFOH可用。当FIFO为空或部分为空时,LCDCDMA请求从显存预取数据(使用突发传输模式,一次预取4个字;在传输期间,不允许出让总线控制权)。
S3C44B0的LCD 控制器使用时间抖动算法和帧速控制方法,实现LCD上的单色、4级灰度(每个象素占用2位)、16级灰度(每个象素占用4位)显示,也能与彩色STN接口,支持最大256色(每个象素占用8位)的显示。
LCD 控制器可以编程支持不同水平和垂直点数(640×480, 320×240, 160×160等等),以及不同的接口时序和刷新速率的LCD,支持4位双扫描、4位单扫描、8位单扫描的LCD显示器,并支持虚拟屏幕,实现硬件水平/垂直卷动。(这些概念后边会详细解释)
灰度显示中,4级灰度显示模式使用查找表,允许在16级灰度中选择4级灰度显示。该查找表和彩色查找表的蓝色查找表公用一个寄存器BULEVAL[15:0],灰度0由BLUEVAL[3:0]值表示,灰度1由BLUEVAL[7:4]值表示,灰度2由BLUEVAL[11:8]值表示,灰度3由BLUEVAL[15:12]值表示。16级灰度显示模式不使用查找表。
彩色8位显示模式中,3位分配为红,3位绿,可以同时显示8个红色与8个绿色,2位蓝色位,可以同时显示4个蓝色,合起来最大显示256色。红、绿、蓝分别使用不同的查找表,红色、绿色查找表入口都是32位(并分成8组),分别由REDVAL[31:0]、GREENVAL[31:0]寄存器指示,蓝色查找表入口为16位,由BLUEVAL[15:0] 寄存器指示,并分成4组。也就是说红色、绿色可以在16种颜色组合中选择8色进行显示,蓝色可以在8种颜色组合中选择4色进行显示。
LCD自刷新模式:S3C44B0X支持LCD自刷新模式,以减少电源消耗,这时电源管理可以进入SL_IDLE模式。

控制器原理

扫描

       LCD控制器的一项重要工作是向LCD驱动器,按照一定的格式输出显示数据,然后驱动器逐象素的显示,由于人眼的滞留效应,看到的是连贯的图像。这个过程称为扫描。控制器的VD[7..0]是数据输出端口。根据不同的驱动器,分为4位双扫描、4位单扫描和8位单扫描,位数指输出端口的位宽,单扫描同时刷新屏幕上的一行,双扫描同时刷新两行。
图2-1 扫描模式
图2-2 彩色扫描模式
       当然, 驱动器光有数据还不能显示,必须知道什么时候这些数据有效,什么时候换行,什么时候换页,等等。这就需要一些同步信号。控制器提供VCLK/VLINE/VFRAME/VM信号做同步用。在VCLK上升延,VD输出数据;VCLK下降延,驱动器锁存该数据;所以VCLK实际是象素的同步信号。同理,VLINE是行的同步信号,VFRAME是帧的同步信号。VM是驱动器切换板电极的交流信号。切换的速率是可以编程的,由MVAL寄存器控制。
VM Rate = VLINE Rate / ( 2 ×MVAL)
VCLK(Hz)=MCLK/(CLKVAL× 2)
       此外需要设置LCD的分辨率和显示模式。因为这些参数和控制器的同步信号直接相关。举例说明:一个LCD面板是320×240的分辨率,那么控制器每输出320个象素,就会输出一个行同步信号;每输出240行之后,就应该输出帧同步信号;如果是4bit单行扫描,那么每个VCLK可以输出4个象素,则每行只会有320÷4=80个VCLK信号。可见前面的结论换句话说,LCD的分辨率和显示模式的参数,决定了控制器的时钟。
HOZVAL = ( Horizontal display size / Number of the valid VD data line) -1
彩色:Horizontal display size = 3 * Number of Horizontal Pixel
LINEVAL = (Vertical display size) -1:单扫描
LINEVAL = (Vertical display size / 2) -1:双扫描

查找表

       既然控制器支持16级灰度,那么还要4级灰度干吗呢?何不舍弃低级的4级灰度,都使用更高级的16级灰度呢?事实并非如此。16级灰度需要4bit来表示一个象素,而4级灰度只需要2bit就够了。所需的位数越少,就越节省显存空间(使用更少的存储器),操作显存耗费的CPU资源也越少,这样系统功耗必然随之减小。因为很多应用中对灰度级要求不高,最好根据需求,衡量使用什么样的显示方式。
       有些比较特殊的应用,虽然只使用4级灰度,但是这4级灰度并不是线性的。线性这个概念在这里怎么理解呢?打个比方,就好像拿着黑色颜料和白色颜料混合。如果是线性的16级灰度,第15级就是只用黑色颜料;第0级则只有白色;第8级相当于8分黑色、7分白色均匀混合;依此类推。使用4级非线性灰度,就是从16级灰度中可编程的挑选出来4种。例如在某个应用中,要求象素点能够完全熄灭、能够达到最大亮度,以及正常显示文字;我们可以设置4级非线性灰度,第0级相当16级线性灰度的第0级(熄灭),第3级相当16级的第15级(最亮),第1级和第2 级都相当16级的第11级(普通文字)。
       查找表就是为了适应非线性灰度而设置的一种数据结构,它其实是一组寄存器。拿前边的例子来说,在4级非线性灰度模式下,LCD控制器读到一个象素是第1级灰度,它就会到查找表中,查找第1级在16级线性灰度中的对应级别,结果是16级的第11级。完成这种转换之后,控制器按第11级输出。
       顺便说一下,在彩色模式下也有查找表。44B0用8位表示彩色,3位红色,也就是2 3=8级红色,我们偷换概念,姑且叫“红度”吧。但是控制器可以输出16级“红度”,16级“绿度”,8级“蓝度”,所以再次用到查找表。

虚拟屏幕

 

       我们在PC上编写文档的时候,一屏幕显示不下,通过滚动翻页来浏览全部文档。虚拟屏幕就好像能容纳整个文档的大屏幕,但显示器只对应其中的某一部分。结合下面的图形很容易理解。
图3 虚拟屏幕
       虚拟屏幕从原理上讲是一个内存的概念。因为程序员对显示器的操作实际上是对显存的操作,把代表显示器每个象素的数据写入显存的过程。对于虚拟屏幕,程序员维护着一个更大的屏幕,更多的显存而已。事实上,虚拟屏幕的大小的确受显存大小的限制。实际显露出来的显示器部分,其起始点(左上角)由程序控制,改变这个点的位置,显示器就会在虚拟屏幕上移动。
       在图3里, 有几个参数需要说明。PAGEWIDTH是真实显示器的宽度;OFFSIZE是真实屏幕左端到虚拟屏幕最右端的距离;LCDBASEU是真实显示器起点对应的显存地址;LCDBASEL只用在双扫描模式,是下半帧对应显存的开始地址,当然在单扫描时他就没有什么用处了。
LCDBASEL =LCDBASEU + (PAGEWIDTH + OFFSIZE)×(LINEVAL +1)
程序通过改变LCDBASEU 和 LCDBASEL的值来滚动屏幕。但在一帧刷新结束时,不能改变LCDBASEU 和 LCDBASEL的值。因为一帧结束时,LCDCDMA已经预取了下一帧的数据。如果这时改变显存中的帧的内容,之前预取的数据将无效,从而显示也不正确。控制器提供一个LI NEC NT寄存器,他会从LINEVAL向0倒计数,记录帧已经刷新了多少行。通过检查LINECNT,可以避免在不恰当的时间更改显存。检查的时候,中断应当被屏蔽,否则在读出LINECNT后,如果某个中断刚好执行,LINECNT的值可能会改变。

抖动算法

S3C44B0X利用抖动算法实现灰度级和STN的彩色显示。
时常会有疑问:16级灰度,需要4bit来表示一个象素,为什么控制器只使用了1bit输出就实现了?256色需要8bit表示一个象素,为什么只用3bit输出就可以呢?下面讲讲抖动算法,大家就会明白这些道理。
LCD屏幕以一个很快的(通常为80Hz)速度刷新,因为众所周知的人眼滞留效应,感觉上是流畅的画面。一个帧周期内,象素只有点亮和熄灭两种状态(44B0使用的简单的LCD驱动器支持两种状态,但是TFT等可以支持更多的状态)。正是基于这种原理,当象素一亮一灭,且切换的频率很低时,看到的是一闪一闪的点;如果切换频率很高,人眼觉察不出来他在闪烁,只会感觉没有那么亮罢了。屏幕不断快速刷新,亮的次数多,熄灭的次数少,看起来就比较重;反之看起来比较淡。这种颜色的浓淡变化构成不同灰度级别。可以用“占空比”来量化表示,就是亮的次数占刷新次数的比例。表1显示出不同灰度级对应的占空比。
表1 不同灰度级对应的占空比
       举例说明,假设某个象素是第11级灰度,表1中查出占空比为5/7。控制器便自动以每7帧为一个周期,其中5帧该象素亮,另外2帧熄灭。这就解释了为什么每个象素只用1bit输出实现16级灰度。
       前面把彩色分成“红度”、“绿度”、“蓝度”,使用和灰度输出相同的思路,用3bit可以实现彩色输出。
       这时又出现一个新问题。极端的例子,比如1秒内,0.5秒点亮,0.5秒熄灭,虽然占空比依然是1/2,但是很显然看起来不会是第7级灰度(第7级灰度对应占空比为1/2),而是闪烁的画面。所以,应该把亮灭状态离散化,尽量不要让同一个象素在相邻帧保持相同状态。
与此同时,这种现象也影响同一帧内相邻的象素。图像的灰度级就像地图上的等高线,相邻象素的灰度很大几率是相同的。如果四条输出线总是输出相同的数据,显示就会出现局部闪烁的现象。解决方法依然是离散化。
考虑到上述两个问题,就可以着手计算输出序列。当然这是一个数学问题,要根据不同的应用不断的优化。一般可以采用经典的序列。好在44B0的LCD控制器并没有把抖动算法的输出序列固化在芯片里,可以通过寄存器更改。
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值