RK3588内核相关的编译

 

配置编译环境

1
2
3
4
5
6
7
8
9
10
11
12
13
# Debian 12 WSL2下为H88K编译内核为例
sudo apt install dpkg-dev build-essential bc flex bison python-is-python3 libncurses-dev libelf-dev libssl-dev gcc-aarch64-linux-gnu


# WSL1编译的话需要如下剔除Windows的PATH内容
sudo vi /etc/wsl.conf
[interop]
appendWindowsPath = false


# WSL设置代理来加速源码下载,没有代理可跳过或根据需求设置。如下是WSL1设置网络代理的例子
export all_proxy="http://172.23.240.1:7890"

开始编译内核

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
# 获取源码
git clone --depth=1 -b rk-5.10-rkr6 https://github.com/armbian/linux-rockchip
cd linux-rockchip/

wget -O .config https://github.com/armbian/build/raw/main/config/kernel/linux-rk35xx-legacy.config
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc)

# 开始安装内核到指定位置,最好切换到root用户再安装模块,否则可能模块权限将混乱
KERNEL_PATH=/home/leux/kernel
sudo mkdir -p ${KERNEL_PATH}/boot/ # INSTALL_PATH不存在会报错
sudo make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- install INSTALL_PATH=${KERNEL_PATH}/boot
sudo make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- modules_install INSTALL_MOD_PATH=${KERNEL_PATH}
sudo make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- headers_install INSTALL_HDR_PATH=${KERNEL_PATH}/usr
sudo make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- dtbs_install INSTALL_DTBS_PATH=${KERNEL_PATH}/boot/dtb-5.10.160

# 也可以直接编译打包成DEB,生成的DEB包文件在内核源码的上一级目录下
# sudo make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bindeb-pkg -j$(nproc)


# 如果内核开启了 CONFIG_DEBUG_INFO 选项,那么编译的内核模块会把调试信息也带进去,导致模块的大小剧增,添加 INSTALL_MOD_STRIP=1 可去除
sudo make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_STRIP=1 modules_install INSTALL_MOD_PATH=${KERNEL_PATH}

# 可以看到经过STRIP了所以很小,而没有STRIP则空间占用巨大
leux@h88k:~$ du -h -d 1 /lib/modules/
97M /lib/modules/5.10.160-strip
1.8G /lib/modules/5.10.160-nostrip
138M /lib/modules/5.10.160-legacy-rk35xx

制作uInitrd

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
# 因为是在X86上交叉制作所以需要,启动服务binfmt-support可解决:chroot: failed to run command '/bin/bash': Exec format error
sudo apt install binfmt-support qemu-user-static
sudo /usr/sbin/update-binfmts --enable

# 指定内核安装目录和根文件系统目录并开始获取根文件系统
KERNEL_PATH=/home/leux/kernel
ROOTFS_PATH=/home/leux/root

sudo qemu-debootstrap --arch=arm64 stable ${ROOTFS_PATH}/ http://mirrors.ustc.edu.cn/debian/

# 拷贝内核配置文件和内核模块到目标根目录,这步mkinitramfs会用到
sudo cp ${KERNEL_PATH}/boot/config-5.10.160 ${ROOTFS_PATH}/boot/
sudo cp -r ${KERNEL_PATH}/lib/modules/ ${ROOTFS_PATH}/lib/


# 切换根目录后制作Initrd和uInitrd,uInitrd是专为U-Boot固件设计的映像格式,而Initrd则是通用的
sudo chroot ${ROOTFS_PATH}/
apt install initramfs-tools u-boot-tools xz-utils wireless-regdb
mkinitramfs -c xz -o /boot/initrd.img-5.10.160 5.10.160
mkimage -A arm64 -T ramdisk -C none -n uInitrd -d /boot/initrd.img-5.10.160 /boot/uInitrd-5.10.160
exit


# 在 /boot/boot.cmd 中定义了启动时默认加载的ramdisk和kernel及dtb路径等参数
# 需要通过 mkimage -A arm64 -T script -C none -d boot.cmd boot.scr 制作成U-Boot可用的启动脚本
load ${devtype} ${devnum}:${distro_bootpart} ${ramdisk_addr_r} ${prefix}uInitrd
load ${devtype} ${devnum}:${distro_bootpart} ${kernel_addr_r} ${prefix}Image
load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} ${prefix}dtb/${fdtfile}

