前言

因 Jellyfin 需要配置硬件加速转码,但发现 OrangePi 3B 官方镜像根本没有启用 GPU 支持,因此无法进行硬件加速。经过不懈努力,找到了一篇介绍编译 Panfrost 驱动来启用 GPU 加速的文章,参照文章的方法终于成功实现 GPU 加速,故写这篇文章记录一下折腾过程。

注意事项

官方提供的 5.10.160 内核镜像虽然支持 GPU 和 VPU,但未包含 Panfrost 驱动;而 6.6 内核虽已内置 Panfrost 驱动,却不支持 VPU 硬件编解码,因此,本文的目标是为 5.10.160 内核手动编译并集成 Panfrost 驱动,以兼顾 GPU 渲染与 VPU 硬解能力。

系统要求(必须严格满足)
交叉编译主机系统:Ubuntu 22.04
开发板运行系统:Ubuntu 22.04

本文所有操作均基于 Ubuntu 22.04 完成。若使用其他发行版或版本,极有可能会导致驱动无法正常工作,请务必注意。

Linux 5.10.160 内核支持情况:

Linux 6.6 内核支持情况:

克隆内核源码

OrangePi 官方内核源码在 Github 上,可能需要科学上网工具。

git clone -b next https://github.com/orangepi-xunlong/orangepi-build.git

配置 config 编译内核

进入目录,进行编译配置。

cd orangepi-build
sudo ./build.sh

选择 OrangePi 3B。

依次选择 Kernel package -> Show a kernel configuration menu before compliation -> legacy Old stable / Legacy



接下来会自动下载依赖和交叉编译工具链,完成后会打开 Kernel Configuration 编辑选项对话框。

进入目录 Device Drivers -> Graphics support -> Direct Rending Manager (XFree86 4.1.0 and higher DRI support),取消标记 Ignore drm ioctl permission,即按下空格键,让括号 [*] 变为 [ ]

[ ] Ignore drm ioctl permission

返回到上一层级 Graphics support,向下翻动,找到 Panfrost (DRM support for ARM Mail Midgard/Bifrost GPUs),标记为模块 [M]

[M] Panfrost (DRM support for ARM Mail Midgard/Bifrost GPUs)

继续向下翻动,进入 Mail Bifrost series support,找到 Enable Mail CSF based GPU support,标记为内核集成 [*]

[*] Enable Mail CSF based GPU support

保存文件名为 .config 后,确定,但不要退出对话框,因为一旦退出后就开始编译了,在此之前我们还需要修改设备树文件。

也就是确保还在这个界面,不要点击下面的 <Exit> 退出。

修改设备树文件

编辑文件 kernel/orange-pi-5.10-rk35xx/arch/arm64/boot/dts/rockchip/rk3566-orangepi-3b.dts,如果你的是 V2.1 的开发板,就编辑 rk3566-orangepi-3b-v2.dts,注意需要 root 权限保存文件。

