RK3588设备H88K适配主线OPENWRT

 

获取官方源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
git clone --depth=1 -b openwrt-24.10 https://github.com/openwrt/openwrt
cd openwrt/
./scripts/feeds update -a
./scripts/feeds install -a

make menuconfig # 进入固件配置界面增减改查
make download V=s -j$(nproc) # 请尽量用梯子下载所需源码
make V=s -j$(nproc) # 若编译出错请用单线程调错

# 左边的包依赖右边的包,所以只需要选择左边的包即可包含右边的依赖包
luci-proto-mbim -> umbim -> kmod-usb-net-cdc-mbim -> kmod-usb-net
luci-proto-ncm -> comgt-ncm -> kmod-usb-net-huawei-cdc-ncm -> kmod-usb-net-cdc-ncm -> kmod-usb-serial-option
kmod-mt7916-firmware -> kmod-mt7915e -> kmod-mac80211 - kmod-mt76-connac - kmod-hwmon-core - kmod-thermal

开始适配设备

  1. 修改 target/linux/rockchip/image/armv8.mk 添加如下内容,使其出现在 make menuconfig 里面
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# target/linux/rockchip/image/armv8.mk

define Device/hinlink_h88k
DEVICE_VENDOR := HINLINK
DEVICE_MODEL := H88K
SOC := rk3588
DEVICE_DTS := rockchip/rk3588-h88k
UBOOT_DEVICE_NAME := h88k-rk3588
BOOT_FLOW := pine64-img
DEVICE_PACKAGES := wpad-openssl kmod-mt7916-firmware kmod-r8125 kmod-r8169 kmod-nvme \
luci luci-ssl-openssl luci-proto-modemmanager luci-proto-mbim luci-proto-ncm \
luci-i18n-base-zh-cn luci-i18n-firewall-zh-cn luci-i18n-package-manager-zh-cn
endef
TARGET_DEVICES += hinlink_h88k

  1. 添加适配设备名到指定文件使其可初始化网络和优化网络设备性能
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 将如下带 + 的行添加到:target/linux/rockchip/armv8/base-files/etc/board.d/02_network