# 退出chroot环境并拷贝制作好的文件并软链接以方便uboot调用
sudo cp ${ROOTFS_PATH}/boot/initrd.img-5.10.160 ${KERNEL_PATH}/boot/
sudo cp ${ROOTFS_PATH}/boot/uInitrd-5.10.160 ${KERNEL_PATH}/boot/

KERNEL_VERSION=5.10.160
cd ${KERNEL_PATH}/boot/
sudo ln -sf uInitrd-${KERNEL_VERSION} uInitrd
sudo ln -sf vmlinuz-${KERNEL_VERSION} Image
sudo ln -sf dtb-${KERNEL_VERSION} dtb

编译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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# Rockchip引导流程:https://opensource.rock-chips.com/wiki_Boot_option#Boot_flow

# 获取Rockchip闭源固件及主线U-Boot源码
git clone --depth 1 https://github.com/rockchip-linux/rkbin
git clone --depth 1 https://source.denx.de/u-boot/u-boot.git

# 如下根据你当前版本rkbin内指定路径的文件填写
cd u-boot
export BL31=../rkbin/bin/rk35/rk3588_bl31_v1.48.elf
export ROCKCHIP_TPL=../rkbin/bin/rk35/rk3588_ddr_lp4_2112MHz_lp5_2400MHz_v1.18.bin
make sige7-rk3588_defconfig # 默认配置在 u-boot/configs/ 中
make CROSS_COMPILE=aarch64-linux-gnu- # 最终生成的位于:u-boot/u-boot-rockchip.bin


# 将U-Boot文件写入磁盘
sudo dd if=u-boot-rockchip.bin of=/dev/mmcblk1 seek=64 conv=notrunc

# 创建一个EXT4分区用来存放内核及根文件系统(如用fdisk可输入起始扇率为 +32768 实现16MB偏移跳过U-Boot存放区域)
sudo parted -s /dev/mmcblk1 mklabel gpt
sudo parted -s /dev/mmcblk1 mkpart primary ext4 16MiB 100%
sudo mkfs.ext4 /dev/mmcblk1p1
sudo mount /dev/mmcblk1p1 /mnt/rootfs/ # 将你的内核及根文件系统放到该分区


# 启动到U-Boot后可用如下命令启动内核
=> load mmc 1 ${kernel_addr_r} /boot/vmlinuz-5.10.160
=> load mmc 1 ${ramdisk_addr_r} /boot/uInitrd-5.10.160
=> load mmc 1 ${fdt_addr_r} /boot/dtb/rockchip/rk3588-hinlink-h88k.dtb
=> setenv bootargs "root=/dev/mmcblk0p1 rootwait console=ttyS2,1500000 console=tty1"
=> booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r}


