ACPI 中文文档ACPI 中文文档
首页
第 1 章
第 2 章
第 3 章
第 4 章
第 5 章
第 6 章
第 7 章
第 8 章
第 9 章
第 10 章
第 11 章
第 12 章
第 13 章
第 14 章
第 15 章
第 16 章
第 17 章
第 18 章
第 19 章
第 20 章
第 21 章
附录 A
首页
第 1 章
第 2 章
第 3 章
第 4 章
第 5 章
第 6 章
第 7 章
第 8 章
第 9 章
第 10 章
第 11 章
第 12 章
第 13 章
第 14 章
第 15 章
第 16 章
第 17 章
第 18 章
第 19 章
第 20 章
第 21 章
附录 A
  • 第 5 章

    • 总览
    • 5.1. 系统描述表架构概述
    • 5.2. ACPI 系统描述表
      • 5.2.1. 保留位和字段
      • 5.2.2. 兼容性
      • 5.2.3. 地址格式
      • 5.2.4. 通用唯一标识符 (UUID)
      • 5.2.5. 根系统描述指针 (RSDP)
      • 5.2.6. 系统描述表头
      • 5.2.7. 根系统描述表 (RSDT)
      • 5.2.8. 扩展系统描述表 (XSDT)
      • 5.2.9. 固定 ACPI 描述表 (FADT)
      • 5.2.10. 固件 ACPI 控制结构 (FACS)
      • 5.2.11. 定义块
      • 5.2.12. 多个APIC描述表(MADT)
      • 5.2.13. 全局系统中断
      • 5.2.14. 智能电池表 (SBST)
      • 5.2.15. 嵌入式控制器启动资源表 (ECDT)
      • 5.2.16. 系统资源关联表 (SRAT)
      • 5.2.17. 系统局部性信息表 (SLIT)
      • 5.2.18. 更正平台错误轮询表 (CPEP)
      • 5.2.19. 最大系统特性表 (MSCT)
      • 5.2.20. ACPI RAS 功能表 (RASF)
      • 5.2.21. 内存电源状态表 (MPST)
      • 5.2.22. 启动图形资源表 (BGRT)
      • 5.2.23. 固件性能数据表 (FPDT)
      • 5.2.24. 通用定时器描述表 (GTDT)
      • 5.2.25. NVDIMM 固件接口表 (NFIT)
      • 5.2.26. 安全设备 (SDEV) ACPI 表
      • 5.2.27. 异构内存属性表(HMAT)
      • 5.2.28. 平台调试触发器表 (PDTT)
      • 5.2.29. 处理器属性拓扑表 (PPTT)
      • 5.2.30. 平台健康评估表 (PHAT)
    • 5.3. ACPI 命名空间
    • 5.4. 定义块编码
    • 5.5. 控制方法和 ACPI 源语言 (ASL)
      • 5.5.1. ASL 报表
      • 5.5.2. 控制方法执行
        • 5.5.2.1. 论点
        • 5.5.2.2. 方法调用约定
        • 5.5.2.3. 局部变量和本地创建的数据对象
        • 5.5.2.4. 进入运营区域
          • 5.5.2.4.1. 运营地区
          • 5.5.2.4.2. CMOS 协议
          • 5.5.2.4.3. PCI 设备 BAR 目标协议
          • 5.5.2.4.4. 声明IPMI运营区域
          • 5.5.2.4.5. 声明 GeneralPurposeIO 操作区域
          • 5.5.2.4.6. 声明 GenericSerialBus 操作区域
            • 5.5.2.4.6.1. 声明 GenericSerialBus 字段
            • 5.5.2.4.6.2. 声明和使用 GenericSerialBus 数据缓冲区
            • 5.5.2.4.6.3. 使用通用串行总线协议
          • 5.5.2.4.7. 声明PCC运营区域
    • 5.6. ACPI 事件编程模型
      • 5.6.1. ACPI 事件编程模型组件
      • 5.6.2. ACPI 事件类型
      • 5.6.3. 固定事件处理
      • 5.6.4. 通用事件处理
      • 5.6.5. GPIO 信号 ACPI 事件
      • 5.6.6. 设备对象通知
      • 5.6.7. 设备类特定对象
      • 5.6.8. 对象、方法和资源的预定义ACPI名称
      • 5.6.9. 中断信号ACPI事件
      • 5.6.10. 使用设备 _PRW 对象管理唤醒事件
    • 5.7. 预定义对象
    • 5.8. 系统配置对象