rockchip_setup_interfaces()
{
local board="$1"

case "$board" in
+ hinlink,h88k|\
armsom,sige7|\
......
rockchip_setup_macs()
{
local board="$1"
local lan_mac=""
local wan_mac=""
local label_mac=""

case "$board" in
+ hinlink,h88k|\
armsom,sige7|\

---------------------------------------------------------------------------------------------------
# 将如下带 + 的行添加到:target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity

case "$(board_name)" in
hinlink,h88k|\
+ armsom,sige7|\

  1. 在内核源码中为需要适配的设备添加设备树,也可选用后续的制作内核补丁方法(二选一即可)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 获取适配设备的DTS并将其放到指定位置,在OPENWRT构建时该文件会复制到内核源码中
mkdir -p ~/openwrt/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/
wget https://github.com/DHDAXCW/lede-rockchip/raw/stable/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3588-h88k.dts \
-O ~/openwrt/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3588-h88k.dts

# 有了DTS还需要在Makefile中添加,将如下补丁添加到这个位置,让构建OPENWRT时应用补丁到内核源码中
---- target/linux/rockchip/patches-6.6/500-arm64-dts-rockchip-Add-Hinlink-H88k.patch ----
diff -Nur a/arch/arm64/boot/dts/rockchip/Makefile b/arch/arm64/boot/dts/rockchip/Makefile
--- a/arch/arm64/boot/dts/rockchip/Makefile
+++ b/arch/arm64/boot/dts/rockchip/Makefile
@@ -114,3 +114,4 @@
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3588s-nanopi-r6s.dtb
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3588s-nanopi-r6c.dtb
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3588s-rock-5a.dtb
+dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3588-h88k.dtb

  1. 在 U-Boot 中添加本适配的设备,也可选用后续的制作 U-Boot 补丁方法(二选一即可)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 首先在 package/boot/uboot-rockchip/Makefile 中添加本适配设备

define U-Boot/h88k-rk3588
$(U-Boot/rk3588/Default)
NAME:=HINLINK H88K
BUILD_DEVICES:= \
hinlink_h88k
endef

UBOOT_TARGETS := \
h88k-rk3588 \


# 我这里使用官方支持的相近配置的设备 Armsom-Sige7 的设备树及配置
mkdir -p ~/openwrt/package/boot/uboot-rockchip/src/arch/arm/dts/
cd ~/openwrt/package/boot/uboot-rockchip/src/arch/arm/dts/
wget -O rk3588-h88k-u-boot.dtsi https://source.denx.de/u-boot/u-boot/-/raw/v2024.10/arch/arm/dts/rk3588-armsom-sige7-u-boot.dtsi
wget -O rk3588-h88k.dts https://source.denx.de/u-boot/u-boot/-/raw/v2024.10/dts/upstream/src/arm64/rockchip/rk3588-armsom-sige7.dts

mkdir -p ~/openwrt/package/boot/uboot-rockchip/src/configs/
cd ~/openwrt/package/boot/uboot-rockchip/src/configs/
wget -O h88k-rk3588_defconfig https://source.denx.de/u-boot/u-boot/-/raw/v2024.10/configs/sige7-rk3588_defconfig


# 将获取到的 Armsom-Sige7 配置及设备树修改下,不修改也能直接用,但在U-Boot中会显示为:Model: ArmSoM Sige7 ,但也不碍事
vi ~/openwrt/package/boot/uboot-rockchip/src/configs/h88k-rk3588_defconfig
# CONFIG_DEFAULT_DEVICE_TREE="rockchip/rk3588-armsom-sige7" 替换为 CONFIG_DEFAULT_DEVICE_TREE="rockchip/rk3588-h88k"
# CONFIG_DEFAULT_FDT_FILE="rockchip/rk3588-armsom-sige7.dtb" 替换为 CONFIG_DEFAULT_FDT_FILE="rockchip/rk3588-h88k.dtb"

vi ~/openwrt/package/boot/uboot-rockchip/src/arch/arm/dts/rk3588-h88k.dts
# model = "ArmSoM Sige7"; 替换为 model = "HINLINK H88K";
# compatible = "armsom,sige7", "rockchip,rk3588"; 替换为 compatible = "hinlink,h88k", "rockchip,rk3588";

手动制作补丁

  1. 根据如下教程为内核制作补丁
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 先为 Armsom-Sige7 编译一次 OPENWRT,完成后用如下命令清空内核源码目录,然后重新解压内核源码并应用自带的补丁
cd ~/openwrt/
make target/linux/clean V=s # 清空源码目录
make target/linux/prepare V=s # 解压及打补丁

# 获取适配设备的内核设备树及添加新增的设备到 Makefile
cd ~/openwrt/build_dir/target-aarch64_generic_musl/linux-rockchip_armv8/

wget wget https://github.com/DHDAXCW/lede-rockchip/raw/stable/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3588-h88k.dts \
-O linux-6.6.86/arch/arm64/boot/dts/rockchip/rk3588-h88k.dts

cp linux-6.6.86/arch/arm64/boot/dts/rockchip/Makefile linux-6.6.86/arch/arm64/boot/dts/rockchip/Makefile.bak
echo "dtb-\$(CONFIG_ARCH_ROCKCHIP) += rk3588-h88k.dtb" >> linux-6.6.86/arch/arm64/boot/dts/rockchip/Makefile

# 最后将上面新增的设备树相关制作成补丁放到 target/linux/rockchip/patches-6.6/ 中即可在构建 OPENWRT 时自动应用补丁
diff -Nur linux-6.6.86/arch/arm64/boot/dts/rockchip/Makefile.bak linux-6.6.86/arch/arm64/boot/dts/rockchip/Makefile >> 500-arm64-dts-rockchip-rk3588-Add-Hinlink-H88k.patch
diff -Nur /dev/null linux-6.6.86/arch/arm64/boot/dts/rockchip/rk3588-h88k.dts >> 500-arm64-dts-rockchip-rk3588-Add-Hinlink-H88k.patch
mv ./500-arm64-dts-rockchip-rk3588-Add-Hinlink-H88k.patch ~/openwrt/target/linux/rockchip/patches-6.6/

# 最后可以重新清空源码目录,解压打补丁,再编译看看会不会报错,如果没有问题那么内核的补丁就做好了
make target/linux/clean V=s # 清空内核源码
make target/linux/prepare V=s # 解包及打补丁
make target/linux/compile V=s # 编译内核源码

  1. 在 U-Boot 中添加本适配的设备,我这照抄官方支持的设备 Armsom-Sige7 的配置小改并做成补丁
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# 首先在 package/boot/uboot-rockchip/Makefile 中添加本适配设备

define U-Boot/h88k-rk3588
$(U-Boot/rk3588/Default)
NAME:=HINLINK H88K
BUILD_DEVICES:= \
hinlink_h88k
endef

UBOOT_TARGETS := \
h88k-rk3588 \


# 先为 Armsom-Sige7 编译一次 OPENWRT,完成后用如下命令清空 U-Boot 的源码目录,然后重新解压 U-Boot 的源码并应用自带的补丁
cd ~/openwrt/
make package/boot/uboot-rockchip/clean V=s # 清空源码目录
make package/boot/uboot-rockchip/prepare V=s # 解压及打补丁

# 复制 Armsom-Sige7 的 U-Boot 设备树待用
cd ~/openwrt/build_dir/target-aarch64_generic_musl/u-boot-h88k-rk3588/u-boot-2024.10/arch/arm/dts/
cp rk3588-armsom-sige7-u-boot.dtsi rk3588-h88k-u-boot.dtsi

# 复制 Armsom-Sige7 的配置并小改
cd ~/openwrt/build_dir/target-aarch64_generic_musl/u-boot-h88k-rk3588/u-boot-2024.10/configs/
cp sige7-rk3588_defconfig h88k-rk3588_defconfig
# CONFIG_DEFAULT_DEVICE_TREE="rockchip/rk3588-armsom-sige7" 替换为 CONFIG_DEFAULT_DEVICE_TREE="rockchip/rk3588-h88k"
# CONFIG_DEFAULT_FDT_FILE="rockchip/rk3588-armsom-sige7.dtb" 替换为 CONFIG_DEFAULT_FDT_FILE="rockchip/rk3588-h88k.dtb"

# 复制 Armsom-Sige7 的设备树并小改
cd ~/openwrt/build_dir/target-aarch64_generic_musl/u-boot-h88k-rk3588/u-boot-2024.10/dts/upstream/src/arm64/rockchip/
cp rk3588-armsom-sige7.dts rk3588-h88k.dts
# model = "ArmSoM Sige7"; 替换为 model = "HINLINK H88K";
# compatible = "armsom,sige7", "rockchip,rk3588"; 替换为 compatible = "hinlink,h88k", "rockchip,rk3588";

# 最后将上面新增的DTS和配置制作成补丁放到 package/boot/uboot-rockchip/patches/ 中即可在构建 OPENWRT 时自动应用补丁
cd ~/openwrt/build_dir/target-aarch64_generic_musl/u-boot-h88k-rk3588/
diff -Nur /dev/null u-boot-2024.10/configs/h88k-rk3588_defconfig >> 110-rockchip-add-Hinlink-H88k.patch
diff -Nur /dev/null u-boot-2024.10/arch/arm/dts/rk3588-h88k-u-boot.dtsi >> 110-rockchip-add-Hinlink-H88k.patch
diff -Nur /dev/null u-boot-2024.10/dts/upstream/src/arm64/rockchip/rk3588-h88k.dts >> 110-rockchip-add-Hinlink-H88k.patch
mv ./110-rockchip-add-Hinlink-H88k.patch ~/openwrt/package/boot/uboot-rockchip/patches/

# 最后可以重新清空源码目录,解压打补丁,再编译看看会不会报错,如果没有问题那么 U-Boot 的补丁就做好了
make package/boot/uboot-rockchip/clean V=s # 清空源码目录
make package/boot/uboot-rockchip/prepare V=s # 解压及打补丁
make package/boot/uboot-rockchip/compile V=s # 编译程序源码

适配问题解决

  1. 内核编译时设备树出错
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 由于新增的dts中有没有定义的节点遂出错,删除它即可
OBJCOPY arch/arm64/boot/Image
DTC arch/arm64/boot/dts/rockchip/rk3588-h88k.dtb
Error: arch/arm64/boot/dts/rockchip/rk3588-h88k.dts:1001.1-5 Label or path rng not found
FATAL ERROR: Syntax error parsing input tree

# https://github.com/DHDAXCW/lede-rockchip/raw/stable/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3588-h88k.dts
# 删除 arch/arm64/boot/dts/rockchip/rk3588-h88k.dts 第 1001 行的如下节点即可
&rng {
status = "okay";

# 也可添加如下补丁到 target/linux/rockchip/patches-6.6/801-05-arm64-dts-rockchip-rk3588s-add-rng-node.patch
--- a/arch/arm64/boot/dts/rockchip/rk3588-base.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3588-base.dtsi
@@ -1770,6 +1770,17 @@
status = "disabled";
};

+ rng: rng@fe378000 {
+ compatible = "rockchip,trngv1";
+ reg = <0x0 0xfe378000 0x0 0x200>;
+ interrupts = <GIC_SPI 400 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&scmi_clk SCMI_HCLK_SECURE_NS>;
+ clock-names = "hclk_trng";
+ resets = <&scmi_reset SRST_H_TRNG_NS>;
+ reset-names = "reset";
+ status = "disabled";
+ };
+
i2s0_8ch: i2s@fe470000 {
compatible = "rockchip,rk3588-i2s-tdm";
reg = <0x0 0xfe470000 0x0 0x1000>;
  1. 编译 U-Boot 时的问题
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
make[6]: *** No rule to make target 'dts/upstream/src/arm64/rockchip/rk3588-h88k.dtb', needed by 'dtbs'.  Stop.

# u-boot-h88k-rk3588/u-boot-2024.10/dts/upstream/src/arm64/rockchip/rk3588-h88k.dts 也要存在
# 不能用rk3588-evb1-v10.dts,因为其dts中没有SD卡从而导致后期无法启动,可试rk3588-armsom-sige7.dts

# 配置中 CONFIG_TARGET_XXX_RK3588 在 u-boot-2024.10/arch/arm/mach-rockchip/rk3588/Kconfig 中定义,所以为了省事直接用 sige7 的吧

# OPENWRT中U-Boot的版本定义在 ~/openwrt/package/boot/uboot-rockchip/Makefile 中的 PKG_VERSION:=2024.10
# OPENWRT中U-Boot的源码下载地址定义在 ~/openwrt/include/u-boot.mk 中,最后组合为:https://ftp.denx.de/pub/u-boot/u-boot-2024.10.tar.bz2
ifndef PKG_SOURCE_PROTO
PKG_SOURCE = $(PKG_NAME)-$(PKG_VERSION).tar.bz2
PKG_SOURCE_URL = \
https://mirror.cyberbits.eu/u-boot \
https://ftp.denx.de/pub/u-boot \
ftp://ftp.denx.de/pub/u-boot
endif

  1. 通过串口调试进入U-Boot后通过命令手动引导OPENWRT系统
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
-----------------------------------------------------------------
U-Boot 2024.10-OpenWrt-r0-9e9f687 (Apr 14 2025 - 17:32:05 +0000)

Model: HINLINK H88K
DRAM: 16 GiB
Core: 327 devices, 23 uclasses, devicetree: separate
MMC: mmc@fe2c0000: 0, mmc@fe2e0000: 1
Loading Environment from nowhere... OK
In: serial@feb50000
Out: serial@feb50000
Err: serial@feb50000
Model: HINLINK H88K
Net: No ethernet found.
Hit any key to stop autoboot: 0
-----------------------------------------------------------------

=> printenv
kernel_addr_r=0x02000000
ramdisk_addr_r=0x12180000
fdt_addr_r=0x12000000
fdtfile=rockchip/rk3588-h88k.dtb
boot_targets=mmc1 mmc0 nvme scsi usb pxe dhcp spi
uuid=B921B045-1DF0-41C3-AF44-4C6F280D3FAE
stdout=serial@feb50000
......

# 文件 ~/openwrt/target/linux/rockchip/image/default.bootscript 最终会被 mkimage 制作成 boot.scr
=> setenv bootargs "console=ttyS2,1500000 earlycon=uart8250,mmio32,0xfeb50000 root=/dev/mmcblk0p2 rw rootwait"
=> load mmc 1 0x02000000 kernel.img
=> bootm 0x02000000

# 关于板载eMMC和外置SD卡在U-Boot中的序号定义,Sige7中默认 mmc0 是板载eMMC,mmc1 是SD卡。骷髅头的则相反
u-boot-2024.10/dts/upstream/src/arm64/rockchip/rk3588-armsom-sige7.dts
mmc0 = &sdhci;
mmc1 = &sdmmc;

# 但因为我这里仅用了骷髅头的内核设备树,所以进了内核 /dev/mmcblk0p2 才是SD卡中的OPENWRT,而U-Boot中mmc0依然是板载eMMC
https://github.com/DHDAXCW/lede-rockchip/blob/stable/package/boot/uboot-rockchip/src/arch/arm/dts/rk3588-h88k.dts
mmc0 = &sdmmc;
mmc1 = &sdhci;

  1. 更换默认软件源为国内源
1
2
3
4
5
6
7
src/gz openwrt_core https://mirrors.ustc.edu.cn/openwrt/releases/24.10.1/targets/rockchip/armv8/packages
src/gz openwrt_base https://mirrors.ustc.edu.cn/openwrt/releases/24.10.1/packages/aarch64_generic/base
src/gz openwrt_luci https://mirrors.ustc.edu.cn/openwrt/releases/24.10.1/packages/aarch64_generic/luci
src/gz openwrt_packages https://mirrors.ustc.edu.cn/openwrt/releases/24.10.1/packages/aarch64_generic/packages
src/gz openwrt_routing https://mirrors.ustc.edu.cn/openwrt/releases/24.10.1/packages/aarch64_generic/routing
src/gz openwrt_telephony https://mirrors.ustc.edu.cn/openwrt/releases/24.10.1/packages/aarch64_generic/telephony

  1. OPENWRT系统网络配置的生成
1
2
3
4
/etc/inittab -> /etc/init.d/boot -> (/bin/config_generate && /sbin/wifi config)
/bin/config_generate /etc/board.json 侦测生成 model network /etc/config/system /etc/config/network
/sbin/wifi config /etc/board.json 侦测生成 wlan /etc/config/wireless 可将 option disabled '1' 设置为 '0' 启用WiFi