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.

am335x lcd显示向左偏移

Other Parts Discussed in Thread: AM3358, AM3352

AM3358

SDK是最新版本SDK-PROCESSOR-03.02

在Linux的文件系统加载完毕后,运行QT的测试程序,有几率发现屏幕左移,同时在串口段打印如下,请问该如何解决?因为文件系统已经启动,QT的测试程序又很小,应该不会存在总线不足之类的问题吧?请帮忙分析。

[ 2154.711045] tilcdc 4830e000.lcdc: tilcdc_crtc_irq(0x00000020): FIFO underfow
[ 2154.726868] tilcdc 4830e000.lcdc: tilcdc_crtc_irq(0x00000004): Sync lost
[ 2154.733636] tilcdc 4830e000.lcdc: tilcdc_crtc_irq(0x00000004): Sync lost
[ 2154.743661] tilcdc 4830e000.lcdc: tilcdc_crtc_irq(0x00000004): Sync lost
[ 2154.750484] tilcdc 4830e000.lcdc: tilcdc_crtc_irq(0x00000004): Sync lost
[ 2154.759628] tilcdc 4830e000.lcdc: tilcdc_crtc_irq(0x00000004): Sync lost
[ 2154.766446] tilcdc 4830e000.lcdc: tilcdc_crtc_irq(0x00000004): Sync lost
[ 2154.776424] tilcdc 4830e000.lcdc: tilcdc_crtc_irq(0x00000004): Sync lost
[ 2154.783188] tilcdc 4830e000.lcdc: tilcdc_crtc_irq(0x00000004): Sync lost
[ 2154.793215] tilcdc 4830e000.lcdc: tilcdc_crtc_irq(0x00000004): Sync lost
[ 2154.800045] tilcdc 4830e000.lcdc: tilcdc_crtc_irq(0x00000004): Sync lost
[ 2155.029849] tilcdc 4830e000.lcdc: tilcdc_crtc_irq(0x00000004): Sync lost flood detected, disabling the interrupt

  • LCD FIFO溢出的时候,驱动会reset整个LCD模块,有些客户反映会闪屏,需要优化下reset的等待时间。

    你的LCD的分辨率和刷新率是多少?能否降低刷新率试下。

  • 您好,我碰到的问题不是闪屏,而是画面往左边偏移,而且启动后出现这个问题的话,运行其他程序也一直偏移,不会恢复,只有重启才有可能恢复。

    分辨率800*480,用的AM335X-EVM的配置。

  • 记得以前有个帖子说关掉一个系统进程就可以了,你现在去掉系统进程还有这个问题么?

  • 周工:

        不知道你说的是不是/etc/systemd/system/getty.target.wants/getty@tty1.service。

        之前我开机80%会出现LCD显示偏移,我怀疑是开机脚本的问题,最后确认getty@tty1.service这个脚本移除后,开机后不再出现显示偏移。但是提交给客户后,客户发现还是会出现,我做了下测试,移除getty@tty1.service之后,开机运行自己的程序,大概10多次会出现一次屏幕偏移,而有这个脚本的时候,开机80%会出现显示偏移。所以虽然可能和脚本有关,但是产生偏移的原因应该不是这个脚本,周工,请帮忙分析一下该如何解决,我不知道怎么下手。

        underflow的是FIFO中没有数据才回产生的错误,但是什么情况下会导致FIFO接收不到数据呢?我运行的QT测试程序是黑白的,做触摸测试用的,按说这个LCD的数据量也不会大。

  • 周工:

    http://git.denx.de/?p=u-boot.git;a=commitdiff;h=8c17cbdf8a8023abdd0009af4dc9dbc0541b4a0f

    这个网页是更新DDR的配置来解决LCD的underflow的错误的,我修改后发现出现错误的概率是变小了,但是还是有存在。其中里面的EMIF_OCP_CONFIG_AM335X_EVM 的值是怎么配置的?因为EVM的内存是256M的,我们的是512M的内存,不知道这个值是否需要修改的原因导致还是有几率出现underflow的错误。如果需要修改,这个值怎么定义。

    #define EMIF_OCP_CONFIG_AM335X_EVM             0x003d3d3d

  • 你手上有没有TI的EVM板,同样用这个版本的LinuxSDK能在EVM板上复线这个问题么?

  • 如果EVM不能复现,而调整DDR的配置能对这个问题有改善,那需要仔细检查所有DDR寄存器配置。

  • 周工:

        我手上没有EVM板子,只有blonewhite板子。

        另外,DDR的寄存器,为什么补丁上值需要是0x003d3d3d,这个值用在我们板子上依旧会出现问题,不过几率小了很多,我根据e2e上有个帖子,用了0x00ffff30这个值,测试了半天,暂时没有出现,很显然这个配置要更好一些,但是这个值具体是根据什么来配置的,周工,请教这个值的配置方法,谢谢。

  • 0x00ffff30这个值是付到DDR的哪个寄存器里?

  • 我仔细看了下这个patch,他是为了规避LCD控制器的FIFO overflow,去调整DDR的cmd FIFO。

    这个patch我还是第一次看到,他是修改了EMIF的Interface Configuration Register,之前我们有客户也反应过LCD出现FIFO overflow的问题,但是没有你说的这么频繁。

    可能和你用的Linux版本有关系。

  • 我用的是SDK-PROCESSOR 03.02,不过uboot用的是SDK08的,因为之前SDK-PROCESSOR的uboot2016的开机起不来。

    但是用SDK08的uboot和kernel和文件系统,也是存在这个问题的。

    能帮忙咨询下那个patch的值是根据什么来确定的吗?

  • 根据那个描述:

    AM335X (EMIF_4D) EMIF REG_COS_COUNT_1, REG_COS_COUNT_2, and
    + * REG_PR_OLD_COUNT values to avoid LCDC DMA FIFO underflows and Frame
    + * Synchronization Lost errors. The values are the biggest that work
    + * reliably with offered video modes and the memory subsystem on the
    + * boards. These register have are briefly documented in "7.3.3.5.2
    + * Command Starvation" section of AM335x TRM. The REG_COS_COUNT_1 and
    + * REG_COS_COUNT_2 do not have any effect on current versions of
    + * AM335x.
    可以看下AM335x的TRM的7.3.3.5.2 Command Starvation 这个章节的介绍。
  • 不好意思,借个楼问个问题,我现在用的是AM3352,裸跑,屏幕同样出现左偏,LCDC控制器工作在Raster 模式,由于系统中不能用中断,只能用轮询的模式来刷屏,LCDC配置采用了FB0一个显示缓冲区的方式,应用软件会设置二个显示缓冲区,当需要刷屏时,由应用软件来动态更改FB0的显示缓冲地址,达到刷屏的目的,刚开始显示正常,可是过了大概几个小时,屏幕就左偏了,我想问的是,LCDC的DMA引擎在运行过程中是否能动态更改FB0寄存器中的显示缓存的地址呢?如果支持话,流程是怎样的呢?我现在的流程是:先禁止掉RASTER,然后修改FB地址,然后再使能RASTER,相关代码如下:

    static void disableLcdDma(void)
    {
    uint32_t value = 16;

    readl(SOC_LCDC_0_REGS + LCDC_RASTER_CTRL) &= (~LCDC_RASTER_CTRL_RASTER_EN);
    while(!(readl(SOC_LCDC_0_REGS + LCDC_IRQSTATUS_RAW) & LCDC_IRQSTATUS_RAW_RMFD) && value --);

    return;
    }

    readl(SOC_LCDC_0_REGS + LCDC_LCDDMA_FB0_BASE) = (unsigned int)(__fb_screen[s_curBufIndex]); // s_curBufIndex是显示缓存的索引,0或者1
    readl(SOC_LCDC_0_REGS + LCDC_LCDDMA_FB0_CEILING) = (unsigned int)(__fb_screen[s_curBufIndex]) + 4*LCD_XSIZE*LCD_YSIZE - 1;

    static void enableLcdDma(void)
    {
    readl(SOC_LCDC_0_REGS + LCDC_RASTER_CTRL) |= (LCDC_RASTER_CTRL_RASTER_EN);
    return;
    }

    期待您的回复。

  • 你说的这个情况和怀疑的路线,应该是指cache刷新的时候,由于cache一致性带来的图像偏移?

    先确认一下,你怀疑的情况描述:因为在app中,我们是打开了MMU和CACHE的,所以这时候刷入frame buffer的东西,是我们写入的,但是后续过程中因为是DMA在进行数据搬运,所以这里面就可能会存在cache一致性的问题。就是我在cache中写了数据,但是这个数据未能及时回写,导致DMA做搬运的时候,并未能搬运到我刚刚写入到cache中的真实数据,而是寄存器中原来的值。

    如果是担心这个问题,不需要做禁止,使能的操作,只需要在刷framebuffer的时候加上cache的回写操作就可以了。找一下函数:CacheDataCleanBuff,这个是用来回写的,你可以加入后进行测试。如果是这个问题的导致的话就会有效果。

    如果加入后没有效果,那就应该不是这个问题导致的,还是建议从时序配置角度来排查。

  • 非常感谢您的回复,可能是我没有把问题描述清楚,软件流程如上图所示,标红色的部分是需要动态修改LCDDMA_FB0_BASE 和LCDDMA_FB0_CELING这二个寄存器的,因为要求不能用中断,所以只能通过这种方式来刷屏,我看手册里有写到:在刷屏的过程中,DMA是不会停止的,会不停的刷。所以如果按以上流程来操作的话,在DMA不停止的情况下,我来动态更改LCDDMA_FB0_BASE 和LCDDMA_FB0_CELING这二个寄存器的话,会不会造成DMA引擎内部的状态不对?按以上的流程操作的话,刚开始显示的效果非常好,画面完整,清楚,所以排除了时序的问题,过了大概半天,画面本来在左边显示的一些内容跑到最右边了,但是整个画面还是完整的。

    以上:我的主要问题是DMA不停止的情况下,软件运行过程中运态更改LCDDMA_FB0_BASE 和LCDDMA_FB0_CELING这二个寄存器是否会造成DMA引擎内部状态不对?

    另外:为了测试动态修改LCDDMA_FB0_BASE 和LCDDMA_FB0_CELING是否会造成画面偏移这个问题,我把以上红色部分取消掉,让LCDDMA_FB0_BASE 和LCDDMA_FB0_CELING这二个寄存器保持在初始化的时候的值,也即framebuf_0 的地址,软件其它流程不变,跑了一天一夜了,画面没有出现偏移(当然显示效果不好)。如果 看不清楚以上图片的话,请看下面的附件,谢谢。

    还有:动态改变LCDDMA_FB0_BASE 和LCDDMA_FB0_CELING这二个寄存器是目前软件中比较理想的方式,因为采用ping-pang方式来刷屏的话,应用软件没法和LCDC控制器做到缓存的同步,因为DMA不会停止。这只是我个人的理解啊,如果您有什么想法,也可以告诉我,谢谢。

    AM3352-LCDC-Raster.pdf
  • 您好 这个问题解决了吗? 我用USB供电会出现上面的情况,但是换成适配器供电就好了。  但是现在屏幕还是左移,不知道您有没有解决方法请教 一下,谢谢!

  • 我们现在也是出现这样的问题,特别是在qt程序中加载jpeg图片时候,过一段时间百分百发生左移,但过一会儿又会自动偏回来,请大牛们帮忙一下!