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
  • 第 9 章

    • 总览
    • 9.1. 设备对象名称冲突
    • 9.2. \_SI 系统指示器
    • 9.3. 环境光传感器设备
    • 9.4. 电池设备
    • 9.5. 控制方法盖板设备
    • 9.6. 控制方法电源按钮和睡眠按钮设备
    • 9.7. 嵌入式控制器设备
    • 9.8. 通用容器设备
    • 9.9. ATA 控制器设备
    • 9.10. 软盘控制器设备对象
    • 9.11. GPE 块设备
    • 9.12. 模块设备
    • 9.13. 内存设备
    • 9.14. _UPC(USB 端口能力)
    • 9.15. PC/AT RTC/CMOS 设备
    • 9.16. 用户存在检测设备
    • 9.17. I/O APIC 设备
    • 9.18. 时间和报警设备
    • 9.19. 通用按钮设备
    • 9.20. NVDIMM 设备
      • 9.20.1. 概述
      • 9.20.2. NVDIMM 根设备
      • 9.20.3. NVDIMM 设备
      • 9.20.4. 示例
      • 9.20.5. 加载 NVDIMM 驱动程序
      • 9.20.6. 热插拔支持
      • 9.20.7. NVDIMM 根设备 _DSMs
      • 9.20.8. NVDIMM 设备方法

9.18. 时间和报警设备

以下各节定义了可选的基于控制方法的时间和报警设备的操作和定义,该设备提供一种独立于硬件的抽象,并且是实时时钟(RTC)的更健壮替代方案(参见 PC/AT RTC/CMOS 设备)。

时间和报警设备的时间功能在平台电源转换过程中保持一天中的时间信息,并且即使在平台关闭时也会持续跟踪时间。预期当使用不同固件接口查询平台时间时,平台上的时间将保持一致。例如,获取时间的 UEFI 调用应返回与 OSPM 在同一时刻使用时间和报警设备时相同的时间。

时间和报警设备可以选择支持电源管理对象(例如 _PS0、_PS3),以允许 OS 管理设备的功耗。

时间和报警设备必须支持控制方法 _PRW,以便能够被启用来唤醒系统。它还可能支持 _DSW 或 _PSW,以提供启用或禁用设备唤醒睡眠系统能力的功能。在硬件简化的 ACPI 平台上,仅当设备依赖于 ACPI 定义的电源资源时才要求 _PRW。OSPM 会忽略 _PRW 的 GPEInfo 结构。对于启用唤醒,使用 _DSW 和 _SxW,并且唤醒事件通过 GPIO 发信号的 ACPI 事件机制来指示(参见第 5.6.5 节)。

时间和唤醒报警设备的即插即用 ID 为 ACPI000E。

表 9.13 时间和报警设备

对象说明
_GCP获取时间和报警设备的能力
_GRT获取实时时间
_SRT设置实时时间
_GWS获取唤醒状态
_CWS清除唤醒状态
_STP为指定计时器设置到期计时器唤醒策略。
_STV设置指定计时器中的值。
_TIP返回指定计时器当前的到期计时器策略设置。
_TIV返回指定计时器的剩余时间。

9.18.1. 概述

时间和报警设备提供了实时时钟(RTC)的替代方案,后者被定义为一种固定功能硬件设备。唤醒计时器允许系统在一段时间过去后从 S3(或可选的 S4/S5)状态转换到 S0 状态。与实时时钟(RTC)报警相比,时间和报警设备在唤醒计时器的操作上提供了更大程度的灵活性,并允许时间源的实现对 OSPM 进行抽象。

时间和报警设备为 OSPM 提供了时间和报警服务的固件抽象,可适用于多种硬件设计。用于设置和获取实时时间的方法提供了 RTC 的替代方案。

实现 AC/DC 唤醒服务的时间与告警设备包含两个可编程定时器,可根据平台当前的电源(AC 或 DC)在定时器到期时将系统唤醒。这两个定时器分别称为 AC 定时器和 DC 定时器,它们彼此独立,即可以分别编程并适用,而不会相互干扰。每个定时器都可以被编程为从设置该定时器开始到请求唤醒为止所经过的秒数。当某个定时器到期时,时间与告警设备会根据当前电源来决定是否唤醒系统。如果当前电源与到期定时器的类型一致,则会置位唤醒信号。否则,不会置位唤醒信号。