5.5.2.4.6.2. 声明和使用 GenericSerialBus 数据缓冲区

使用 GenericSerialBus 事务的数据缓冲区允许AML接收状态和数据长度值,并且可以实现“进程调用”协议。 BufferAcc 访问类型用于向字段处理程序指示将使用特定于区域的数据缓冲区。

对于 GenericSerialBus 操作区域,此数据缓冲区被定义为任意长度的缓冲区,如果使用“C”样式声明表示,则将建模如下:

typedef struct
{
   BYTE Status;      // Byte 0 of the data buffer
   BYTE Length;      // Byte 1 of the data buffer
   BYTE[x-1] Data;   // Bytes 2-x of the arbitrary length data buffer,
}                    // where x is the last index of the overall buffer

其中:

  • 状态(字节 0)指示给定 GenericSerialBus 事务的状态代码。

  • 长度(字节 1)指定数据缓冲区中存在的有效数据的字节数(字节 2-x)。该字段的使用仅为读/写块协议定义。对于其他协议(数据长度由协议隐含),该字段被保留。由于该字段是一个字节,因此数据缓冲区的最大长度为255。

  • Data(字节2-x)表示任意长度的缓冲区,是实际数据存储的位置。

例如,以下ASL显示了使用 GenericSerialBus 数据缓冲区对智能电池设备执行事务。

/* Create the GenericSerialBus data buffer */

Name (BUFF, Buffer (34){}) // 创建 GenericSerialBus 数据缓冲区作为 BUFF CreateByteField (BUFF, 0x00, STAT) // STAT = Status (Byte) CreateByteField (BUFF, 0x01, LEN) // LEN = Length (Byte) CreateWordField (BUFF, 0x02, DATW) // DATW = Data (Word - Bytes 2 & 3) CreateField (BUFF, 0x10, 256, DBUF) // DBUF = Data (Block - Bytes 2-33)

/* Read the battery temperature */

BUFF = BTMP // Invoke Read Word transaction

If (STAT == 0x00)    // Successful?
{
    // DATW = Battery temperature in 1/10th degrees Kelvin
}

/* Read the battery manufacturer name */

BUFF = MFGN          // Invoke Read Blocktransaction

If (STAT == 0x00)    // Successful?
{
    // LEN = Length of the manufacturer name
    // DBUF = Manufacturer name (as a counted string)
}

请注意使用 CreateField 原语来访问数据缓冲区的子元素(状态、长度和数据),其中数据(字节 2-33)被“类型转换”为字 (DATW) 和块 (DBUF) 数据。

上面的示例演示了如何使用 Store() 运算符调用读取块事务来获取电池制造商的名称。对源操作数 (MFGN) 的计算会产生一个 34 字节缓冲区,该缓冲区由 Store() 复制到目标缓冲区 (BUFF)。

捕获写操作的结果,例如检查状态代码,需要额外的 Store() 运算符,如下所示:

BUFF = (MFGN = BUFF)
If (STAT == 0x00)      // Transaction successful?
{
    ...
}

请注意,外部 Store() 将写入块事务的结果复制回BUFF。这就是 BufferAcc 双向性的本质。应该注意的是,存储(或解析)GenericSerialBus Write 事务的结果不是必需的,尽管对于确定事务的结果很有用。

由于只有目标操作数是双向传递的,GenericSerialBus Process Call 协议需要类似的语义。这些事务需要使用 double-Store() 语义来正确捕获返回结果。

Prev
5.5.2.4.6.1. 声明 GenericSerialBus 字段
Next
5.5.2.4.6.3. 使用通用串行总线协议