關於在 Linux 下做 RTC WakeUp 與自動排程
首先, 自動排程與 Cron or Crontab 有關, 可以參考 :  http://linux.vbird.org/linux_basic/0430cron.php
而RTC WakeUp 有兩種, 要先查看 RTC Alarm 是在哪裡
1. /proc/acpi/alarm
2. /sys/class/rtc/rtc0/wakealarm
所以設定 RTC Alarm 有兩種方法, 詳情可以參考以下兩篇文章:
摘錄如下:
1.
代表設定 40 秒之後發出 alarm,並且同時也會 enable ACPI。
所以下面的命令就可以將系統 suspend to memory,40 秒後 resume。
# echo "+00-00-00 00:00:40" > /proc/acpi/alarm
# echo "mem" > /sys/power/state
2.
要查看支援哪些 suspend mode
# more /sys/power/state
standby mem disk
這個 RTC WakeUp 已經在 GF8100 platform 上 with Ubnutu 8.04.01  測試 OK!!
我們可以透過 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 是不會跑這行的。

要查看支援哪些 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

後來在網路上找到一篇有用的文章「 ACPI Wakeup 」裡面有說明如何設定定時從S1/S3回來。 我是在SLES11上試了 Suspend to RAM WakeAlarm Timer 的簡單方法, 參考裡面的範例把喚醒的時間設為1分鐘...試完之後結果真的可以呢~ 超高興, 系統會在時間到時自動的被叫起來 :D
echo 0 > /sys/class/rtc/rtc0/wakealarm
echo `date '+%s' -d '+ 1 minutes'` > /sys/class/rtc/rtc0/wakealarm
pm-suspend
第1與2步驟主要是在歸零和設定定時, 進入S3 (Suspend to RAM) 主要是第3個命令, 如果要進入S1只要換這命令就好了, 1&2步不用動, 以這個script再配上shell 的 loop 就可以做長時間的測試啦。
[*] Software Suspend (EXPERIMENTAL)  (y)
; 支持系统suspend(休眠),打开这项功能后, 可用swsusp或者shutdown -z 来挂起系统. 这样系统会将你当前正在进行的工作(也就是当前内存中的内容)作成一个镜象保存到你的交换分区中, 在你下一次启动时使用启动参数"resume=/dev/交换分区".内核就会将上一次的工作内核从镜象文件中恢复到内存,这可以大大提高系统的启动速 度. 当你不想恢复上次的工作时向内核传递参数“noresume".不过系统启动后你的交换分区将不可以使用, 你可以使用mkswap命令来重新格式化你的交换分区. 这个功能不需要高级电源管理的支持.
Logo

更多推荐