Chinaunix首页 | 论坛 | 博客
  • 博客访问: 343592
  • 博文数量: 97
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 636
  • 用 户 组: 普通用户
  • 注册时间: 2014-10-12 22:41
文章分类

全部博文(97)

文章存档

2017年(8)

2015年(87)

2014年(2)

我的朋友

分类: 嵌入式

2015-04-16 00:35:38

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

阅读(2111) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~