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

相关文章

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑

Android App安装列表获取方法(实践方案)

《AndroidApp安装列表获取方法(实践方案)》文章介绍了Android11及以上版本获取应用列表的方案调整,包括权限配置、白名单配置和action配置三种方式,并提供了相应的Java和Kotl... 目录前言实现方案         方案概述一、 androidManifest 三种配置方式

Spring AI ectorStore的使用流程

《SpringAIectorStore的使用流程》SpringAI中的VectorStore是一种用于存储和检索高维向量数据的数据库或存储解决方案,它在AI应用中发挥着至关重要的作用,本文给大家介... 目录一、VectorStore的基本概念二、VectorStore的核心接口三、VectorStore的

Spring、Spring Boot、Spring Cloud 的区别与联系分析

《Spring、SpringBoot、SpringCloud的区别与联系分析》Spring、SpringBoot和SpringCloud是Java开发中常用的框架,分别针对企业级应用开发、快速开... 目录1. Spring 框架2. Spring Boot3. Spring Cloud总结1. Sprin