实现仅 AC(与电源无关)唤醒的时间与告警设备包含一个可编程定时器,该定时器可被配置为在到期时无论平台电源为何都唤醒系统。为简化编程接口,AC 唤醒将使用 AC/DC 唤醒中的 AC 定时器部分;当仅支持 AC 唤醒时,对 DC 定时器的写入将被忽略。

为简化时间与告警设备的编程接口,定时器到期事件将保持有效。这意味着,如果 OSPM 编程了一个唤醒定时器,而该定时器在 OSPM 完成向 S3(或支持时的 S4/S5)转换之前到期,则时间与告警设备将在 OSPM 完成转换后立即唤醒系统。图 9.6 说明了这种行为。

../_images/ACPIdefined_Devices_and_DeviceSpecificObjects-6.png

图 9.5 已到期定时器事件的保持性

时间与告警设备将向 OSPM 提供一个接口,用于查询唤醒定时器的状态并发现哪些定时器已经到期。该接口使 OSPM 能够发现唤醒源。唤醒定时器的状态可以通过设置唤醒告警来重置;OSPM 可以使用清除唤醒状态方法来清除告警状态。如果 OSPM 需要平台保持在 S3(S4/S5)状态,则必须清除所有已到期的唤醒定时器;否则,这些已到期的定时器将立即唤醒系统。

对于 AC/DC 唤醒服务,如果当前电源与到期定时器的类型不一致,则定义了一个已到期定时器唤醒策略值(以秒为单位),使时间与告警设备能够在与已到期定时器对应的电源变为活动状态时唤醒系统(立即唤醒、经过一段时间后唤醒,或永不唤醒)。已到期定时器唤醒策略仅适用于支持 AC/DC 唤醒的设备,并且仅在定时器到期且电源与定时器类型不一致时适用。已到期定时器策略与前面描述的已到期定时器保持性结合应用。

例如,如果移动平台将 AC 定时器设置为 2 小时、DC 定时器设置为 4 小时,然后在凌晨 1:00 从 S0 状态转换到 S3 状态,则 AC 定时器将被设置为在凌晨 3:00 到期,DC 定时器将被设置为在凌晨 5:00 到期。对于 AC 定时器,已到期定时器唤醒策略值被编程为 60 秒。

如果平台在凌晨 1:40 断开 AC 电源并保持断开状态,则时间与告警设备不会在凌晨 3:00 唤醒系统。如果平台一直保持 DC 供电直到凌晨 5:00 DC 定时器到期,则随后会置位唤醒信号。下图说明了上述示例。

../_images/ACPIdefined_Devices_and_DeviceSpecificObjects-7.png

图 9.6 带唤醒告警的系统转换 — 定时器

如果 AC 电源在凌晨 4:00 再次接通,则由于 AC 已到期定时器唤醒策略值的设置,系统将在凌晨 4:01 被唤醒。下图说明了这一点。

../_images/ACPIdefined_Devices_and_DeviceSpecificObjects-8.png

图 9.7 带唤醒告警的系统转换 — 策略

时间与告警设备可以支持一系列服务,OSPM 通过求值 _GCP 对象来获取设备支持的能力。如果能力表明设备支持时间服务,则 OSPM 分别通过求值 _GRT 和 _SRT 对象来获取和设置时间。

如果设备支持告警服务,则 OSPM 通过求值 _STV 对象来编程 AC 和 DC 定时器值。这些值以秒为单位,表示定时器到期前的经过时间。OSPM 通过求值 _TIV 对象来读取当前 AC 和 DC 定时器值(距离到期的剩余秒数)。

OSPM 通过求值 _STP 对象来设置 AC 和 DC 定时器的定时器策略。OSPM 通过求值 _TIP 对象来读取当前定时器策略,该对象返回 AC 和 DC 定时器的策略设置。

OSPM 通过求值 _GWS 对象来识别可能唤醒平台的已到期定时器。OSPM 必须求值 _CWS 对象,以清除任何可能根据上述已到期定时器唤醒策略和已到期定时器保持性而阻止系统执行睡眠转换的已到期定时器事件。

如果时间与告警设备实现了唤醒支持,则必须支持从 S3 唤醒系统。从 S4/S5 唤醒的支持是可选的。

9.18.2. _GCP(获取能力)

此对象是必需的,并向 OSPM 提供设备能力的位掩码。除唤醒功能外,设备还可以实现时间功能。能力位掩码将指示给 OSPM 实现了哪些支持。如果平台同时实现 AC 和 DC 定时器,则它能够基于电源来唤醒。

