Chinaunix首页 | 论坛 | 博客
  • 博客访问: 453499
  • 博文数量: 90
  • 博客积分: 2158
  • 博客等级: 大尉
  • 技术积分: 1435
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-12 17:02
个人简介

怎么了选择

文章分类
文章存档

2024年(1)

2023年(1)

2019年(1)

2018年(5)

2017年(5)

2015年(1)

2014年(1)

2013年(1)

2012年(74)

分类: Windows平台

2017-10-09 14:38:45

1. ASL基本准则

a)  变量名必须由4个字符组成,第1个字符不能是数字

b)  变量名和函数名不区分大小写

c)  Scope和Device都会形成自己的作用域,类似于C++中的namespace和class

d)  所有以”_”开头的函数都是Reserved的,给系统使用,不能给自己的函数起这样的名字

e)  ASL中的路径有相对路径和绝对路径之分。其结构有点像文件目录。

f)  对于函数,最多只能传递8个参数(Arg0~Arg7),只能用这8个名字,不能自己起名字

g)  对于局部变量,最多能使用8个变量(Local0~Local7),和函数参数一样,不能自己起名字,而且在使用之前必须手动赋初值。

h)  声明变量时不需要显示声明其类型,这一点不同于C和C++。

2. 数据类型

ASL 常用的几种数据类型

a)  Integer  – 整数   b)  String   – 字符串   c)  Event   -- 事件  

d)  Buffer  -- 数组    e)  Package – 对象结合

问:如何获取一个变量的类型?

:使用函数ObjectType(Obj)可以得到变量类型

       返回值:

       0: Uninitialized              1: Integer              2: String              3: Buffer              

       4: Package                     7: Event

3. 定义变量

    正如前面提到的,声明变量时不需要显式地声明其类型。

    Name(MYIN,1)                //定义了一个整数

    Name(MSTR, “Hello,world”)   //定义了一个字符串

4. 赋值

ASL中使用函数Store()来进行赋值操作

Store(0x1234,  Local0)

Store(“Hello”,     Local0)

5. 算术运算

ASL中不使用+-*/等符号进行运算,全部使用函数

常用的有:

Add:                   Add(0x1, 0x2, Local0)                   // Local0 = 0x1+ 0x2

And:                   And(0x1, 0x2, Local0)                   // Local0 = 0x1& 0x2

Divide:              Divide(0x2, 0x1, Local0)                // Local0 = 0x2/ 0x1

Mod:                  Mod(0x2, 0x1, Local0)                  //Local0 = 0x2% 0x1

Multiply:            Multiply(0x2, 0x1, Local0)             //Local0 = 0x1* 0x2

Nor:                   Nor(0x1, 0x2, Local0)                    //Local0 = (~0x1)& (~0x2)

Not:                   Not(0x1, Local0)                            // Local0 =~0x1

Or:                     Or(0x1, 0x2, Local0)                     // Local0 = 0x1 |0x2

ShiftLeft:           ShiftLeft(0x1, 0x8, Local0)           // Local0 = (0x1)<<0x8

ShiftRight:        ShiftRight(0x8, 0x2, Local0)         //Local0 = (0x8)>>0x2

Subtract:          Subtract(0x2, 0x1, Local0)            //Local0 = 0x2 0x1

Xor:                   Xor(0x1, 0x2, Local0)                   //Local0 = 0x1 ^ 0x2

6. 逻辑运算

和算术运算一样,ASL中同样使用函数来进行逻辑运算

常用的有:

LAnd:                          LAnd(0x1, 0x2)                                     //0x1 && 0x2

LEqual:                       LEqual(0x1, 0x2)                                  // 0x1== 0x2

LGreater:                   LGreater(0x1, 0x2)                               //0x1 > 0x2

LGreaterEqual:         LGreaterEqual(0x1,0x1)                       // 0x1 >= 0x2

LLess:                        LLess(0x1, 0x2)                                   // 0x1 < 0x2

LLessEqual:              LLessEqual(0x1,0x2)                           // 0x1 <= 0x2

LNot:                          LNot(0x1)                                             //!(0x1)

LNotEqual:                LNotEuqal(0x1,0x2)                             //0x1 != 0x2

LOr:                           LOr(0x1,0x2)                                        // 0x1 || 0x2

