Android suspend-to-mem 流程分析

2023-10-05 02:59

本文主要是介绍Android suspend-to-mem 流程分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 实验平台

cpu: omap4460 blaze tablet

memory: 1-GB DRAM

OS: android 4.0.3, kernel 3.0.31


2.流程分析

1). echo "mem" > /sys/power/state
2). state_store() kernel/power/main.c  
3). request_suspend_states(PM_SUSPEND_MEM)  kernel/power/earlysuspend.c
4). queue_work(suspend_work_queue, &early_suspend_work)  kernel/power/earlysuspend.c 
early_suspend() 
// call device driver's early-suspend function to turn off multi-touch, LCM, frame buffer,sensors,release "main" wakelock
5). wake_unlock(&main_wake_lock)  kernel/power/wakelock.c  
          // if system has no activate wakelock,call kernel/power/wakelock.c suspend() start suspend progress.
6). queue_work(suspend_work_queue, &suspend_work);
7). suspend()
sys_sync()
pm_suspend()  
// here enter suspend
// return from this function means exit suspend(resume)

8). pm_suspend(PM_SUSPEND_MEM)
enter_state()
sys_sync()
suspend_prepare()
pm_notifier_call_chain(PM_SUSPEND_PREPARE)        
suspend_freeze_processes()
freeze_processes() kernel/power/process.c
//  the same as hibernation process to freeze user space process and task in kernel
pm_restrict_gfp_mask()
//  avoid i/o and fs to allocate memory during suspend progress
//  clear bit GFP_IOFS of gfp_allowed_mask
suspend_devices_and_enter()
omap4_pm_begin()  arch/arm/mach-omap2/pm44xx.c 
suspend_prepare() drivers/regulator/core.c
// regulator linked with regulator_list     
suspend_console()
dpm_suspend_start(PMSG_SUSPEND)
dpm_prepare(PMSG_SUSPEND)  drivers/base/power/main.c
// execute ->prepare() callback for all non-sysdev devices, device list movement dpm_list-->dpm_prepared_list
dpm_suspend(PMSG_SUSPEND)
// execute ->suspend() callback for all non-sysdev devices, device list movement dpm_prepared_list-->dpm_suspended_list                
suspend_enter()
dpm_suspend_noirq(PMSG_SUSPEND)
// execute "late suspend"
suspend_device_irqs() kernel/irq/pm.c
// disable all currently enabled interrupt lines
// after this function, device will can't receive interrupt
device_suspend_noirq()   
// execute -->suspend_noirq callback for all non-sysdev devices, device list movement dpm_suspended_list-->dpm_noirq_list                       
disable_nonboot_cpus()
arch_suspend_disable_irqs() kernel/power/suspend.c
local_irq_disable()
// disable local cpu interrupt,so there will no interrtup from now on
syscore_suspend()  driver/base/syscore.c
// Execute all the registered system core suspend callbacks
check_wakeup_irqs() kernel/irq/pm.c
// check if any wakeup interrupts are pending, if ture, exit suspend
// then to execute sysdev's suspend callback, all sysdev are linked with syscore_ops_list      
omap4_pm_enter() arch/arm/mach-omap2/pm4xx.c
omap2_pm_wakeup_on_timer() arch/arm/mach-omap2/pm-debug.c
//  setup a hareware timer if debug enabled
omap4_configure_pwrst(off_mode_enabled)
// Program all powerdomain(except cpu0_pwrdm and cpu1_pwrdm) to required power domain state
// powerdomain linked with pwrst_list
// off_mode_enabled = 1
omap4_device_set_state_off(1)
// setup device off state   
omap4_enter_sleep()
pwrdm_clear_all_prev_pwrst() 
//Clear the powerdomain's previous power state
omap4_device_clear_prev_off_state()   
pwrdm_read_next_pwrst()
//get next powerdomain power state
omap2_gpio_prepare_for_idle()
omap2_gpio_set_wakeupenables()
// enable wakeup gpio in the list omap_gpio_list
omap4_print_wakeirq()
// resuming. 
// Print wakeup interrupt for debug
xxxxxxx     


这篇关于Android suspend-to-mem 流程分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/3252

相关文章

Linux流媒体服务器部署流程

《Linux流媒体服务器部署流程》文章详细介绍了流媒体服务器的部署步骤,包括更新系统、安装依赖组件、编译安装Nginx和RTMP模块、配置Nginx和FFmpeg,以及测试流媒体服务器的搭建... 目录流媒体服务器部署部署安装1.更新系统2.安装依赖组件3.解压4.编译安装(添加RTMP和openssl模块

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

springboot启动流程过程

《springboot启动流程过程》SpringBoot简化了Spring框架的使用,通过创建`SpringApplication`对象,判断应用类型并设置初始化器和监听器,在`run`方法中,读取配... 目录springboot启动流程springboot程序启动入口1.创建SpringApplicat

通过prometheus监控Tomcat运行状态的操作流程

《通过prometheus监控Tomcat运行状态的操作流程》文章介绍了如何安装和配置Tomcat,并使用Prometheus和TomcatExporter来监控Tomcat的运行状态,文章详细讲解了... 目录Tomcat安装配置以及prometheus监控Tomcat一. 安装并配置tomcat1、安装

MySQL的cpu使用率100%的问题排查流程

《MySQL的cpu使用率100%的问题排查流程》线上mysql服务器经常性出现cpu使用率100%的告警,因此本文整理一下排查该问题的常规流程,文中通过代码示例讲解的非常详细,对大家的学习或工作有一... 目录1. 确认CPU占用来源2. 实时分析mysql活动3. 分析慢查询与执行计划4. 检查索引与表

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep