大概一个月前,大概因为考研生活过于枯燥,于是买了块Orange Pi 3B的板子,也算第一次体验国产arm板子生态 (事实证明,花钱有利于心情变好) 。这块板子发布时间距现在不到半年,CPU是RK3566,显卡Mali-G52,带VPU,官方店搞活动,8G内存+64Gemmc才349,不到350的价整一台能上网看视频的新玩具,听起来不挺好的嘛。

买回来之后当然先装官方镜像。官方提供了Debian 11/12、Ubuntu 22.04和Orange Pi OS(基于Arch Linux Arm)的镜像,Debian每个版本甚至都提供了两个不同的内核版本(5.10/6.6)供选择,看起来还挺有诚意——然而事实是,除了5.10内核版本的Debian,其他的镜像中浏览器均未开启硬件解码,以RK3566的孱弱性能,看B站视频到了360P都嫌卡的程度。而5.10内核的Debian则更加奇怪,有vpu解码,但桌面没有GPU加速,Xfce桌面上移动一下鼠标就能触发100%的CPU占用。只能找找第三方镜像了。

Orange Pi 3B能选的第三方镜像不多,支持各种硬件的发行版Armbian的论坛里甚至没有专门的页面。不过好在有人给板子做了移植,虽然目前处于没人维护的状态。不得不说Armbian的镜像确实比官方的好,至少硬件加速没有问题了,内核版本也到了6.6。

这里不得不提一句,Arm这几款Soc显卡驱动的Linux主线支持,比x86_64平台要糟挺多,官方驱动貌似直接给了开发板厂家在官方镜像中做优化,并没有加入主线代码。不过有dalao们通过逆向为Mali系列的GPU做的社区驱动,内核部分和用户部分分别被Linux和Mesa主线所支持(Linux需要在编译时开启这一功能)。至于VPU,则需要使用打了libv4l2补丁的ffmpeg、chromium才能正常启用硬件解码。更多说明可以参考这里

所幸Armbian以及接下来要说的Arch Linux Arm在这一块的优化还算不错。不过至少到目前为止,在Armbian上想要使用带VPU支持的软件,需要额外添加Mainline VPU以及Chromium的PPA。

用了一段时间Armbian(基于Ubuntu),还是想试试更熟悉的Arch Linux Arm。虽然官方不支持Orange Pi 3B,但Github上有人放出了Linux 6.6的PKGBUILDUboot源码,加上有这篇文章参考,启动应该很好搞定。

因为家里缺乏跑编译的设备,我拜托Integral帮我编译了这个内核包(甚至放上了archlinuxcn)。下载generic的Arch Linux Arm包,在emmc上建立gpt分区表,从第32768个block创建一个分区并格式化为ext4,挂载后将Arch Linux Arm包解压至此,arch-chroot,安装准备好的内核,其他操作与一般Arch的安装差异不大。

至于Uboot,一开始我看到源码仓库中放出了一个u-boot.img的release,直接下载写入sd卡前32768个block,一切似乎都显得很顺利。重启以后,成功启动了。但当我一边窃喜一边在emmc上重复这一套操作后,再次重启时,屏幕没有输出。一度尝试过把别的镜像的前32768个block dd过来的操作,全部没有效果。郁闷几天以后,想起之前买ch32v103板子送的wch-link带串口功能,翻出它外加一堆杜邦线,借用手机上的串口输出软件,成功得到了串口输出。

又经历一番折腾,这个mmc block read error一直没有解决。之后觉得uboot最好也是自己编译比较放心,于是下了源码手动编译,得到idbloader.bin、u-boot.itb这两个文件。按照文档将这两个文件写入emmc,按照pine64的boot脚本创建一份boot.cmd,修改一下fdt,这时就能成功启动了。

效果图

顺便一提,用这个版本的内核启动的Arch Linux Arm,内核做了网卡驱动支持,但需要从orangepi的仓库里编译uwe5622支持的二进制文件,并手动modprobe模块。这里我偷了个懒,直接从armbian里拖了过来。不过armbian这一版的驱动稳定性不是很好。