v0.01 20190831 Init
Linux System进入sleep状态之后,需要有设备进行唤醒。
Linux支持多中设备做为wakeup source,
参考来自:
AM335x Power Management Standby User’s Guide
如果设备使能了wakeup能力,那在sys文件系统下,该设备的power子目录下就有个wakeup文件。
比如:/sys/class/rtc/rtc0/device/power/wakeup
所以我们可以搜索wakeup文件,看哪些设备具有wakeup能力。
每种wakeup source的wakeup方式是不同的。以RTC为例,我们设计一个定时器中断,等时间到了就会唤醒。
可以使用工具rtcwake完成系统睡眠及自动唤醒的过程。
rtcwake -m freeze -s 10
在RTC驱动的probe函数里,增加以下两行,就可以在power下看到wakeup文件。
device_set_wakeup_capable(&pdev->dev, true);
device_wakeup_enable(&pdev->dev);
但有wakeup文件,不代表具备wakeup能力。
wakeup能力还需要RTC支持中断功能,简单的看就是有定义宏 RTC_IRQ。
经过测试,rtc-efi是不支持中断能力的,测试现象如下:
#未enable wakeup:
estuary:/$ rtcwake -m freeze -s 10
rtcwake: /dev/rtc0 not enabled for wakeup events
#enable wakeup后:
estuary:/$ rtcwake -m disk -s 60
[ 637.420643] rtc-efi rtc-efi: write status is 3
rtcwake: RTC_AIE_ON: Invalid argument
有时候硬件不支持wakeup能力,但我们还是想测下软件流程,该怎么办呢? 是有方法的。
# 增加内核配置
CONFIG_PM_DEBUG=y
CONFIG_PM_SLEEP=y
CONFIG_PM_SLEEP_DEBUG=y
# 增加这些内核配置后,/sys/power/pm_test文件就会出现
# 配置测试模式,支持五种测试模式:core, platform, processors, devices, freezer
# 默认是none,即不进入测试模式
echo devices > /sys/power/pm_test
测试模式定义于kernel/power/power.h
225 /*
226 * Suspend test levels
227 */
228 enum {
229 /* keep first */
230 TEST_NONE,
231 TEST_CORE,
232 TEST_CPUS,
233 TEST_PLATFORM,
234 TEST_DEVICES,
235 TEST_FREEZER,
236 /* keep last */
237 __TEST_AFTER_LAST
238 };