又是一年的最后一天,为了完成今年份博客更新任务,来写下应该是拖了一个月左右的这篇应该是折腾记录的东西。有生之年应该还有续集,因为目前整体还没达到预期的状态,比如还不能直接从固态启动系统……
一些无关紧要的前情提要,碎碎念
大概是在去年七月份入手的 Radxa ROCK 3A,8G 内存版本。记得买之前正苦恼没有比较优雅的方法来挂之前整的一块 4T 移动硬盘,手里只有一个白嫖的树莓派 3B+,但碍于其 USB2.0 的速度,以及没有足够的电流来直接驱动,所以想要找一个至少得有 USB3.0 口子的板子来用,记得是在酷安看到有人分享类似需求来使用 rock3a 来折腾的经历,也没多想就在某宝入手了。到手之后才发现还是需要外接带供电的拓展坞才能稳定不掉盘。能选的系统不多,选了 Armbian 用着,顺便也开始想在这上面跑大蜥蜴,后来因为各种原因鸽了。
现在想来像在价格和生态方面都还挺坑的,当时我也没想到原来看似便宜的国产板子都差不多是这样,各玩儿各的,看似开源但不合到主线……
TL;DR
了解这个板子所用 SOC 的启动流程,一开始准备构建镜像 by hand,但涉及太多并不懂的知识,转而借助大蜥蜴的基础设施(openSUSE Build Service),打包需要的前置软件包 U-Boot,照着现有的 JeOS (Just Enough Operating System) KIWI 模板魔改。
打包 U-Boot
至少在重新捡起来折腾这个板子的 23 年 11 月,U-Boot 官方源码已经有了这个板子的构建配置 rock-3a-rk3568_defconfig
,一开始走了弯路去研究 Radax 提供的 U-Boot 源码
确定需要的那什么 .img .bin .itb
文件怎么来的。后来才发现 U-Boot 文档中写得清楚又明白,连构建步骤都挨个写了,留下感动的泪水。
这个板子的 rk3568 在构建过程中需要使用到瑞芯微提供的实现私有的 binary 文件,于是仿照有开源实现的 arm-trusted-firmware-rk3399
使用 rockchip-linux/rkbin 打包了一个 arm-private-firmware-rk3568
来提供构建过程中需要用到的 bl31.elf
。这里直接使用三方二进制打包决定了在有开源实现之前,我整的这些东西是只有在自己分支项目玩玩儿了。
参照其他瑞芯微板子修改 u-boot.spec 添加 rock-3a-rk3568
相关配置,为了后续使用 Btrfs 还修改了下上游 defconfig 加上默认 Btrfs 构建参数。
目前与大蜥蜴上游项目的差异参见这里。(还有一些为了实现直接固态启动的构建参数修改尝试,以及后续为了使用板子自带 PWM 风扇接口启用了对应的接口的修改,不过这些都是后话了)
打包 JeOS 镜像
同样是基于大蜥蜴上游 JeOS 包,参照已有的瑞芯微板子创建修改所需 KIWI 配置文件,与大蜥蜴上游差异。
在配置文件中有两种启动方式
- 配置 U-Boot 启动 GRUB2,再由 GRUB2 启动系统
- 配置 U-Boot 直接加载,启动系统
两种方式区别是 U-Boot 在前面启动分区(启动流程 boot.img 位置)读取的文件不同,U-Boot 会按照一定顺序去几个特定位置读取特定文件。这两种我试过都是可以的,目前仓库的可以通过两种方式启动,不过使用 boot.scr 的优先级高一些,会使用配置的这个启动脚本加载相关文件然后启动系统,当然也可以启动阶段任意键终止,在 U-Boot 终端使用 bootefi
启动 GRUB2
前面说到无法直接从固态启动的问题就是,我没找到配置能在使用自带 SPI flash 的时候默认启用板子的 PCI,然后就会识别不到 NVMe 设备然后报错,后面通过使用其他设备如 micro sdcard 上同样的 U-Boot 进入就能够启用并正常进入在 NVMe 上的系统。
刷入镜像
如果使用 micro sdcard 或者 emmc module 的 MMC 设备可以直接正常 dd 写入镜像然后使用,可参见大蜥蜴任意 Arm 板子维基写入 JeOS 镜像部分,或者使用类似下面的命令,写入对应具体介质的 /dev/mmcblk0
设备
xzcat /path/to/image.raw.xz | sudo dd bs=4M of=/dev/mmcblk0 iflag=fullblock oflag=direct status=progress; sync
但是想要使用 NVMe 设备,需要额外的 micro sdcard 或者 emmc module,并在其中写入镜像并启动进入,在系统中向 NVMe 设备再次写入镜像,因为镜像的启动配置中 NVMe 设备优先级比 MMC 设备高(bootdevs=“nvme mmc”),所以后续会直接使用 NVMe 设备中的系统。
一些问题
-
有线网卡无法直接使用,在这里找到补丁,于是再次自己从大蜥蜴上游拉了 kernel-source 自己打了补丁,截止到写这篇文章还没合入主线
由于上面地址没直接给出补丁,这里给下补丁内容:
diff --git a/arch/arm64/boot/dts/rockchip/rk3568-rock-3a.dts b/arch/arm64/boot/dts/rockchip/rk3568-rock-3a.dts index e05ab11..a872184 100644 --- a/arch/arm64/boot/dts/rockchip/rk3568-rock-3a.dts +++ b/arch/arm64/boot/dts/rockchip/rk3568-rock-3a.dts @@ -583,7 +583,7 @@ &i2s2_2ch { &mdio1 { rgmii_phy1: ethernet-phy@0 { - compatible = "ethernet-phy-ieee802.3-c22"; + compatible = "ethernet-phy-id001c.c916", "ethernet-phy-ieee802.3-c22"; reg = <0x0>; pinctrl-names = "default"; pinctrl-0 = <ð_phy_rst>;
最后
虽然前面出现过,但项目在这里,如果有人有需要也可以直接用里面 JeOS-rock3a 构建出的镜像文件
不过入坑这板子,还用大蜥蜴的估计就我了. :)
等我折腾出来了直接从固态启动,应该会更新个非流水帐的续集。
Last modified on 2024-01-01