MTK 平台唤醒流程:

一、唤醒流程:

  MTK平台唤醒流程是从power键或者其他按键按下开始,本文以mt6753n平台为例,通过分析kernel log来看驱动中整个唤醒的流程,上层的唤醒流程后续再分析。 
1、按键按下 
  当按键按下时会出发中断,从而回调中断的处理函数,从kernel log从会有以下log吐出:

01-02 12:27:04.500571    70    70 E [  940.825599]: (3)[70:pmic_thread][name:pmic&][PMIC] [pwrkey_int_handler] Press pwrkey 0
01-02 12:27:04.500593    70    70 E [  940.825621](3)[70:pmic_thread][name:kpd&]: Power Key generate, pressed=1
01-02 12:27:04.500694    70    70 E [  940.825722](3)[70:pmic_thread][name:hal_kpd&]: kpd: (pressed) HW keycode =116 using PMIC
  •   在代码中体现如下:
./kernel-3.18/drivers/misc/mediatek/power/mt6735/pmic.c
void pwrkey_int_handler(void)
{PMICLOG("[pwrkey_int_handler] Press pwrkey %d\n", pmic_get_register_value(PMIC_PWRKEY_DEB));#if defined(CONFIG_MTK_KERNEL_POWER_OFF_CHARGING)if (get_boot_mode() == KERNEL_POWER_OFF_CHARGING_BOOT)timer_pre = sched_clock();
#endif
#if defined(CONFIG_MTK_FPGA)
#elsekpd_pwrkey_pmic_handler(0x1);
#endif
}
  •   接下来调用kpd_pwrkey_pmic_handler:
void kpd_pwrkey_pmic_handler(unsigned long pressed)
{kpd_print("Power Key generate, pressed=%ld\n", pressed);if (!kpd_input_dev) {kpd_print("KPD input device not ready\n");
        return;}kpd_pmic_pwrkey_hal(pressed);
#if (defined(CONFIG_ARCH_MT8173) || defined(CONFIG_ARCH_MT8163))if (pressed) /* keep the lock while the button in held pushed */wake_lock(&pwrkey_lock);else /* keep the lock for extra 500ms after the button is released */wake_lock_timeout(&pwrkey_lock, HZ/2);
#endif
}
  •   接下来调用kpd_pmic_pwrkey_hal:
void kpd_pmic_pwrkey_hal(unsigned long pressed)
{
#ifdef CONFIG_KPD_PWRKEY_USE_PMICif (!kpd_sb_enable) {//通过input子系统向上层上报键值input_report_key(kpd_input_dev, kpd_dts_data.kpd_sw_pwrkey, pressed);input_sync(kpd_input_dev);if (kpd_show_hw_keycode) {kpd_print(KPD_SAY "(%s) HW keycode =%d using PMIC\n",pressed ? "pressed" : "released", kpd_dts_data.kpd_sw_pwrkey);}/*ZH CHEN*//*aee_powerkey_notify_press(pressed);*/}
#endif
}
  •   到这里从按键按下触发中断到回调中断函数,最后通过input子系统向上层上报键值。

2、进程解冻,系统开始唤醒 
  当按键按下后,系统开始唤醒,一些sensor(gsensor/psensor/lsensor/gyro/msensor等)会开始进入resume流程,log如下:

01-02 12:27:04.518694   873   873 W [  940.843722]: (0)[873:system_server]MSENSOR af7133e_af8133i_resume
01-02 12:27:04.522326   873   873 W [  940.847354]: (2)[873:system_server][Gsensor] bmi160_acc_resume
01-02 12:27:04.534504   873   873 D [  940.859532]: (2)[873:system_server][name:ltr579&][ALS/PS] ltr579_i2c_resume
......
  •   当这些进程解冻完成后,在kernel log中会有标志性的log吐出:
