RV1109–LCD黑屏问题
1、问题描述
平台
:RV1109
需求
:兼容一块10.1寸mipi的LCD屏(1218-A101NL66-28K),是rv1109的第10块屏幕,使用lcd_index=10(lcd_index涉及到我司兼容LCD方式)来标志这块屏。
问题
:设备开机后,在uboot阶段显示正常,启动kernel后屏幕逐渐熄灭变黑。
2、问题根因
在uboot的时候,LCD屏的初始化序列正确,故能在uboot阶段正常显示。但是在kernel阶段由于
错误地使用timimg参数
,导致屏幕逐渐熄灭变黑。
3、具体分析
这就需要涉及到我司rv1109项目对LCD屏幕的兼容方式了,我司是在uboot阶段兼容各种LCD屏幕,所以会在uboot选择具体哪个lcd屏幕,然后根据这块屏幕的初始化序列来初始化这块屏幕并显示logo。具体可以去查找相关资料和追溯代码。
在uboot这一阶段没有出现问题,也正确地通过bootarg命令将选择的屏幕index传递到kernel了,如下图所示:
由上面的图片可知,显然uboot阶段选择的屏幕是正确的,是选择我需要的那块屏幕。但从图片里可以看到选择的LCD型号为L071,不是我目前LCD型号–1218-A101NL66-28K。那这是什么原因导致的呢?
那我们从函数of_get_display_timings寻找答案吧,如下图:
在of_get_display_timings函数里发现出现bug的就是在上图中的那部分代码。在这部分代码里我们可以知道获取LCD的timing参数是通过lcd_name和lcd_index来比较,如果相同就获取timing参数。但问题就出在上图3处的字符串比较函数—strncmp。它这里是以
lcd_name的长度来与lcd_index比较,所以当在LCD1与LCD10以4的长度来比较,结果是相同的,这样就选择了LCD1的timing参数
。所以我们将这部分代码改成如下图,bug就解决了。