小華的部落格: S3/S4 測試工具開發

搜尋此網誌

星期三, 4月 30, 2008

S3/S4 測試工具開發

源由:


前幾個星期為了解一個VS Mode (設定1分鐘後關閉螢幕) bug 所以自己寫了一個Win32工具去檢查CMOS RTC alarm 和RTC interrupt 的設定值還有監控RTC Enable bit設定值(PMBase),而這個問題的徵狀是當系統從S4 Resume後,等個10秒後就會看到螢幕被關閉。


追蹤後發現這應該是Vista的計時器的問題,他所謂的一分鐘是指"當OS沒收到任何event後開始計時",所以當進入S4的時候計時器可能已經跑了35秒,而當系統從S4 Resume後計時器會繼續計時,因此等個10幾秒就進入VS mode了。


會被開這條Bug是因為開Bug的人認為計時器應該重新計算,所以參考了一些其他機種做法後決定,使用相同的解決方式去解決(Notify Power button)這個問題。


而在此時我們的T學長看到我個工具,因此問我說有沒有辦法寫一個自動進入S3/S4且可以定時wakeup的工具...


原本在Vista底下就已經有工具可以測試,而我們的客戶也有撰寫一個工具也可達到這個功能,另外ALi也有一個類似的工具也做的到這個功能,因此是有機會可以自行開發出來這個工具。


實驗ㄧ過程:

原先我想的很單純,在BIOS角度就是去設定好RTC alarm時間,然後去改變RTC Enable bit,接著呼叫API讓系統進入S3/S4就應該可以了,不過實驗後發現OS會把RTC Enable 清除,所以就算我設定了也沒有用 >.<


實驗二過程:

秉持著研究的精神,所以我認為OS會去清除RTC enable bit就代表OS才能決定這個bit的狀態,我沒辦法透過Ring 0層的AP直接去修改暫存器值,因此他ㄧ定有方式去控制; 查詢了相關資訊後發現有API可以做這些事情,因此問題就只是在如何用這些API而已。


結論:

經過實驗過後,這些API真的可以達到我需要的功能,所以也只能說Windows真的管很多,想要偷偷修改暫存器都不行, 呵呵!


相關的API:

CreateWaitableTimer
SetWaitableTimer
SetSuspendState
WaitForSingleObject
CancelWaitableTimer
CloseHandle

隨便寫的程式,所以畫面看起來很難看 ^^!

Reference
Microsoft 網站

23 則留言:

匿名 提到...

請問一下~~是否可以告知如何寫你的"S3/S4 測試工具開發"

Harrison 提到...

我是使用 VB6+API

呼叫的API就如同文章內的那幾個,其他的部分還包含加入/刪除 Reg的API

匿名 提到...

在bios post後便是由所有deive都是由os所控制了, bios也是被動被呼叫, 所以這bit當然也由os控制. 不知這樣對不對

Giga's World 提到...

大大請教您一下,如果我在純DOS底下,利用南橋的power management進入S3,需要備份哪些東西嗎?我發現我利用RTC離開S3後,畫面還是呈現黑屏哩…感謝您的指教。

匿名 提到...

可以share 您的s3/s4 tool給我使用嗎?
thanks!
E-Mail:timothy0025@gmail.com

DC 提到...

Good morning Harrison. Is it possible to share this tool wit me? Very much appreciated.
DC (pa.dc.lin@gmail.com)

匿名 提到...

華哥你好
我用了你介紹的API
但是達不成這個效果,
HANDLE hTimer = NULL;
LARGE_INTEGER liDueTime;
liDueTime.QuadPart = -600000000;

hTimer = CreateWaitableTimer(NULL, FALSE, _T("TestWaitableTimer"));
if (!hTimer)
MessageBoxA(NULL,"","",MB_OK);

if (!SetWaitableTimer(hTimer, &liDueTime, 0, NULL, NULL, 0))
{
CloseHandle(hTimer);
MessageBoxA(NULL,"Can't Set Wait timer","",MB_OK);
}
SetSuspendState(FALSE, FALSE, FALSE);
if (WaitForSingleObject(hTimer, INFINITE) != WAIT_OBJECT_0)
{
CloseHandle(hTimer);
MessageBoxA(NULL,"10秒定 器fail了","",MB_OK);
}
else
{
MessageBoxA(NULL,"10秒定 器到了","",MB_OK);
}

