ACPI AML Summary
簡介
-
寫在DSDT & SSDT裡面
-
主要的作用是描述所在平台的周邊裝置的
-
特性
-
控制方法
-
架構
DefinitionBlock(...) {
//
//In Root Scope
//
OperationRegion() { … }
Field () { … }
Name(ABC, 123)
Method(ABC, 0, ...) { … }
Scope(\_SB) {
//
//In _SB scope
//
Method (SBM1, 1, …) { … }
Device(DEVA) {
//
// In _SB.DEVA scope
//
OperationRegion() { … }
Field () { … }
Name(ABC, 123)
Method(ABC, 0, ...) { … }
ResourceTmplate() { … }
}
}
}
- 最外面是一個DefinitionBlock(), 裡面包著ASL code, 如果沒有特別指定scope, 則裡面所定義的均為global的變數及函式.
- Scope類似檔案系統中的目錄.
- Device(), Processor(), ThermalZone()...等等object,類似class,性質類似scope,可以有自己的變數和函式,並且有自己的resources.
- 函式是用Method()來定義(Function()亦可,本質上只是Method()的一種).
- 變數,通常是可以讀取或儲存的一個空間.依特性不同有不同的存取權限. 可以用Name() or CreateXXXField()...來宣告.
ACPI ASL變數
宣告
Name (name, object); |
取名並設定初值為object. |
OperationRegion(name, type, offset, Length) Name1, bit, Name2, bit, Offset(...) … ) CreateBitField(...) CreateByteFile(...) |
先定義Device等object內的OerationRegion. 再用Field() or CreateXXXField()取出某個子區域,另外取名. |
Arg0,Arg1,Arg2... ==> ArgX Local0,Local1,Local2... ==> Local X |
Method裡面預定定義的變數,初始資料型態未定. (此參數不需要特別預先定義,系統會自動建立) ArgX為Method的參數 LocalX為Method的區域變數 |
One (常數0) Ones (常數 -1, 0xffffffff …) Zero (常數0) |
ACPI定義的常數, 通常搭配Store()用來將將值assign給其他變數,資料型態會依要assign的變數而自動轉型. |
變數的名字,長度為4, 開頭可以用_ or A-Z 表示,其餘字元可以是A-Z or 0-9. 通常_ underline開頭為系統預先定義的有意義的變數.
Package
Package(num) { item1, item2, item3...}
- 類似array,但是他不限定裡面的item的形態,型態可以是integer, string, resource template... 等object
- 可在package裡面重複包另外一個package
- 可以用Ref(), DeRef(), IndexOf()...等存取內容
存值 (Assignment)
CopyObject (Src, dest) |
將dest的值及變數型態,設為與src一致 |
Store (Src, dest) |
依dest型態將src存至dest (dest型態不變) |
函式
定義方式 (Define)
Function(name, return type,parameter types) {
ASL code...
}
Method(name, numArgs,serial rule, sync level, return type, parameter types) {
ASL code ...
}
如定義
Method(STOV, 1, NotSerialized) {
Store(VVVV, Arg0)
Return(0x01)
}
呼叫方式 (Invoke)
類似一般高階語言的呼叫方式如定義Method (STOV,1,NotSerialized) { … }, 則用 STOV(One),呼叫.
預先定義的變數
系統會依傳入的參數建立ArgX, 參數數量,定義在Method() operator,的第二的參數,如上例的STOV,即有一個參數.
LocalX則是Method內的區域變數,初值及型態都未定,變數內容不會影響其他Method的LocalX變數.
傳回值 (Return Value)
用Return or Return() or Return(Arg) 傳回值
Scope
類似檔案系統目錄的架構,用來分類用. 可以巢狀定義(表示 Scope() 裡面又可以有Scope().
語法:
Scope(name) {
Method(MED1) { … }
Name(NAM1) { … }
Device(DEV1) { … }
}
裡面可以定義Method(函式), 或變數(Name, 或field... 等方式定義),還有Device, Process … 等.
Resolving解譯
這邊會有兩個特殊的resolving字元,用來resolve Method or Name的scope,
- “\” : 用在開頭代表從root開始resolve, 中間表示下一層scope,如 “\_SB\PCI0\MED1” , 類似DOS的路徑規則.
- “^” : 表示上一層scope, 如\SB\PCI0\MED1 Method要access某個 \NAM1, 可用”^^NAM1”來resolve.
Device() , Processor()...等object
性質同scope,可以有Method或是變數. 但是不同點有:
- 各個不同的device, ACPI有預先定義該種object的特殊含意的Method和變數.
- 會有自己的Resource (用 ResourceTemplate定義, 可以是Memory, IO port, DMA, IRQ …)
- 會有自己的OperationRegion(), Scope也會有, 可是這樣的意義較不明確, OperationRegion() 裡面的資源會搭配Field, CreateXXXField用, 與上述的Resource不同的是上述的Resource是給系統的device driver操作用, 而operation region是定義給ASL code用的.
控制用Operator
這些operator會用在Method裡面,是真正有執行動作的code.
-
Assignment : 請參考變數的敘述
-
運算Operator : Add, Subtract, …等. 與一般高階語言不同的是這些會把運算的兩個變數放前面,然後結果assign變數放後面, 如 C = A + B , 則變成 Add(A, B, C).
-
流程控制 : If , Else, Switch … 等,控值程式流程及判斷值的operator, 用法語一般高階語言類似.
-
邏輯運算 : LAnd, LOr … 等, 判斷是非的判斷operator, 前面都會有 'L' 開頭, 與一般的bitwise的運算, 並不一樣. 邏輯判斷的結果是 True or False, 非bitwise的結果為Integer.
-
Load() … 可load其他SSDT裡的東西 (即SSDT存在之意義).
-
Notify : 用來通知OSPM,某個device發生的事情. 如_L01 Method(GPE1發生)內可以用Notify(DEV1,1)告訴OSPM某個Device可能被拔除或插入(Notify code 1的意義).
留言列表