星期日, 4月 12, 2009

What is the sleep state when Windows suspend?

參照ACPI Sleeping State Definitions

S1 and S3 是ACPI 定義的Sleep State, 分別代表不同程度的省電模式。BIOS會提供ACPI table 提供Sleep State method (\_Sx),所以ACPI 作業系統就可以知道這台機器是否符合ACPI規範,可以支援省電模式。所以如果BIOS只提供\_S1 method, 那Windows就會suspend就會進S1,如果只提供\_S3 method,那Windows就會進S3。那如果兩個都提供呢?

我無從得知Windows喜歡進那個作業系統,Microsoft另外有釋放一支程式dumppo.exe (XD,沒教人怎麼寫這種程式...)。


C:\tmp>dumppo admin
Admin policy overrides
Min sleep state......: S1
Max sleep state......: S4 - hibernate
Min video timeout....: 0
Max video timeout....: -1
Min spindown timeout.: 0
Max spindown timeout.: -1

執行dumppo admin minsleep=s3,則可設定Windows suspend進入s3。

C:\tmp>dumppo admin minsleep=s3
Admin policy overrides
Min sleep state......: S3
Max sleep state......: S4 - hibernate
Min video timeout....: 0
Max video timeout....: -1
Min spindown timeout.: 0
Max spindown timeout.: -1


另外,插上USB Keyboard or USB mouse, 讓Windows XP進入Suspend, 此時會發覺Windows 會進入S3,但是無法從USB keyboard或是USB mouse按鈕讓系統回復工作狀態。如果要讓USB裝置能夠喚醒系統,就要在裝置管理員裡特別選擇允許此裝置能夠喚醒系統。

allow_device_wakeup

可是一旦設定好讓USB裝置能夠喚醒,就會發覺Windows只能進入S1了(這從外觀上無法得知,如果沒有儀器,大概只能從有風扇有沒轉來猜測)。

繼續參考Description of how to enable the S3 system power state for standby when USB devices are armed for wake。這篇有提到這是因為早期很多機器並沒有提供正確的\_SxD device Power state, 所以一旦Windows進入S3,USB Host Controller通常又位於南橋,是當S3時會被切掉電源的那一塊,又允許USB裝置喚醒系統,此時很容易出問題,為了避免這問題,所以XP乾脆只要有USB裝置允許喚醒系統,就強置進入S1。如果要讓系統進入S3,請手動更Registry,參照連結文章建立一個USBBIOSx Key,就可以同時讓USB裝置喚醒系統而且進入S3節電模式了。