在 Debian Bookworm 上关闭 Raspberry Pi 5 屏幕和背光

简单目标

我一开始给运行 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 终于不仅能控制显示的画面,也能控制显示器背光。

实际操作顺序是:

  1. 编辑 /boot/config.txt
  2. 使用 dtoverlay=vc4-kms-v3d,而不是 dtoverlay=vc4-fkms-v3d
  3. 重启 Raspberry Pi。
  4. DISPLAY=:0 xrandr --query 确认输出名称。
  5. 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 输出和显示器背光,让夜间自动化按预期工作。

Leave a Reply