高通调试 SPI 屏的 bug
1. spi调试问题:
问题描述:
- 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\n", __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:-\n", __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\n", __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\n", __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\n",
__func__);
return ret;
}
ctrl_pdata->ctrl_state |= CTRL_STATE_PANEL_INIT;
// }
return ret;
}
修改后,patch地址: patch地址
开机正常,spi正常,一切正常;
高通调试 SPI 屏的 bug的更多相关文章
- 高通APQ8074 spi 接口配置
高通APQ8074 spi 接口配置 8074 平台含有两个BLSP(BAM Low-Speed Peripheral) , 每一个BLSP含有两个QUP, 每一个QUP可以被配置为I2C, SPI, ...
- 高通非adsp 架构下的sensor的bug调试
高通 sensor 从native到HAL 高通HAL层之Sensor HAL 高通HAL层之bmp18x.cpp 问题现象: 当休眠后,再次打开preesure sensor的时候,会出现隔一段时候 ...
- 高通平台 lcd driver 调试小结
一.概述 1.1 简介 本文档主要包括LCD模块的驱动流程分析.Framebuffer相关知识.Gralloc等相关内容,以及LCD调试的一些经验和相关bug的分析和讲解. 1.2 开发环境 And ...
- 高通安卓调试LCD几方面总结
来公司上班现在已经整整一个月了,蔽人不才,能力有限,学习进度缓慢,不过也是有一点点的收获与心得,在这里写出来与大家分享,养成良好的记录习惯也免得后忘记. 不啰嗦了,开入正题.来公司一个月左右的时间,主 ...
- 高通LCD驱动调试
本文转载自:http://www.itgo.me/a/x6305658852004979994/lcd%20qcom 来自 :http://blog.csdn.net/dacaozuo/article ...
- 高通Android平台硬件调试之Camera篇
之前一段时间有幸在高通android平台上调试2款camera sensor,一款是OV的5M YUV sensor,支持jpeg out,同时也支持AF,调试比较比较简单,因为别的项目已经在使用了, ...
- Android 系统自动重启Bug(高通平台)
点击打开链接 最近客户反馈了一个Bug,我们的系统用着用着会自动重启,尤其是在拨号的时候极容易死机或者进入下载模式.根据老大和高通的支持得到了一个解决方案. 在Android系统中,有这么一个文件夹: ...
- 高通spi 屏幕 -lk代码分析
lk SPI驱动 1. 初始化时钟 在lk中,我们是从kmain开始执行下来的,而执行顺序则是先初始化时钟,也就是在platform_early_init函数中开始执行的: 在这里我们需要修改这个函数 ...
- 高通MSM8998 ABL的调试
高通在MSM8998上引入了UEFI,用来代替LK(Little Kernel).高通UEFI由XBL和ABL两部分组成.XBL负责芯片驱动及充电等核心应用功能.ABL包括芯片无关的应用如fastbo ...
随机推荐
- 教你自己写Android第三方库
其实Android studio的出现很大程度上方便了我们Android开发人员,今天我们说说怎么构建我们自己的库. 依次按File->New Moudle->android Librar ...
- 【Qt编程】Qt学习之Window and Dialog Widgets
Qt Creator 提供的默认基类只要QMainWindow.QWidget和QDialog三种.其中,QMainWindow是带有菜单栏和工具栏的主窗口类,QDialog是各种对话框的基类,这两个 ...
- 三消游戏FSM状态机设计图
三消游戏FSM状态机设计图 1) 设计FSM图 2) smc配置文件 ///////////////////////////////////////////////////////////////// ...
- 如何修改linux开机运行配置脚本
开机运行级别的配置角本 /etc/inittab 开机运行级别 init 是切换运行级别的指令 0.关机 //init0 1.单用户模式(自动获取超级用户权限,无网络,无服 ...
- 【Qt编程】基于Qt的词典开发系列<十三>音频播放
在上一篇文章中,我是在Qt4平台上调用本地发音的,后来由于用到JSON解析,就将平台转到了Qt5,因为Qt5自带解析JSON的类.然后发现上一篇文章的方法无法运行,当然网上可以找到解决方法,我在这里直 ...
- android EventBus详解(一)
EventBus 是一款针对Android优化的发布/订阅事件总线.主要功能是替代Intent, Handler, BroadCast 在 Fragment,Activity,Service,线程之间 ...
- form表单提交转为可被 getModel(PROJECT.class ,null);接收
var form = new mini.Form("#editForm"+id); form.validate();if (!form.isValid()) { alert('信息 ...
- 《深入理解JAVA虚拟机》笔记1
java程序运行时的内存空间,按照虚拟机规范有下面几项: )程序计数器 指示下条命令执行地址.当然是线程私有,不然线程怎么能并行的起来. 不重要,占内存很小,忽略不计. )方法区 这个名字很让我迷惑. ...
- Linux的chkconfig命令详解
chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. 使用语法: chkconfig [--a ...
- LOVO学习之思维导图和文档编辑器
思维导图——是一种图示笔记方法,一种图示笔记工具,一个思考的利器.能将放射性思考具体化,帮助人们理解和记忆事物. 思维导图绘制规则:1,在纸的正中央用一个彩色图像或者符号开始画思维导图. 2,把所有主 ...