exynos4412 的FIMD 介绍

来源:互联网 发布:js控制class显示隐藏 编辑:程序博客网 时间:2024/06/14 11:36

exynos4412 的FIMD 介绍


后续这几篇文章力争将exynos4412 的显示部分介绍清楚
这一块我们分成以下部分介绍:
显示控制器的硬件原理
framebuffer驱动分析
exynos 4412显示部分主要寄存器


本文参考了http://wenku.baidu.com/link?url=g_g0RLh3Kzbm_fE7AAR5-YSkeEtGTxzE-a23h0OsaRH5QKeQ7uX8l0hwCz3wukvH_C_PTZ7xQRC2UhMbfGCQPpdbboxC9CQglA6e46v1Mfi
以及http://blog.csdn.net/walkingman321/article/details/6211075
对二位作者表示感谢


首先我们介绍一下exynos 4412显示控制器的硬件原理
为了简化讨论,我们只讨论最常见的RGB 24bpp接口的场景。I80不做讨论。


1. 综述
首先贴一张exynos4412的LCD控制器内部结构框图:




根据exynos4412的芯片手册,我们可以知道LCD控制器主要由以下几部分构成
� VSFR
由121个可编程控制器组,一套gammaLUT寄存器组( 包括64个寄存器),5块256*32调色板存储器组成,主要用于对lcd控制器进行配置。
� VDMA
是LCD专用的DMA传输通道,可以自动从系统总线上获取视频数据传送到VPRCS,无需CPU干涉。
� VPRCS
收到数据后组成特定的格式(24bpp),然后通过数据接口传送到外部LCD屏上。
� VTIME
模块由可编程逻辑组成,负责不同lcd驱动器的接口时序控制需求。VTIME模块产生 RGB_VSYNC, RGB_HSYNC, RGB_VCLK, RGB_VDEN,VEN_VSYNC等信号。





2. 接口信号
FIMD显示控制器RGB 24bpp全部信号定义如下所示






其中主要的RGB接口信号:
� LCD_HSYNC: 行同步信号,表示一行数据的开始, LCD控制器在整个水平线 (整行)数据移入LCD驱动器后,插入一个LCD_HSYNC信号;
� LCD_VSYNC: 帧同步信号,表示一帧数据的开始, LCD控制器在一个完整帧显示完成后立即插入一个 LCD_VSYNC信号,开始新一帧的显示; VSYNC信号出现的频率表示一秒钟内能显示多少帧图像,称为“显示器的频率”
� LCD_VCLK:像素时钟信号,表示正在传输一个像素的数据;
� LCD_VDEN: 数据使能信号;
� LCD_VD[23:0]: LCD像素数据输出端口


3. 工作时序
下图是LCD RGB接口工作时序图:




上面时序图上各时钟延时参数的含义如下: (这些参数的值, LCD产生厂商会提供相应
的数据手册)
� VBPD(verticalbackporch): 表示在一帧图像开始时, 垂直同步信号以后的无效的行数
� VFBD(verticalfrontporch):表示在一帧图像结束后,垂直同步信号以前的无效的行数
� VSPW(verticalsyncpulsewidth):表示垂直同步脉冲的宽度,用行数计算
� HBPD(horizontalbackporch):表示从水平同步信号开始到一行的有效数据开始之间的VCLK的个数
� HFPD(horizontalfrontporth):表示一行的有效数据结束到下一个水平同步信号开始之间的VCLK的个数
� HSPW(horizontalsyncpulsewidth):表示水平同步信号的宽度,用VCLK计算




( 1) 帧的传输过程
1) VSYNC信号有效时, 表示一帧数据的开始, 信号宽度为 ( VSPW+1)个HSYNC信号周期,即( VSPW+1)个无效行;
2) VSYNC信号脉冲之后,总共还要经过( VBPD + 1)个HSYNC信号周期,有效的行数据才出现; 所以,在VSYNC信号有效之后,还要经过( VSPW +1 +VBPD +1)个无效的行;
3) 随即发出( LINEVAL + 1)行的有效数据;
4) 最后是( VFPD + 1)个无效的行;


