小華的部落格: ACPI v.s ASL Code

搜尋此網誌

網頁

星期日, 11月 04, 2007

ACPI v.s ASL Code

ㄧ般OEM/ODM BIOS工程師接觸到BIOS中比較特殊的部份是屬於ACPI的ASL Code,因為這部份的程式碼主要的功能就是提供OS去做一些服務以及提供一些資訊給OS使用,因此本篇文章重點放在事件的觸發(event)的概念與ASL Code架構。

先說明一下何謂硬體事件: 在系統中,常常有一些硬體會產生一些事件,例如使用者按下Power Button,而這個動作需不需要讓OS知道 ? 答案是肯定的;當OS知道後,最常出現的畫面就是會跳出一個視窗,然後讓你選擇”重新開機” 、 “登出” 或是 “關閉電腦”,另外像是你的NoteBook 插上船塢(Docking) 時,也是要通知OS 目前系統插在船塢上,這樣子才能更新狀態或是做其他需要服務的事情。而這些動作就是硬體所產生的事件,【而事件產生後需要通知OS】,通知的方式也分成不同類型,最常見的方式就是SCI。

假設產生的硬體事件是透過SCI 來告知OS有事件產生,而OS的驅動程式會去辨別是屬於哪一種硬體事件(系統中可以產生事件的硬體有很多類型),然後針對不同的事件去執行不同的ASL Code。

一般透過SCI 來通知OS的硬體事件都會有一個事件編號,假設有一個硬體事件產生,而他的事件編號是Number 20(編號是BIOS端自己定義的,所以家OEM/ODM製造出來的電腦中所代表的意思也不同),一般我們稱為此事件為Q event 編號20,寫作Q20; 當OS 知道是Q20 event後,就會執行對應的ASL Code,例如:

Method(_Q20){ <--ACPI Spec定義Q Method 可以從00~FFh,其意義由製造商自己定義
…..
}

範例中 方法“Method()” 這個語法類似C語言的副程式寫法,他代表著當編號20 的硬體事件產生後,OS會去執行這個Method內所撰寫的程式碼,至於撰寫什麼功能就要參考這家BIOS規範書中的說明,一般比較常見的就是Fn+Key 的硬體事件產生後,透過ASL Code通知Application去改變音量大小。

所以對於ASL Code來說,並沒有所謂的類似C語言的主程式進入點,因為他是一個屬於event-based 的程式架構。

Main() <--C語言程式的進入點
{

FunA(...);
}

………………………………
Method(_Q20) <--ASL Code沒有進入點
{

}
Method(_Q8A)
{

}

Method(OEMM,2) //自己定義且帶有引數的方法
{
Store(Arg0,Local0);
...
}

結論:
整篇文章的重點在於說明 ASL Code是事件驅動類型,沒有所謂的程式進入點,因此你要多了解不同的硬體事件是透過什麼方式告知OS(SCI/GPE…etc),然後OS會幫你執行哪些ASL code。 至於ASL Code語法說明則參考ACPI Spec 中有更詳細的說明。

8 則留言:

Eric Yao 提到...

您好,
若是我想利用某根GPIO來產生一個event..
比方說..GPI-12好了..我希望在這個input有被按的時候..
能夠發一個 Q45 到 OS ..至於作什麼..什麼都不用作..
我只要OS有收到這個 Q45 就行了~
那像這樣..是要怎麼作呢..?

小華的部落格 提到...

你是要問EC端還是BIOS端?

Eric Yao 提到...

BIOS端..

小華的部落格 提到...

BIOS端主要是改EC.ASI ,另外在組態好你的GPIO!

匿名 提到...

小華哥您好~
請教一下,當GPE event發生時,windows下可以使OS進入ASL code,但Linux就不會進去~ 請問會是BIOS的問題嗎? 還是Linux ACPI Driver的問題?
謝謝

POL 提到...

小華哥你好!!
請教一下? ASL code 有辨法 disable 一個 device 嗎? 像在 device manager 內的 disable 功能。我 report _STA to 00, 老是不成功? 這個部份BIOS 能完成嗎?

匿名 提到...

你好
請教一下
若我想要用WMI提交一張ACPI table給BIOS,

具體而言我需要做什麼事
能否指引方向?

show 提到...

請問你有玩 slimbootloader嗎?