ACPI 视频扩展

此驱动程序实现了主板上集成显卡设备的 ACPI 扩展显示适配器,如 ACPI 2.0 规范附录 B 中所述,允许执行一些基本控制,如定义视频 POST 设备、检索 EDID 信息或设置视频输出等。请注意,这仅是一个参考实现。它可能适用于您的集成视频设备,也可能不适用。

ACPI 视频驱动程序在背光控制方面做了 3 件事。

为用户空间导出一个 sysfs 接口来控制背光等级

如果 ACPI 表有视频设备,并且不存在 acpi_backlight=vendor 内核命令行,则驱动程序将注册一个背光设备并为其设置所需的背光操作结构以供 sysfs 接口控制。对于每个注册的类设备,/sys/class/backlight 下都会有一个名为 acpi_videoX 的目录。

背光 sysfs 接口在此处有标准定义:Documentation/ABI/stable/sysfs-class-backlight。

ACPI 视频驱动程序所做的是:

actual_brightness:
  读取时,将评估控制方法 _BQC 以获取固件认为的亮度级别;

bl_power:
  未实现,将改为设置当前亮度;

brightness:
  写入时,将运行控制方法 _BCM 来设置请求的亮度级别;

max_brightness:
  源自 _BCL 包(见下文);

type:
  firmware

请注意,ACPI 视频背光驱动程序将始终使用亮度索引、实际亮度和最大亮度。因此,如果我们有以下 _BCL 包:

Method (_BCL, 0, NotSerialized)
{
        Return (Package (0x0C)
        {
                0x64,
                0x32,
                0x0A,
                0x14,
                0x1E,
                0x28,
                0x32,
                0x3C,
                0x46,
                0x50,
                0x5A,
                0x64
        })
}

前两个级别适用于笔记本电脑使用交流电或电池供电且 Linux 目前未使用的情况。其余 10 个级别是受支持的级别,我们可以从中选择。适用的索引值从 0(对应于 0x0A 亮度值)到 9(对应于 0x64 亮度值)不等。每个索引值都被视为“亮度级别”指示器。因此,从用户空间的角度来看,可用亮度级别的范围是从 0 到 9(max_brightness)不等。

通知用户空间有关hotkey事件

hotkey事件上报一般有两种情况:

case 1. 对于某些笔记本电脑,当用户按下热键时,会生成一个扫描码,并通过键盘驱动程序创建的输入设备作为键类型输入事件发送到用户空间,经过适当的重新映射后,用户空间将出现以下键码:

EV_KEY, KEY_BRIGHTNESSUP
EV_KEY, KEY_BRIGHTNESSDOWN
etc.

对于这种情况,ACPI 视频驱动程序不需要执行任何操作(实际上,它甚至不知道发生了这种情况)。

case 2. 对于某些笔记本电脑,热键按下不会生成扫描码,而是由固件将事件通知给视频设备 ACPI 节点。事件值在 ACPI 规范中定义。ACPI 视频驱动程序将根据收到的通知值生成按键类型的输入事件,并通过其创建的输入设备将事件发送到用户空间:

event keycode
0x86 KEY_BRIGHTNESSUP
0x87 KEY_BRIGHTNESSDOWN
etc.  

因此这将导致与上面的case 1 有相同的效果。

一旦用户空间工具收到此事件,它就可以通过 sysfs 接口修改背光级别。

在内核中更改背光级别

这适用于上面case 2 所涵盖的机器。一旦驱动程序收到通知,它将相应地设置背光级别。这不会影响向用户空间发送事件,无论视频模块是否直接控制背光级别,它们始终都会发送到用户空间。此行为可以通过 bright_switch_enabled 模块参数控制,如 admin-guide/kernel-parameters.rst 中所述。建议在 GUI 环境启动并希望完全控制背光级别时禁用此行为。

 

posted @ 2025-03-20 18:32  闹闹爸爸  阅读(61)  评论(0)    收藏  举报