( 2) 行中像素数据的传输过程

1) HSYNC信号有效时,表示一行数据的开始,信号宽度为( HSPW+1)个VCLK信号周期,即( HSPW +1)个无效像素;
2) HSYNC信号脉冲之后,还要经过( HBPD+ 1)个VCLK信号周期,有效的像素数据才出现;
3) 随后发出( HOZVAL+ 1)个像素的有效数据;
4) 最后是( HFPD+ 1)个无效的像素;


( 3) 将VSYNC、 HSYNC、 VCLK等信号的时间参数设置好之后,并将帧内存的地址告诉LCD控制器,它即可自动地发起DMA传输从帧内存中得到图像数据,最终在上述信号的控制下出现在数据总线VD[23:0]上。 用户只需要把要显示的图像数据写入帧内存中。


4,数据存储格式
16M( 24BPP)色的显示模式场景下,用24位的数据来表示一个像素的颜色, 每种颜色使用8位LCD控制器从内存中获得某个像素的24为颜色值后, 直接通过VD[23:0]数据线发送给LCD;
在内存中, 使用4个字节( 32位)来表示一个像素,其中的3个字节从高到低分别表示红、绿、蓝,剩余的1个字节无效或者表示alpha值;
以下几幅图片表示了几种主要的数据存放格式




5. 寄存器
The registers you can use to configure display controller are:
1. VIDCON0: Configures video output format and displays enable/disable.
2. VIDCON1: Specifies RGB I/F control signal.
3. VIDCON2: Specifies output data format control.
4. VIDCON3: Specifies image enhancement control.
5. I80IFCONx: Specifies CPU interface control signal.
6. VIDTCONx: Configures video output timing and determines the size of display.
7. WINCONx: Specifies each window feature setting.
8. VIDOSDxA, VIDOSDxB: Specifies window position setting.
9. VIDOSDxC, D: Specifies On Screen Display (OSD) size setting.
10. VIDWxALPHA0/1: Specifies alpha value setting.
11. BLENDEQx: Specifies blending equation setting.
12. VIDWxxADDx: Specifies source image address setting.
13. WxKEYCONx: Specifies color key setting register.
14. WxKEYALPHA: Specifies color key alpha value setting.
15. WINxMAP: Specifies window color control.
16. GAMMALUT_xx: Specifies gamma value setting.
17. COLORGAINCON: Specifies color gain value setting.
18. HUExxx: Specifies Hue coefficient and offset value setting.
19. WPALCON: Specifies palette control register.
20. WxRTQOSCON: Specifies RTQoS control register.
21. WxPDATAxx: Specifies window palette data of each index.
22. SHDOWCON: Specifies shadow control register.
23. WxRTQOSCON: Specifies QoS control register.


6,窗口层叠
exynos支持5个 overlay  windows
●    win 0 (base) : YCbCr,RGB
●    Win 1 (overlay 1): YCbCr,RGB
●    Win 2 (overlay 2): YCbCr,RGB
●    Win 3 (caption) : RGB
●    Win 4 (cursor) : RGB
一般来说这五个图层的分工如下
The system uses
win0 as OS window, full TV screen window, and so on.
win1 as small (next channel) TV screen with win2 as menu.
win3 as caption.
win4 as channel information.


exynos 4412支持多个层叠窗口(5个),显示的时候,这些窗口会被叠加显示。在这里,framebuffer的概念变成和窗口关联,而不是和LCD显示屏关联。每个窗口对应一个framebuffer,所以,exynos 4412中可以有5个framebuffer(不考虑硬件双缓冲的情况),甚至十几个framebuffer(考虑硬件双缓冲/三缓冲的情况)。
窗口的混合主要是在VPRCS模块做的。


Overlay Priority
Win4>Win3>Win2>Win1>Win0




