您的位置:首页 > 其它

Qc FB驱动 以及 LCD调试过程

2013-09-13 11:11 218 查看
http://blog.csdn.net/yili_xie/article/details/5459205

作者:YiLi Xie(yili.xie@gmail.com)

日期:2010/04/07

欢迎转载,请注明出处

 

 

     首先说说QC的片子,QC这块片子使用MDP3.0作为图像处理器,下面支持MDDI,LCDC,以及EBI3种显示接口,MDP3.0不支持overlay,因为不管是camera或者视频播放都必须使用surfaceflinger来进行处理。3种接口这里我们使用到的是LCDC,使用RGB接口接一个同步屏。MDP会根据PANEL的type(比如LCDC_PANEL)来选择适当的接口,而panel本身必须注册适当的设备,比如说LCDC屏必须在后面注册一个LCDC设备而不是MDDI设备。

       从FB的结构来上,QC注册了4个设备:MSM_FB,MDP,LCDC,panel。MSM_FB是fb.c的本地实现,其他的都是各个设备接口的驱动。系统启动的时候board.c会首先注册4个ID为1的设备,然后probe完成最基本的一些硬件的初始化,最后panel的驱动注册的时候会重新注册一个ID为1的panel设备,并将panel相关的参数(比如margin,pclk,resolution等等)传到LCDC,并重新注册一个ID不为0的lcdc设备,LCDC的probe又会重新注册一个ID不为0的MDP设备,MDP的probe又会根据传过来的参数注册一个FB设备。(插播点小广告:linux设备注册的时候会寻找相应的驱动,如果有相应的驱动就会调用相应的驱动的probe,同时驱动注册的时候也会寻找相应的设备,找不到会报错,找到了会调用相应的probe,一个驱动可以被多个设备使用,但是一个设备不能同时使用多个驱动。另外FB相关的设备一般注册成platform
device,关于这个名词可以去参照linux的doc文件夹)

       FB的数据类型有RGB565,RGB888和ARGB8888四种,LCDC下被写死了只能是RGB565。

       要了解上面的一个过程必须对内核运行的一套机制有所了解,这样才知道这个数据流程是如何走下来的,尤其是panel的参数最后是如何被FB给接收的,以及open device的时候一套on是如何下来的。这里最重要的几个文件一个是arch/arm/mach-msm下面的board相关文件,另外一个就是drvier/video/msm下面的driver相关文件。

       也许咱看的内核代码还太少,觉得QC这套FB的流程真是清晰流畅,相当的经典阿,可以作为以后自己写FB的典型范例阿,不过得有机会写才行- -!

        除了上面的一套设备和驱动注册过程之外,最重要的就是从设备的open开始的这么一套流程了,FB是一个字符设备,当打开设备的时候就会调用FB的open函数,这个open函数的实现是很重要的。QC在FB的open里面先后调用各个设备的open完成对MDP,LCDC,PANEL的初始化,并在最后点亮背光。这个backlight设备也是个很高深的学问,QC实现的自己一套,而android则是注册了一个LED设备,暂时没有深研究这个设备的运作过程,以后一定得仔细弄清楚~~背光控制不好最常见的就是白屏,花点了。除了open以为还有一个就是release/off以及set_backlight了,这3个函数基本实现了FB的全部功能。

       了解了FB一套大体的实现,下面就是具体的如何来调试这个LCD了。觉得真要调一个屏的话,一定要了解TFT-LCD的一个最基本的工作原理,不需要了解太深,但至少从硬件上知道他显示一个什么原理,网上有很多资料,这里只是简略说一下。TFT-LCD的基本原理就是两个电极板驱动液晶流向,然后光穿透并进入滤光板显示出颜色。这里有几个概念是必须清楚的:

      1、common极的电压(Vcom/VcomH/VcomL)和source driver(DDVDH)之间的电压控制液晶的方向,因为液晶不能常时间朝向一个方向,不然会造成液晶的损坏,因此这里就存在一个反转的问题,就是两个电极之间的电压必须反转以让液晶的流向反转。可以通过改变两个电极的电压来反转,反转的方式有很多种:帧反转,行反转,列反转以及像素反转。不同的反转方式可能造成屏的flicker(闪烁)以及crosstalk(相邻像素互相影响),因此根据电压反转的方式必须选择适当的反转方式。

      2、调节common的电压可以调节屏幕的对比度,因为它和source driver之间的电压控制着液晶中能通过的光量。

      3、gate driver(VGH/VGL)与source driver之间的电压控制着TFT的开关

      了解了一些最基本的物理原理,现在我们看看具体的调试LCD的过程。除了可以参照网上一些达人的成功经验之外,我觉得更主要的还是要仔细看清楚datasheet,因为不同的屏同一个现象的原因并不是唯一的,因此了解一个基本的调屏的过程之后最重要的还是仔细阅读datasheet。

      调屏之前首先必须确认Driver IC 的datasheet的正确性,咱这个可怜人两次厂家给的datasheet都是错误的,害得咱两次都瞎折腾半天却总不对。一定要和厂家确认Driver IC的正确性。基本现在的屏都是上电 --> reset --> 初始化这么一个过程,初始化现在一般是使用的SPI接口,那么我们就来说说这个基本的过程:

       1、上电   有些屏对上电的顺序有比较严格的要求,一定要根据datasheet要求的时序来;

       2、reset  reset一般都是高低高的一个过程,而且一般都有时序上的要求。一定要注意这个reset的脚是否专用的,侧曾经碰到过reset还被其他的驱动使用造成reset脚不停地被拉高拉低

       3、初始化  现在一般使用三线spi接口(clk,data,cs)来发送初始化命令,各种屏对发送命令的格式和参数都有一种要求,比如说command以0开头或者其他的十六进制数开头等等。另外还要确认MCU物理spi或者模拟spi的时序与屏相匹配。一般来说初始化成功以后屏应该就亮起来了,只是可能显示的是花彩。

       4、RGB接口的配置  RGB接口包含HSYNC  VSYNC PCLK 3根线,有些屏还多一根DATA_EN线。这里一般最重要的是让MCU与屏的极性一致,通过配置主芯片相关寄存器或者屏的相关寄存器使两者的极性相匹配。4跟线的极性正确以后再配置相关的margin的数据,屏幕应该就正常亮起来了。

        如果这时候显示还有问题,那么就差不多应该怀疑初始化代码的微调了。初始化代码里面比较重要的一般有:VCOM/VGL/DDVDH之类的电压配置;工作模式的选择;RGB接口的极性;RGB的顺序;DATA的数据位数;开始扫描的坐标;极性反转的方式;

        基本上通过上面的调试LCD应该是没有什么问题了,再有问题就仔细看datasheet并联系厂家的FE了~~

 

     点滴积累:

     1、LCD残影一般是由panel的液晶特性决定的,处于规格以内就好了,如果频繁出现就要查电压了

     2、闪烁以及相邻像素之间的互相影响一般是由极性反转的方式不正确导致的

     3、造成颜色不正常的因素很多,除了数据位数,RGB的顺序,PCLK的极性之外,PCLK的频率,极性反转的方式都会造成颜色的不正常

     4、图像的对比度可以通过调节VCOM/VCOMH/VCOML来实现

     5、造成LCD白屏的原因有很多,但根本的原因就是背光亮了但是没有RGB数据过来或者背光亮了PANEL确不能正确显示数据。从这个根本的原因去寻找其他的原因,比如是否正常初始化,是否背光点得太早等等; 另外有时候如果寄存器的延时不够的话也可能造成一定情况下的白屏,尤其是那些启动屏幕,开始数据传输,或者读写之类的寄存器。

     6、启动时候的花屏一般可以通过点背光之前的一个清data操作来完成,比如将FB的数据全部写0

     7、图像出现上下或者左右不对齐一般是margin的参数不对, 抖动一般是sync的信号不稳定造成的

     8、图像出现水波纹类似于抖动闪烁的现象可能跟极性反转有关系,也有可能和gate driver和source driver的电压有关系

     9、硬件的时序参数有时候不一定与datasheet上的参数完全匹配,所以一般的开始的时候都让时间稍微长一点,比如reset的时间,数据的设置时间和保持时间等等,调通以后再来优化速度

     10、关于LCD背光,一般都有一个偏差,比如说背光偏暖就会使得图像偏黄,如果背光偏冷就会使得图像偏紫。这里补充一点小知识,太阳光的七色光谱红、橙、黄、绿、蓝、靛、紫,红光波长最长为暖色,紫光波长最短偏冷色,色温的单位是K(开尔文),越高就越偏冷,越低就越便暖。色温上的喜好是因人而定的,这跟我们日常看到景物景色有关,例如在接近赤道的人,日常看到的平均色温是在11000K(8000K(黄昏)~17000K(中午)),所以比较喜欢高色温(看起来比较真实),相反的,在纬度较高的地区(平均色温约6000K)的人就比较喜欢低色温的(5600K或6500K),也就是说如果您用一台高色温的电视去表现北极的风景,看起来就感觉偏青;相反的若您用低色温的电视去看亚热带的风情,您会感觉有点偏红,
