AM3517 VRFB LCD屏幕旋转详解

关于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;

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值