7,多缓冲技术
双缓冲是指framebuffer的大小两倍于LCD的大小,可将其称为frame1和frame2。LCD显示frame1的内容时,GUI在后台绘制frame2;LCD显示frame2时,GUI在后台绘制frame1。
有多种实现双缓冲的方法,比如硬件切换、virtual screen等
这样能提高刷新效率,并且有效避免屏幕撕裂等现象


8.alpha与colorkey
exynos 4412支持硬件alpha操作和colorkey操作。


alpha操作用于实现图形渐变效果,以及半透明效果等等。
LCD本来采用R、G、B三通道来表示颜色,但是显示控制器分为5个图层,故图层混合时需要按照一定的比例因子来混合以实现图层的透明度,而不至于将背景图层完全覆盖掉,现在增加alpha通道来作为那个颜色混合时的调节因子,配置相关的设置后,透过调节alpha值则可以实现图层间透明度的控制,而所谓的透明度,相当于是两图层的按照不同的合成因子来合成为一个图层,这样背景图层就不会被完全覆盖掉而不可视了。


color key:设有背景窗口bg,前台窗口fg,两个窗口有重叠部分,设置一个颜色值作为fg的色键,当有fg中的像素的颜色值与色键的值相等时,这些像素会被特殊对待,有两种方式,若我们配置了出现这种色值相等的情况显示前台窗口的颜色,那么就会显示前台窗口的颜色;若我们配置了出现这种色值相等的情况显示背景窗口的颜色,那么就会显示背景窗口的颜色。当然背景窗口color key就没有意义了。
colorkey操作可以在融合两个窗口时过滤掉其中一个窗口的某一种特定颜色。因为GUI在显示图象时都是通过画矩形实现,所以这个功能在显示非矩形图像(比如圆形)时很有用。假设要显示圆形图案,可以把圆形放进一个矩形,然后矩形的剩余部分填充一个背景色,并把这个背景色指定为colorkey。这样,显示的时候自动将colorkey指定的颜色过滤,屏幕上就能显示出那个圆形了。


混合时,这里涉及到两个算法


8.1窗口混合时数据混合的算法

该算法主要是计算每次两个窗口叠加混合后的RGB数据
Win01 (R/G/B) = Win0 (R/G/B) * b1 + Win1 (R/G/B) * a1
Win012 (R/G/B) = Win01 (R/G/B) * b2 + Win2 (R/G/B) * a2
Win0123 (R/G/B) = Win012 (R/G/B) * b3 + Win3 (R/G/B) * a3
WinOut (R/G/B) = Win0123 (R/G/B) * b4 + Win4 (R/G/B) * a4
上面公式中,
Win0 (R) = Window 0's Red data,
Win0 (G) = Window 0's Green data,
Win0 (B) = Window 0's Blue data,
Win1 (R) = Window 1's Red data,
...
其中,
b1 = Background's Data blending equation1 factor,
a1 = Foreground's Data blending equation1 factor,
b2 = Background's Data blending equation2 factor,
a2 = Foreground's Data blending equation2 factor,
这里所说的Background和Foreground不是固定的.
Win012与Win3混合的时候,Win012就是Background,Win3就是Foreground










8.2 Alpha因子混合算法

该算法主要是计算每次两个窗口叠加混合后的Alpha因子,该Alpha因子可以被用作下一层窗口叠加的因子,也可以闲置不用。
AR (G,B)01 = AR (G,B)0 * q1 + AR (G,B)1 * p1
AR (G,B)012 = AR (G,B)01 * q2 + AR (G,B)2 * p2
AR (G,B)0123 = AR (G,B)012 * q3 + AR (G,B)3 * p3
上面公式中,
AR0 = Window 0's Red blending factor,
AG0 = Window 0's Green blending factor,
AB0 = Window 0's Blue blending factor,
AR1 = Window 1's Red blending factor,...
AR01 = Window01's Red blending factor (alpha value blending between AR0 and AR1),
AG01 = Window01's Green blending factor (alpha value blending between AG0 and AG1),
AB01 = Window01's Blue blending factor (alpha value blending between AB0 and AB1),
AR012 = Window012's Red blending factor (alpha value blending between AR01 and AR2),
...
其中,
q1 = Background's Alpha value blending equation1 factor,
p1 = Foreground's Alpha value blending equation1 factor,
q2 = Background's Alpha value blending equation2 factor,
p2 = Foreground's Alpha value blending equation2 factor,…


