王再躍 顧長利 王娟
(安徽合肥聯寶信息技術有限公司 安徽省合肥市 230091)
計算機在出現的前幾十年,研究的重點一直是如何提高機器性能,而不是在降低功耗上。便攜式筆記本被發明后,業界才開始考慮如何省電以延長電池的供電時間。由Intel,Microsoft,Toshiba等公司共同制定的提供操作系統應用程序管理電源接口的spec-ACPI 中規定了各種省電狀態,就系統而言有S0,S1..S5 等,對于CPU 來說有C0,C1..C10,對于各種外部設備則有D0,D1,D2,D3。當筆記本暫時不使用時,用戶可以通過在系統下發送睡眠的指令,也可以直接合上蓋子,進入S3 狀態。需要使用時只需要輕觸鼠標或者打開上蓋,一秒鐘以后就進入操作系統。但是,隨著智能手機的普及,人們對于電子設備即拿即用,隨時響應的要求越來越高。計算機在傳統的睡眠模式S3 時所有的通訊設備都被關閉,用戶無法收到即時的通訊信息和郵件,不能夠滿足人們對于實時性,低功耗的需求,現代待機(ModernStandby)的誕生解決了這一困擾。Microsoft 在Win10 引入了ModernStandby 的電源模式,設備可以立即使能或者關閉,以極低的功耗模式在后臺運行,為用戶提供了更快的開/關體驗,同時也擴展了對硬件的支持。對于臺式機系統來說,是從外部到內部一步一步進入低功耗的狀態。在這個過程中,如果有任何設備拒絕進入這一狀態,整個鏈路就會中斷,回到普通的運行模式。比如一個接有USB 設備的邊緣計算微小化主機系統,如果有任何一個外設沒有能夠進入D3 低功耗狀態,那么從SoC 到USBController 都會在帶電的狀態,無法進入現代待機。除了硬件之外,軟件也需要配合,不能有任何的軟件拒絕進入這一狀態,如果要讓這個過程順利完成,僅有操作系和CPU 的支持是不夠的,現代待機是一個系統的工程,要求主板,外圍設備和BIOS都支持這一模式,并且還要對各種系統配置進行參數的調試才能順利進入。正因如此,這一電源模式對計算機的硬件和軟件的要求都非常高,實現起來也很復雜,也是造成該功能暫未普及的原因之一,而臺式機由于其可擴展性強,支持的外部設備眾多,留給用戶自己DIY 的空間也很大,對現代待機的支持就更加困難。傳統的S3 睡眠狀態是將當前的系統狀態和內容全部存到Memory 中,僅有內存帶電,其他所有的設備都停止供電,風扇也會停轉,對于用戶和開發人員來說可以直觀感知到的是睡眠指示燈的閃爍,對于支持ModernStandby 的系統,如何判斷系統已經進入了現代待機的狀態,讓用戶體會到它與傳統S3 睡眠的不同,給研發工程師們帶來了挑戰。
傳統臺式機實現睡眠的LED 燈閃爍一般是通過板端的超級輸入輸出芯片SIO 來完成,當用戶在系統下通過控制選項選擇要讓機器進入睡眠狀態或者手動點擊睡眠按鈕時,會觸發系統管理中斷信號進而調用相應的中斷處理函數來實現LED 燈的閃爍。SIO 對于LED 燈的控制寄存器定義如下,只需要在屏幕熄滅時填寫對應的寄存器地址來控制bit 位的使能即可。如圖1所示。

圖1
工程師們需要思考如何利用燈效讓用戶區別現代待機和傳統睡眠,廣泛應用于手機等便攜設備的呼吸燈是個不錯的選擇。呼吸燈是指燈光在控制器的作用下完成由亮到暗的逐漸變化,給人的感覺像在呼吸,可以用來達到提醒用戶的功能。本文提供的方法可以將該功能應用在支持現代待機的臺式機上,屬于業界首創,也是第一次將現代待機的功能應用于臺式機上。開發工程師和用戶都可以通過呼吸燈的變化直觀的了解系統是否有進入到現代待機的狀態,該方法簡單易用,效果明顯,可以推廣到筆記本和臺式機等支持現代待機的平臺上。
控制LED 燈的亮度主要有兩種方法,一種是給LED 燈上施加模擬信號(可以串接可調電阻或DAC 輸出模擬信號),通過改變流經LED 上的電流控制LED 燈的亮度;另一種是使用PWM,給LED 燈上施加數字信號,通過調整數字信號的占空比(調整占空比= 調整有效值)來控制。這里我們的呼吸燈就是采用第二種PWM的方法。在邊緣計算微小化臺式機主板上我們利用SIO 芯片控制呼吸燈的占空比來實現,可以通過SIO 芯片開放出來的寄存器來調節不同的占空比實現燈的明亮變化。
圖2 是完整的一次呼吸過程中Duty 的變化值,橫坐標是時間的變化,縱坐標代表著占空比的變化,B8h 是指延長最暗的時間,是根據人眼的視覺暫留來設定的,B9h 對應的每一格亮度占用的時長,單位是以10ms 來計算,亮度的變化總共有40 格,從0x90-0xB7。通過這一設定可以很好的實現呼吸的效果。

圖2

圖3
實現燈效控制的方法已經找到,但是對于終端用戶和系統工程師來說,判斷是否進入現代待機狀態的標準是不一樣的,如背景部分所述,現代待機是一個系統的工程,主板上任何設備的功耗狀態都會影響到系統最終的待機深度。對于終端使用的用戶來說最直觀的判斷機器是否進入現代待機的方法是通過屏幕的亮滅,可以以此作為觸發LED 燈呼吸的條件,利用SIO 芯片來實現LED 燈效的控制,要求屏幕熄滅和點亮時SIO 做出相應動作,但是在臺式機上實現較于筆記本而言更有難度。使用臺式機的用戶可以外接各種顯示接口的顯示器,很難掌握用戶對于外接顯示器的使用,SIO 無法像在筆記本電腦上控制內置屏一樣掌握屏幕的亮滅狀態。通過綜合分析臺式機上系統的圖形顯示驅動和底層軟件的交互,我們發現可以利用BIOS 來通知SIO 對LED 進行控制。在Intel 平臺上,當屏幕熄滅時,系統自帶的inbox 驅動會通知到ACPI 下的ASLcode,只需要在這段代碼中添加對SIO 的通知即可。
對于在項目開發階段的工程師來說,這一判斷方法并不適用,硬件工程師需要掌握各個設備的功耗狀態以了解其是否真正實現了深度待機,單純通過屏幕的亮滅遠遠不夠。下圖是在支持現代待機的設備上調試的日志,顯示了板端的哪些設備影響了現代待機的深度,從左側的設備列表上可以看到網卡,顯卡的驅動,USB 的controller 都有影響到這一待機狀態的進入。
因此,硬件工程師需要實際的量測#SLP_S0 的信號,如果其狀態為low 并且維持5s 以上,才認為系統進入了現代待機的模式,進而去使能呼吸燈的燈效,通過這一方法的實現可以幫助系統工程師準確的掌握板端設備的現代待機狀態,防止出現誤判的場景。
以上是針對不同的使用者提出的現代待機場景的呼吸燈解決方案,可以成功的在邊緣計算微小化主機上實現深度待機燈效的控制,并且區別于傳統的睡眠模式給用戶新的使用體驗;另一方面也考慮到了在開發過程中工程師對于設備功耗情況的調試,對于判斷系統是否進入現代待機模式提供了新的思路。隨著現代待機技術的普及,該方案也可以移植到其他使用該功能的設備上。