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 };