This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

ti81xx HDVPSS刷新画面闪烁问题求助

Other Parts Discussed in Thread: OMAP-L138

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;
}