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 };
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章