# 硬件启动时首先会加载闭源固件 rk3588_ddr_lp4_2112MHz_lp5_2400MHz_v1.18.bin 初始化内存
DDR 9fffbe1e78 cym 24/02/04-10:09:20,fwver: v1.16
LPDDR4X, 2112MHz
channel[0] BW=16 Col=10 Bk=8 CS0 Row=17 CS1 Row=17 CS=2 Die BW=8 Size=4096MB
channel[1] BW=16 Col=10 Bk=8 CS0 Row=17 CS1 Row=17 CS=2 Die BW=8 Size=4096MB
channel[2] BW=16 Col=10 Bk=8 CS0 Row=17 CS1 Row=17 CS=2 Die BW=8 Size=4096MB
channel[3] BW=16 Col=10 Bk=8 CS0 Row=17 CS1 Row=17 CS=2 Die BW=8 Size=4096MB
Manufacturer ID:0x6
CH0 RX Vref:28.5%, TX Vref:21.8%,21.8%
CH1 RX Vref:29.3%, TX Vref:23.8%,23.8%
CH2 RX Vref:27.9%, TX Vref:22.8%,22.8%
CH3 RX Vref:31.0%, TX Vref:22.8%,21.8%
change to F1: 528MHz
change to F2: 1068MHz
change to F3: 1560MHz
change to F0: 2112MHz
out
# 接着加载闭源固件 rk3588_bl31_v1.48.elf 后才到U-Boot界面
INFO: Preloader serial: 2
NOTICE: BL31: v2.3():v2.3-682-g4ca8a8422:derrick.huang, fwver: v1.45
NOTICE: BL31: Built : 10:11:21, Dec 27 2023
INFO: spec: 0x1
INFO: code: 0x88
INFO: ext 32k is not valid
INFO: ddr: stride-en 4CH
INFO: GICv3 without legacy support detected.
INFO: ARM GICv3 driver initialized in EL3
INFO: valid_cpu_msk=0xff bcore0_rst = 0x0, bcore1_rst = 0x0
INFO: l3 cache partition cfg-0
INFO: system boots from cpu-hwid-0
INFO: disable memory repair
INFO: idle_st=0x21fff, pd_st=0x11fff9, repair_st=0xfff70001
INFO: dfs DDR fsp_params[0].freq_mhz= 2112MHz
INFO: dfs DDR fsp_params[1].freq_mhz= 528MHz
INFO: dfs DDR fsp_params[2].freq_mhz= 1068MHz
INFO: dfs DDR fsp_params[3].freq_mhz= 1560MHz
INFO: BL31: Initialising Exception Handling Framework
INFO: BL31: Initializing runtime services
WARNING: No OPTEE provided by BL2 boot loader, Booting device without OPTEE initialization. SMC`s destined for OPTEE will return SMC_UNK
ERROR: Error initializing runtime service opteed_fast
INFO: BL31: Preparing for EL3 exit to normal world
INFO: Entry point address = 0x200000
INFO: SPSR = 0x3c9

编译错误解决

  1. 可能是GCC版本较新的原因导致下面的一系列问题,注释掉 linux-rockchip/scripts/gcc-wrapper.py 第105行来禁用 interpret_warning 即可解决
1
2
3
4
5
6
7
8
        proc = subprocess.Popen(args, stderr=subprocess.PIPE, env=env)
for line in proc.stderr:
print (line.decode("utf-8"), end="")
- interpret_warning(line.decode("utf-8"))
+ #interpret_warning(line.decode("utf-8"))
if do_exit:
sys.exit(1)

  1. 由于当前内核版本不支持MT7916,所以可以通过backport来支持它
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 打补丁来支持MT7916网卡
wget https://github.com/amazingfate/armbian-h68k-images/raw/master/backport-v6.1.39.patch
cd linux-rockchip/ && patch -p1 < backport-v6.1.39.patch

# 先关闭BSP内核自带的驱动,因为自带驱动和Backport驱动只能二选一
> Device Drivers > [*] Network device support > [ ] Wireless LAN # WLAN [=n]
> Networking support > [*] Wireless > < > cfg80211 - wireless configuration API # CFG80211 [=n] & MAC80211 [=n]

# 在如下位置开启MT7915E,它依赖CFG80211和MAC80211
> Backport Linux > <*> cfg80211 - wireless configuration API # BACKPORT_CFG80211 [=y]
> Backport Linux > <M> Generic IEEE 802.11 Networking Stack (mac80211) # BACKPORT_MAC80211 [=m]
> Backport Linux > [*] Wireless LAN > [*] MediaTek devices > <M> MediaTek MT7915E (PCIe) support
#BACKPORT_LINUX [=y] BACKPORT_WLAN [=y] WLAN_VENDOR_MEDIATEK [=n] BACKPORT_MT7915E [=m]

# 在BSP内核中选择了就不要在Backport中选择,它们会冲突报错

  1. 也可用如下最傻瓜的方式一刀切:去掉出错模块

  2. fs/xfs/libxfs/xfs_attr_remote.c: In function '__xfs_attr3_rmt_read_verify':

File systems > < > XFS filesystem support

  1. drivers/acpi/thermal.c: In function 'acpi_thermal_resume':

ACPI (Advanced Configuration and Power Interface) Support > < > Thermal Zone

6. drivers/net/ethernet/huawei/hinic/hinic_rx.c: In function 'rx_add_napi':

Device Drivers > Network device support > Ethernet driver support > [ ] Huawei devices

  1. drivers/net/ethernet/stmicro/stmmac/stmmac_main.c: In function 'stmmac_napi_add':

Device Drivers > Network device support > Ethernet driver support > [ ] STMicroelectronics devices

  1. drivers/net/wireless/ath/ath11k/qmi.c:626:35: warning: initialization discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]

Device Drivers > Network device support > Wireless LAN > < > Qualcomm Technologies 802.11ax chipset support

  1. drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_android.c: In function 'wl_handle_private_cmd':

Device Drivers > Network device support > Wireless LAN > < > Rockchip Wireless LAN support —-

  1. drivers/staging/rtl8192u/r8180_93cx6.c: In function 'eprom_w':

Device Drivers > Staging drivers > < > RealTek RTL8192U Wireless LAN NIC driver

  1. drivers/net/wireless/intel/iwlwifi/fw/pnvm.c:174:12:

Device Drivers > Network device support > Wireless LAN > [ ] Intel devices