RD之家欢迎你,立即注册 登录
RD之家 返回首页

yun398992067的个人空间 https://www.rdzhijia.com/?13910 [收藏] [复制] [分享] [RSS]

日志

asl语法

已有 39 次阅读2019-8-26 18:58 |个人分类:ACPI|系统分类:BIOS

@font-face { font-family: "Times New Roman"; }@font-face { font-family: "宋体"; }@font-face { font-family: "Calibri"; }p.MsoNormal { margin: 0pt 0pt 0.0001pt; text-align: justify; font-family: Calibri; font-size: 10.5pt; }span.msoIns { text-decoration: underline; color: blue; }span.msoDel { text-decoration: line-through; color: red; }div.Section0 { }

1DefinitionBlock (AMLFileName, TableSignature, ComplianceRevision,

OEMID, TableID, OEMRevision)

{

TermList // A list of ASL terms

}

DefinitionBlock参数列表:

AMLFileName  ASL编译为AML文件的输出文件名,可为NULL,为NULL时,则系统自动生成

TableSignature  DSDTSSDT

ComplianceRevision  1时标识32架构 2时标识64位架构

OEMID   original equipment manufacturer (OEM) ID

TableID  ID

OEMRevision  OEM的版本号

2Name (ObjectName, Object)

  ACPI Namespace中的名称对象,ObjectName对象名称,Objectvalue

3、ASL语言中的数据类型

• Integer — 32位或者64位的值

• String — 字符串

• Buffer — 字节数组

• Package — ASL对象的数组

• Object Reference — 对象的索引

• Method — 控制方法

4、buffers and package

Name (BUF1, Buffer(3){0x00, 0x01, 0x02})

Name (BUF2, Buffer(){0x00, 0x01, 0x02, 0x03})每个逗号的数在0x00 and 0xff之间

Name (PKG3,

Package(){

Package() {0x00, 0x01, 0x02},

Package() {0x03, 0x04, 0x05}

})//C中的结构体类似

 

5Operation Regions and Fields

  OperationRegion(OPR1, SystemMemory, 0x10000, 0x5)

OPR1: 名称

SystemMemory:类型 系统内存

0x10000: 基地址

0x5: 长度

Field (OPR1)//定义了OperationRegion这块5字节内存的分布情况

6Scopes描述设备

Device (DEV1)

{

Name (INT1, 0x1234)

Name (STR1, "This string is inside of DEV1's scope")

Name (BUF1, Buffer() {0x00, 0x04, 0x6f})

Name (PKG1, Package() {OBJ0, OBJ1})

}

7、名称空间中预定义对象

_HID 标识设备的硬件id

_CRScurrent resource setting)标识当前资源的设置

8、可执行的ASLcontrol method

DefinitionBlock ("", "DSDT", 2, "", "", 0x1)

{

Name (INT1, 0x1234) // define INT1 to be 0x1234

Method (MTH1)

{

INT1 = 0x00 // store 0x00 to INT1

}

}

控制方法MTH1将会把INT1这个值置1,控制方法可以引用存在于其作用域之外的任何命名对象。

Method (MethodName, NumArgs, SerializeRule)

{

TermList // A list of ASL terms and expressions

}

MethodName  控制方法的名称

NumArgs  参数个数,包括arg0arg6.

SerializeRule  说明该控件方法是否可以由多个线程输入

方法最多允许有7个参数和8个局部变量。参数被引用为Arg0Arg6,局部变量被引用为local0local7ASL方法可以由其他ASL方法调用,也可以由OS通过AML解释器调用。

DefinitionBlock ("", "DSDT", 2, "", "", 0x0)

{

Name (STR1, "it is a wonderful day")

Method (GRT1)

{

printf ("Hello world, %o", STR1)

}

}//ASL的基本操作,输出字符串

由于ASL的底层特性,通常可以方便地操作缓冲区内的位,方法是将一个名称分配给一个位区域,并将该区域作为一个命名对象执行操作。这将避免程序员不断索引缓冲区元素。

CreateWordField将一个命名对象取双字域。这允许使用一种简单的方法来处理两个相邻的BUFF元素。同样重要的是,CreateWordField操作符可以将名称DWRD添加到ACPI名称空间中。

CreateWordField (SourceBuffer, ByteIndex, FieldName)

SourceBuffer  取双字域的buff

ByteIndex  buff开始的位置偏移

FieldName  取出双字域的名称

********************************************取各种长度的域***************************************************************

CreateBitFieldLength: 1 bit

