網頁

星期三, 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 網站

24 則留言:

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

    回覆刪除
  2. 我是使用 VB6+API

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

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

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

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

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

    回覆刪除
  7. 華哥你好
    我用了你介紹的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);

    回覆刪除
  8. 樓上的你程式碼要修改一下就可以了
    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);

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

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

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

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

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

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

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

    回覆刪除
  15. 華哥你好:

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

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

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

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

    回覆刪除
    回覆
    1. 可以份享給我嗎感謝!
      Myheart1206@Hotmail.com

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

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

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

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

    回覆刪除
  23. 請問能請大大分享s3/s4 tool 及source code嗎?

    resorce9999@gmail.com

    感謝分享

    回覆刪除