电视或者显示屏的色温是如何界定的呢?因为在中国的景色一年四季平均色温约在8000K~9500K之间,所以电视台在节目的制作都以观众的色温为9300K去摄影的。但是欧美因为平时的色温和我们有差异,以一年四季的平均色温约6000K为制作的参考的,所以我们再看那些外来的片子时,就会发现5600K~6500K最适合观看。一般来说色温偏低给人的感觉是比较偏暗,比如偏黄给人的感觉就是偏暗,如果偏蓝给人的感觉就是偏亮。

      11、几个LCD的光学参数,这里只是粗暴地说说,具体地可以参考一些资料说得很详细。一个就是LCD的亮度参数mcd,m是毫的意思,其实真的参数是cd(坎贝拉),现在手机上的LED一般都是用的1500-1700mcd的。还有一个就是LCD的色度参数,衡量的参数很多,这里只说色度系xyz3坐标,代表红绿蓝,相应的降低就会偏另外一种色,比如说x/y降低就会便蓝,主要用在调颜色的偏差上,和上面的色温是联系在一起的

      12、lcd debug的时候有两个很重要的技能,一个是用来debug颜色的问题,刷单色条;还一个就是debug初始化过程的回读函数。刷色条的问题很简单,按照RGB的格式分别在将R、G、B的位上置1就好了;至于回读寄存器,一般datasheet上都有相关的时序,按照时序来读就好了,这里稍微说一下使用GPIO模拟SPI的话只需要将GPIO设成输入然后读寄存器就好了。回读寄存器是必须的debug手段,可以检查数据是否下进去,如果下进去了说明指令本身有问题,如果读出来为全0或者全1之类的就要考虑一数据是否输出?二数据输出了但是确没进panel,有两种可能情况,一种是可能打样没打好,panel和板子的连接没连好,还有一种就是指令的格式不正确~~