参数:(0)

返回值:

一个 32 位整数,包含如下结果位掩码:

位 [0] - 1 = 已实现 AC 唤醒,0 = 不支持

位 [1] - 1 = 已实现 DC 唤醒,0 = 不支持

位 [2] - 1 = 已实现获取/设置实时时间功能,0 = 不支持

位 [3] - 1 = 实时时间精度为毫秒,0 = 实时时间精度为秒

位 [4] - 1 = 对于由定时器导致的从 S4/S5 唤醒,_GWS 返回正确值。0 = 不支持

位 [5] - 1 = 支持在 AC 下从 S4 唤醒,0 = 不支持在 AC 下从 S4 唤醒

位 [6] - 1 = 支持在 AC 下从 S5 唤醒,0 = 不支持在 AC 下从 S5 唤醒

位 [7] - 1 = 支持在 DC 下从 S4 唤醒,0 = 不支持在 DC 下从 S4 唤醒

位 [8] - 1 = 支持在 DC 下从 S5 唤醒,0 = 不支持在 DC 下从 S5 唤醒

位 [9] 到位 [31] 为保留位,且必须为 0。

9.18.3. _GRT(获取实时时间)

如果能力位 2 被设置为 1,则此对象是必需的。OSPM 可以使用此对象获取时间。返回值是一个缓冲区,包含如下所述的时间信息。

参数: (0)

返回值:

一个缓冲区,按以下格式包含时间信息:

Buffer(){
WORD Year;                 // 1900 - 9999
BYTE Month;                // 1 - 12
BYTE Day;                  // 1 - 31
BYTE Hour;                 // 0 - 23
BYTE Minute;               // 0 - 59
BYTE Second:               // 0 - 59
BYTE Valid;                // 0 - Time is not valid (request failed); 1 - Time is valid
WORD milliseconds,         // 1-1000
WORD TimeZone;             // -1440 to 1440 or 2047 (unspecified)
BYTE Daylight;
BYTE Pad2[3];              // Reserved, must be zero
}

9.18.4. _SRT(设置实时时间)

如果能力位 2 被设置为 1,则此对象是必需的。OSPM 可以使用此对象设置时间。参数是一个缓冲区,包含如上定义的时间信息。

参数: (1)

一个缓冲区,按以下格式包含时间信息:

Buffer(){
WORD Year;                 // 1900 - 9999
BYTE Month;                // 1 - 12
BYTE Day;                  // 1 - 31
BYTE Hour;                 // 0 - 23
BYTE Minute;               // 0 - 59
BYTE Second;               // 0 - 59
BYTE Pad1;
WORD milliseconds,         // 1-1000
WORD TimeZone;             // -1440 到 1440,或 2047(未指定)
BYTE Daylight;
BYTE Pad2[3];              // 保留,必须为零
}

返回值:

一个整数:

0 - 成功 0xFFFFFFFF- 失败

注

时间通过带电池后备的时间设备来维护(例如,实时时钟)。

时间始终为本地时间;时区值可用于确定相对于 UTC 的偏移量。

时区字段是本地时间落后于 UTC 时间的分钟数。(即,时区 = UTC - 本地时间)。时区采用 2 的补码格式。

时区值为 2047 表示未指定时区值,且无法推断其与 UTC 的关系。

Daylight 是一个包含该时间夏令时信息的位掩码,定义如下:

位 [0]:1 = 时间受夏令时影响,0 = 时间不受夏令时影响。该值并不表示时间已经因夏令时而调整。它仅表示当时间进入夏令时时应进行调整。

位 [1]:1 = 时间已经因夏令时而调整,0 = 时间尚未因夏令时而调整。

所有其他位都必须为零。

进入夏令时时,如果时间受影响但尚未调整(DST = 1),使用新的计算方式:

  • 日期/时间应增加适当的量。

  • TimeZone 应减少适当的量(例如:从 PST 切换到 PDT 时,+480 变为 +420)。

  • Daylight 值变为 3。

退出夏令时时,如果时间受影响且已经调整(DST = 3),使用新的计算方式:

  • 日期/时间应减少适当的量。

  • TimeZone 应增加适当的量。

  • Daylight 值变为 1。

9.18.5. _GWS(获取唤醒告警状态)

此对象是必需的,并使 OSPM 能够读取唤醒告警的状态。即使在唤醒定时器到期后才完成向睡眠状态的转换,已到期的唤醒定时器仍将唤醒平台。该方法使 OSPM 能够检索唤醒定时器的状态,并在需要时清除其中任意一个。

