AnsweredAssumed Answered

iMX6Q Android 添加initlogo.rle后系统唤醒时会出现framebuffer显示问题

Question asked by carit zhu on Sep 20, 2016
Latest reply on Sep 30, 2016 by jimmychan

现在发现Android 4.4.3在启动时添加initlogo.rle后,系统启动时能通过LVDS正确显示。但是当系统休眠后,再次唤醒时会发生屏幕抖动,并且颜色错误。通过logcat发现系统唤醒后在调用gralloc时会发生如下错误:

W/imx6.gralloc(  142): FBIOPAN_DISPLAY failed: Invalid argument

通过查看linux驱动代码,主要是由于framebuffer的模式出现了问题。

android系统在启动时,由于需要三倍缓存的原因,会调用一次FBIOPUT_VSCREENINFO来设置3倍的缓存区大小以及相应的RGBA8888。在设置的同时会调用一次fbcon.c中的fbcon_modechanged,改函数是为了同时设置console中的显示参数。但是这个函数里面有一个判断,就是如果vc_mode != KD_TEXT,就会跳过修改console的显示参数,而查看android/system/core/init/logc.c中发现当存在initlogo.rle后,系统会主动将console模式设置成KD_GRAPHICS。这样console中还是保存着原来的非3倍缓存的参数。而在系统唤醒时linux内核会再读取显示参数并调用fbcon.c中的fbcon_switch,改函数会将console中的显示参数复制给实际显示的参数,这样原来3倍的缓冲区就又变成了1倍缓冲区,而且RGB参数也被修改了,这样唤醒后就会出现屏幕闪烁和色彩不正确的情况。

现在有如下几种解决方案:

1、去除initlogo.rle,这样console模式还是会变成KD_TEXT。

2、在fbcon_modechanged函数中将vc_mode != KD_TEXT判断去掉。

3、在fbcon_switch中也添加vc_mode != KD_TEXT判断。

不知道是否有人碰到相同的问题,这个到底是哪里有bug呢?我这样修改是否合理呢?

Outcomes