7. 函数定义

Method(ADBG, 2) //表示有两个输入参数
{
    // Arg0, First parameter
    // Arg1, Second parameter
    Store(Arg0, Local0)     //局部变量0
    Store(Arg1, Local1)     //局部变量1
    Add(Local0, Local1, Local1)
    Return(Local1)          //返回Local1
}
调用函数
ADBG(3, 5)

8. 流程控制

在ASL中,常见的流程控制列表如下:
Break, BreakPoint, Case, Continue, Default, Else, ElseIf, Fatal, If, NoOp, Return, Sleep, Stall, Switch, While

If的用法:
[plain] view plain copy
  1. If (predicate1)  
  2. {  
  3.     …statements1…  
  4. }  
  5. ElseIf (predicate2)  
  6. {  
  7.     …statements2…  
  8. }  
  9. Else  
  10. {  
  11.     …statements3…  
  12. }  

For Example:
[plain] view plain copy
  1. If (predicate1)  
  2. {  
  3.     …statements1…  
  4. }  
  5. ElseIf (predicate2)  
  6. {  
  7.     …statements2…  
  8. }  
  9. Else  
  10. {  
  11.     …statements3…  
  12. }  
Switch语句:
[plain] view plain copy
  1. Switch (expression)  
  2. {  
  3.     Case (value) {  
  4.         Statements executed if Lequal (expression, value)  
  5.     }  
  6.     Case (Package () {value, value, value}) {  
  7.         Statements executed if Lequal (expression, any value in package)  
  8.     }  
  9.     Default {  
  10.         Statements executed if expression does not equal  
  11.         any case constant-expression  
  12.     }  
  13. }  
While语句的用法:
[plain] view plain copy
  1. While (LGreater(Local0, 0))  
  2. {  
  3.     Subtract(Local0, 1, Local0);  
  4. }  


前面的章节已经对ACPI Table和ASL语言的基本语法有过初步的介绍。这里在复习一下。ASL是ACPI Source Language的简称,它经过编译器编译过后变成AML,然后交给操作系统来执行。

1. 根作用域下面的5个域(\_GPE, \_PR, \_SB, \_SI, \_TZ)

\_GPE, 主要负责ACPI的事件处理
\_PR, 处理器相关
\_SB, 所有的设备和总线
\_SI, 系统指示灯
\_TZ, Thermal相关,用于读取某些温度值

2. \_GPE

用RW在windows下面可以查看本机的ACPI Table。我们来看一下真实的\_GPE是什么样子的。

GPE下面的东西,别的不多讲,主要讲一下Lxx Method.
GPE域内的Lxx方法都是和GP0_STS寄存器中的bit对应起来的。举个例子,_L01对应的就是GP0_STATUS中的第一位。
注意,Lxx中的xx是16进制而不是十进制,所以如果你看到_L24,千万不要以为是bit24, 而应该是bit36。

3. \_PR Processor相关

  1. Scope (_PR)
  2. {
  3.     Processor (CPU0, 0x00, 0x00000410, 0x06)
  4.     {
  5.         ....
  6.     }
  7.     ....
  8. }

4. \_SB 所有的设备和总线




ASL常用的数据类型有:

Integer(整数), String(字符串), Event(事件), Buffer(数组), Package(对象集合)

定义一个Integer:

Name(TEST, 0)

定义一个String:
Name(TEST, "ABCD")

定义一个Buffer:

Buffer (BufferSize) {String or ByteList}

Buffer() {0xa, 0xb, 0xc, 0xd}

Buffer(2) {0xa, 0xb}

定义一个Package:

Package (NumElements) {PackageList}

Package中的成员可以是Integer, String, Buffer, 当然也可以是Package

例如:

Package () {
      3,
      9,
      “ACPI 1.0 COMPLIANT”,
      Package () {
            “CheckSum=>”,
            Package () {7, 9}

      },

     0
}

如果Package中NumElements缺省,那么有它被设置成Package中实际包含的元素个数。

如果NumElements大于Package中实际元素的个数,那么多出来的这些元素是未定义的。

阅读(4943) | 评论(0) | 转发(0) |
0

上一篇:PCI总线原理

下一篇:ACPI Table基本知识

给主人留下些什么吧!~~