发生异常的现象:
msm8953 lcd在快速亮灭的情况下背光概率性休眠不灭;测量高通pwm,发现正常的时候pwm的管脚LCM_BL_PWM
为低电平,失败的时候为高电平;
根据原理图:
mpp是什么?
mpp是基于电源pmic的管脚,也叫做多功能管脚;MPP的全称是Multi Purpose Pin;可以做电源、gpio、ADC、PWM、SINK等功能。
背光的控制方式:
- LCD控制IC支持动态背光控制功能(CABC)通过解析图像的直方图动态改变输出PWM的占空比从而动态调节LCD的背光,在不改变图像显示效果的情况下降低功耗,PMIC根据CABC的占空比控制背光输出电压;
- 背光控制部分不经过PMIC而是通过一颗单独的带有boost转换功能的LED驱动器如LM3630A,该芯片通过PWM调节亮度。
我们使用的就是第一种方式;
通过soc->pmi8950(内部pwm)->mpp3的方式去控制。
lcd背光控制调用流程:
首先,我们用的是mipi接口,所以lcd显示驱动是在mdss_dsi.c
中,pwm驱动控制是在pwm-qpnp.c
文件中(kernel\msm-3.18\drivers\pwm
);
在mdss_dsi.c
文件中,具体在哪里调用到背光函数呢?
根据打印log,可以知道背光控制函数mdss_dsi_panel_bl_ctrl
;
mdss_dsi_panel_bl_ctrl
这个函数是在mdss_dsi_panel.c
文件中;
调用顺序如下:mdss_dsi_ctrl_probe
-- >
mdss_dsi_config_panel
-- >
mdss_dsi_panel_init
-- >
ctrl_pdata->panel_data.set_backlight = mdss_dsi_panel_bl_ctrl;
根据mdss_dsi_panel_bl_ctrl
函数:
static void mdss_dsi_panel_bl_ctrl(struct mdss_panel_data *pdata,
u32 bl_level)
{
......
/*
* Some backlight controllers specify a minimum duty cycle
* for the backlight brightness. If the brightness is less
* than it, the controller can malfunction.
*/
if ((bl_level < pdata-&g