9.19. 通用按钮设备
通用按钮设备是一种标准设备,用于通过硬件中断报告按钮事件,并将这些中断映射到人机接口设备 (HID) 规范中定义的特定用法。为了向 OS 表达按钮的功能,需要两部分信息:HID 控件的用法,以及该控件所属的 HID 集合的用法。一个用法是用法页和用法 ID 的组合。例如,音量增大按钮在消费者控制集合中被标识为音量增大用法(用法页 0x0C,用法 Id 0xE9)(用法页 0x0C,用法 Id 0x01)。
通用按钮设备的即插即用 ID 为 ACPI0011。
注
如果电源按钮使用此设备进行描述,则它还必须支持 Section 4.8.3.1.1.3 中定义的电源按钮覆盖特性。
表 9.14 通用按钮设备子对象
| 对象 | 说明 |
|---|---|
| _CRS | 列出通用按钮设备消耗的资源。对于此设备,仅中断资源(GpioInt() 和 Interrupt())有效。列出的每个中断都必须表示一个不同的按钮事件。 |
| _DSD | 提供 HID 按钮描述符列表,其定义见 UUID FA6BD625-9CE8-470D-A2C7-B3CA36C4282E。对于此设备返回的描述符,仅 HID 2 状态按钮用法有效。 |
注
如果 _DSD 返回的 HID 按钮描述符数量多于 _CRS 中列出的中断数量,则行为取决于 OS。
9.19.1. 按钮中断
通用按钮设备的中断必须是边沿触发,而不能是电平触发,因为未定义任何接口供驱动程序在接收到中断后使中断线进入静止状态。中断的极性(高电平有效/低电平有效 与 双边沿有效)由与该中断关联的 HID 用法的用法类型决定,如下表所述。
表 9.15 用法类型和中断极性
| 用法类型 | 中断极性 | 说明 |
|---|---|---|
| OSC - 单次控制 | 高电平有效/低电平有效 | 应在按钮按下时触发中断。这适用于切换按钮。每次此类事件(中断)发生时,操作系统将切换其所控制实体的内部属性。示例:静音按钮 |
| MC - 瞬时控制 | 双边沿有效 | 应在按钮按下和释放时都触发中断。示例:鼠标左键。 |
| RTC - 可重复触发控制 | 双边沿有效 | 应在按钮按下和释放时都触发中断。当按钮保持按下时,操作系统将重复执行其在按钮按下时会执行的动作。示例:音量增大按钮在按住时会重复增加音量。 |
| OOC - 开/关控制 | 高电平有效/低电平有效 OR 双边沿有效 | 如果实现为会自动返回其初始状态的按钮,则应指定高电平有效/低电平有效极性。例如,按压按钮或弹簧复位滑动开关。对于一次按下/释放配对,只应触发一个中断。示例:弹簧复位的无线电滑动开关。如果实现为保持其状态直到用户再次移动它的按钮,则应指定双边沿有效极性。例如,保持按下状态的按钮,或固定在其位置的滑动开关。示例:无线电滑动开关。 |
9.19.2. 按钮用法和集合
HID 用法表包含一份广泛的标准化用法列表,涵盖各种类型的按钮。计算设备上常见的一些按钮及其用法列于下表。
完整列表请参见“ HID 用法表 ”,可从“与 ACPI 相关文档的链接”下的 http://uefi.org/acpi 获取,位于标题“ HID 用法表 ”下。
按钮归类在 HID 集合之下。若干 HID 集合通常被操作系统所理解,例如键盘集合、消费者控制集合、无线电控制集合等。
表 9.16 常见 HID 按钮用法
| 按钮 | 用法页 / 用法 | 用法类型 | 中断极性 | 规范参考 |
|---|---|---|---|---|
| 电源 | 通用桌面页 (0x01) 系统关机 (0x01) | OSC | ActiveBoth * | USB HID 用法表,版本 1.2:参见 https://www.usb.org/hid,位于标题 HID 用法表 下 |
| 音量增大 | 消费者页 (0x0C) 音量增加 (0xE9) | RTC | ActiveBoth | USB HID 用法表,版本 1.2:参见 https://www.usb.org/hid,位于标题 HID 用法表 下 |
| 音量减小 | 消费者页 (0x0C) 音量减小 (0xEA) | RTC | ActiveBoth | USB HID 用法表,版本 1.2:参见 https://www.usb.org/hid,位于标题 HID 用法表 下 |
| 相机快门 | 相机控制页 (0x90) 相机快门 (0x21) | OSC | 高电平有效/低电平有效 | USB 审查请求 49:相机控制 - 参见 https://www.usb.org/hid,位于标题 已批准的用法表审查请求 下 |
| 显示亮度增加 | 消费者页 (0x0C) 显示亮度增加 (0x6F) | RTC | ActiveBoth | USB 审查请求 41:显示亮度控制 - 参见 https://www.usb.org/hid,位于标题 已批准的用法表审查请求 下 |
| 显示亮度减小 | 消费者页 (0x0C) 显示亮度减小 (0x6F) | RTC | ActiveBoth | USB 审查请求 41:显示亮度控制 - 参见 https://www.usb.org/hid,位于标题 已批准的用法表审查请求 下 |
| 无线电按钮 | 通用桌面页 (0x01) 无线电按钮 (0xC6) | OOC | ActiveHigh/ ActiveLow | USB 审查请求 40:HID 无线电开/关用法 - 参见 https://www.usb.org/hid,位于标题 已批准的用法表审查请求 下 |
| 无线电滑动开关 | 通用桌面页 (0x01) 无线电滑动开关 (0xC8) | OOC | ActiveBoth | USB 审查请求 40:HID 无线电开/关用法 - 参见 https://www.usb.org/hid,位于标题 已批准的用法表审查请求 下 |
注
- 系统关机用法(页:01,ID:81)的类型为 OSC,尽管其其中断必须为 ActiveBoth,以便允许驱动程序基于“长按”时序执行功能。这是中断极性的用法类型规则的一个例外(见表 9.15)。
9.19.3. 通用按钮设备示例
Device(BTNS)
{
Name(_HID, "ACPI0011")
Name(_CRS, ResourceTemplate() {
GpioInt(Edge, ActiveBoth...) {pin} //Vol Down
GpioInt(Edge, ActiveBoth...) {pin} //Vol Up
GpioInt(Edge, ActiveBoth,...) {pin} //Power (MUST BE ACTIVEBOTH!)
})
Name(_DSD, Package(2) {
//UUID for HID Button Descriptors:
//ToUUID("FA6BD625-9CE8-470D-A2C7-B3CA36C4282E"),
//Data structure for this UUID:
Package() {
Package(5) {
0, //Declare a Collection
1, //Unique ID for this collection
0, //It is a top-level collection
0x0c, //Usage Page ("Consumer")
0x01 //Usage ("Consumer Control")
},
Package(5) {
0, //Declare another Collection
2, //Unique ID for this collection
0, //Also a top-level collection
0x01, // Usage Page ("Generic Desktop")
0x80 //Usage ("System Control")
},
Package(5) {
1, //Declare a Control
0, //Interrupt index in \_CRS for Vol Down
1, //In the "Consumer Control" collection
0x0c, //Usage Page ("Consumer")
0xEA //Usage ("Volume Decrement")
},
Package(5) {
1, //Declare another Control
2, //Interrupt index for the Power Button
2, //In the "System Control" collection
0x01, //Usage Page ("Generic Desktop")
0x81 //Usage ("System Power Down")
},
Package(5) {
1, //Declare another Control
1, //Interrupt index for the Vol Up button
1, //In the "Consumer Control" collection
0x0c, //Usage Page ("Consumer")
0xE9 //Usage ("Volume Increment")
},
Package(5) {
1, //Another Control
0xFF, //No Interrupt for this one... e.g. OS-
// specific signaling for Rotation Lock
1, //In the "Consumer Control" collection
0x0C, //Usage Page ("Consumer")
0x245 //Usage ("AC Rotate")
}
}
})
}// End Device