android 系统优化(20)---MTK 平台唤醒时间优化1
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相关推荐
- android 性能优化---(2) MTK 平台开机时间优化
一.在工程模式开启MTKLogger, 开机后取日志bootprof adb pull /storage/emulated/0/mtklog/mobilelog/APLog_2018_0309_10 ...
- Android手机开关机、重启时间优化
本篇文章主要介绍 Android 开发中开关机 重启时间 部分知识点,通过阅读本篇文章,您将收获以下内容: zygote,预加载class.resources 开机动画进程 bootanimation ...
- 【android睡眠唤醒 二】MTK平台唤醒框架分解
在文章MTK 唤醒时间分析中分析了内核中的主要的亮屏重要阶段,此篇文章结合上层的log一起来分析下整个系统的亮屏流程.整个流程可以分为如下几个部分: (1)power键(home键)产生并上报(在in ...
- android 遥控器映射,MTK 平台Android系统遥控器映射关系
MTK 平台Android系统遥控器映射关系 在我们工作中,经常要去适配遥控器的工作,但是大部时候我们是移植其他工程上的代码来修改,可能对Android系统中的按键关系有些不清楚,下面以MTK平台为例 ...
- Android Camera (13)---MTK平台相机插值修改
MTK平台相机插值修改 一.注意事项 二.HAL层修改 三.APP层修改 四.部分插值整理 五.快速编译指令 一.注意事项 Camera插值在底层已经做好,我们只需要在中间层和app层添加一个对应的p ...
- android 9.x MTK平台讯飞输入法重启被卸载
引言 平台信息:mt8788平台 android9.0 问题描述:安装讯飞输入法,重启机器,讯飞输入法消失 分析过程 安装apk后,adb shell进入机器,查看/data/app里面的文件 C:\ ...
- MTK平台唤醒源分类
SPM R12寄存器记录MCU的唤醒源,MCU被唤醒时log中会将具体唤醒源打印: #define R12_PCM_TIMER_EVENT (1U << 0) ----> SPM 定 ...
- Android 8.1 MTK平台 导入GMS包后安装的应用无法启动, GoogleDialerGo
在Android 8.1 的代码里面,导入GMS包后发现系统应用可以正常运动,但安装的三方应用直接 就是闪退,一直以为是GMS导致的问题. 添加GMS 包(GooglepackageInstaller ...
- mtk android tv软件架构,MTK 平台Camera 驱动架构
Platform_driver 这个结构体包含 Probe(). Remove()等函数来完成驱动的填充. b)设备的注册: 对 platform_device 的定义通常在 BSP 的板级文件( k ...
最新文章
- TextView-- 测量文字宽度
- python 教学_「Python基础」一次就装好Python手把手装到好
- Wamp修改httpd.conf中的DocumentRoot不生效解决办法
- python基础代码大全-Python字典及基本操作(超级详细)
- VS2010 修改全局 include目录
- makefile(详细讲解)
- 【论文学习】Large-scale Video Classification with Convolutional Neural Networks
- numpy-stl中文文档
- APP开发流程都有哪些?
- 计算机键盘上fn键,笔记本电脑键盘上Fn键的详细介绍
- linux驱动——内核通知链(探究i2c-dev.c 中的bus_register_notifier函数所得)
- H5和C3新特性(完整版)
- Daftart.ai:人工智能专辑封面生成器
- Pytorch遇到权重不匹配的问题
- 【HAN】代码逐句理解三
- 言简意赅之二进制运算符口诀
- 航空发动机数据-C-MAPSS数据集的个人理解
- 用sql实现百年的阴阳历
- ssl设置,阿里云申请
- HTML5部分查漏补缺
热门文章
- 异步通知《来自Linux驱动程序开发实例》
- mysql文件结构_MySQL文件结构
- tcp与udp的socket编程,udp代码实现客户端服务端,tcp代码实现客户端服务端(单线程、多线程、多进程分别实现),三次握手
- xp系统服务器dns怎么设置在哪里设置,xp系统DNS怎么设置 DNS设置步骤
- Oracle在Linux平台安装时涉及的/etc/security/limits.conf
- eclipse调试debug时出现source not found
- UVA - 10779 Collectors Problem
- 使用正态分布变换(Normal Distributions Transform)进行点云配准
- 火狐firefox插件配合scrapy,注意tbody会导致empty
- Asp.net开发之旅--简单的引用母版页