#define PM_SUSPEND_MAX ((__force suspend_state_t) 4) 其中MAX 是disk对应的宏是PM_SUSPEND_MAX,mem对应的宏是PM_SUSPEND_MEM,standby对应的宏是PM_SUSPEND_STANDBY,freeze对应的宏是PM_SUSPEND_TO_IDLE。 pm_suspend(PM_SUSPEND_MEM) (kernel/power/suspend.c) enter_state(PM_SUSPEND_MEM)(kernel/power...
大致流程,就是冻结进程,调用设备驱动模型的suspend函数。 3-1)平台相关联的suspend函数,suspend_ops->begin(state) 3-2)挂起控制台,suspend_console; 由于系统suspend流程,会挂起console,因此,在调试休眠唤醒流程时,内核中的printk以及pr_info打印会失效,不方便调试。可以通过在kernel的cmdline传参中,加入no_console_...
其中bus_type里会有一套runtime_pm的三个callback,Bdev自身还有另一套runtime_pm的三个callback。 当dev1的两个counter都为零了,就会调用bus_type里的runtime_idle,一般情况下这个idle会调用pm_runtime_suspend,仅按照上面的介绍,就会调用这个bus_type里的runtime_suspend call back。之后是不是就该是最重要的...
主要代码放在Runtime.c (drivers\base\power)中,同一时候附带的Runtime_pm.txt (documentation\power)有具体 说明。要使得设备能够进入runtime_idle与runtime_suspend必须满足device的2个參数usage_count与child_count同一时候为0。 1:操作usage_count參数通常在HOST控制器驱动中,使用辅助runtime函数来完毕。 2:操作ch...
如果runtime suspend()即将被执行,或者有一个挂起的请求执行,runtime idle()将不会在同一个设备上执行。 如果runtime_suspend回调已经执行或者已经在pending状态,则取消该设备的runtime idle请求。 如果runtime_resume回调已经执行,其他callbacks则将不被执行对于同一个设备。
kernel/power/process.c---Suspend过程中对进程的处理逻辑 2)设备PM drivers/base/power/*---具体可参考“ Linux电源管理(4)_电源管理接口”的描述。 设备驱动---具体设备驱动的位置,不再涉及。 3)平台依赖PM include/linux/suspend.h---定义平台依赖PM相关的操作函数集 arch/xxx...
dev_pm_ops 结构体中,有3个以 runtime 开头的成员函数:runtime_suspend()、runtime_resume()和runtime_idle(),它们辅助设备完成运行时的电源管理: 运行时 PM 与前文描述的系统级挂起到 RAM 时候的PM不太一样,它是针对单个设备,指系统在非睡眠状态的情况下,某个设备在空闲时可以进入运行时挂起状态,而在不...
可以调用RPM core提供helper函数(pm_runtime_autosuspend_expiration、pm_runtime_autosuspend、pm_request_autosuspend),要求在指定的时间后,suspend设备。 5)pm_runtime_autosuspend、pm_request_autosuspend等接口,会起一个timer,并在timer到期后,使用异步(ASYNC)或同步(SYNC)的方式,调用设备的.runtime_suspend回调...
先来看一个非常重要的数据结构,这个数据结构是内核为device电源管理所抽象出来的回调函数,我们关心最后三个即可,即runtime_pm方法,设备的suspend和resume最终都调用该结构体下的某个函数。 structdev_pm_ops{int(*prepare)(struct device *dev);void(*complete)(struct device *dev);int(*suspend)(struct device ...
1. 依然会再次判断当前的state是否在PM_SUSPEND_ON和PM_SUSPEND_MAX之间 2. pm_suspend_marker("entry") static void pm_suspend_marker(char *annotation) { struct timespec ts; struct rtc_time tm; getnstimeofday(&ts); rtc_time_to_tm(ts.tv_sec, &tm); ...