分享到: 

上一篇:DDMS找不到设备的问题下一篇:The ELF Object File Format by Dissection

查看评论

18楼 ayaka 2012-08-22 04:38发表 [回复]


您能查收一下邮件吗?我这里简短的问当中的一个问题。

我现在是htc evo 3d gsm的手机,可是我不能通过写入fb0来改变屏幕。我想知道android是不是直接操作fb0的。

谢谢
17楼 sunnyhjq 2012-07-02 14:09发表 [回复]


马上要学习调试lcdc和MIPI了,多向楼主学习下。
16楼 sfrysh 2012-04-30 14:49发表 [回复]


博主你好,请问你有qcom 芯片的datasheet吗?我想详细看看它显示设备这块的资料。如果有的话能发一份给我吗,andyshrk@gmail.com。
15楼 月光宝盒 2012-04-28 20:14发表 [回复]


“启动时候的花屏一般可以通过点背光之前的一个清data操作来完成,比如将FB的数据全部写0”

请问如何在LCD的驱动里把FB的数据全部写0,调过几个都有这样的需求,开机瞬间会闪,FAE建议刷黑屏,但不知道接口是哪个?
14楼 xiayu98020214 2012-02-09 16:54发表 [回复]


当clk比较低的时候,屏幕正常显示,但是clk调高,屏幕左右抖动。怎么回事?你说是和同步信号有关,怎么调阿?
13楼 gaomaolin_88 2011-03-21 11:19发表 [回复]


你好,我用androidscreencast.jnlp抓屏,PC机上是花屏(好像是像素错位);但手机上的屏是正常显示的,您看这是什么原因,我们头儿说USB通路肯定是好的
12楼 forever1008 2011-01-09 22:38发表 [回复]


请教一个问题,在qualcomm 7227的板子上,把原来的s6d的屏换成ams320fs01的屏,开机后图形可以显示,只是图像有的地方细节不太清晰。

lcd 配的是RGB888,mdp, fb都没有改,到目前为止修改的只是新屏的初始化序列,请问需要修改哪些地方。

我对这类图像质量的问题无从下手,楼主能否讲解一下这块的原理?

多谢啦
11楼 ziyizhc 2010-11-29 10:29发表 [回复]


你好,我用gpio模拟spi初始化oled屏,屏没反应,读寄存器的值均为ff.再三检查,时序应该没有问题,屏的电压均正常,不知道你哪里出的问题?请帮忙指点一下,谢谢!
10楼 sunnytina 2010-09-19 17:27发表 [回复]


你好,

你第二段写到:

并将panel相关的参数(比如margin,pclk,resolution等等)传到LCDC,并重新注册一个ID不为0的lcdc设备。

请问:这些参数是怎么传到LCDC的,具体代码可以指出来看看嘛;另外就是一点重新注册一个ID不为0的lcdc,请问注册的具体代码在什么地方?我就没有跟踪到。

谢谢!

Re: yili_xie 2010-09-22 23:35发表 [回复]


回复 sunnytina:仔细看看每个设备的probe函数~~~
9楼 sunnytina 2010-09-19 13:58发表 [回复]


你好,

第二段刚开头你写到:

系统启动的时候board.c会首先注册4个ID为1的设备。

请问应该是注册4个ID == 0 的设备吧?

若楼主能够在代码里指出MSM_FB,MDP,LCDC,panel的data flow 那就更好了,代码体现更具说服力,谢谢!

Re: yili_xie 2010-09-22 23:35发表 [回复]


回复 sunnytina:呵呵,对的,应该是ID为0的设备,这个data flow代码写得很清楚,不需要再说了~~
8楼 yanx730 2010-07-09 13:53发表 [回复]


[e01]
7楼 匿名用户 2010-05-06 15:14发表 [回复]


文章写的都不错,赞
6楼 匿名用户 2010-04-24 17:18发表 [回复]


我用的是高通的rex系统。overlay image注册后,会存在image list中。MDP文档里,一些小图标或title区可以通过注册overlay image的形式注册在layer-2(前景)。但是我发现BREW默认的刷新都在layer-0(背景)。这是怎么回事?能在QQ上向你请教吗?我的QQ号是854038930。谢谢!
5楼 yili_xie 2010-04-24 16:12发表 [回复]


FB是linux的概念,就是图像的缓存区~~不知道你底层用的什么系统?分几层是由硬件来决定的,多个FB的好处就是可以由硬件来控制图像的合成,而不需要软件来计算,就是硬件加速的意思,分三层是从功能上来决定的,就是一层用来显示UI,一层一般给video,一层给camera ~~因为video和camera的图像是不断变化的,所以用硬件合成比软件快多了~~
4楼 匿名用户 2010-04-24 16:04发表 [回复]


谢谢yili。overlay是MDP的功能。不知你说的FB是什么意思?我所说的分层,指的是注册MDP overlay image的时候,可以指定注册在哪一层。
3楼 yili_xie 2010-04-24 13:17发表 [回复]


overlay不是屏的功能,是硬件图像处理器的功能,简单地说就是IPU或者MDP能支持多少个FB,每个FB都可以被上层写数据,然后由硬件对这些FB进行合成,合成到一个FB,然后送到屏显示。我不太懂你所谓的虚拟分层是什么意思?
2楼 wendyxu123456 2010-04-24 12:41发表 [回复] [引用] [举报]


你好,

看了你的文章, 觉得你对调屏应该比较有经验。我是做手机软件开发的,请教一个问题:overlay的作用是什么,或者说什么是overlay?用在哪些应用上?如果对LCD 的虚拟分层(一般是三层)也清楚地话,请教一下三层的显示的好处?

谢谢!
1楼 dongya1987 2010-04-08 13:01发表 [回复]


“点滴积累:”这个段落对知识点的总结很好,学习这种写法

分享到: 

上一篇:DDMS找不到设备的问题下一篇:The ELF Object File Format by Dissection

查看评论

18楼 ayaka 2012-08-22 04:38发表 [回复]


您能查收一下邮件吗?我这里简短的问当中的一个问题。

我现在是htc evo 3d gsm的手机,可是我不能通过写入fb0来改变屏幕。我想知道android是不是直接操作fb0的。

谢谢
17楼 sunnyhjq 2012-07-02 14:09发表 [回复]


马上要学习调试lcdc和MIPI了,多向楼主学习下。
16楼 sfrysh 2012-04-30 14:49发表 [回复]


博主你好,请问你有qcom 芯片的datasheet吗?我想详细看看它显示设备这块的资料。如果有的话能发一份给我吗,andyshrk@gmail.com。
15楼 月光宝盒 2012-04-28 20:14发表 [回复]


“启动时候的花屏一般可以通过点背光之前的一个清data操作来完成,比如将FB的数据全部写0”

请问如何在LCD的驱动里把FB的数据全部写0,调过几个都有这样的需求,开机瞬间会闪,FAE建议刷黑屏,但不知道接口是哪个?
14楼 xiayu98020214 2012-02-09 16:54发表 [回复]


