RK3588内核相关的编译

配置编译环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 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"

# 也可使用SDK中提供的交叉编译工具
#mkdir ~/rk3588_sdk/ && cd ~/rk3588_sdk/
#git clone --depth 1 -b rk3588/firefly https://gitlab.com/firefly-linux/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.git
#export PATH=$(pwd)/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin:$PATH

开始编译内核

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 获取源码
git clone --depth=1 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包文件在内核源码的上级目录下
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bindeb-pkg -j$(nproc)

制作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
# 因为是在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


# 退出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 vmlinuz-${KERNEL_VERSION} Image
sudo ln -sf uInitrd-${KERNEL_VERSION} uInitrd
sudo ln -sf dtb-${KERNEL_VERSION} dtb
#sudo ln -s initrd.img-${KERNEL_VERSION} Initrd

编译错误解决

  1. 可能是GCC版本较新的原因导致下面的一系列问题,注释掉 linux-rockchip/scripts/gcc-wrapper.py 第105行来禁用 interpret_warning 即可解决
1
2
3
4
5
6
7
        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
# 打补丁来支持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