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.

uboot 中的lcd显示问题

Other Parts Discussed in Thread: AM3715

各位好!

目前我是在做am3715上面实现uboot中开机logo显示的功能,lcd是一个480*640 24位的,需要用spi配置。现在在uboot中显示时出现了如下的情况:

(我用的是默认的logo图片,带有denx标志的那个)

感觉是本来该在左上角的logo重复了4次,而且下面的字符也跟着重复。我对uboot中初始化lcd是初次调试,有些现象都不太明白。麻烦各位如果对这个lcd初始化有了解的话,帮忙看下这种现象可能的原因有哪些,谢谢了!!

  • 有调整过屏的时序吗?

  • 水平和垂直时序相关的寄存器我是直接照搬的kernel中的寄存器值写的,这样可以吗?同事说这种现象可能和framebuffer的设置有关,可我也不太确定怎么改。我试着改过几个传入logo显示的framebuffer的首地址和分配大小的数值,将它们直接写死,不过都没有改变这种问题。之前是直接分配的一个640*480*3 (总像素所占空间)大小的数组。不知道这个会不会有问题,还请你帮忙分析下!谢谢!

  • 是不稳定吧,你检查一下接口

  • leo chen 你好,谢谢你的答复。你是说LCD连接板子的连接头那边不稳定吗?可是同样的状态开机后kernel是正常的,连接应该没问题吧 。我现在试着改过几种对framebuffer的设置,如果增加了对 DISPC_GFX_BA1 这个寄存器的设置会有uboot中间的一段显示是黑屏(就是没图像但一直黑)的现象。之前是只对 DISPC_GFX_BA0这个寄存器设置了。这两个属于对Graphics DMA控制相关的寄存器:

    对照datasheet上面有这两个寄存器的控制的说明:

    我不是太明白这两个地址到底是要设成什么大小,是一样的,还是说 BA1 比 BA0多一定的大小。而且我看网上有的参考上面也没有特别的提到这个问题。不过从我尝试几次的修改看,这两个buffer地址的修改确实对图像显示有影响。下面我也不知道怎么改了。。。有点卡住了,我们要放假了,这个问题估计要到年后再来好好看了。

    再次谢谢你们的答复,也祝各位新年快乐!

  • 各位好!

    之前的重影的问题现在我找到原因了,是分辨率的设置问题。现在我这边uboot中能够显示出来logo图像和打印信息:

    但是有以下几个问题:

    1)logo图像的颜色不对,显示不出来彩色。这个图像是uboot中默认的那个denx图标的bmp图片。uboot中是通过将denx.bmp这个图片制作成像素数组保存的。

    按照网上的一些说法,我想换成一个自己的logo图片,可是我制作成bmp图片替换这个denx后显示也不正常。颜色和内容都有些差异。

    2)在uboot显示结束到kernel开始的那个交替时间中,会出现kernel logo闪烁一下,然后再保持正常。这个是不是和framebuffer的清除有关?

    3)现在背光显示不太正常,我想让lcd显示时才开启背光并让它保持到kernel,应该怎么做?

    上面几个问题还请各位有时间的话帮忙分析一下,感谢!

  • 针对你的3个问题的几个建议:

    1.进入kernel后,LCD显示的内容正常吗?如果进入Linux kernel后,GUI显示是正常的,说明还是U-boot中寄存器配的不对,可以参考kernel下寄存器的配置。

    2.kernel会重新初始化一遍clock,你可以把这部分代码去掉看看效果。

    3.背光控制应该是通过某个GPIO做的,控制这个GPIO就可以了。

  • 谢谢你的答复。

    目前我这边有了些新进展:

    1)背光通过设置一个GPIO后,差不多可以在logo显示出来的同时也一直保持了。

    2)目前的颜色始终不对,不管用什么图片都只能是黑白的,没有彩色。进入kernel后LCD内容都是正常的,我也对照kernel的寄存器改了,就是dispc ,dsi,dss相关的值基本都和kernel中的一样。主要不知道是哪个寄存器的配置会影响这个颜色问题,目前我还在一个一个的看。

    3)我修改了cfb_console.c中的一些代码,现在的logo能全屏显示了。按说分辨率是480*640,可是不知道为什么得用640*640分辨率的图片(8bit bmp图)才可以,如果用480*640的图片总会有一部分的黑屏。这个我目前还不知道原因:

    480*640的图片

    640*640的图片

    4)目前重点的问题是在uboot结束到进入kernel的时候,会有几秒的白屏,之后才完全进入kernel的logo。而且这个kernel的logo会先闪烁一下才稳定。

    在这个白屏的时间里,我量了一下某个像素数据的管脚和像素时钟的管脚,发现这几秒的时间里都没有信号传输。在uboot显示图片和后面的kernel

    阶段数据管脚和时钟管脚都是有信号(数据)一直在传。这个现在还没能分析出来原因,怀疑进入kernel后是不是把LCD控制的管脚之类的都给重新

    复位了。感觉这几秒的时间LCD 就没正常工作。不知道还有没有其他可能的原因,还请也帮忙分析下,感谢!

     

  • 进入kernel后会把LCD的配置整个初始化一遍的。

  • 那有什么办法可以规避这个进入kernel白屏的问题吗?比如把kernel中lcd初始化的流程提前之类的,不知道能不能修改这些。

    还有就是uboot阶段图像的颜色问题,我感觉有的测试用的logo图像不光没有颜色,还会有部分像素点的丢失,总之就是感觉不完整。我最近一直在跟这个问题,可以一直找不到根本原因。

  • 把kernel 里面的LCD初始化部分去掉应该就可以了。

  • 我现在接了群创的7寸屏,感觉绿色少了,不知道是什么地方的问题,用万用表量,连接都没问题

  • 你的是在进入kernel后颜色不正常还是uboot里面的?我的在kernel都是正常的,就是我自己加的uboot中的图像不正常,uboot里面的LCD驱动是我自己参考网上的写得,可能有问题。还有就是我之前说的几个问题中,进入kernel后kernel logo闪烁的问题解决了,是把kernel 里面的部分spi初始化和操作reset管脚的地方去掉了。现在就是还有两个问题没解决:

    1)uboot中的颜色问题,我发现如果原始图像是不含彩色的那种简单的灰度图,可以完整的显示。一有彩色,那个彩色的地方就显示的不正常,总感觉缺色的那种。

    2)进入kernel就白屏的问题还是找不到原因。就是在uboot结束到kernel启动的时候,从打印log看只要一进入kernel (时间打印开始有的时候)就开始变成白屏(或者有残影渐变成白屏),持续5秒左右到kernel中的LCD初始化显示kernel logo之后正常。

  • Cheng Zhuo Gu 说:

    你的是在进入kernel后颜色不正常还是uboot里面的?我的在kernel都是正常的,就是我自己加的uboot中的图像不正常,uboot里面的LCD驱动是我自己参考网上的写得,可能有问题。还有就是我之前说的几个问题中,进入kernel后kernel logo闪烁的问题解决了,是把kernel 里面的部分spi初始化和操作reset管脚的地方去掉了。现在就是还有两个问题没解决:

    1)uboot中的颜色问题,我发现如果原始图像是不含彩色的那种简单的灰度图,可以完整的显示。一有彩色,那个彩色的地方就显示的不正常,总感觉缺色的那种。

    2)进入kernel就白屏的问题还是找不到原因。就是在uboot结束到kernel启动的时候,从打印log看只要一进入kernel (时间打印开始有的时候)就开始变成白屏(或者有残影渐变成白屏),持续5秒左右到kernel中的LCD初始化显示kernel logo之后正常。

    1. 关于颜色不正常,我觉得一方面你查查屏本身是否正常,另一方面, 可以用starterware来做下简单的验证。

    2. 这个问题似乎我们的开发板也有,就是kernel起来后,会重新初始化各个时钟,导致了这个问题。

  • 谢谢答复!

    关于问题1,我试过其他的样机也是一样的,颜色没有,而且进入kernel后颜色正常。感觉不是屏本身的问题。你说的这个starterware我后面可以试着看看。

    关于问题2,我之前在跟踪kernel初始化代码的时候好像也发现这个问题,就是在如下的位置:

    init_IRQ()里面跟进去有个  void __init omap2_init_common_infrastructure(void) ,里面的

    if (cpu_is_omap2420())
    omap2420_clk_init();
    else if (cpu_is_omap2430())
    omap2430_clk_init();
    else if (cpu_is_omap34xx())
    omap3xxx_clk_init();
    else if (cpu_is_ti816x())
    ti816x_clk_init();
    else if (cpu_is_ti814x())
    ti814x_clk_init();
    else if (cpu_is_omap44xx())
    omap4xxx_clk_init();

    应该就是这个omap3xxx_clk_init()初始化clk的,我试过把这个注释掉,发现kernel会卡死,但是此时的屏不是白屏的,还能保持uboot中的logo图像。不知道这个分析的对不对。如果你们的开发板也有,那有没有什么规避的方案?或者能让体验好点的方法,这个5秒左右的白屏确实体验不好。我之前想过一种方法就是uboot结束或者进入kernel后让LCD的背光关掉,在kernel logo出来时再打开背光,这样那几秒的白屏就是黑屏了,可是同事说这种体验也不好。。所以我也不知道后面该怎么改了。

  • 1.  关于颜色,我想确认下,您的连接是否已经参考了我们的勘误文档,Errata, 请再确认下。

    2. 关于这个闪屏的问题,我觉得可否在uboot里面关掉背光试试。

  • 秦工你好,

    1. 关于连接的问题与相关同事确认过了,没有问题的,而且我们这边目前wince的显示和android kernel里面的显示都是正常的。会不会是uboot里面某些寄存器的配置与kernel中要有差异?

    2. 我之前试过在uboot中一直关掉背光,体验也不好。在之前的那种进入kernel白屏的时间里是黑屏的,之后再显示出kernel logo。我想问下你说的那个进入kernel clk初始化问题,是不是它把LCD相关的如dss 、dpll等时钟重新初始化了造成这段时间LCD等于是不正常的状态,而由于背光在uboot开始是一直开着的所以就是白屏了那么5秒左右,直到kernel 开始初始化LCD。像这些时钟能不能不让它重新的初始化?或者有没有办法让它们保持uboot中的状态?请问你们那边是怎么解决这个白屏问题的?

  • 我比较好奇的是,有没有在uboot里面显示logo,这个问题你们不是第一个遇到,很多客户都没有很好的方法解决:(

  • 这个是整个系统的clock初始化,关掉估计会对整个系统的启动产生影响。

    最后单步跟进代码,把LCD相关的clock初始化关掉就可以了

  • Jian Zhou 你好!

    今天我在clk init的调用中看到这么一个数组:

    /*
    * clkdev
    */

    /* XXX At some point we should rename this file to clock3xxx_data.c */
    static struct omap_clk omap3xxx_clks[] = {
    CLK(NULL, "apb_pclk", &dummy_apb_pclk, CK_3XXX),
    CLK(NULL, "omap_32k_fck", &omap_32k_fck, CK_3XXX),
    CLK(NULL, "virt_12m_ck", &virt_12m_ck, CK_3XXX),
    CLK(NULL, "virt_13m_ck", &virt_13m_ck, CK_3XXX),

    ......

    里面有很多应该是初始化依次要用到的时钟,其中有LCD相关的如:

    CLK("omapdss", "dss1_fck", &dss1_alwon_fck_3430es1, CK_3430ES1),
    CLK("omapdss", "dss1_fck", &dss1_alwon_fck_3430es2, CK_3430ES2PLUS | CK_AM35XX | CK_36XX),
    CLK("omapdss", "tv_fck", &dss_tv_fck, CK_3XXX),
    CLK("omapdss", "video_fck", &dss_96m_fck, CK_3XXX),
    CLK("omapdss", "dss2_fck", &dss2_alwon_fck, CK_3XXX),
    CLK("omapdss", "ick", &dss_ick_3430es1, CK_3430ES1),

    ...

    你说的意思是不是把这种类型的都给注释掉?我今天尝试着部分的注释掉过,结果是有的版本进入kernel就一直白屏,有的是一进kenel就一直黑屏,没图像显示待机界面也没能正常进入。反正试的几个版本都不正常。不知道我找的这个地方是不是你说的LCD相关时钟初始化的地方?能不能帮忙一起看下?谢谢!