在实际的配置中,上面所说的a,b,p,q这几个值,都可以通过BLENDEQ寄存器来设置,
一般默认值都做如下配置:
<Data blending>
B' = B * (1 - alphaA) + A * alphaA        通过设置a,b参数为(1 - alphaA),alphaA 实现。


<Alpha value blending>
alphaB' = alphaB * 0 + alphaA * 0 = 0     通过设置p,q参数为0实现。
也就是说,在实际使用中,一般都忽视用p,q参数,只用a,b参数,而a,b参数实际上是alphaA的值。
alphaA的值是通过VIDW0ALPHA0寄存器组来设置的。
 







9.窗口平移与virtual screen平移
窗口平移与virtual screen平移是两个容易被混淆的概念,下面简单介绍一下:


窗口平移
exynos 硬件上支持5个窗口,每一个窗口都可以显示在LCD的不同位置。所以窗口平移就是指硬件支持的窗口在LCD上的移动。
窗口平移由以下寄存器控制:
VIDOSD[0-4]A
VIDOSD[0-4]B


virtual screen平移

通过设定framebuffer的xoffset和yoffset,可以设置framebuffer被LCD显示的x、y坐标。因此,可以定义frame1的坐标为(0,0),frame2的坐标为(0,<LCD’s yres>)。通过改变x/y的坐标,可以在LCD上切换frame1、frame2。
这种机制被Android采用.尤其是浏览文本,网页等场景,会广泛用到。
这里的平移指的是显示内容的平移,可以想象成通过拖动GUI中的滚动条造成的效果。
virtual screen的平移由寄存器VIDWxxADD[0-1]实现
 
 
10,数据传输
前面讲过,显示控制器里实际有5个window,每个window都有自己独立的数据源,就是所谓的一个window配置一个fifo,所以这里一共有5个fifo。
前面讲过,待显示的数据送到LCD总线上,依赖的是VDMA,VDMA一共有8个通道:5个内存DMA通道和3个CAMIF/FIMC通道。
5个fifo里,有WIN0~2这3个对应的fifo可以通过配置,使其选择数据源是内存DMA通道还是CAMIF/FIMC通道。WIN3~4这两个通道固定接DMA通道。
如果选择了CAMIF/FIMC通道,数据源一般是YUV空间的数据,需要动用FIFO中的CSC模块转成RGB。
如果选择了内存DMA通道,一般是从framebuffer取数据,其数据应该是RGB格式。不需要转换。
所以由此可见,视频播放,camera preview等多媒体场景,一般是用WIN0~2+CAMIF/FIMC通道的方法,因为其源数据一般是YUV格式。
图形界面,GUI等一般就是用的内存DMA通道的方法,因为其源数据一般是RGB格式。


通道的选择一般是通过SHADOWCON寄存器来设置的


 
 
 
11,典型控制流程
<1>配置 video main control(n,0-2) register 这类寄存器基本控制了整个control的时钟属性,扫描方式,输出格式的选择,VIDEO output的输出使能,获取当前帧使能。
        <2>配置 video time control(n,0-2) register,该类寄存器配置了lcd显示屏的物理极性,时序间隔,输出尺寸。
        <3>配置 window (n,0-4) control register ,数据输入路径选择,交换数据长度。Burstlen,BPPmode的配置等。
        <4>配置 alpha equation blending factor以及 window alpha_n control register,配置混合方程因子,以及配置alpha通道的值。
        <5>配置 windows (n,0-4) postion control register ,窗体位置信息。包括OSD infomation。
        <6>绑定 framebuffer地址。
        <7>window(n,0-4),输出使能。

按照这7步,只要时钟是正确范围内的配置,一般是有图像输出的。


转载地址:http://blog.csdn.net/wan8180192/article/details/51194797

原创粉丝点击