系统睡眠模型是让整个系统休眠,而runtime是在系统正常工作的时候单独控制某个设备休眠和唤醒
1. runtime PM流程
怎样动态地打开或关闭设备的电源?最简单的方法:
在驱动程序里,在open函数中打开电源,在close函数中关闭电源
上述方法有一个缺点: 多个APP使用该设备时可能造成干扰
解决方法:给驱动添加使用计数值: 当该计数大于0时打开电源, 等于0时关闭电源
在应用程序运行过程中通过ioctl来关闭和启动电源
ioctl: alsa
runtime PM只是提供辅助函数, 比如:(内核文档runtime_pm.txt详细介绍了)
1. 增加计数/减少计数
2. 使能runtime pm电源管理
内核驱动示例: drivers\input\misc\bma150.c
pm_runtime_enable (在probe函数中)/ pm_runtime_disable (在remove函数中): 使能/禁止runtime PM, 修改disable_depth变量
pm_runtime_get_sync(在open函数中) / pm_runtime_put_sync (在close函数中): 增加/减小计数值, 并且让设备处于resume或suspend状态
在dev_pm_ops里提供3个回调函数: runtime_suspend, runtime_resume, runtime_idle
流程分析:
pm_runtime_get_sync
__pm_runtime_resume(dev, RPM_GET_PUT);
atomic_inc(&dev->power.usage_count); // 增加使用计数
rpm_resume(dev, rpmflags); // resume重新运行设备