RK3588设备H88K适配主线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
# 下载源码(--single-branch 仅下载单个分支/标签、--depth=1 只下载最新的一次提交、-b 指定分支/标签)
git clone --depth=1 -b v24.10.1 https://github.com/openwrt/openwrt
cd openwrt/
git pull
./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

# 如下相关软件包只能同时选择一个,共存会在安装时报错
# > Base system > dnsmasq
# > Base system > dnsmasq-full
# > Libraries > libustream-openssl # > Libraries > SSL > libopenssl
# > Libraries > libustream-mbedtls # > Libraries > SSL > libmbedtls
# > Libraries > libustream-wolfssl # > Libraries > SSL > libwolfssl

# 其他相关包的介绍
# > LuCI > 1. Collections > luci-ssl-openssl # 页面支持HTTPS访问
# > LuCI > 2. Modules > luci-compat # 页面最下会显示【Lua 兼容模式激活】
# > LuCI > 2. Modules > Translations -> Chinese Simplified (zh_Hans) # 默认使用中文,配置为:CONFIG_LUCI_LANG_zh_Hans=y
# > LuCI > 5. Protocols > luci-proto-modemmanager # 首页中多出【蜂窝网络】页面

开始适配设备

  1. 修改 target/linux/rockchip/image/armv8.mk 添加如下内容,使其出现在 make menuconfig 里面
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 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 \
usbutils pciutils luci luci-ssl-openssl luci-proto-ncm luci-proto-mbim
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
34
35
36
# 首先在 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

# 这个设备树文件所在路径与配置文件中的 CONFIG_DEFAULT_DEVICE_TREE 有关
cd ~/openwrt/package/boot/uboot-rockchip/src/dts/upstream/src/arm64/rockchip/
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 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-sige7-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-sige7-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-sige7-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-sige7-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. OpenWrt系统网络配置的生成和其他系统设置的修改
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 如果LAN下接入设备的DNS有问题,请在 网络 -> 接口 -> LAN -> 高级设置 -> 使用自定义的 DNS 服务器 -> 添加其他DNS服务器
/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

# 修改 ~/openwrt/package/base-files/files/bin/config_generate 中第 165 行如下可设置默认局域网IP地址
case "$1" in
lan) ipad=${ipaddr:-"192.168.1.1"} ;;
*) ipad=${ipaddr:-"192.168.$((addr_offset++)).1"} ;;
esac

# 在 ~/openwrt/package/base-files/files/bin/config_generate 文件中第 314 行如下可设置默认主机名,时区等
set system.@system[-1].hostname='OpenWrt' # 要显示的主机名
set system.@system[-1].timezone='CST-8' # 修改时区为 CST-8
set system.@system[-1].zonename='Asia/Shanghai' # 再在下一行添加如下内容

  1. 解决 LuCI 版本显示异常问题 (HEAD detached at 2ac26e56)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# OpenWrt中该问题的讨论:https://github.com/openwrt/luci/pull/7745

# SNAPSHOT 版本和 24.10.1 的版本默认显示对比如下
固件版本 OpenWrt 24.10-SNAPSHOT r0-78d517a / LuCI openwrt-24.10 branch 25.115.55128~bedefb1
Powered by LuCI openwrt-24.10 branch (25.115.55128~bedefb1) / OpenWrt 24.10-SNAPSHOT (r0-78d517a) / Lua 兼容模式激活

固件版本 OpenWrt 24.10.1 r28597-0425664679 / LuCI (HEAD detached at 2ac26e56) branch 25.103.51521~2ac26e5
Powered by LuCI (HEAD detached at 2ac26e56) branch (25.103.51521~2ac26e5) / OpenWrt 24.10.1 (r28597-0425664679)

# 编辑 openwrt/feeds/luci/modules/luci-base/Makefile 中第11行后添加:PKG_GITBRANCH:=LuCI openwrt-24.10 branch
# 修复后的显示,往后官方的 24.10.2 因为已经修复就不需要修改了
固件版本 OpenWrt 24.10.1 r28597-0425664679 / LuCI openwrt-24.10 branch 25.103.51521~2ac26e5
Powered by LuCI openwrt-24.10 branch (25.103.51521~2ac26e5) / OpenWrt 24.10.1 (r28597-0425664679)

  1. 调整内核后缀与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
# 查看当前运行的OpenWrt内核后缀
root@OpenWRT:~# opkg info kernel
Package: kernel
Version: 6.6.86~9c44f65d374062718cc717437267393e-r1
Depends: libc
Status: install ok installed
Architecture: aarch64_generic
Installed-Time: 1744562312

# 查看内核修改前的后缀值
leux@Debian:~/openwrt$ cat build_dir/target-aarch64_generic_musl/linux-rockchip_armv8/linux-6.6.86/.vermagic
9c44f65d374062718cc717437267393e


# 首先查看要用的OpenWrt源中内核的版本信息
leux@Debian:~$ curl -s https://downloads.openwrt.org/releases/24.10.1/targets/rockchip/armv8/openwrt-24.10.1-rockchip-armv8.manifest | grep kernel
kernel - 6.6.86~a8e18e0ecc66cc99303d258424ec0db8-r1

