树莓派400图形显示配置

树莓派的图形显示配置位于 /boot/config.txt ,通过 raspi-config 工具可以调整,也可以手工编辑。

基本配置

  • 树莓派启动最少需要4行配置:

    hdmi_force_hotplug=1
    hdmi_group=2
    #hdmi_mode=87
    hdmi_force_mode=1
    
    • hdmi_force_hotplug=1 设置树莓派即使没有检测到HDMI显示链接也要输出一个信号。这是因为一些显示器比较特殊,这样即使树莓派没有适配也能输出显示

    • hdmi_group=2hdmi_mode=87 结合是激活自定义视频配置,即告诉系统不使用常规的1080p;而 hdmi_force_mode=1 则表明确定采用自定义

      • 详细配置参考 树莓派官方config.txt说明

      • 我没有使用 hdmi_mode 是因为预定义配置不符合我的显示器,而是采用 hdmi_cvt 自定义,见下文

  • 关闭屏幕周边的黑边:

    disable_overscan=1
    

一些显示器需要有一个黑边,则设置为 0 ,不过通常是指电视机显示器。而对于计算机显示器则不需要。

  • 如果使用 DVIHDMI 显示器,如果出现显示闪烁,则可以尝试输出更强信号,如:

    config_hdmi_boost=7
    

不过,这个配置会被 树莓派Raspberry Pi 4树莓派Raspberry Pi 400 忽略,虽然其他主版会使用这个参数来增强视频输出信号。默认值是 2 或者 5 。调整到 7 通常能够满足要求,如果视频电缆非常长,则可能最高配置到 11

  • 如果树莓派和显示器不能协商正确的设置,没有达到即插即用,则可以尝试 boot_delay 配置,强制系统启动时等待一些时间再启动内核,对于一些显示器就会有足够时间就绪:

    boot_delay=5
    
  • 重要: 如果显示器支持音频,则配置以下设置使得音频能够路由到HDMI端口,这样可以通过显示器的音频输出(耳机或喇叭):

    hdmi_drive=2
    

以上配置并没有实际配置显示分辨率,但是提供了基础。

显示分辨率

  • 自定义分辨率:

    hdmi_cvt=3840 2160 60 3 0 0 0
    

备注

上述 hdmi_cvt 是根据显示器配置,详见 树莓派HDMI配置

完整配置

  • 我的完整配置:

使用ACO 4K显示器的树莓派400完整config.txt
dtparam=audio=on

camera_auto_detect=1
display_auto_detect=1

dtoverlay=vc4-kms-v3d
max_framebuffers=2

arm_64bit=1

disable_overscan=1

hdmi_force_hotplug=1
hdmi_group=2
hdmi_drive=2
hdmi_cvt=3840 2160 60 3 0 0 0
hdmi_force_mode=1

[cm4]
otg_mode=1

[all]

[pi4]
arm_boost=1

[all]
#hdmi_enable_4kp60=1
gpu_mem=256

说明:

精简配置

后来实践发现,设置 hdmi_cvt 似乎没有什么优势,虽然可以正常工作,但是实际上即使不设置树莓派启动也能正确识别显示器的分辨率,所以我改为简化配置(只激活 HDMI 音频输出)

使用ACO 4K显示器的树莓派400 精简config.txt
dtparam=audio=on

camera_auto_detect=1
display_auto_detect=1

dtoverlay=vc4-kms-v3d
max_framebuffers=2

arm_64bit=1

disable_overscan=1

hdmi_drive=2

[cm4]
otg_mode=1

[all]

[pi4]
arm_boost=1

[all]
#hdmi_enable_4kp60=1
gpu_mem=256

超频配置和 HDMI1 音频

树莓派超频 时发现当显示器接在 HDMI0 时不能稳定工作(主机键盘无响应,图形界面不能输出),但是接在 HDMI1 上则稳定输出视频信号。但是不知道为何, HDMI1 虽然能够视频输出,但是 alsamixer 显示这个 vc4-hdmi-1 声卡状态 This sound device does not have any controls 。似乎只有 HDMI0 才有音频输出!!!

参考 Independent Sound HDMI0 and HDMI1 提到了 snd_bcm2835.enable_compat_alsa=0 内核参数是问题,需要设置成 snd_bcm2835.enable_compat_alsa=1 ,这样才能使 udev 规则能够使用 seat1 / hdmi1

我修订了 /boot/cmdline ,在最后添加 snd_bcm2835.enable_compat_alsa=1 ,然后重启后发现,内核参数同时有:

... snd_bcm2835.enable_compat_alsa=0 ... snd_bcm2835.enable_compat_alsa=1

此时很神奇,声卡设备突然多出了:

hw:CARD=b1,DEV=0
    bcm2835 HDMI 1, bcm2835 HDMI 1
    Direct hardware device without any conversions

这不就是之前在 kali linux 系统中看到的 HDMI1 设备么,而且可以在 mpd.conf 中指定 hw:CARD=b1,DEV=0 作为设备。

我将这个设备配置到 mpd.conf ,发现 mpd 运行不报错,但是 HDMI1 连接显示器的音频依然无声。

经过反复搜索,终于在 HDMI 1 on Pi 4 doesn’t have sound #1243 找到解答:

这不是firmware bug: amixer -q cset numid=3 2 会路由音频设备到一个输出接口。这里的 2 表示 HDMI 但是只代表 HDMI0 。需要使用命令 amixer -q cset numid=3 3 调用 HDMI1

果然,我在终端执行命令:

amixer -q cset numid=3 3

然后就突然能够 HDMI1 的显示接口连接的AOC显示器的音频耳机中听到 MPD(Music Player Daemon) 输出的音乐

为了自动化这个过程,在内核传递了 snd_bcm2835.enable_compat_alsa=1 配置到 /boot/cmdline.txt ,再添加一个 /etc/udev/rules.d/77-hdmi.rules 内容如下:

TAG=="seat", ATTR{id}=="b1", ATTR{number}=="2", SUBSYSTEM=="sound", KERNEL=="card2", ENV{ID_SEAT}="seat1"

这样就能使用 seat 1/hdmi1

不过,我也发现了一个问题,就是播放音乐时候,会突然黑屏,然后过好久才能恢复,似乎这个路由是存在问题的。

此外 Raspberry Pi sound 一文提供了音频设置的较好参考。

备注

折腾太多时间,我暂时无法解决 树莓派超频 带来的问题:

  • 需要使用 HDMI1 作为视频输出接口

  • HDMI1 接口没有解决音频输出功能(或者说接近解决,但音频播放时视频输出中断)

参考