1、如何看亮灭屏时间

adb shell

kmsgcat |grep fb_blank

2、code简介

在kernel/drivers/video/msm/mdss/mdss_fb.c中,

static intmdss_fb_blank_sub(int blank_mode, struct fb_info *info, int op_enable)

blank_mode这个参数的值主要有两个,FB_BLANK_UNBLANK和 FB_BLANK_POWERDOWN ,

FB_BLANK_UNBLANK是亮屏操作;

FB_BLANK_POWERDOWN 是灭屏操作;

当要亮屏的时候,传入参数FB_BLANK_UNBLANK时,会执行下面这些函数,

if (!mfd->panel_power_on &&mfd->mdp.on_fnc) {

ret = mfd->mdp.on_fnc(mfd);

if (ret == 0) {

mfd->panel_power_on = true;

mfd->panel_info->panel_dead= false;

}

mutex_lock(&mfd->update.lock);

mfd->update.type =NOTIFY_TYPE_UPDATE;

mfd->update.is_suspend = 0;

mutex_unlock(&mfd->update.lock);

/* Start the work thread tosignal idle time */

if (mfd->idle_time)

schedule_delayed_work(&mfd->idle_notify_work,

msecs_to_jiffies(mfd->idle_time));

}

mutex_lock(&mfd->bl_lock);

if (!mfd->bl_updated) {

mfd->bl_updated = 1;

mdss_fb_set_backlight(mfd,mfd->bl_level_prev_scaled);

}

mutex_unlock(&mfd->bl_lock);

}

