CPU是DRA62x,跑VxWorks系统
HDVPSS驱动是从denny.yang写的uboot_logo范例中移植过去的
目前问题是:显示静态的画面正常,往显存刷入新的图片时,画面切换可以肉眼看出闪烁,不像是正常的画面切换
我现在考虑可能是两个原因,但又不从下手:
1、VPSS与CPU共享DDR3,两边同时访问时存在带宽问题(类似的问题曾在OMAP-L138上也碰到过,调整了DDR Controller的一个配置后解决)
DRA62x上是否有类似的配置优化选项呢?
2、驱动太简单,没有做乒乓显存,cpu一边写入数据 ,vpss一边读取数据,可能会有数据冲突?
这个不太肯定,按理说显存更新速度慢的话,画面应该是肉眼看到从上往下逐行更新,现在看到的现象更像是整个画面闪了一下
附上部分代码段,从uboot_logo的示例代码也就改了这里,将desc队列头尾接起来实现循环显示,别的几乎没动只是适配液晶做了点分辨率相关的调整
麻烦帮忙看看这个问题,谢谢!
static uint32_t dra62xDispmgrSetupLayers(uint32_t* desc_buffer, int stride,
int width, int height, uint32_t paddr,
uint8_t dataType)
{
#define DESC_NUM 120 /* 一条list中刷DESC_NUM帧,MAX:511 */
uint32_t size = 0;
uint32_t numDesc = 0, i = 0;
uint32_t* desc;
int chan;
int x = 0;
int y = 0;
uint32_t layer_ctrl;
/* add src_viewport origin to surface start address */
layer_ctrl = 0x0000E400;
#ifdef CONFIG_GRPX0
layer_ctrl |= 1<<(2); /* enable GRPXx layer */
#elif defined CONFIG_GRPX1
layer_ctrl |= 1<<(1); /* enable GRPXx layer */
#else
layer_ctrl |= 1 << (0); /* enable GRPXx layer */
#endif
#ifdef CONFIG_GRPX0
chan = 29;
#elif defined CONFIG_GRPX1
chan = 30;
#else
chan = 31;
#endif
desc = desc_buffer;
/* 构建N*fps条desc */
for (i = 0; i < DESC_NUM; i++)
{
/* set up data transfer descriptor */
desc[0] = 0 | (dataType << 26) // RGB-888 /* 注意:这里需要根据实际情况做调整 */
| (0 << 25) // no notification
| (0 << 24) // field number
| (0 << 23) // 2-dimensional data
| (0 << 20) // +1 line skip (even)
| (0 << 16) // +1 line skip (odd)
| (stride) // line stride
;
desc[1] = 0 | (width << 16) // line length in pixels
| (height) // number of rows
;
desc[2] = paddr;
desc[3] = 0 | (0xA << 27) // packet type
| (0 << 26) // 1D mode
| (0 << 25) // inbound direction
| (chan << 16) // channel
| (0 << 9) // priority
| (chan << 0) // next channel
;
desc[4] = 0 | (width << 16) // region width
| (height) // region height
;
desc[5] = 0 | (x << 16) // horizontal start
| (y << 0) // vertical start
;
desc[6] = 0 | (1 << 7) // first region
| (1 << 8) // last region
;
desc[7] = 0; // alpha blending enable
desc += 8;
size += 32;
}
/* 追加一条control desc:reload list
* 本组list执行完毕后,将自动循环重新加载本list
* 以达到图像刷新不需要cpu额外干预的目的 */
size += 16;
desc[0] = (uint32_t)desc_buffer & 0xFFFFFFFE;
desc[1] = size & 0x0000FFFF;
desc[2] = 0;
desc[3] = 0 | (0xC << 27) //packet type;
| (0x7); //control type: reload list
/* COMP模块,将graphic x通道映射到DVOx上,相当于打通了信号流 */
vpsWrite32(VPS_COMP_DVO2, layer_ctrl); /* GRPXx --> DVO2(VOUT0) */
return size;
}