2012年3月25日 星期日

ASL code簡單教學

這一篇是用來記錄我自己學習ASL code的文章~
我在想一開始應該會有很多錯誤吧~
就慢慢修正囉~

Device (DeviceName) {ObjectList}
建立一個名為DeviceName的Object,其是代表Bus或device或是其它的hardware

OperationRegion (RegionName, RegionSpace, Offset, Length)
建立一個名為RegionName的變數,這一個東東代表的就是一個可以存取的空間。
RegionSpace就是這個空間的類型,在Acpi5.0可能是
SystemMemory,
SystemIO,
PCI_Config,
EmbeddedControl,
SMBus,
CMOS,
PCIBARTarget,
IPMI,
GeneralPurposeIO,
GenericSerialbus
Offset則表示由這一上述的空間的起始位址開始位移Offset (byte)的地方代表目前宣告的RegionName的起始位址。
Length則表示目前這一個RegionName所代表的大小(byte)

Field (RegionName, AccessType, LockRule, UpdateRule) {FieldUnitList}
Field通常是跟OperationRegion搭配使用,把OperationRegion宣告的空間,在細分成可以access的個別的變數。
RegionName就是OperationRegion宣告的變數名稱。
AccessType就是存取變數是一次存取的長度,可以是
AnyAcc,
ByteAcc,
WordAcc,
DWordAcc,
QWordAcc
LockRule可以設定為Lock or NoLock
若設定為Lock的情況時,當變數被access時,其它他要access這一個變數,必需等到這一個變數沒有被access才可以動作。
UpdateRule可以設定為Preserve, WriteAsOnes and WriteAsZeros
這裡若是設定一個Field為QWordAccess,則當有一個成員為4 bits,則當這一個被update時,其它的12個成員為被保留或是設定為1或是0。
以下為一個OperationRegion與Field的例子:

OperationRegion (MIOC, PCI_Config, 0x10, 0xFF)
Field (MIOC, AnyAcc, NoLock, Preserve)
{
Offset (0x58),
HXGB, 32,
HXGT, 32,
GAPE, 8,
Offset (0x70),
MR0A, 4,
MR0B, 4
}

這裡是說,宣告一個OperationRegion其起始位址為PCI configuration space的0x10 byte的地方,
並且其長度為0xFF bytes。
並且在下面宣告了一個MIOC的Field,其Access的方式並沒有限定,並且沒有Lock的機制,並保留其它沒有access的數值。
Office (0x58)意思是先直接跳到MIOC起始位置0x58 bytes的地方,
接下來設定一個名為HXGB的變數,其大小為32 bits,而其起始位置就在0x58 bytes offset of MIOC
再來設定一個名為HXGT的變數,其大小為32 bits,而其起始位置就在0x5C bytes offset of MIOC
Offset (0x70)則一樣是直接跳到MIOC起始位置0x70 bytes的地方,
再來設定一個名為MR0A的變數,其大小為4 bits,而其起始位置就在0x70 bytes offset of MIOC


參考資料:
ACPIspec5.0
自己動手寫DSDT系列教程1-ASL(ACPI Source Language)基礎篇

2 則留言:

Hughes 提到...

謝謝您的分享!!

匿名 提到...

謝謝分享