简单目标
我一开始给运行 Debian Bookworm 的 Raspberry Pi 5 设定了一个简单目标:让通过 HDMI 连接的屏幕及其背光在夜间自动关闭,然后在早晨重新打开。我原以为这只是一个很小的显示管理任务,但它最后变成了一次关于 Raspberry Pi 显示驱动的简短探索。
早期尝试
一开始,我的 Raspberry Pi 没有在 /boot/config.txt 中启用任何特定的显示驱动设置。最初的几次尝试用的是常见的桌面显示命令:
- 使用
xset:我尝试用xset dpms force off来熄屏。它确实让显示输出变黑了,但显示器背光仍然亮着。 - 改用
xrandr:接着,我用了xrandr --output HDMI-1 --off。这禁用了屏幕输出,但背光问题依然存在。
作为参考,可以用下面的命令检查当前活动输出的名称:
DISPLAY=:0 xrandr --query
在我的设置中,输出名是 HDMI-1;在另一套安装中,它可能会有不同的名称。
进一步探索
我以为 ddcutil 也许能直接控制显示器的电源状态或亮度设置。但在我的情况下,这条路走不通,因为这套环境没有暴露所需的 /dev/i2c 设备。
可以用下面的命令快速检查这些设备:
ls /dev/i2c*
如果没有出现匹配的设备,ddcutil 就没有可用的 I2C 总线与显示器通信。
驱动发现
尝试 Fake KMS
为了解决背光问题,我在 /boot/config.txt 中启用了 Fake KMS 驱动:
dtoverlay=vc4-fkms-v3d
重启之后,当 HDMI 输出被禁用时,背光仍然没有关闭。
Full KMS 带来的成功
转折点出现在我改用 Full KMS 驱动时:
dtoverlay=vc4-kms-v3d
再次重启后,xrandr --output HDMI-1 --off 终于不仅能控制显示的画面,也能控制显示器背光。
实际操作顺序是:
- 编辑
/boot/config.txt。 - 使用
dtoverlay=vc4-kms-v3d,而不是dtoverlay=vc4-fkms-v3d。 - 重启 Raspberry Pi。
- 用
DISPLAY=:0 xrandr --query确认输出名称。 - 用
xrandr测试关闭和打开显示器。
最终设置
简化日常使用
为了让手动控制更方便,我在 .profile 中添加了别名:
alias mon='DISPLAY=:0 xrandr --output HDMI-1 --auto'
alias moff='DISPLAY=:0 xrandr --output HDMI-1 --off'
重新加载 shell profile 或打开一个新的登录 shell 之后,我就可以使用:
moff
mon
自动化这个流程
我设置了 cron 任务来自动管理屏幕,无需手动干预:
# Turn off the monitor in the evening.
0 22 * * * DISPLAY=:0 xrandr --output HDMI-1 --off
0 23 * * * DISPLAY=:0 xrandr --output HDMI-1 --off
0 0 * * * DISPLAY=:0 xrandr --output HDMI-1 --off
# Turn on the monitor in the morning.
0 8 * * * DISPLAY=:0 xrandr --output HDMI-1 --auto
晚上重复执行的条目是有意设置的:如果显示器被手动唤醒,或被其他进程唤醒,它们会让关闭命令稍后再次运行。另请注意,cron 中午夜使用 0 0 ;在典型系统上,0 24 不是有效的 cron 语法。
总结
这件事不只是简单地切换显示开关。在我这台运行 Debian Bookworm 的 Raspberry Pi 5 上,关键是从 Fake KMS 切换到 Full KMS。一旦 dtoverlay=vc4-kms-v3d 生效,xrandr 就可以同时关闭 HDMI 输出和显示器背光,让夜间自动化按预期工作。
