Wakeup linux system from sleep mode

Wakeup linux system from sleep mode

v0.01 20190831 Init

1. wakeup souces

Linux System进入sleep状态之后,需要有设备进行唤醒。

Linux支持多中设备做为wakeup source,

  • GPIO wakeup
  • USB wakeup
  • Touchscreen wakeup
  • MMC/SD wake
  • RTC wakeup
  • DM Timer wakeup

参考来自:

AM335x Power Management Standby User’s Guide

2. wakeup使用

如果设备使能了wakeup能力,那在sys文件系统下,该设备的power子目录下就有个wakeup文件。
比如:/sys/class/rtc/rtc0/device/power/wakeup

所以我们可以搜索wakeup文件,看哪些设备具有wakeup能力。

每种wakeup source的wakeup方式是不同的。以RTC为例,我们设计一个定时器中断,等时间到了就会唤醒。

可以使用工具rtcwake完成系统睡眠及自动唤醒的过程。
rtcwake -m freeze -s 10

3. wakeup能力

在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

4. PM测试

有时候硬件不支持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 };

你可能感兴趣的:(PM)