Suspend/Resume

我們可以透過 ACPI 提供的 interface,設置 RTC alarm,如此在 alarm 發出 IRQ 時,ACPI 就會 resume system。EPC 中的 genrtc module 並不支援 alarm interrupt。如果手動加入 rtc module,雖然它有支援 alarm interrupt,但是透過 rtc module 來設 alarm,與透過 ACPI interface 的差別就在於,ACPI 是否有 enable event。


我們可以看看 kernel source 中,driver/acpi/sleep/proc.c


在 acpi_system_write_alarm 這個 function,設定 RTC alarm 之後,還會做這一行


acpi_enable_event(ACPI_EVENT_RTC, 0);


單獨透過 rtc module 是不會跑這行的。


至於用法


# echo "+00-00-00 00:00:40" > /proc/acpi/alarm


代表設定 40 秒之後發出 alarm,並且同時也會 enable ACPI。


所以下面的命令就可以將系統 suspend to memory,40 秒後 resume。


# echo "+00-00-00 00:00:40" > /proc/acpi/alarm
# echo "mem" > /sys/power/state


要查看支援哪些 suspend mode


# more /sys/power/state
standby mem disk


它們分別代表 S1 S3 S4。


這種方式可以用軟體來做 suspend-resume 的測試。它和 suspend 後按 power button 再 resume 的原理不盡相同。因為 power button 的訊號是透過 GPIO 接到 EC,然後再透過 LPC 來通知南橋。RTC 本身就在南橋內了,並無透過 EC。


在 kernel 2.6.22 之後,ACPI 改用另一個 interface 來取代 /proc/acpi/alarm。相關資訊,請參照


http://www.mythtv.org/wiki/index.php/ACPI_Wakeup


留言

熱門文章