当执行ret =mfd->mdp.on_fnc(mfd);会调用(上一篇文章http://blog.csdn.net/liwei16611/article/details/52830483)注册的函数mdss_mdp_overlay_on;

在mdss_mdp_overlay_on函数中,

staticint mdss_mdp_overlay_on(struct msm_fb_data_type *mfd)

{

..................

if (!mdp5_data->ctl) {

ctl =__mdss_mdp_overlay_ctl_init(mfd);

if (IS_ERR_OR_NULL(ctl))

return PTR_ERR(ctl);

mdp5_data->ctl = ctl;

}

if (!mfd->panel_info->cont_splash_enabled&&

(mfd->panel_info->type !=DTV_PANEL)) {

rc =mdss_mdp_overlay_start(mfd);

if (!IS_ERR_VALUE(rc)&&

(mfd->panel_info->type!= WRITEBACK_PANEL)) {

atomic_inc(&mfd->mdp_sync_pt_data.commit_cnt);

rc= mdss_mdp_overlay_kickoff(mfd, NULL);

}

} else {

rc =mdss_mdp_ctl_setup(mdp5_data->ctl);

if (rc)

return rc;

}

......

}

在这里我们看到如果mdp5_data->ctl 还没有被初始化,则对他进行初始化,实际上在fb_probe 已经被初始化了, 那在这判断的作用,是为了如果有动态切换的话,                    mdp5_data->ctl 会被置成NULL,当要亮屏的时候回去重新初始化。

如果连续显示打开的话则mfd->panel_info->cont_splash_enabled会被置1,那么就不去执行mdss_mdp_overlay_start,因为它在fb_probe中已经被执行了。

执行mdss_mdp_ctl_setup会对pipe 及Mixer 进行一些配置,为传入的帧数据做准备。

当要显示数据的帧的时候,会从hal 层传入commit的命令,调用 mdss_mdp_display_commit 函数,然后调用display_fnc,

这个回调函数是在mdss_mdp_video_start中注册的;

ctl->display_fnc= mdss_mdp_video_display;

在mdss_mdp_video_display函数中,

staticint mdss_mdp_video_display(struct mdss_mdp_ctl *ctl, void *arg)

{

......................

if(!ctx->timegen_en) {

rc =mdss_mdp_ctl_intf_event(ctl, MDSS_EVENT_UNBLANK, NULL);

if (rc) {

pr_warn("intf #%dunblank error (%d)\n",

ctl->intf_num,rc);

video_vsync_irq_disable(ctl);

ctx->wait_pending =0;

return rc;

}

pr_debug("enabling timinggen for intf=%d\n", ctl->intf_num);

if((pdata->panel_info.cont_splash_enabled &&

!ctl->mfd->splash_info.splash_logo_enabled)

||(ctl->mfd->splash_info.splash_logo_enabled

&&!is_mdss_iommu_attached())) {

rc =wait_for_completion_timeout(&ctx->vsync_comp,

usecs_to_jiffies(VSYNC_TIMEOUT_US));

}

rc = mdss_iommu_ctrl(1);

if (IS_ERR_VALUE(rc)) {

pr_err("IOMMUattach failed\n");

return rc;

}

mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_ON,false);

mdss_mdp_irq_enable(MDSS_MDP_IRQ_INTF_UNDER_RUN, ctl->intf_num);

mdss_bus_bandwidth_ctrl(true);

mdp_video_write(ctx,MDSS_MDP_REG_INTF_TIMING_ENGINE_EN, 1);

wmb();

rc = wait_for_completion_timeout(&ctx->vsync_comp,

usecs_to_jiffies(VSYNC_TIMEOUT_US));

WARN(rc == 0, "timeout(%d) enabling timegen on ctl=%d\n",

rc, ctl->num);

ctx->timegen_en = true;

rc =mdss_mdp_ctl_intf_event(ctl, MDSS_EVENT_PANEL_ON, NULL);

WARN(rc,"intf %d panel on error (%d)\n", ctl->intf_num, rc);

......................

}

通过mdss_mdp_ctl_intf_event(ctl,MDSS_EVENT_UNBLANK, NULL); 发送一个event事件,

dsi_event_handler 会接收到这个事件,去执行dsi_on,mdss_dsi_op_mode_config;

之后通过mdss_mdp_ctl_intf_event(ctl,MDSS_EVENT_PANEL_ON, NULL);

dsi_event_handler会接收到这个事件,去执行mdss_dsi_unblank;

当要灭屏的时候,从hal层会发送stop命令,当驱动接收到这个命令会执行mdss_mdp_video_stop函数;

staticint mdss_mdp_video_stop(struct mdss_mdp_ctl *ctl)

{

rc = mdss_mdp_ctl_intf_event(ctl,MDSS_EVENT_BLANK, NULL);

if (rc == -EBUSY) {

pr_debug("intf #%dbusy don't turn off\n",

ctl->intf_num);

return rc;

}

WARN(rc, "intf %d blankerror (%d)\n", ctl->intf_num, rc);

mdp_video_write(ctx,MDSS_MDP_REG_INTF_TIMING_ENGINE_EN, 0);

/* wait for at least one VSYNCon HDMI intf for proper TG OFF */

if (MDSS_INTF_HDMI ==ctx->intf_type) {

frame_rate =mdss_panel_get_framerate

(&(ctl->panel_data->panel_info));

if (!(frame_rate >= 24&& frame_rate <= 240))

frame_rate = 24;

msleep((1000/frame_rate)+ 1);

}

mdss_iommu_ctrl(0);

mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_OFF,false);

ctx->timegen_en = false;

rc =mdss_mdp_ctl_intf_event(ctl, MDSS_EVENT_PANEL_OFF, NULL);

WARN(rc, "intf %dtimegen off error (%d)\n", ctl->intf_num, rc);

mdss_mdp_irq_disable(MDSS_MDP_IRQ_INTF_UNDER_RUN,

ctl->intf_num);

sctl =mdss_mdp_get_split_ctl(ctl);

if (sctl)

mdss_mdp_irq_disable(MDSS_MDP_IRQ_INTF_UNDER_RUN,   sctl->intf_num);

mdss_bus_bandwidth_ctrl(false);

----------------------

}

通过mdss_mdp_ctl_intf_event(ctl,MDSS_EVENT_BLANK, NULL);发送灭屏的事件,

dsi_event_handler会接收到这个事件,会去执行mdss_dsi_blank。

通过mdss_mdp_ctl_intf_event(ctl,MDSS_EVENT_PANEL_OFF, NULL);发送事件,同样dsi_event_handler 会接收到这个事件,会去执行mdss_dsi_off。

最后在mdss_fb_suspend_sub中发送FB_BLANK_POWERDOWN,最后屏熄灭。

