• 高通调试 SPI 屏的 开机一段时间黑屏


    1. spi调试问题:

    问题描述:

    1. spi屏幕lk启动的时候正常出现小企鹅,到kernel启动的过程黑屏并且花屏才到开机动画;

    2. 黑屏的三个阶段:

    参照:黑屏分析
    分析开机过程黑屏,首先需要定位黑屏问题发生的时间段,开机过程中涉及到显示logo 或者是播放动画的主要有如下三个阶段:

    • 显示 lk logo ;
    • 显示kernel logo;
    • 开机动画 Bootanimation
      如下这张ENG 版本开机过程显示图,说明了主要的三个过程:

    如下解释:
    (阶段1)、带有”normal boot“的lk logo,会在lk阶段显示。显示时间一般1s左右。
    (阶段2)、启动到kernel的前7s左右,显示的是带”normal boot“字样的lk logo。(这里L/M版本和KK/JB版本很不同,不在此处细说)
    (阶段3)、之后显示kernel logo的时间段很短,一般只有2s左右.
    (阶段4)、显示bootanimation动画。

    3. 调试过程:

    如上所示,我们是在(阶段一)(阶段二)之间黑屏,这时候要看一下lk中DEFINES += DISPLAY_SPLASH_SCREEN = 1 的宏有没有打开;(target/xxx/rules.mk),再将qcom,cont-splash-enabled增加到你对应厂商的屏代码的设备树中;

    重新烧录软件,开机;

    依然出现问题:
    我们这时候发现lk到kernel的第二阶段已经完全正常了,但是又出现问题。。。这时候kernel的开机动画出现抖动,并且无法正常显示(第三阶段);关键来了,灭屏后,一切屏幕正常;
    这时候,我已经开始怀疑lk和kernel的spi屏初始化代码有区别:

    将lk代码修改为kernel中的初始化代码,结果lk也有问题,出现不断的抖动和闪烁;于是,我只能接受spi 屏kernel和lk初始化代码不一样的结论了;但问题是为什么我们第三阶段已经属于我们kernel启动的时候了,但是为什么没有初始化呢?(灭屏后再次开启已经启用了resume了);

    读源码吧:
    找到我们kernel源码中的qcom,mdss-spi-on-command节点,在解析设备树用到的,最后我们定位在mdss_spi_panel_on函数中初始化:

    int mdss_spi_panel_on(struct mdss_panel_data *pdata)
    {
    	struct spi_panel_data *ctrl = NULL;
    	struct mdss_panel_info *pinfo;
    	int i;
    
    	if (pdata == NULL) {
    		pr_err("%s: Invalid input data
    ", __func__);
    		return -EINVAL;
    	}
    	pinfo = &pdata->panel_info;
    	ctrl = container_of(pdata, struct spi_panel_data,
    				panel_data);
    
    	for (i = 0; i < ctrl->on_cmds.cmd_cnt; i++) {
    		mdss_spi_tx_command(ctrl->on_cmds.cmds[i].command);
    
    		if (ctrl->on_cmds.cmds[i].dchdr.dlen > 1) {
    			mdss_spi_tx_parameter(ctrl->on_cmds.cmds[i].parameter,
    					ctrl->on_cmds.cmds[i].dchdr.dlen-1);
    		}
    		if (ctrl->on_cmds.cmds[i].dchdr.wait != 0)
    			msleep(ctrl->on_cmds.cmds[i].dchdr.wait);
    	}
    
    	pinfo->blank_state = MDSS_PANEL_BLANK_UNBLANK;
    	pr_debug("%s:-
    ", __func__);
    
    	return 0;
    }
    

    增加log打印,最后判断在第三阶段中上述函数中并没有被调用到,而是由lk的初始化代码一直维持屏的状态;
    mdss_spi_panel_init函数中,注册了相应的回调函数:

    int mdss_spi_panel_init(struct device_node *node,
    	struct spi_panel_data	*ctrl_pdata,
    	bool cmd_cfg_cont_splash)
    {
    	int rc = 0;
    	static const char *panel_name;
    	struct mdss_panel_info *pinfo;
    	
    	if (!node || !ctrl_pdata) {
    		pr_err("%s: Invalid arguments
    ", __func__);
    		return -ENODEV;
    	}
    
    	pinfo = &ctrl_pdata->panel_data.panel_info;
    
        .......
    	ctrl_pdata->on = mdss_spi_panel_on;
    	ctrl_pdata->off = mdss_spi_panel_off;
    	ctrl_pdata->panel_data.set_backlight = mdss_spi_panel_bl_ctrl;
    
    	return 0;
    }
    

    而这个回调函数是在什么时候作用到的呢?

    mdss_spi_panel_unblank函数中:

    static int mdss_spi_panel_unblank(struct mdss_panel_data *pdata)
    {
    	int ret = 0;
    	struct spi_panel_data *ctrl_pdata = NULL;
    
    	if (pdata == NULL) {
    		pr_err("%s: Invalid input data
    ", __func__);
    		return -EINVAL;
    	}
    
    	ctrl_pdata = container_of(pdata, struct spi_panel_data,
    				panel_data);
    
    //	if (!(ctrl_pdata->ctrl_state & CTRL_STATE_PANEL_INIT)) {
    
    	ret = ctrl_pdata->on(pdata);
    	if (ret) {
    		pr_err("%s: unable to initialize the panel
    ",
    					__func__);
    		return ret;
    	}
    	ctrl_pdata->ctrl_state |= CTRL_STATE_PANEL_INIT;
    //	}
    
    	return ret;
    }
    

    修改后,patch地址: patch地址
    开机正常,spi正常,一切正常;

  • 相关阅读:
    活用 %取余 用于变量循环
    jquery滚动条固定在某一位置
    jquary中各种相似操作介绍
    jquary中滚动条滚动到底部
    JSON到字符串之间的解析
    ecshop删去版权等信息
    分享代码和网页地图
    ecshop版权的修改,头部,底部
    ECSHOP中transport.js和jquery的冲突的简单解决办法
    从Eclipse迁移到Android Studio碰到的问题记录
  • 原文地址:https://www.cnblogs.com/linhaostudy/p/9045309.html
Copyright © 2020-2023  润新知