当clk比较低的时候,屏幕正常显示,但是clk调高,屏幕左右抖动。怎么回事?你说是和同步信号有关,怎么调阿?
13楼 gaomaolin_88 2011-03-21 11:19发表 [回复]


你好,我用androidscreencast.jnlp抓屏,PC机上是花屏(好像是像素错位);但手机上的屏是正常显示的,您看这是什么原因,我们头儿说USB通路肯定是好的
12楼 forever1008 2011-01-09 22:38发表 [回复]


请教一个问题,在qualcomm 7227的板子上,把原来的s6d的屏换成ams320fs01的屏,开机后图形可以显示,只是图像有的地方细节不太清晰。

lcd 配的是RGB888,mdp, fb都没有改,到目前为止修改的只是新屏的初始化序列,请问需要修改哪些地方。

我对这类图像质量的问题无从下手,楼主能否讲解一下这块的原理?

多谢啦
11楼 ziyizhc 2010-11-29 10:29发表 [回复]


你好,我用gpio模拟spi初始化oled屏,屏没反应,读寄存器的值均为ff.再三检查,时序应该没有问题,屏的电压均正常,不知道你哪里出的问题?请帮忙指点一下,谢谢!
10楼 sunnytina 2010-09-19 17:27发表 [回复]


你好,

你第二段写到:

并将panel相关的参数(比如margin,pclk,resolution等等)传到LCDC,并重新注册一个ID不为0的lcdc设备。

请问:这些参数是怎么传到LCDC的,具体代码可以指出来看看嘛;另外就是一点重新注册一个ID不为0的lcdc,请问注册的具体代码在什么地方?我就没有跟踪到。

谢谢!

Re: yili_xie 2010-09-22 23:35发表 [回复]


回复 sunnytina:仔细看看每个设备的probe函数~~~
9楼 sunnytina 2010-09-19 13:58发表 [回复]


你好,

第二段刚开头你写到:

系统启动的时候board.c会首先注册4个ID为1的设备。

请问应该是注册4个ID == 0 的设备吧?

若楼主能够在代码里指出MSM_FB,MDP,LCDC,panel的data flow 那就更好了,代码体现更具说服力,谢谢!

Re: yili_xie 2010-09-22 23:35发表 [回复]


回复 sunnytina:呵呵,对的,应该是ID为0的设备,这个data flow代码写得很清楚,不需要再说了~~
8楼 yanx730 2010-07-09 13:53发表 [回复]


[e01]
7楼 匿名用户 2010-05-06 15:14发表 [回复]


文章写的都不错,赞
6楼 匿名用户 2010-04-24 17:18发表 [回复]


我用的是高通的rex系统。overlay image注册后,会存在image list中。MDP文档里,一些小图标或title区可以通过注册overlay image的形式注册在layer-2(前景)。但是我发现BREW默认的刷新都在layer-0(背景)。这是怎么回事?能在QQ上向你请教吗?我的QQ号是854038930。谢谢!
5楼 yili_xie 2010-04-24 16:12发表 [回复]


FB是linux的概念,就是图像的缓存区~~不知道你底层用的什么系统?分几层是由硬件来决定的,多个FB的好处就是可以由硬件来控制图像的合成,而不需要软件来计算,就是硬件加速的意思,分三层是从功能上来决定的,就是一层用来显示UI,一层一般给video,一层给camera ~~因为video和camera的图像是不断变化的,所以用硬件合成比软件快多了~~
4楼 匿名用户 2010-04-24 16:04发表 [回复]


谢谢yili。overlay是MDP的功能。不知你说的FB是什么意思?我所说的分层,指的是注册MDP overlay image的时候,可以指定注册在哪一层。
3楼 yili_xie 2010-04-24 13:17发表 [回复]


overlay不是屏的功能,是硬件图像处理器的功能,简单地说就是IPU或者MDP能支持多少个FB,每个FB都可以被上层写数据,然后由硬件对这些FB进行合成,合成到一个FB,然后送到屏显示。我不太懂你所谓的虚拟分层是什么意思?
2楼 wendyxu123456 2010-04-24 12:41发表 [回复] [引用] [举报]


你好,

看了你的文章, 觉得你对调屏应该比较有经验。我是做手机软件开发的,请教一个问题:overlay的作用是什么,或者说什么是overlay?用在哪些应用上?如果对LCD 的虚拟分层(一般是三层)也清楚地话,请教一下三层的显示的好处?

谢谢!
1楼 dongya1987 2010-04-08 13:01发表 [回复]


“点滴积累:”这个段落对知识点的总结很好,学习这种写法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: