王再躍 顧長(zhǎng)利 王娟
(安徽合肥聯(lián)寶信息技術(shù)有限公司 安徽省合肥市 230091)
計(jì)算機(jī)在出現(xiàn)的前幾十年,研究的重點(diǎn)一直是如何提高機(jī)器性能,而不是在降低功耗上。便攜式筆記本被發(fā)明后,業(yè)界才開(kāi)始考慮如何省電以延長(zhǎng)電池的供電時(shí)間。由Intel,Microsoft,Toshiba等公司共同制定的提供操作系統(tǒng)應(yīng)用程序管理電源接口的spec-ACPI 中規(guī)定了各種省電狀態(tài),就系統(tǒng)而言有S0,S1..S5 等,對(duì)于CPU 來(lái)說(shuō)有C0,C1..C10,對(duì)于各種外部設(shè)備則有D0,D1,D2,D3。當(dāng)筆記本暫時(shí)不使用時(shí),用戶可以通過(guò)在系統(tǒng)下發(fā)送睡眠的指令,也可以直接合上蓋子,進(jìn)入S3 狀態(tài)。需要使用時(shí)只需要輕觸鼠標(biāo)或者打開(kāi)上蓋,一秒鐘以后就進(jìn)入操作系統(tǒng)。但是,隨著智能手機(jī)的普及,人們對(duì)于電子設(shè)備即拿即用,隨時(shí)響應(yīng)的要求越來(lái)越高。計(jì)算機(jī)在傳統(tǒng)的睡眠模式S3 時(shí)所有的通訊設(shè)備都被關(guān)閉,用戶無(wú)法收到即時(shí)的通訊信息和郵件,不能夠滿足人們對(duì)于實(shí)時(shí)性,低功耗的需求,現(xiàn)代待機(jī)(ModernStandby)的誕生解決了這一困擾。Microsoft 在Win10 引入了ModernStandby 的電源模式,設(shè)備可以立即使能或者關(guān)閉,以極低的功耗模式在后臺(tái)運(yùn)行,為用戶提供了更快的開(kāi)/關(guān)體驗(yàn),同時(shí)也擴(kuò)展了對(duì)硬件的支持。對(duì)于臺(tái)式機(jī)系統(tǒng)來(lái)說(shuō),是從外部到內(nèi)部一步一步進(jìn)入低功耗的狀態(tài)。在這個(gè)過(guò)程中,如果有任何設(shè)備拒絕進(jìn)入這一狀態(tài),整個(gè)鏈路就會(huì)中斷,回到普通的運(yùn)行模式。比如一個(gè)接有USB 設(shè)備的邊緣計(jì)算微小化主機(jī)系統(tǒng),如果有任何一個(gè)外設(shè)沒(méi)有能夠進(jìn)入D3 低功耗狀態(tài),那么從SoC 到USBController 都會(huì)在帶電的狀態(tài),無(wú)法進(jìn)入現(xiàn)代待機(jī)。除了硬件之外,軟件也需要配合,不能有任何的軟件拒絕進(jìn)入這一狀態(tài),如果要讓這個(gè)過(guò)程順利完成,僅有操作系和CPU 的支持是不夠的,現(xiàn)代待機(jī)是一個(gè)系統(tǒng)的工程,要求主板,外圍設(shè)備和BIOS都支持這一模式,并且還要對(duì)各種系統(tǒng)配置進(jìn)行參數(shù)的調(diào)試才能順利進(jìn)入。正因如此,這一電源模式對(duì)計(jì)算機(jī)的硬件和軟件的要求都非常高,實(shí)現(xiàn)起來(lái)也很復(fù)雜,也是造成該功能暫未普及的原因之一,而臺(tái)式機(jī)由于其可擴(kuò)展性強(qiáng),支持的外部設(shè)備眾多,留給用戶自己DIY 的空間也很大,對(duì)現(xiàn)代待機(jī)的支持就更加困難。傳統(tǒng)的S3 睡眠狀態(tài)是將當(dāng)前的系統(tǒng)狀態(tài)和內(nèi)容全部存到Memory 中,僅有內(nèi)存帶電,其他所有的設(shè)備都停止供電,風(fēng)扇也會(huì)停轉(zhuǎn),對(duì)于用戶和開(kāi)發(fā)人員來(lái)說(shuō)可以直觀感知到的是睡眠指示燈的閃爍,對(duì)于支持ModernStandby 的系統(tǒng),如何判斷系統(tǒng)已經(jīng)進(jìn)入了現(xiàn)代待機(jī)的狀態(tài),讓用戶體會(huì)到它與傳統(tǒng)S3 睡眠的不同,給研發(fā)工程師們帶來(lái)了挑戰(zhàn)。
傳統(tǒng)臺(tái)式機(jī)實(shí)現(xiàn)睡眠的LED 燈閃爍一般是通過(guò)板端的超級(jí)輸入輸出芯片SIO 來(lái)完成,當(dāng)用戶在系統(tǒng)下通過(guò)控制選項(xiàng)選擇要讓機(jī)器進(jìn)入睡眠狀態(tài)或者手動(dòng)點(diǎn)擊睡眠按鈕時(shí),會(huì)觸發(fā)系統(tǒng)管理中斷信號(hào)進(jìn)而調(diào)用相應(yīng)的中斷處理函數(shù)來(lái)實(shí)現(xiàn)LED 燈的閃爍。SIO 對(duì)于LED 燈的控制寄存器定義如下,只需要在屏幕熄滅時(shí)填寫(xiě)對(duì)應(yīng)的寄存器地址來(lái)控制bit 位的使能即可。如圖1所示。
圖1
工程師們需要思考如何利用燈效讓用戶區(qū)別現(xiàn)代待機(jī)和傳統(tǒng)睡眠,廣泛應(yīng)用于手機(jī)等便攜設(shè)備的呼吸燈是個(gè)不錯(cuò)的選擇。呼吸燈是指燈光在控制器的作用下完成由亮到暗的逐漸變化,給人的感覺(jué)像在呼吸,可以用來(lái)達(dá)到提醒用戶的功能。本文提供的方法可以將該功能應(yīng)用在支持現(xiàn)代待機(jī)的臺(tái)式機(jī)上,屬于業(yè)界首創(chuàng),也是第一次將現(xiàn)代待機(jī)的功能應(yīng)用于臺(tái)式機(jī)上。開(kāi)發(fā)工程師和用戶都可以通過(guò)呼吸燈的變化直觀的了解系統(tǒng)是否有進(jìn)入到現(xiàn)代待機(jī)的狀態(tài),該方法簡(jiǎn)單易用,效果明顯,可以推廣到筆記本和臺(tái)式機(jī)等支持現(xiàn)代待機(jī)的平臺(tái)上。
控制LED 燈的亮度主要有兩種方法,一種是給LED 燈上施加模擬信號(hào)(可以串接可調(diào)電阻或DAC 輸出模擬信號(hào)),通過(guò)改變流經(jīng)LED 上的電流控制LED 燈的亮度;另一種是使用PWM,給LED 燈上施加數(shù)字信號(hào),通過(guò)調(diào)整數(shù)字信號(hào)的占空比(調(diào)整占空比= 調(diào)整有效值)來(lái)控制。這里我們的呼吸燈就是采用第二種PWM的方法。在邊緣計(jì)算微小化臺(tái)式機(jī)主板上我們利用SIO 芯片控制呼吸燈的占空比來(lái)實(shí)現(xiàn),可以通過(guò)SIO 芯片開(kāi)放出來(lái)的寄存器來(lái)調(diào)節(jié)不同的占空比實(shí)現(xiàn)燈的明亮變化。
圖2 是完整的一次呼吸過(guò)程中Duty 的變化值,橫坐標(biāo)是時(shí)間的變化,縱坐標(biāo)代表著占空比的變化,B8h 是指延長(zhǎng)最暗的時(shí)間,是根據(jù)人眼的視覺(jué)暫留來(lái)設(shè)定的,B9h 對(duì)應(yīng)的每一格亮度占用的時(shí)長(zhǎng),單位是以10ms 來(lái)計(jì)算,亮度的變化總共有40 格,從0x90-0xB7。通過(guò)這一設(shè)定可以很好的實(shí)現(xiàn)呼吸的效果。
圖2
圖3
實(shí)現(xiàn)燈效控制的方法已經(jīng)找到,但是對(duì)于終端用戶和系統(tǒng)工程師來(lái)說(shuō),判斷是否進(jìn)入現(xiàn)代待機(jī)狀態(tài)的標(biāo)準(zhǔn)是不一樣的,如背景部分所述,現(xiàn)代待機(jī)是一個(gè)系統(tǒng)的工程,主板上任何設(shè)備的功耗狀態(tài)都會(huì)影響到系統(tǒng)最終的待機(jī)深度。對(duì)于終端使用的用戶來(lái)說(shuō)最直觀的判斷機(jī)器是否進(jìn)入現(xiàn)代待機(jī)的方法是通過(guò)屏幕的亮滅,可以以此作為觸發(fā)LED 燈呼吸的條件,利用SIO 芯片來(lái)實(shí)現(xiàn)LED 燈效的控制,要求屏幕熄滅和點(diǎn)亮?xí)rSIO 做出相應(yīng)動(dòng)作,但是在臺(tái)式機(jī)上實(shí)現(xiàn)較于筆記本而言更有難度。使用臺(tái)式機(jī)的用戶可以外接各種顯示接口的顯示器,很難掌握用戶對(duì)于外接顯示器的使用,SIO 無(wú)法像在筆記本電腦上控制內(nèi)置屏一樣掌握屏幕的亮滅狀態(tài)。通過(guò)綜合分析臺(tái)式機(jī)上系統(tǒng)的圖形顯示驅(qū)動(dòng)和底層軟件的交互,我們發(fā)現(xiàn)可以利用BIOS 來(lái)通知SIO 對(duì)LED 進(jìn)行控制。在Intel 平臺(tái)上,當(dāng)屏幕熄滅時(shí),系統(tǒng)自帶的inbox 驅(qū)動(dòng)會(huì)通知到ACPI 下的ASLcode,只需要在這段代碼中添加對(duì)SIO 的通知即可。
對(duì)于在項(xiàng)目開(kāi)發(fā)階段的工程師來(lái)說(shuō),這一判斷方法并不適用,硬件工程師需要掌握各個(gè)設(shè)備的功耗狀態(tài)以了解其是否真正實(shí)現(xiàn)了深度待機(jī),單純通過(guò)屏幕的亮滅遠(yuǎn)遠(yuǎn)不夠。下圖是在支持現(xiàn)代待機(jī)的設(shè)備上調(diào)試的日志,顯示了板端的哪些設(shè)備影響了現(xiàn)代待機(jī)的深度,從左側(cè)的設(shè)備列表上可以看到網(wǎng)卡,顯卡的驅(qū)動(dòng),USB 的controller 都有影響到這一待機(jī)狀態(tài)的進(jìn)入。
因此,硬件工程師需要實(shí)際的量測(cè)#SLP_S0 的信號(hào),如果其狀態(tài)為low 并且維持5s 以上,才認(rèn)為系統(tǒng)進(jìn)入了現(xiàn)代待機(jī)的模式,進(jìn)而去使能呼吸燈的燈效,通過(guò)這一方法的實(shí)現(xiàn)可以幫助系統(tǒng)工程師準(zhǔn)確的掌握板端設(shè)備的現(xiàn)代待機(jī)狀態(tài),防止出現(xiàn)誤判的場(chǎng)景。
以上是針對(duì)不同的使用者提出的現(xiàn)代待機(jī)場(chǎng)景的呼吸燈解決方案,可以成功的在邊緣計(jì)算微小化主機(jī)上實(shí)現(xiàn)深度待機(jī)燈效的控制,并且區(qū)別于傳統(tǒng)的睡眠模式給用戶新的使用體驗(yàn);另一方面也考慮到了在開(kāi)發(fā)過(guò)程中工程師對(duì)于設(shè)備功耗情況的調(diào)試,對(duì)于判斷系統(tǒng)是否進(jìn)入現(xiàn)代待機(jī)模式提供了新的思路。隨著現(xiàn)代待機(jī)技術(shù)的普及,該方案也可以移植到其他使用該功能的設(shè)備上。