01-02 12:27:04.544117   401   401 W [  940.869145]: (0)[401:fuelgauged]Restarting tasks ...
  • 3、LCM开始唤醒:

  当系统唤醒完成后,LCM也会开始进入唤醒状态,当LCM唤醒完成之后会退出唤醒状态,这个过程都有标志性的log吐出:

......
01-02 12:27:05.076832   272   272 W [  940.936520]: (4)[272:surfaceflinger][name:mtkfb&]DISP/MTKFB [FB Driver] enter late_resume
......
01-02 12:27:05.413783   272   272 W [  941.273471]: (0)[272:surfaceflinger][name:mtkfb&]DISP/MTKFB [FB Driver] leave late_resume
......
  •   其中在enter late_resume和leave late_resume中会执行LCM的唤醒操作,这部分的耗时与屏的时序有关,当屏上电和下参数的时间越短,手机唤醒亮屏的时间也就越短,代码如下:
//./kernel-3.18/drivers/misc/mediatek/video/common/mtkfb.c
static void mtkfb_blank_resume(void)
{int ret = 0;MSG_FUNC_ENTER();if (disp_helper_get_stage() != DISP_HELPER_STAGE_NORMAL)return;PRNWARN("[FB Driver] enter late_resume\n");#ifdef CONFIG_SINGLE_PANEL_OUTPUTis_early_suspended = false;
#endifret = primary_display_resume();if (ret) {DISPERR("primary display resume failed\n");return;}PRNWARN("[FB Driver] leave late_resume\n");
}
  •    primary_display_resume()函数比较多,包含显示模块的上电、初始化、lcm的上电、resume等的过程:
int primary_display_resume(void)
{......DISPMSG("dpmanager path power on[begin]\n");dpmgr_path_power_on(pgc->dpmgr_handle, CMDQ_DISABLE);DISPMSG("dpmanager path power on[end]\n");......DISPMSG("[POWER]dpmanager re-init[begin]\n");dpmgr_init...DISPMSG("[POWER]dpmanager re-init[end]\n");......DISPMSG("[POWER]lcm resume[begin]\n");disp_lcm_resume(pgc->plcm);DISPMSG("[POWER]lcm resume[end]\n");......
}
  •   下面重点看disp_lcm_resume:
