5.6.5. GPIO 信号 ACPI 事件
在硬件缩减的 ACPI 平台上,当 OSPM 接收到 GPIO 中断时,可以发出 ACPI 事件信号,并且 GPIO 中断连接列在 GPIO 控制器设备的 _AEI 对象中。 OSPM声明所有此类GPIO中断,并将它们映射到ACPI事件模型所需的适当事件方法。
5.6.5.1. 声明GPIO 控制器设备
GPIO控制器被建模为命名空间中的设备,至少具有 _HID 或 _ADR 和 _CRS 对象。 (可选)GPIO控制器设备范围可以包括 GeneralPurposeIO OpRegion 声明(第 5.5.2.4.5 节)和GPIO中断到ACPI事件映射(第 5.6.5.2 节)。请注意,对于 GPIO 信号的 ACPI 事件,相应的事件方法(例如 _Exx、_Lxx 或 _EVT)也必须出现在目标 GPIO 控制器的作用域中。对于大于 255 (0xFF) 的 GPIO 事件编号,使用 _EVT 方法。
GPIO控制器上的每个引脚都有一个配置(例如电平敏感中断、去抖输入、高驱动输出等),这些配置在GPIO中断中的OSPM或GPIO、IO中描述为外围设备占用或在操作区域访问中使用的连接资源。
5.6.5.2. GPIO 信号事件的 _AEI 对象
_AEI 对象将那些应由OSPM处理的GPIO中断指定为ACPI事件(参见第 5.6.5 节)。该对象出现在GPIO控制器设备的范围内,其引脚将用作GPIO信号事件。
参数:
无
返回值:
仅包含GPIO中断连接描述符的资源模板缓冲区。
示例:
Device (\_SB.GPI2)
{
Name(_HID, "XYZ0003")
Name(_UID, 2) //Third instance of this controller on the platform
Name(_CRS, ResourceTemplate ()
{ //Register Interface
MEMORY32FIXED(ReadWrite, 0x30000000, 0x200, ) //Interrupt line (GSIV 21)
Interrupt(ResourceConsumer, Level, ActiveHigh, Exclusive) {21}
})
Name(_AEI, ResourceTemplate ()
{ //Thermal Zone Event
GpioInt(Edge, ActiveHigh, Exclusive, PullDown, , " \\\_SB.GPI2") {14}
//Power Button
GpioInt(Edge, ActiveLow, ExclusiveAndWake, PullUp, , " \\\_SB.GPI2") {36}
})
}
5.6.5.3. 用于处理 GPIO 信号事件的事件 (_EVT) 方法
GPIO 中断连接描述符为GPIO 引脚分配一个与控制器相关的、基于 0 的引脚编号。 GPIO 引脚编号可以大至 65、535。 GPIO 平台分配用于发送 ACPI 事件信号的中断连接列在 GPIO 控制器下的 _AEI 对象中。由于GPIO中断连接描述符还提供了与事件关联的中断模式,因此它为OSPM提供了调用该事件的处理程序方法所需的所有信息。无需命名约定即可对事件的模式和引脚号进行编码。相反,GPIO信号事件的处理程序只需具有众所周知的名称并将事件的引脚号作为参数即可。该方法的单个实例处理给定GPIO控制器设备的所有ACPI事件。
对于 GPIO 信号事件,使用事件 (_EVT) 方法。 _EVT 定义如下:
参数(1):
Arg0 - 事件编号。一个整数,指示当前事件的事件编号(控制器相对于零的GPIO引脚编号)。必须在 0x0000 - 0xffff 范围内。
返回值:
无
描述:
_EVT 方法处理 GPIO 信号事件。它必须出现在GPIO控制器设备的范围内,该设备的引脚用于发出事件信号。
OSPM 处理 GPIO 信号事件,如下所示:
GPIO中断由OSPM处理,因为它列在GPIO控制器下的_AEI对象中。
当事件触发时,OSPM 根据其模式处理中断并调用 _EVT 方法,向其传递事件的引脚号。
从此时起,处理与 GPE 的处理完全相同。 _EVT 方法在适当的设备上执行 Notify(),并使用 OS 特定的机制来通知驱动程序该事件。
对于小于 255 的事件编号,可以使用 _Exx 和 _Lxx 方法代替。在这种情况下,它们优先,并且 _EVT 将不会被调用。
注意事项
对于小于 255 的事件号,可以使用 _Exx 和 _Lxx 方法。在这种情况下,它们优先,并且 _EVT 将不会被调用。
示例:
Scope (\_SB.GPI2)
{
Method (_EVT,1) { // Handle all ACPI Events signaled by GPIO Controller GPI2
Switch (Arg0)
{
Case (300) {
…
Notify (\_SB.DEVX, 0x80)
}
Case (1801) {
…
Notify (\_SB.DEVY, 0x80)
}
Case (14…) {
…
Notify (\_SB.DEVZ, 0x80)
}
…
}
} //End of Method
} //End of Scope