RTC wake up from S3/S4/S5

在 Windows 中要由 S3/S4 中自動喚醒,可以使用 SetWaitableTimer 這一類的 API 達成。


那 S5(soft off)呢?S5 事實上並不屬於 sleeping state (G1),在 ACPI 中它是屬於 G2 state。在 ACPI spec. 中有段話是這麼述敘的:


When the RTC generates a wake event the RTC_STS bit will be set. If the RTC_EN bit is set, an RTC hardware power management event will be generated (which will wake the system from a sleeping state, provided the battery low signal is not asserted).


這邊描述了系統要由 RTC 來喚醒的過程。這兒可以看見,RTC_EN 這個位元必需要被 enable,RTC wake up event 才會真正被發出。那這個 bit 在哪裡呢?它在南橋的 PMBASE + 02h 中的第 10 bit,稱為 RTC Event Enable (RTC_EN)。


想要設定這個 bit,當然要先知道 PMBASE 是多少。PMBASE 可以由 PCI Configuration Registers (LPC I/F—D31:F0) 中得到(參考的 spec. 為 Intel HM55 Express Chipset)。在 40h-43h 即為 PMBASE,它的名稱為 ACPI Base Address。


以上如果要寫成程式的話,大概像以下這樣:


#define PCI_CONF1_ADDRESS(bus, dev, fn, reg) \
 (0x80000000 | (bus << 16) | (dev << 11) | (fn << 8) | (reg & ~3))


unsigned int conf_addr = PCI_CONF1_ADDRESS(bus, dev, fun, reg);
printf("PCI configuration address = 0x%X\n", conf_addr);


(*WriteIoPortDword)(0xCF8, conf_addr);
unsigned int value = (*ReadIoPortDword)(0xCFC);


在 Windows user space 中當然要使用 IO library 才能直接存取 PCI configuration space。例子中是使用 WinRing0。一般來說 PMBASE 為 0x800,但在 ASUS NB 中,也有看見是 0x400 的(一般 0x400 都是 SMBus base address)。不管是多少,透過 PCI configuration space 來得到真正 IO address 是最妥當的。


當我們 enable RTC_EN 之後,接著便要設定 RTC alarm。設定 RTC alarm 可以透過 index IO port 0x70/0x71 來完成。根據 Intel HM55 Express Chipset 的資料,RTC indexed registers 的對應為:


Index Name
-------------------
00h Seconds
01h Seconds Alarm
02h Minutes
03h Minutes Alarm
04h Hours
05h Hours Alarm
06h Day of Week
07h Day of Month
08h Month
09h Year
0Ah Register A
0Bh Register B
0Ch Register C
0Dh Register D


其中當然設定的部份需要一些研究。不過當我還沒研究出來的時候,我在 ACPI spec. 裡頭發現這句話:


Notice that the G2/S5 “soft off” and the G3 “mechanical off” states are not sleeping states. The OS will disable the RTC_EN bit prior to entering the G2/S5 or G3 states regardless


意思就是進入 S5 之前,OS 必需把 RTC_EN disable 掉。如此一來,在 Windows user space 幾乎無法達到 RTC wake up from S5 這個功能。Windows 似乎也沒有相關的 API 可以做。


既然此路不通,那進入 S5 之後,EC 跟 NIC 應該還有供電。因此一個方法是利用 EC 來發出 Power Button SCI event,另一個就是利用 WOL (wake on lan) 了。利用 EC 大概可以藉由設定某個 flag 後,EC 便按照我們設定的時間開始 count down,直到 time out 後便發出 SCI event。利用 NIC 的話則是看是否 NIC firmware 能夠提供與 EC 相同的功能,藉由 NIC firmware 來發出 wake up event。


留言

  1. 1. PMBase 400h 並不是特定有些 ASUS 的電腦才是 400h, 是因為它是 AMD Chipset.
    2. RTC wake up event 被設起來, 可以在 sleep trap 時去設定它, 就不會被 OS 關掉.
    [版主回覆01/26/2013 12:17:43]原來400h 是 AMD chip 用的,那時沒搞清楚,感謝分享。
    另外您說在 sleep trap 時去設定它,這我就不懂了,能否分享?

    回覆刪除

張貼留言

熱門文章