int disp_lcm_resume(disp_lcm_handle *plcm)
{LCM_DRIVER *lcm_drv = NULL;DISPFUNC();if (_is_lcm_inited(plcm)) {lcm_drv = plcm->drv;//调用lcm驱动代码中的resume_powerif (lcm_drv->resume_power)lcm_drv->resume_power();//调用lcm驱动代码中的lcm_resumeif (lcm_drv->resume) {lcm_drv->resume();} else {DISPERR("FATAL ERROR, lcm_drv->resume is null\n");return -1;}return 0;}DISPERR("lcm_drv is null\n");return -1;
}

4、背光亮 
  当LCM初始化完成后会调用背光的驱动,通过上层传入的level_1024来设置背光的亮度,从而亮屏

01-02 12:27:05.527109   487   487 W [  941.386797]: (4)[487:AALServiceMain][name:ddp_pwm&][PWM] disp_pwm_set_backlight_cmdq(id = 0x1, level_1024 = 358), old = 0
  •   从上面kernel log的唤醒流程中可以看出,整个唤醒的流程主要包括:power键按下、进程解冻、late_resume、背光亮这几步,所以优化唤醒的时间可以从这几个方面出发优化

android 系统优化(20)---MTK 平台唤醒时间优化1相关推荐

  1. android 性能优化---(2) MTK 平台开机时间优化

    一.在工程模式开启MTKLogger, 开机后取日志bootprof  adb pull /storage/emulated/0/mtklog/mobilelog/APLog_2018_0309_10 ...

  2. Android手机开关机、重启时间优化

    本篇文章主要介绍 Android 开发中开关机 重启时间 部分知识点,通过阅读本篇文章,您将收获以下内容: zygote,预加载class.resources 开机动画进程 bootanimation ...

  3. 【android睡眠唤醒 二】MTK平台唤醒框架分解

    在文章MTK 唤醒时间分析中分析了内核中的主要的亮屏重要阶段,此篇文章结合上层的log一起来分析下整个系统的亮屏流程.整个流程可以分为如下几个部分: (1)power键(home键)产生并上报(在in ...

  4. android 遥控器映射,MTK 平台Android系统遥控器映射关系

    MTK 平台Android系统遥控器映射关系 在我们工作中,经常要去适配遥控器的工作,但是大部时候我们是移植其他工程上的代码来修改,可能对Android系统中的按键关系有些不清楚,下面以MTK平台为例 ...

  5. Android Camera (13)---MTK平台相机插值修改

    MTK平台相机插值修改 一.注意事项 二.HAL层修改 三.APP层修改 四.部分插值整理 五.快速编译指令 一.注意事项 Camera插值在底层已经做好,我们只需要在中间层和app层添加一个对应的p ...

  6. android 9.x MTK平台讯飞输入法重启被卸载

    引言 平台信息:mt8788平台 android9.0 问题描述:安装讯飞输入法,重启机器,讯飞输入法消失 分析过程 安装apk后,adb shell进入机器,查看/data/app里面的文件 C:\ ...

  7. MTK平台唤醒源分类

    SPM R12寄存器记录MCU的唤醒源,MCU被唤醒时log中会将具体唤醒源打印: #define R12_PCM_TIMER_EVENT (1U << 0) ----> SPM 定 ...

  8. Android 8.1 MTK平台 导入GMS包后安装的应用无法启动, GoogleDialerGo

    在Android 8.1 的代码里面,导入GMS包后发现系统应用可以正常运动,但安装的三方应用直接 就是闪退,一直以为是GMS导致的问题. 添加GMS 包(GooglepackageInstaller ...

  9. mtk android tv软件架构,MTK 平台Camera 驱动架构

    Platform_driver 这个结构体包含 Probe(). Remove()等函数来完成驱动的填充. b)设备的注册: 对 platform_device 的定义通常在 BSP 的板级文件( k ...

最新文章

  1. TextView-- 测量文字宽度
  2. python 教学_「Python基础」一次就装好Python手把手装到好
  3. Wamp修改httpd.conf中的DocumentRoot不生效解决办法
  4. python基础代码大全-Python字典及基本操作(超级详细)
  5. VS2010 修改全局 include目录
  6. makefile(详细讲解)
  7. 【论文学习】Large-scale Video Classification with Convolutional Neural Networks
  8. numpy-stl中文文档
  9. APP开发流程都有哪些?
  10. 计算机键盘上fn键,笔记本电脑键盘上Fn键的详细介绍
  11. linux驱动——内核通知链(探究i2c-dev.c 中的bus_register_notifier函数所得)
  12. H5和C3新特性(完整版)
  13. Daftart.ai:人工智能专辑封面生成器
  14. Pytorch遇到权重不匹配的问题
  15. 【HAN】代码逐句理解三
  16. 言简意赅之二进制运算符口诀
  17. 航空发动机数据-C-MAPSS数据集的个人理解
  18. 用sql实现百年的阴阳历
  19. ssl设置,阿里云申请
  20. HTML5部分查漏补缺

热门文章

  1. 异步通知《来自Linux驱动程序开发实例》
  2. mysql文件结构_MySQL文件结构
  3. tcp与udp的socket编程,udp代码实现客户端服务端,tcp代码实现客户端服务端(单线程、多线程、多进程分别实现),三次握手
  4. xp系统服务器dns怎么设置在哪里设置,xp系统DNS怎么设置 DNS设置步骤
  5. Oracle在Linux平台安装时涉及的/etc/security/limits.conf
  6. eclipse调试debug时出现source not found
  7. UVA - 10779 Collectors Problem
  8. 使用正态分布变换(Normal Distributions Transform)进行点云配准
  9. 火狐firefox插件配合scrapy,注意tbody会导致empty
  10. Asp.net开发之旅--简单的引用母版页