关于am3517屏幕翻转模块,网上的资料太少,主要是参考TRM手册,供大家一起学习。
先解释几个名词,
VRFB(Virtualrotated frame buffer)
SMS(SDRAM MemoryScheduler)
给大家看一张图就能明白SMS相对于屏幕rotation处于什么地位
简单的说,也就是正常从左到右,然后下一行再从左到右的刷新规律,经过SMS策略改变后,对于DDR2中的同一段显存,实际在DISPC里就按照旋转后的点进行刷新。
在看几个关键的地址,(下图)
VRFB支持12个context,每一个可以设置不同的内容,比如摄像头的图像翻转后直接显示在正常的LCD上,这样就需要2个context。之后的例子中,我们都以用第0个context为例。
下面我们以一块1024x768分辨率的LCD,旋转180°为例,
首先设置好DISPC的各个寄存器,让他能正常显示。主要有以下几个寄存器需要设置
DISPC_SYSCONFIG
DISPC_TIMING_H
DISPC_TIMING_V
DISPC_POL_FREQ
DISPC_SIZE_LCD
DISPC_GFX_SIZE
DISPC_DEFAULT_COLOR_0
DISPC_TRANS_COLOR_0
DISPC_DIVISOR
DISPC_CONTROL
DISPC_GFX_BA_0
DISPC_GFX_FIFO_THRESHOLD
DISPC_GFX_ATTRIBUTES
假设我们设置了显存地址是DISPC_GFX_BA_0=0x80300000
则,要显示翻转的180°的LCD,只需要设置以下几个寄存器,我先给出结果
SMS_ROT_CONTROL_0 = 0x551;
SMS_ROT_SIZE_0=(768<<16|1024);
SMS_ROT_PHYSICAL_BA_0=0x80300000;
DISPC_GFX_PIXEL_INC=0x1;
DISPC_GFX_ROW_INC=(2048-1024)*2+1;
DISPC_GFX_BA_0=0x72000000;
然后结合数据手册的9.2.5 SDRC Use Cases and Tips,VRFB rotationmechanism章节,写的非常清楚。
主要的改动是DISPC的刷显存的地址改为了0x72000000,但实际对于应用程序来说,显存还是在0x80300000,只是DISPC去刷0x72000000地址时,SMS模块把这个地址(0x72000000+2*(1024*y+x))转换到0x80300000开始的显存经过翻转后的对应的地址,实际上也就是个地址转换功能而已,结合DMA的设置,DISPC_GFX_ROW_INC,每行后地址多跳(2048-1024)*2+1,也就是绿色箭头代表的宽度。
于是,对于DISPC控制器来说,每次扫描的都是0x72000000,这个地址空间,刷1024个点后,DMA跳1024个点(VRFB固定最大2048x2048),再刷下一行。
应用程序,只管操作0x80300000开始的空间,DISPC会负责和VRFB协调,在LCD引脚上刷出翻转后的图像。
明白了自后,要翻转90°,或者270°也就很容易了,
SMS_ROT_CONTROL_0 = 0x551;
SMS_ROT_SIZE_0=(1024<<16|768);
SMS_ROT_PHYSICAL_BA_0=0x80300000;
DISPC_GFX_PIXEL_INC=0x1;
DISPC_GFX_ROW_INC=(2048-768)*2+1;
DISPC_GFX_BA_0=0x71000000;