参数: (1)

Arg0 - 定时器标识符(Integer (DWORD)):指示要清除的定时器:

0x00000000 - AC 定时器

0x00000001 - DC 定时器

返回值:

一个整数(DWORD),在位字段中包含当前已到期定时器

位 [0]- 1 = 定时器已到期,0 = 定时器未到期

位 [ 1]- 1= 定时器导致了平台唤醒,0 = 定时器未导致平台唤醒

位 [31:2] 为保留位,应为 0。

9.18.6. _CWS(清除唤醒告警状态)

此对象是必需的,并使 OSPM 能够清除唤醒告警的状态。即使在唤醒定时器到期后才完成向睡眠状态的转换,已到期的唤醒定时器仍将唤醒平台。该方法使 OSPM 能够清除已到期唤醒定时器的状态。

参数:(1)

Arg0 - 定时器标识符(Integer (DWORD)):指示要清除的定时器:

0x00000000 - AC 定时器

0x00000001 - DC 定时器

返回值:

一个整数(DWORD),包含当前已到期定时器唤醒策略:

0x00000000 - 成功

0x00000001 - 失败

9.18.7. _STP(设置已到期定时器唤醒策略)

该对象是必需的,用于设置到期计时器唤醒策略。当相应计时器已到期,但由于电源类型的原因未触发唤醒信号时,将应用该策略。平台会在当前电源类型下累计经过的时间,并在该电源类型下的累计计时器超过到期计时器唤醒策略值时触发唤醒信号。电源类型切换不会重置到期计时器唤醒策略值。当唤醒闹钟设备触发唤醒时,AC 计时器和 DC 计时器的到期计时器唤醒策略值都会由硬件自动重置为 0xFFFFFFFF。

参数:(2)

Arg0 - 计时器标识符 (Integer(DWORD)):指示要设置的计时器:

0x00000000 - AC 计时器

0x00000001 - DC 计时器

Arg1 - 到期计时器唤醒策略 (Integer(DWORD)):指示到期计时器唤醒策略:

0x00000000 - 电源类型变化后,计时器将立即唤醒系统。

0x00000001 - 0xFFFFFFFE:从电源类型变化到计时器唤醒系统之间的时间(以秒为单位)。

0xFFFFFFFF - 电源类型变化后,计时器将永不唤醒系统。

返回值:

一个 Integer,包含如下结果代码:

0x00000000 - 成功设置到期计时器唤醒策略。

0x00000001 - 设置计时器策略失败。实际计时器策略未知。

9.18.8. _STV(设置计时器值)

该对象是必需的,用于将计时器设置为指定值。如 _TIV 中所定义,该值表示从计时器被编程的时刻到其到期时刻之间的秒数。当唤醒闹钟设备触发唤醒信号时,计时器值会自动重置为 0xFFFFFFFF(禁用)。

参数:(2)

Arg0 - 计时器标识符 (Integer (DWORD)):指示要设置的计时器:

0x00000000 - AC 计时器

0x00000001 - DC 计时器

Arg1 - 计时器值 (Integer):指示要设置的值。

返回值:

一个 Integer,包含如下结果代码:

0x00000000 - 成功设置计时器值。

0x00000001 - 设置计时器值失败。实际计时器值未知。

9.18.9. _TIP(到期计时器唤醒策略)

该对象是必需的,返回指定计时器当前的到期计时器唤醒策略设置。

参数:(1)

Arg0 - 计时器标识符 (Integer (DWORD)):指示要读取的计时器:

0x00000000 - AC 计时器

0x00000001 - DC 计时器

返回值:

一个 Integer (DWORD),包含当前到期计时器唤醒策略:

0x00000000 - 电源类型变化后,计时器将立即唤醒系统

0x00000001 - 0xFFFFFFFE:从电源类型变化到计时器唤醒系统之间的时间(以秒为单位)

0xFFFFFFFF - 电源类型变化后,计时器将永不唤醒系统

9.18.10. _TIV(计时器值)

该对象是必需的,返回指定计时器到期前的剩余时间。

参数:(1)

Arg0 - 计时器标识符 (Integer(DWORD)):指示要读取的计时器:

0x00000000 - AC 计时器

0x00000001 - DC 计时器

返回值:

一个 Integer,包含当前计时器值。值为 0xFFFFFFFF 表示该计时器被禁用。

