热度 1||
1、DefinitionBlock (AMLFileName, TableSignature, ComplianceRevision,
OEMID, TableID, OEMRevision)
{
TermList // A list of ASL terms
}
DefinitionBlock参数列表:
• AMLFileName — ASL编译为AML文件的输出文件名,可为NULL,为NULL时,则系统自动生成
• TableSignature — DSDT或SSDT
• ComplianceRevision — 为1时标识32位架构 为2时标识64位架构
• OEMID — original equipment manufacturer (OEM) ID
• TableID — 表ID
• OEMRevision — OEM的版本号
2、Name (ObjectName, Object)
在ACPI Namespace中的名称对象,ObjectName对象名称,Object为value
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中的结构体类似
5、Operation Regions and Fields
OperationRegion(OPR1, SystemMemory, 0x10000, 0x5)
OPR1: 名称
SystemMemory:类型 系统内存
0x10000: 基地址
0x5: 长度
Field (OPR1)//定义了OperationRegion这块5字节内存的分布情况
6、Scopes描述设备
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
_CRS(current resource setting)标识当前资源的设置
8、可执行的ASL(control 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 — 参数个数,包括arg0到arg6.
• SerializeRule — 说明该控件方法是否可以由多个线程输入
方法最多允许有7个参数和8个局部变量。参数被引用为Arg0到Arg6,局部变量被引用为local0到local7。ASL方法可以由其他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 — 取出双字域的名称
********************************************取各种长度的域***************************************************************
• CreateBitField—Length: 1 bit
• CreateByteField—Length: 1 byte
• CreateWordField—Length: 2 bytes
• CreateDWordField—Length: 4 bytes
• CreateQWordField—Length: 8 bytes
• CreateField—Length: 任意长度
*************************************************************************************************************************
下面是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)开始的名称的整数偏移量(以字节或比特为单位)。
例如,给定上面的资源模板,下面的代码将更改名为IO2的I/O描述符的最小和最大地址:
需要注意的是,IOP1和IOP2是宏,它们在编译期间转换为整数值,整数值用于索引到ResourceTemplate中。这些标签不会插入到ACPI名称空间中。但是,RES2被插入到名称空间中,IOP1和IOP2的内容将供驱动程序使用。
ASL方法使用“按引用常量调用”调用约定。在这个调用约定中,方法参数作为引用传递,以减少复制数据时的开销。为了减少混叠问题,控制方法参数本质上是作为常量传递的,并且不容易被重写。此规则的一个例外是,当参数包含引用时。在这种情况下,可以通过取消引用来更改对象值。
6、asl编程注意
除了可执行过程之外,还可以在方法内部声明命名对象。这是非常不鼓励的,因为在方法声明中声明的任何命名对象只在方法执行期间存在。命名对象插入ACPI名称空间,并在方法末尾从名称空间中删除。对于AML解释器来说,这是一种计算上的浪费,尤其是如果声明一个命名对象的全部目的是为了让操作系统与之交互的话。如果一个命名对象只出现在方法执行中,那么ASL中唯一可以引用命名对象的部分就是方法本身。为了存储临时值,使用local0到local7。
|Archiver|手机版|小黑屋|个人研发笔记
京ICP备18037383号-1
GMT+8, 2021-1-22 10:46
Powered by Discuz! X3.4
© 2001-2013 Comsenz Inc.