大家日常使用的安卓手机,最看重的一个性能指标之一就是屏幕。而性能又包含诸多因素,如屏幕刷新率能达到多少?色彩饱和度?屏幕功耗等等。而调试这些性能便是作为一个驱动工程师的日常。下面便是之前皮皮哥调试安卓手机遇到的一些问题的个人经验之谈,具体问题具体分析,不具有通用性,希望能给大家开阔一些思维,不管有木有用,希望来个三连,哈哈。
废话不多说,直接上干货:
下面是MTK显示流程框图:
MTK显示流程
一般的LCD显示接口类型:
1. 并行接口:
MCU接口,LCD模组须有自己的GRAM。
RGB接口,通过时钟同步来实现同步传输,此模式不需要LCD有GRAM来缓存数据。
2. 串行接口:
SPI接口。
MDDI接口,高通公司的一种接口方式,传输率高,功耗低。
DSI MIPI接口,MIPI联盟推出的一种高速低耗接口。
LCD调试要注意以下问题:
1. gamma是否超标。
2. 刷新率是否合适。
3. flicker现象是否严重或能否轻易察觉。
4. ESD是否合格。
5. 背光调节是否存在问题,特别是自动调节是否有不平滑现象,或者亮度调定某个范围屏幕出现闪烁等。
6. 图片显示是否有失真的现象。
7. 是否有噪点等问题。
下面是在项目上遇到的实际问题,灰常干货:
遇到的问题:
1. ESD问题。
问题描述:正反打静电,屏幕出现花屏或黑屏。
问题分析:LCD有可能被打死了,或者与LCD连接的时钟或数据线被打乱,造成数据乱,显示花屏。
解决方案:mtk平台有一个时刻检测LCD是否受到静电干扰的线程,一旦发现问题会重新初始化LCD,具体的实现可参考MTK提供的文档<DSI Video Mode Support v1.0.pdf>.
2. TP失效。
问题描述:manggo项目上出现TP偶尔失效的现象。有时开机就无法操作tp,有时开关屏幕就出现无法操作屏幕,有时长时间的使用也会偶尔出现tp失效。
问题分析:通过与TP FAE沟通了解,能够影响TP的主要因素是LCD的Vcom信号。通过同LCD FAE沟通也了解到,LCD的刷新率可能也会对TP造成影响。
解决方案:LCD的vcom信号通过修改调节LCD相关寄存器得到一定的优化,同时TP那边也通过调节固件参数,TP失效的出现几率有所降低,最后再将LCD的刷新率降低一些但不影响绝对实用,问题得到基本解决,测试也再没发现此问题。
备注:此问题出现在video模式的LCD屏幕上,暂时在command模式的屏幕上没有发现,同时与之搭配的TP也是很低廉的,做工也不是很精细,或许也是其原因。
3. 噪点。
问题描述:在bear项目上遇到的噪点问题,就是看上去麻点,看上去“很脏”,这个在用户体验上很不好。
问题分析:通过与MTK沟通了解,最终锁定在MTK自己的为实现去除contour现象,就我们肉眼观察最直接的就是像梯田一样,一圈圈的,这种现象在一张渐变色彩的图片上观察最为明显,但用户体验要好很多。对于contour现象,只是在LCD的分辨率低于24bits时才会出现,因为本身的操作系统都是以24bits—RGB888真彩存储的,最终处理后到LCD显示,如果LCD低于24bits就会砍掉多余的位,这样显示起来就会失真。
解决方案:①换屏幕,提高到24bits真彩的。②取消MTK自有的去噪功能,同时接受contour现象。最终选定为第二种,因为成本。
4. 屏幕闪烁。
问题描述:bear项目上遇到的问题。在将背光调到最低时,仔细观察屏幕会看到在闪烁。
问题分析:因LCD背光控制通过PWM,PWM通过占空比来实现对亮度的调节。PWM可通过调节频率来降低这种闪烁的几率。
解决方案:提高PWM频率的对背光调节的亮度范围重新设定,使其避开了会出现问题的值范围。
5. Yoko项目出现的开机logo显示不正常问题。
问题描述:LCD在uboot中显示不了bootlogo,但是在kernel中重新初始化LCD寄存器的话是可以显示正常,以后都正常。
问题分析:首先怀疑是uboot中初始化代码的问题,但是kernel和uboot都是用的同一份代码,所以应该不是这个问题。但是可以比较确定是LCD初始化有问题,我们就会考虑上电是否正确,上电时序是否正确等等。
解决方案:通过排查,发现在uboot中有一个电压并没有在IC初始化前上好,这个问题解决了,但是uboot显示的问题还没解决,通过上电时序排查,在LCD的3个电压全部上好后100ms,IC寄存器开始初始化,上好电后,IC的正常工作至少应该要几百毫秒,所以怀疑是上电后IC没正常工作就开始寄存器设置了。将IC初始化时间延后,问题解决。
要做好LCD的性能调试,需要对LCD驱动架构以及LCD的芯片参数有很好的了解,才能对症下药。
本文只是自己在调试过程中遇到的一些问题以及解决思路,不具有通用性,针对有缘人,请佛系阅读,喜欢的话,请三连,后面有时间会多写写Linux内核驱动开发、inux调试及性能优化、嵌入式开发中经常用到的软件开发技能栈,比如netlink、mmap、dma、大数据传输、中断、多线程调度优化等常用必备技能。