CancelWaitableTimer(hTimer);
RequestWakeupLatency(LT_DONT_CARE);
SetThreadExecutionState(ES_SYSTEM_REQUIRED);

CloseHandle(hTimer);

匿名 提到...

樓上的你程式碼要修改一下就可以了
HANDLE hTimer = NULL;
LARGE_INTEGER liDueTime;
liDueTime.QuadPart = -3000000000;
//至少Sleep 30妙
hTimer = CreateWaitableTimer(NULL, TRUE, _T("WaitableTimer"));
if (!hTimer)
MessageBoxA(NULL,"","",MB_OK);
if (!SetWaitableTimer(hTimer, &liDueTime, 0, NULL, NULL, TRUE))
{
CloseHandle(hTimer);
MessageBoxA(NULL,"Can't Set Wait timer","",MB_OK);
}
SetThreadExecutionState(ES_CONTINUOUS);
SetSuspendState(FALSE, FALSE, FALSE);
CancelWaitableTimer(hTimer);
CloseHandle(hTimer);
SetThreadExecutionState(ES_CONTINUOUS|ES_SYSTEM_REQUIRED|ES_DISPLAY_REQUIRED);

匿名 提到...

你好, 我自己也寫了一個Windows程式,可以定時進入S3/S4並自動回到工作狀態, 已經用了兩年都很正常 (XP/Vista).
但是在最近新的OS Windows 7下測試卻出了問題. 進入S3/S4以後久久都不見回復到工作狀態, 不知你的程式是否也會遇到這情況?

匿名 提到...

大大請教您, 我想利用BIOS 先enable RTC Alarm. 進Windows XP 後用Port 70/71去更改Alarm Time. 可以達成S5定時開機嗎?

目前我的測試是不能的,不知大大有無可建議的方法

匿名 提到...

windows7要使用CreateWaitableTimerEx與SetWaitableTimerEx這兩個API.
但是我遇到一樣的問題,即使註冊了waitable timer到系統(可以用powershell看)但是時間到了似乎不會從S3/S4回來.

匿名 提到...

請問一下,你說Vista timer 有問題,到底是什麽問題?我遇到一個類似的bug,用Sleeper 測試S4, 如果把count down timer 定時間長一些, ex:150s. 在倒計時剩20多秒的時候就自動進S4了,然後不能自動wake。如果手動喚醒以後,繼續從20多秒倒計時,倒計時到0的時候又進S4了。 這個bug只在Vista上出現。如果count down timer 用默認值60s,就沒有這個問題。

匿名 提到...

可以share 您的s3/s4 tool給我使用嗎?
thanks!
E-Mail:chychen.chen@msa.hinet.net

Unknown 提到...

大大請教您一下,我照你的方式,發現程式能夠進入 s3 但是無法 wake up. 想請問 wake up function 是靠 SetWaitableTimer function 這還是其他

匿名 提到...

華哥你好:

方便 share 您的s3/s4 tool source code 給我使用嗎?
thanks!
E-Mail:chychen.chen@msa.hinet.net

匿名 提到...

您好,可否麻煩您分享您的tool與source code給我使用嗎? 感激不盡!
E-Mail:wlaccts@gmail.com

Sky 提到...

華哥,方便share您的tool嗎?
hsi.adsl@msa.hinet.net
謝謝!

匿名 提到...

您好:
可否麻煩您分享您的tool與source code給我用嗎? 感激不盡!
E-Mail:chiayun50@hotmail.com

鄭旺彬 提到...

可以分享您的s3/s4 tool讓小弟使用嗎?
非常感謝!!
E-Mail:sean75106@gmail.com

yu yan 提到...

可以份享給我嗎感謝!
Myheart1206@Hotmail.com

Fish 提到...

我要做測試工具 請問可以分享給我嗎感謝
yenfish@gmail.com

小蘋果 提到...

S3醒不過來多半是以下設定沒設:
Control Panel\Power Options\Edit Plan Settings > Click on "Change Advance Power Setting" Expand "Sleep" in the tree to enable "Allow Wake Timers"

匿名 提到...

方便 share 您的s3/s4 tool and source code 給我使用嗎?
thanks!
christie_lo@hotmail.com