# 将 openwrt/include/kernel-defaults.mk 中第 130 行如下内容注释并在其后添加另一行
......
# grep '=[ym]' $(LINUX_DIR)/.config.set | LC_ALL=C sort | $(MKHASH) md5 > $(LINUX_DIR)/.vermagic
cp $(TOPDIR)/.vermagic $(LINUX_DIR)/.vermagic
......

# 将源中内核的后缀添加到OpenWrt源码根目录,后续内核编译时会将其拷贝到内核源码根目录并将其内容作为内核后缀
leux@Debian:~/openwrt$ echo "a8e18e0ecc66cc99303d258424ec0db8" > ~/openwrt/.vermagic

# 最后生成的内核包:bin/targets/rockchip/armv8/packages/kernel_6.6.86~a8e18e0ecc66cc99303d258424ec0db8-r1_aarch64_generic.ipk

# 刷入该系统后可更换默认软件源为国内源,如下首行KMOD源即是上面后缀一致可用的官方内核模块源
src/gz openwrt_kmod https://mirrors.ustc.edu.cn/openwrt/releases/24.10.1/targets/rockchip/armv8/kmods/6.6.86-1-a8e18e0ecc66cc99303d258424ec0db8
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. 移植 Immortalwrt 中的包 luci-proto-quectel 到OpenWrt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 下载后复制如下文件夹中所有的文件到OpenWrt中指定目录下
https://github.com/immortalwrt/packages/tree/master/net/quectel-cm/ # ~/openwrt/feeds/packages/net/quectel-cm/
https://github.com/immortalwrt/luci/tree/master/protocols/luci-proto-quectel/ # ~/openwrt/feeds/luci/protocols/luci-proto-quectel/

# 修改如下文件中的源码下载地址及删除其中的私有依赖项:+kmod-usb-net-qmi-wwan-fibocom +kmod-usb-net-qmi-wwan-quectel
~/openwrt/feeds/packages/net/quectel-cm/Makefile
PKG_SOURCE_URL:=https://sources.immortalwrt.org

# 可修改如下文件中第27行 return _('Quectel Cellular'); 这个值将会在接口的协议处显示
~/openwrt/feeds/luci/protocols/luci-proto-quectel/htdocs/luci-static/resources/protocol/quectel.js

# 拷贝及修改完成后要执行 ./scripts/feeds update -a 后才能在配置菜单中出现,最后在配置菜单中的位置
> Network > WWAN > quectel-cm # CONFIG_PACKAGE_quectel-cm=y
> LuCI > 5. Protocols > luci-proto-quectel # CONFIG_PACKAGE_luci-proto-quectel=y

  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
# OpenWrt官方镜像默认分区情况如下,有两个不连续的空闲空间和两个分区
|-- NULL 32M --|-- kernel 16M --|-- NULL 16M --|-- rootfs 104M --|
# 我想将其改成如下单分区情况,前面16M存放U-Boot后面存放内核及根文件系统
|-- NULL 16M --|------------------ rootfs 100% ------------------|

# 使用parted创建单个分区,如用fdisk可输入起始扇率为 +32768 实现16MB偏移
sudo parted -s /dev/mmcblk1 mklabel gpt
sudo parted -s /dev/mmcblk1 mkpart primary ext4 16MiB 100%

# 将OpenWrt中编译完成的U-Boot文件写入磁盘
sudo dd if=~/openwrt/staging_dir/target-aarch64_generic_musl/image/h88k-rk3588-u-boot-rockchip.bin of=/dev/mmcblk1 seek=64 conv=notrunc

# 分区完成后将OpenWrt官方镜像中的 kernel.img 放到单一根文件系统的 /boot/kernel.img
sudo mkfs.ext4 /dev/mmcblk1p1
sudo mount /dev/mmcblk1p1 /media/leux/ # 将OpenWrt官方镜像的根文件系统拷贝到当前分区

# 可在U-Boot中手动启动OpenWrt系统,也可根据后面修改 /boot/boot.scr 来自动启动
=> setenv bootargs "console=ttyS2,1500000 earlycon=uart8250,mmio32,0xfeb50000 root=/dev/mmcblk0p1 rw rootwait"
=> load mmc 1 ${kernel_addr_r} /boot/kernel.img
=> bootm ${kernel_addr_r}

# 拷贝OpenWrt官方源码中的U-Boot启动脚本到指定路径
cp ~/openwrt/target/linux/rockchip/image/default.bootscript ~/

# 修改U-Boot启动脚本 default.bootscript 中如下两句,即将分区 ${devnum}:2改为1,内核位置 kernel.img 改为 /boot/kernel.img
part uuid ${devtype} ${devnum}:2 uuid part uuid ${devtype} ${devnum}:1 uuid
load ${devtype} ${devnum}:1 ${kernel_addr_r} kernel.img load ${devtype} ${devnum}:1 ${kernel_addr_r} /boot/kernel.img

# 然后将修改后的启动脚本制作成 boot.scr,并将其放到单一根文件系统的 /boot/boot.scr
mkimage -A arm -O linux -T script -C none -a 0 -e 0 -d ~/default.bootscript /mnt/d/boot.scr