高通LCD之亮灭屏过程简析相关推荐

  1. Android7.0 PowerManagerService亮灭屏分析(一)

    绪论 可以导致手机亮灭屏的因素有多种,而在本文中主要讲解按power键亮灭屏过程以及来电亮屏.在亮灭屏过程power中主要的实现类与功能如下所述: PowerManagerService.java:以 ...

  2. Android 系统(40)--Android7.0 PowerManagerService亮灭屏分析(一)

    Android7.0 PowerManagerService亮灭屏分析(一) 可以导致手机亮灭屏的因素有多种,而在本文中主要讲解按power键亮灭屏过程以及来电亮屏.在亮灭屏过程power中主要的实现 ...

  3. qcom平台 LCD亮灭屏流程及LCD知识点总结

    一.LK中亮屏流程 1.gcdb_display_init(),进行display初始化的起始地方: 2.oem_panel_select(),在这里去选择哪一款屏,也可以在这里添加新一款屏: 3.d ...

  4. Android7.0 PowerManagerService亮灭屏分析(三)

    在前面两部分已经对绘制windows与设置设备状态进行了详细讲解. 之后接着就该对亮度值进行设置, 实现亮屏动作了. 在DisplayPowerController中的animateScreenBri ...

  5. Android7.0 PowerManagerService亮灭屏分析(二)

    在PowerManagerService中对各种状态进行判断后,将其数值封装进DisplayPowerRequest中传入DisplayPowerController中进一步处理.在亮屏过程中Disp ...

  6. Android 系统(42)---Android7.0 PowerManagerService亮灭屏分析(三)

    Android7.0 PowerManagerService亮灭屏分析(三) 在前面两部分已经对绘制windows与设置设备状态进行了详细讲解. 之后接着就该对亮度值进行设置, 实现亮屏动作了. 在D ...

  7. Android 系统(41)---Android7.0 PowerManagerService亮灭屏分析(二)

    Android7.0 PowerManagerService亮灭屏分析(二) 3029 在PowerManagerService中对各种状态进行判断后,将其数值封装进DisplayPowerReque ...

  8. 高通LCD bring up流程

    高通LCD bring up流程 前言 kernel 添加LCD的dtsi 将屏的dtsi放到平台的dtsi中 电压配置 lk 添加屏的.h文件 Panel configuration Panel r ...

  9. Android7.0 PowerManagerService 之亮灭屏(二) PMS 电源状态管理updatePowerStateLocked()...

    本篇注意接着上篇[Android7.0 PowerManagerService 之亮灭屏(一)]继续分析量灭屏的流程,这篇主要分析PMS的状态计算和更新流程,也是PMS中最为重要和复杂的一部分电源状态 ...

最新文章

  1. 国企程序员有多香?这是一个普通程序员在国企的每日工作清单!
  2. QL Server 中四种匹配符的含义
  3. 手机uc浏览器夜间模式怎么设置调成全黑
  4. 数独解题程序的python实现_python实现自动解数独小程序
  5. BitMEX将于2月16日16:00引入防止输入错误交易规则
  6. Java web--过滤器
  7. java生成word带多级标题,word自动生成多级标题的方法
  8. C语言题目:输出三角形面积和周长 (15 分)
  9. Linux下的C语言编程教程-Chinaitlab制作
  10. 由中国银联主导和推行的“盒子支付模式”正式推出多平台应用
  11. s5p6818/fs4418系统移植之uboot的移植
  12. memery leak Exception
  13. html怎么设置下外边距,cssmargin外边距属性与用法总结
  14. 1228: 趣味程序设计_出售金鱼
  15. 医疗器械注册文件清单 2022.5.26
  16. python reset_index()_python 问题 reset_index(drop=True
  17. 关于nacos配置中心配置不成功的问题
  18. h5打开手机扫码功能
  19. 子网掩码,CIDR前缀法表示掩码
  20. vscode python F12无法跳转定义的解决

热门文章

  1. (转)更改窗口控制按鈕的位置(非 Emerald )
  2. 020:Python函数使用进阶
  3. 如何:获取对 DTE 和 DTE2 对象的引用
  4. Nature封面:宇宙物质起源的证据找到了!12国团队耗时十年,中微子不对称揭示宇宙秘密...
  5. 2019-2-11-win10-uwp-安装文件-appinstaller-格式
  6. WIN10 右键菜单增加“获取管理员权限”和“恢复管理员”权限的方法
  7. 鸿蒙红包系统,不朽鸿蒙录红包版
  8. NXP PCF85063芯片的实时时钟
  9. 实现局域网内其他设备访问服务器
  10. 循环移动数组,比如移动M个位置