close

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)
Field(

    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的意義). 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 cj6m3 的頭像
    cj6m3

    勇ㄅㄟㄅㄟ胡言亂語堂

    cj6m3 發表在 痞客邦 留言(0) 人氣()