在手机进入系统之前会有一个bootloader流程,我从网上找到的解释如下:
“Bootloader(系统启动加载器),其实就是在系统启动之前运行的一段程序。Bootloader的作用是对硬件设备初始化,建立内存空间映像图,从而把系统的软件环境带到一个合适的状态。这样,系统在调用内核时就准备好真正的环境,最终引导系统正常启动。”
对于显示系统LCD来说存在这样一个问题:既然在bootloader里已经对硬件进行了初始化,那么进入kernel后再初始化一遍会不会很麻烦,于是在系统中存在这样一个全局变量:
static int cont_splash_enabled;
它的作用是控制是否在进入kernel以后重新对硬件进行配置,其字面意思是(配置连续闪屏功能)
target_set_cont_splash_screen(1);//使能连续闪屏,即不在kernel重新配置LCD
target_set_cont_splash_screen(0);//不使能连续闪屏,即在kernel重新配置LCD
但之前遇到一个问题,开机的过程中屏幕会跳一下,之前一直不知道问题出在哪里,只觉得是bootloader和kernel中的配置可能有不一样的地方,才会导致抖屏。
但明明在bootLoader里配置了target_set_cont_splash_screen(1);,怎么还会这样呢?
最后通过多次调用lm3630_lcd_backlight_set_level(int level);这个函数,设置屏幕亮暗和加msleep(int time);延迟判断问题出在
根目录\android\kernel\drivers\video\msm\mdss\mdss_dsi.c的dsi_panel_device_register()函数的mdss_dsi_clk_ctrl(ctrl_pdata, 1);里
再往里找,最后确定是如下函数出现了问题
rc = clk_set_rate(ctrl_pdata->byte_clk, ctrl_pdata->byte_clk_rate);
可以判断是kernel中对byte的时钟配置跟bootloader里的不一样
最后解决的办法如下:
if (!ctrl->panel_data.panel_info.cont_splash_enabled) {
rc = mdss_dsi_clk_set_rate(ctrl);
if (rc) {
pr_err("%s: failed to set clk rates. rc=%d\n",__func__, rc);
mdss_dsi_disable_bus_clocks(ctrl);
goto error;
}
}
先判断是否设置了ctrl->panel_data.panel_info.cont_splash_enabled这个变量等于1,如果是的话就不对byte时钟进行重新配置,这样就解决了这个问题。
来看看这个变量是怎么来的吧:
ctrl->panel_data.panel_info.cont_splash_enabled= unc_get_cont_splash_enabled();
bool unc_get_cont_splash_enabled(void)
{
return cont_splash_enabled;
}
其中static int cont_splash_enabled;是定义在
根目录\android\bootable\bootloader\lk\target\msm8974_l9_open_com\Init.c中的全局变量,就是前面那个cont_splash_enabled