9.18.11. ACPI 唤醒闹钟事件

唤醒闹钟设备作为一种通用硬件,支持控制方法 _PSW 和 _PRW 来唤醒系统,并在唤醒闹钟设备上发出 Notify(device, 0x2)。

9.18.12. 与实时时钟闹钟的关系

尽管这两种设备都支持使用唤醒计时器将系统从睡眠状态唤醒,但它们彼此独立工作。实时时钟闹钟被定义为固定功能硬件,而时间与闹钟设备被定义为通用硬件,并且可以替代实时时钟或与之共存。OSPM 可以选择使用哪种设备来提供定时唤醒能力。

9.18.13. 作为 RTC 替代方案的时间与闹钟设备

在某些不具备传统 RTC 硬件的平台上,时间与闹钟设备可以作为 RTC 的替代方案;在这些平台上,OSPM 可以使用时间与闹钟设备来获取时间并设置唤醒闹钟。对于不需要 AC/DC 唤醒服务的平台(例如仅有一种电源类型的平台),可以使用 AC 计时器来提供传统上由 RTC 提供的全部功能。借助功能对象,时间与闹钟设备可以向 OSPM 提供可扩展范围的服务。

9.18.14. 与 UEFI 时间源的关系

时间与闹钟设备必须由与 UEFI 时间服务相同的时间源驱动。这可确保平台具有一致的实时时间(时钟时间)和唤醒闹钟值。OSPM 可以使用 ACPI 或 UEFI 与该值进行交互。

  • OSPM 必须只使用一种运行时接口来配置/查询平台闹钟;如果在同一硬件上使用两种唤醒接口,可能会发生未定义行为。

  • 如果 OSPM 尝试使用 EFI 运行时服务设置闹钟,则无论电源类型如何,都应遵循该闹钟(即,如果平台对每种电源类型都有独立的计时器,则应使用该闹钟同时配置它们两者)。

9.18.15. ASL 代码示例

以下 ASL 代码作为时间与闹钟设备可如何实现的示例。提供完整的硬件实现示例超出了本规范的能力和范围。

示例 1:定义一个 ACPI 唤醒闹钟设备