CreateByteFieldLength: 1 byte

CreateWordFieldLength: 2 bytes

CreateDWordFieldLength: 4 bytes

CreateQWordFieldLength: 8 bytes

CreateFieldLength: 任意长度

*************************************************************************************************************************

下面是asl通过buffer描述一个I/O资源:

DefinitionBlock ("", "DSDT", 2, "", "", 0x0)

{

Name (RES1, buffer(){

0x47, 0x01, 0x62, 0x00, 0x62, 0x00, 0x00, 0x01,

0x47, 0x01, 0x66, 0x00, 0x66, 0x00, 0x00, 0x01,

0x79, 0x00

})

}

当驱动程序希望通过ACPI了解设备的配置时,它会为一个已命名对象调用AML解释器,该对象可能被分配到一个类似于BUF1的缓冲区。在上面的例子中手工编程可能会导致错误,因为这种表示法缺乏语义意义。如果需要描述设备资源,则使用ResourceTemplate宏。通过使用ResourceTemplate宏,可以这样编码缓冲区:

DefinitionBlock ("", "DSDT", 2, "", "", 0x0)

{

Name (RES2,

ResourceTemplate(){

IO(Decode16, 0x62, 0x62, 0, 1)

IO(Decode16, 0x66, 0x66, 0, 1)

})

}

当编译后,RES2将会编译成和RES1一样的数据结构。

若要读取或写入RES2的元素,请创建取字域并写入位字段。在上面的例子中,第一个IO宏的第二个参数可以这样写:

 

 

 

 

 

DefinitionBlock ("", "DSDT", 2, "", "", 0x0)

{

Name (RES2,

ResourceTemplate(){

IO(Decode16, 0x62, 0x62, 0, 1, IOP1)

IO(Decode16, 0x66, 0x66, 0, 1, IOP2)

})

Method (WRRT, arg1)

{

/*

* According to the ACPI specification, the second

* field of the IO macro is 16 bits. Therefore, use

* CreateWordField to overlay a region that is 16 bits

* in length.

*/

CreateWordField (RES2, \IOP1._MIN, MINF)

MINF = 0x1234 // This will write 0x1234

// to the second field in IOP1.

}

}

有时,有必要在运行时更改现有资源模板中描述符的参数(控制方法执行期间)为了方便实现这一点,描述符宏可选地包含一个名称声明,稍后可以使用该名称声明引用描述符。当使用描述符声明名称时,ASL编译器将自动在给定名称下创建字段名,以引用描述符中的各个字段。

对资源描述符字段名的引用返回的偏移量要么以字节为单位(8-16-32-64位字段宽度),要么以位为单位(所有其他字段宽度)。在所有情况下,返回的偏移量都是从父资源模板的第一个字节(偏移量0)开始的名称的整数偏移量(以字节或比特为单位)

例如,给定上面的资源模板,下面的代码将更改名为IO2I/O描述符的最小和最大地址:

 

需要注意的是,IOP1IOP2是宏,它们在编译期间转换为整数值,整数值用于索引到ResourceTemplate中。这些标签不会插入到ACPI名称空间中。但是,RES2被插入到名称空间中,IOP1IOP2的内容将供驱动程序使用。

ASL方法使用“按引用常量调用”调用约定。在这个调用约定中,方法参数作为引用传递,以减少复制数据时的开销。为了减少混叠问题,控制方法参数本质上是作为常量传递的,并且不容易被重写。此规则的一个例外是,当参数包含引用时。在这种情况下,可以通过取消引用来更改对象值。

6asl编程注意

除了可执行过程之外,还可以在方法内部声明命名对象。这是非常不鼓励的,因为在方法声明中声明的任何命名对象只在方法执行期间存在。命名对象插入ACPI名称空间,并在方法末尾从名称空间中删除。对于AML解释器来说,这是一种计算上的浪费,尤其是如果声明一个命名对象的全部目的是为了让操作系统与之交互的话。如果一个命名对象只出现在方法执行中,那么ASL中唯一可以引用命名对象的部分就是方法本身。为了存储临时值,使用local0local7


路过

鸡蛋

鲜花

握手

雷人

全部作者的其他最新日志

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | RD之家欢迎你,立即注册

QQ|Archiver|手机版|小黑屋|RD之家 - 研发工程师的伊甸园 ( 京ICP备18037383号 )
360导航 360安全浏览器 蚂蚁搜索 速搜全球 酷帝网站目录 搜狗导航 114啦网址导航

GMT+8, 2019-9-16 14:11

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

返回顶部