sudo vim kernel/orange-pi-5.10-rk35xx/arch/arm64/boot/dts/rockchip/rk3566-orangepi-3b.dts
删除第1075行:cursor-win-id = <ROCKCHIP_VOP2_CLUSTER0>;
在340行下面:&gpu {
增加第341行:clock-names = "gpu", "bus";
增加第342行:interrupt-names = "gpu", "mmu", "job";

再编辑文件 kernel/orange-pi-5.10-rk35xx/arch/arm64/boot/dts/rockchip/rk3568.dtsi,同样需要 root 权限保存文件。

sudo vim kernel/orange-pi-5.10-rk35xx/arch/arm64/boot/dts/rockchip/rk3568.dtsi
用 // 注释掉 1391、1396、1401、1406、1415、1424 行,内容都是 opp-support-hw = <0xfx 0xffff>;

保存,再退出之前的对话框,开始编译。编译完成后如图所示:

编译后的产物在 output/debs 目录下,把这三个 deb 文件传到开发板里。

安装内核 deb 包

查看系统中安装的内核包。

apt list --installed |grep -e ^linux-image -e ^linux-dtb -e ^linux-headers

执行下面的命令替换原有的内核包,注意备份,谨慎操作

sudo apt purge linux-image-legacy-rockchip-rk356x linux-dtb-legacy-rockchip-rk356x linux-headers-legacy-rockchip-rk356x
sudo apt install libssl-dev python-is-python3
sudo dpkg -i linux-image-legacy-rockchip-rk356x_1.0.8_arm64.deb linux-dtb-legacy-rockchip-rk356x_1.0.8_arm64.deb linux-headers-legacy-rockchip-rk356x_1.0.8_arm64.deb

然后重启开发板。

sudo sync
sudo reboot

验证 GPU 驱动

接下来验证 GPU 驱动是否成功加载。

sudo cat /var/log/kern.log |grep panfrost

查看是否出现 Initialized panfrost 字样。

启用 VPU 硬件加速

到这里还没结束,还需要启用 VPU 硬件加速功能。执行下面的命令添加 ppa 源,并安装 rkmpp。可能需要科学上网,国内下载速度很慢。

sudo add-apt-repository ppa:liujianfeng1994/rockchip-multimedia
sudo apt dist-upgrade
sudo apt install rockchip-multimedia-config libv4l-0 libv4l-rkmpp
sudo reboot

重启后,列出 /dev 目录下所有设备。

ls /dev

并检查是否存在以下设备节点:

dma_heap
dri
mpp_service
rga

若上述设备节点存在,则表明 VPU 硬件加速功能已成功启用。

video-enc0video-dec0 显示为“假设备”属于正常现象。这是 Rockchip 平台的特性,其多媒体处理框架(MPP)采用私有 API,不依赖标准的 V4L2 接口。

如果你的开发板运行的是带桌面环境的系统,可从 PPA 源安装支持硬解的软件包(如 ffmpeg、chromium 等)进行测试。
重要提示:务必使用 PPA 源中的软件包,因为它们在编译时启用了 rkmpp 支持,能够调用 Rockchip 芯片内置的 VPU;而 Ubuntu 官方镜像源中的软件包未包含此支持,无法实现硬件解码,请特别注意。

# 如果之前安装了 Ubuntu 镜像源的软件包,先卸载
sudo apt purge chromium ffmpeg
# 安装 ppa 源中的软件包
sudo apt install ffmpeg chromium-browser{,-l10n} chromium-codecs-ffmpeg-extra mpv vlc kodi libvl-rkmpp

配置 Chromium 硬件加速

启动 Chromium 后,访问地址 chrome://flags,启用所有与硬件加速相关的功能。

按下 Ctrl+F 搜索下面的 Flags 并启用:

  • Override software rendering list
  • GPU rasterization
  • Toggle hardware accelerated H.264 video encoding for Cast Streaming
  • Toggle hardware accelerated VP8 video encoding for Cast Streaming
  • Use the MojoVideoDecoder for hardware video decoding in Pepper

设置完成后,重启 Chromium,然后访问 chrome://gpu 页面。检查下面的信息:

Graphics Feature Status
Canvas: Hardware accelerated
Canvas out-of-process rasterization: Enabled
Direct Rendering Display Compositor: Disabled
Compositing: Hardware accelerated
Multiple Raster Threads: Enabled
OpenGL: Enabled
Rasterization: Hardware accelerated on all pages
Raw Draw: Disabled
Video Decode: Hardware accelerated
Video Encode: Software only. Hardware acceleration disabled
Vulkan: Disabled
WebGL: Hardware accelerated
WebGL2: Hardware accelerated
WebGPU: Disabled
.
.
.
Video Acceleration Information
Decoding
Decode hevc main
48x48 to 3840x2160 pixels
Decode hevc main 10
48x48 to 3840x2160 pixels
Decode hevc main still-picture
48x48 to 3840x2160 pixels
Decode h264 baseline
48x48 to 3840x2160 pixels
Decode h264 main
48x48 to 3840x2160 pixels
Decode h264 high
48x48 to 3840x2160 pixels
Decode vp8
48x48 to 3840x2160 pixels
Decode vp9 profile0
48x48 to 3840x2160 pixels
Encoding

测试 GPU

安装 glmark2 测试,正常分数为 300 分左右。

sudo apt install glmark2 glmark2-es2
glmark2-es2

参考资料

Orangepi-3B rk3566 编译5.10.160内核panfrost驱动
Orangepi-3B rk3566-5.10.160-panfrost