Device(\_SB.AWAK){
  Name(_HID, "ACPI000E")            //device ID
  Name(_PRW, Package(){...})        //enable or disable to wake up the system
  OperationRegion(CMOP, EmbeddedControl, ...)
  Field(CMOP, ByteAcc, ...){
    // timer status and policies
  }
  Method(_GCP) {
    Return (0x03)                   // Both AC and DC alarms are implemented;
                                    // Time capability is NOT supported
  }
  Method(_STP, 2){
    If(LEqual(Arg0, 0) {
      Store(Arg1, ...)              // Set AC timer policy
    }
    Else {
      Store(Arg1, ...)              // Set DC timer policy
    }
    Return(0)
  }
  Method(_TIP, 1){
    If(LEqual(Arg0, 1) {
      Store(..., Local0)            // Get DC timer policy
    }
    Else {
      Store(..., Local0)            // Get AC timer policy
    }
    Return (Local0)
  }
  Method(_STV, 2){
    If(LEqual(Arg0, 0) {
      Store(Arg1, ...)              // Set AC timer value
    }
    Else {
     Store(Arg1, ...)               //Set DC timer value
    }
    Return(0)
  }
  Method(_TIV, 1){
    If(LEqual(Arg0, 1) {
      Store(..., Local0)            //Get DC timer value
    }
    Else {
      Store(..., Local0)            //Get AC timer value
    }
    Return (Local0)
  }
  Method(_GWS, 1){
    If(LEqual(Arg0, 1) {
      Store(..., Local0)            //Get DC timer wake status
    }
    Else {
      Store(..., Local0)            //Get AC timer wake status
    }
    Return (Local0)
  }
  Method(_CWS, 2){
    If(LEqual(Arg0, 0) {
      Store(0, ...)                 //Clear AC Wake status
    }
    Else {
      Store(0, ...)                 //Clear DC Wake status
    }
    Return(0)
  }
}                                   // end of ACPI Wake Alarm device object
Scope(\_GPE) {                      // Root level event handlers
  Method(_Lxx){
    Store(One, ...)
    Notify(\_SB.AWA, 0x2)           //notify the OSPM of device wake
  }
} // end of \_GPE scope

示例 2:在 HW-Reduced ACPI 平台上定义一个 ACPI 实时时间设备

Device(\_SB.I2C1)                   //The controller used to access the RTC hardware
{
  Name (_HID, ...)
  ...                               // Other objects required for this I2C controller
  // Track status of SPB OpRegion availability for this controller
  Name(AVBL, 0)
  Method(_REG,2)
  {
    /* 9 is the OpRegion type for SPB. (8 == GPIO, etc) */
    If (Lequal(Arg0, 9))
    1{
      Store(Arg1, ^AVBL)
    }
  }
}
Device(\_SB.TAAD) {                 //The Time and Alarm Device
  Name (_HID, "ACPI000E")
  Scope(\_SB.I2C1)                  //OpRegion declaration must appear under the controller
  {
    OperationRegion(TOP1, GenericSerialBus, 254, 0x100)
    Field(TOP1, BufferAcc, NoLock, Preserve)
    {
      Connection(I2CSerialBusV2(0x4a,,400000,,"\\_SB.I2C1",,,,,)),
        //Connection to the controller for the following field accesses
      AccessAs(BufferAcc, AttribWord),  //AccessProtocol for the following field(s)
      Y, 8,
      AccessAs(BufferAcc, AttribByte),
      M, 8,
      D, 8,
      H, 8,
      Mi,8,
      S, 8,
      P, 8,
      AccessAs(BufferAcc, AttribWord),
      Ms, 8,
      Tz, 8,
      AccessAs(BufferAcc, AttribByte),
      Dl, 8,
      P2, 8
    }                                 // End of Field
  }                                   // End of Scope
  Method (_GCP, 0x0, NotSerialized)
  {
    Return(0x4)                       //Implements Real Time interface, but no alarms
  }
  Method(_GRT, 0x0, NotSerialized)
  {
    If(LNotEqual(\_SB.TC1.AVBL, 1))   // Verify that SPB OpRegion is available
                                      // for this access
    {
      Return(0)
    }
    Name(BUFF, Buffer(4){})           // Create SerialBus data buffer as BUFF
    CreateByteField(BUFF, 0x00, STAT) // STAT = Status (Byte)
    CreateWordField(BUFF, 0x02, DATA) // DATA = Data (Byte)
    Name(BUF2,Buffer(0x10){})         // Create buffer to hold the Real Time structure
                                      //as BUF2
    CreateWordField(BUF2, 0x0,Y)      // Year
    CreateByteField(BUF2,0x2,M)       // Month
    ...
    CreateByteField(BUF2,0xc,Dl)      // Dl
    CreateByteField(BUF2,0xd,P2)      // Pad2
    Store(\_SB.I2C1.Y, BUFF)          // Get each member from the OpRegion and store
                                      // in the structure
    Store(DATA,Y)
    Store(\_SB.I2C1.M, BUFF)
    Store(DATA,M)
    ...
    Store(\_SB.I2C1.Dl, BUFF)
    Store(DATA,Dl)
    Store(\_SB.I2C1.P2, BUFF)
    Store(DATA,P2)
    Return(BUF2)                        // Success -> return what was last in buffer
  }
  Method(_SRT,0x1, NotSerialized)
  {
    Name(BUFF, Buffer(4){})             // Create SerialBus data buffer as BUFF
    CreateByteField(BUFF, 0x00, STAT)   // STAT = Status (Byte)
    CreateWordField(BUFF, 0x02, DATA)   // DATA = Data (Byte)
      // Verify that SPB OpRegion is available for this access
    If(LNotEqual(\_SB.I2C1.AVBL, 1))
    {
       Return(0)
    }
    CreateWordField(Arg0,0x0,Y)         // Create Fields to access each member of the
                                        // input data
    ...
    CreateByteField(Arg0,0xd,P2)
    Store(Store(Y, \\_SB.I2C1.Y), BUFF) // Store each input member into the hardware,
                                        // and set the transaction status into BUFF
    If(LEqual(STAT, 0x00))              // transaction was *NOT* successful
    {
      Return(0xFFFFFFFF)
    }
    ...
    Store(Store(P2, \\_SB.I2C1.P2), BUFF)
    If(LEqual(STAT, 0x00))              // Transaction was \_NOT_successful
    {
      Return(0xFFFFFFFF)
    }
  }
  Name(_DEP, Package() {"\\_SB.I2C1"})  // Identify the OpRegion dependency for
                                        // this device
}                                       // End of Time and Alarm Device definition
Prev
9.17. I/O APIC 设备
Next
9.19. 通用按钮设备