LCD驱动调试中部分常见问题的分析及解决办法文档格式.docx
《LCD驱动调试中部分常见问题的分析及解决办法文档格式.docx》由会员分享,可在线阅读,更多相关《LCD驱动调试中部分常见问题的分析及解决办法文档格式.docx(5页珍藏版)》请在冰豆网上搜索。
在上电成功以后,BB会通过LCD串行总线发送LCD的初始化数据,如果这个环节出现问题,那肯定初始化不能成功。
在这个过程中能出现问题的就只有SPI的通讯控制这一块了,(通常LCD的通讯接口有CPU和串行总线接口等,手机中较常用的就是串行总线接口,串行总线接口又以SPI接口居多),其实造成
SPI通讯不符合LCD模组驱动芯片的要求的原因也是多种
多样的:
1、虽然都是SPI接口,但是,不同的LCD模组,在控制信号的要求上往往都会有细小的不同,有时候,CPU的SPI接口甚至都无法产生LCD模组所要求的特定波形时序。
有些LCD模组可能还会有特定的势能信号来控制SPI接口工
作与否。
2、多数LCD驱动芯片其实都是具有读取寄存器和ID号的功能的,但是很多模组在封装的时候往往没有吧芯片的SPI接口的SDO信号线引出来。
导致无法通过读取寄存器和ID的方式来判断SPI总线上的通信协议是否正确。
那么,如果确定了是SPI通讯控制不满足要求的话,就可以通过修改SPI的读写控制来适配LCD模组IC的要求。
如果CPU所提供SPI接口实在没有办法配置到完全和LCD模组要求的时序波形相同,可以采用CPIO口模拟SPI信号的方式来初始化LCD。
最后,如果模组能够将SDO引出就尽量引出,不仅方便调试,而且可以很方便的做不同IC的LCD自适应的兼容。
初始化成功,LCD点不亮
有的时候LCD点不亮,通过上面讲的方法,测量LCM的FPC上的电容的电压确认初始化正常。
即有时候初始化已经成功了,但是LCD还是没有被点亮。
这个
时候就要仔细的对照LCD模组的规格书来检查了,是否是一些非常规的原因,例如串口和RGB数据接口相互影响或者别的什么原因。
见过别人讲的一个案例:
某厂商的一款LCD驱动芯片,初始化成功了以后LCD还是点不亮,经查发现,在RGB接口上写入数据前,要通过串口对某一寄存器写入特殊值,但实际上在初始化的代码中已经包含了对该寄存器写值,即使写入这一特殊值以后RGB数据口上仍然写入不了数据。
最后发现,对暖气修改以后,不能再写其它的寄存器,否则就会出现问题。
当然这也是极个别的现象,不过当你在调试过程中遇到此类问题无法解决的时候,不妨在这个方向上进行检查。
LCD图像错位
LCD显示在水平方向发生位移,或者在上面或底部有一条几个像素的彩色、白色或黑色条纹。
一般来说,出现这种情况,都是因为初始化参数设置不对,和行同步或者场同步信号有关。
显示位置有位移或者错位,就检查LCD模组和CPU上的LCD控制器的行同步与场同步信号的宽度、前后延时、极性的匹配。
最可能的就是回扫的前后延时时间不匹配。
另外,这种情况通常错位不会很多,如果出现错位了一半的图像之类的情况,通常就是别的原因造成的了。
而
且有时候,有的LCD的行信号、场信号的设置还和LCD驱动芯片的部分电压参数的取值设置有关。
LCD大片图片错位、叠加、重复
LCD显示上大范围的图像出现错位、叠加或者重复,出现这种情况一般不会是行同步或者场同步信号的延时引起的,基本可以排除这方面的影响。
可以间检查下抽样等功能的参数是否正常,还有就是因为LCD的硬件平台不同,而在时序或者时钟频率上存在差异引起的。
碰见这种情况首先应该做的就是先仔细计算DMA传输参数。
其它的情况要具体问题具体分析。
UBOOT过程中LCD不显示
开机的时候在UBOOT过程中LOGO不显示,只有背光亮。
这种情况出现的时候如果其它都正常,不妨检查下FLASH的配置。
我碰见这个问题的原因最后是
FLASH的MCP没有设置正确。
FLASH换小以后MCP只有CS0这一片封装,而在配置文件里还是沿用以前的CS0和CS1两片的配置,从而可能会引起各种意想不到的问题。
开机LCD亮的瞬间有花屏出现这种问题,一般都是由于LCD在初始化完成后刷新第一副图像未完全准备好的时候背光已经亮了。
解决的办法就是在UBOOT时候背光亮之前的延时相应的加长一点问题:
RGB接口的屏,在uboot显示正常,进入kernel显示时先花屏几秒钟然后才显示正常;
打log显示在uboot阶段,dpi
controler的framebuffe地址一致,进入kernel后,dpicontroler的framebuffe地址发生变化。
1.在调试mipi接口的时候,lcm
driver添加了te功能,在进入kernel那一瞬间同步紊乱而出现花屏,解决办法是在uboot的时候不要做te的动作,在进入kernel后再开启同步信号。
2.framebuffersize设置过小导致kernel时logo未能正常加载,解决办法是将buffersize改大。
屏的帧同步问题
现象:
在刷屏数据比较频繁(如camerapreview界面移动屏幕时)会有一条或多条断屏现象解决方法:
1.开启mak中的帧同步宏:
SYNC_LCM_SUPPORT=TRUE
2.要在lcd_init函数中打开te功能并设置VSYNC模式,若上层帧同步宏SYNC_LCM_SUPPORT=TRUE,但是lcd_init函数中未打开TE功能则会导致不能开机。
3.LCD_IOCTROL函数要配置正确,如下红色部分要注意跟
LCD_INIT中的设置相匹配
caseLCM_IOCTRL_QUERY__FRAME_RATE:
*(kal_uint32*)(Parameters)=60;
//(*)byinitial
setting//需要与lcd_init函数中设置的一样
returnLCM_IOCTRL_OK;
caseLCM_IOCTRL_SET__FRAME_RATE:
returnLCM_IOCTRL_NOT_SUPPORT;
caseLCM_IOCTRL_QUERY__FRAME_MARKER:
caseLCM_IOCTRL_SET__FRAME_MARKER:
case
LCM_IOCTRL_QUERY__SUPPORT_H_V_SIGNAL_FUN
C:
LCM_IOCTRL_QUERY__SUPPORT_V_PULSE_WIDTH:
LCM_IOCTRL_QUERY__SUPPORT_H_PULSE_WIDTH:
returnLCM_IOCTRL_NOT_SUPPORT;
caseLCM_IOCTRL_QUERY__BACK_PORCH:
*(kal_uint32*)(Parameters)=8;
//(*)byinitialsetting//需要与lcd_init函数中设置的一样
caseLCM_IOCTRL_QUERY__FRONT_PORCH:
//(*)byinitialsetting//需要与lcd_init函数中设置的一样
caseLCM_IOCTRL_SET__BACK_PORCH:
caseLCM_IOCTRL_SET__FRONT_PORCH:
caseLCM_IOCTRL_QUERY__TE_EDGE_ATTRIB:
*(kal_uint32*)(Parameters)=
LCM_TE_FAILING_EDGE;
//此处注意用下降沿returnLCM_IOCTRL_OK;
LCM_IOCTRL_QUERY__SUPPORT_READBACK_FUNC:
caseLCM_IOCTRL_QUERY__SCANLINE_REG:
caseLCM_IOCTRL_QUERY__IF_CS_NUMBER:
*(kal_uint32*)(Parameters)=LCD_IF_PARALLEL_0;
returnLCM_IOCTRL_OK;
caseLCM_IOCTRL_QUERY__LCM_WIDTH:
width
caseLCM_IOCTRL_QUERY__LCM_HEIGHT:
*(kal_uint32*)(Parameters)=320;
//(*)bygram
height
caseLCM_IOCTRL_QUERY__SYNC_MODE:
LCM_TE_VSYNC_MODE;
//此处注意用VSYNC模式returnLCM_IOCTRL_OK;
4.如上三点都用到之后若还是有断屏现象,那么就要确认硬件接口TE信号有接出来,包括CPU和LCD。
如下图:
LPTE脚就是已接出的TE信号如果还不能确认屏是否已接出TE脚,那么可以用示波器量出来,方法如下:
要一直有刷屏的状态下才能量出来,故进入到camerapreview界面,然后量取TE脚的信号,如果是比较规律的一个个脉冲方波,那么就已经接出同步信号。
注意:
能量出TE信号前提必须将软件TE打开才行。
5.如果确认了有TE信号输出那么就需要测量一下屏的CS脚和TE脚的信号。
如下图所示,ta和tb的相同,也就是说每帧数据的起始点和te信号之间的相对位置是一定的,而且Tcs不能大于两个Tte,这时候说明同步了。
如果我们测到Tcs大于两个Tte,那么是肯定没有同步到,肯定会有断屏现象的。
此时我们需要将Tcs缩短,或是将Tte加长;
1)缩短Tcs可以将init_lcd_interface(void)函数中的如下几个参数值减小,但是不能太小,太小了可能会引起白屏问题。
SET_LCD_PARALLEL_CE2WR_SETUP_TIME((kal_uint3
2)3);
//0
SET_LCD_PARALLEL_CE2WR_HOLD_TIME
(1);
SET_LCD_PARALLEL_CE2RD_SETUP_TIME
(1);
SET_LCD_PARALLEL_WRITE_WAIT_STATE(3);
//22////1
SET_LCD_PARALLEL_READ_LATENCY_TIME(13);
//10
SET_LCD_ROI_CTRL_CMD_LATENCY
(1);
2)通过降低屏的帧率来加大Tte周期,这里的帧率调整必须要与LCD_IOCTROL函数中设置的一致。
3)如果Tcs在两个Tte之内,但是Ta!
=Tb,那么也可以通过微调屏的帧率来使Ta=Tb。
通过如上方法基本可以做到无断屏现象,但是还有其他很多因素可以调节,比如:
前廊与后廊,tearscanline等等,这
些对帧同步的影响具体还不是很了解,还有待研究。
另外要注意一下:
如果硬件都有有接出TE脚,且上层将TE功能打开,但是底层屏的TE功能未打开,那么就会引起不开机状态,因为在开机时上层搜索屏的TE信号,屏需要返回TE信号,手机才会开机。
当然如果没有焊接屏的话也是不开机的,因为没有屏就不能返回TE信号而不开机。
(这里主要是针对工厂没有焊接屏时需要开机处理时的一些问题,针对这种情况需要在软件中判断是否有焊接屏,有的话上层才打开TE功能,没有就将上层的TE功能关闭,这样不焊接屏是也能开机了)