- 文件夹 - kernel/power/ - main.c 模块入口 core_initcall - suspend.c 睡眠 to RAM - hibernate.c 休眠 to DISK - poweroff.c 关机 - 数据结构 - syspend的几种模式 - `#define PM_SUSPEND_ON       ((__force suspend_state_t) 0)` - `#define PM_SUSPEND_TO_IDLE  ((__force suspend_state_t) 1)` // s2-idle sleep - `#define PM_SUSPEND_STANDBY  ((__force suspend_state_t) 2)` // standby modern? - `#define PM_SUSPEND_MEM      ((__force suspend_state_t) 3)` // s3 sleep - 函数 - pm_suspend S2 S3(deep sleep) CONFIG_SUSPEND_SKIP_SYNC - **enter_state** // s2idle shallow deep - **ksys_sync_helper** // 选择是否sync CONFIG_SUSPEND_SKIP_SYNC - **suspend_prepare** // 主要就是冻结软件进程 - suspend_freeze_processes - freeze_processes // 冻结用户态进程 - freeze_kernel_threads // 冻结内核任务 - **suspend_devices_and_enter** // core function - platform_suspend_begin - suspend_console // 挂起console,从此时开始console无法再输出 - **suspend_enter** // power/suspend.c 进入syspend模式 - s2 和 s3的模式在这个函数中很不一样 - S2 - s2idle_loop // s2本质上是一个循环 - S3 standby - suspend_disable_secondary_cpus - **arch_suspend_disable_irqs** -> local_irq_disable 屏蔽本核I位, 但是FIQ依然可以响应 - syscore_suspend drivers/base/syscore.c - **psci_system_suspend_enter** // arm64用的是psci进行电源管理 - cpu_suspend // arm64 - cpu_suspend_enter // arch/arm64/kernel/sleep.s - psci_system_suspend ? ==> bl3 - suspend_finish [H 86.979381374] cs: c0 pc[c023c69a] lr[c023c689] sp[c0e5bdf0] [H 86.985310124] c0 pc: [<0xc023c69a>] arch_spin_lock+0x1a/0x32 [H 86.991243291] c0 [<0xc047cd4b>] _raw_spin_lock_irqsave+0xd/0x10 [H 86.997429541] c0 [<0xc023b997>] down_trylock+0x9/0x1c [H 87.2745749] c0 [<0xc023ebb3>] __down_trylock_console_sem.constprop.0+0x13/0x28 [H 87.10231208] c0 [<0xc023ebcf>] console_trylock+0x7/0x30 [H 87.15717749] c0 [<0xc023ebff>] console_trylock_spinning+0x7/0x78 [H 87.21985249] c0 [<0xc024038f>] vprintk_emit+0x6b/0x90 [H 87.27297749] c0 [<0xc02403c7>] vprintk_default+0x13/0x18 [H 87.32869624] c0 [<0xbf8cb173>] osal_printk+0x1f/0x34 [osaldrv] [H 87.39013916] c0 [<0xbf9941ad>] vnne_suspend+0x19/0x30 [vnne] [H 87.44949749] c0 [<0xc03983a7>] dpm_run_callback+0x17/0x30 [H 87.50613124] c0 [<0xc0398705>] __device_suspend+0x109/0x230 [H 87.56445583] c0 [<0xc0398d8d>] dpm_suspend+0x5f/0xea [H 87.61672416] c0 [<0xc0398eeb>] dpm_suspend_start+0x2f/0x38 [H 87.67417708] c0 [<0xc023e5cd>] suspend_devices_and_enter+0x49/0xe4