1. 项目概述:为立创RK3566泰山派开发板编译Linux主线系统
最近在折腾立创的RK3566泰山派开发板,想给它编译一套最新的Linux主线内核(6.19版本)搭配Ubuntu 24.04的rootfs。整个过程踩了不少坑,也收获了不少经验,这里把完整的编译流程记录下来,希望能帮到有同样需求的开发者。
RK3566作为Rockchip的中端SoC,性能足够运行完整的桌面环境,但官方SDK往往基于较老的内核版本。通过编译主线内核,不仅能获得最新的硬件支持,还能体验更先进的Linux特性。下面就从环境搭建开始,一步步带你完成整个系统的编译和部署。
2. 环境准备与工具链配置
2.1 Docker编译环境搭建
为了避免污染主机环境,我选择在Docker容器中进行编译。这里使用Ubuntu 22.04作为基础镜像,并配置华为云镜像源加速软件包下载:
bash复制mkdir docker_tspi && cd docker_tspi
mkdir DISK
vim Dockerfile
Dockerfile内容如下(关键点已添加注释):
dockerfile复制FROM ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive
# 使用国内镜像源加速
RUN cp -a /etc/apt/sources.list /etc/apt/sources.list.bak && \
sed -i 's@http://.*archive.ubuntu.com@http://repo.huaweicloud.com@g' /etc/apt/sources.list && \
sed -i 's@http://.*security.ubuntu.com@http://repo.huaweicloud.com@g' /etc/apt/sources.list
# 安装基础工具链
RUN apt update && apt install -y --no-install-recommends \
locales \
sudo \
gcc-aarch64-linux-gnu \
make \
&& rm -rf /var/lib/apt/lists/*
# 设置locale避免警告
RUN locale-gen en_US.UTF-8
ENV LANG=en_US.UTF-8
# 创建专用用户
RUN useradd -c 'lckfb user' -m -d /home/lckfb -s /bin/bash lckfb && \
echo '%sudo ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/nopasswd-sudo && \
chmod 440 /etc/sudoers.d/nopasswd-sudo && \
usermod -a -G sudo lckfb
USER lckfb
WORKDIR /home/lckfb
构建镜像并运行容器:
bash复制docker build -t lckfb_sdk_cmp .
docker run --privileged --mount type=bind,source=$(pwd)/DISK,target=/home/lckfb --name="lckfb_sdk_cmp_container" -h lckfb -it -v /dev:/dev lckfb_sdk_cmp
注意:--privileged和-v /dev:/dev参数对后续设备操作至关重要,不要省略
2.2 交叉编译工具链安装
RK3566是ARM64架构,需要安装对应的交叉编译工具链。我选择了ARM官方提供的GNU工具链:
bash复制wget https://developer.arm.com/-/media/Files/downloads/gnu/15.2.rel1/binrel/arm-gnu-toolchain-15.2.rel1-x86_64-aarch64-none-linux-gnu.tar.xz
tar -xvf arm-gnu-toolchain-15.2.rel1-x86_64-aarch64-none-linux-gnu.tar.xz
sudo mv arm-gnu-toolchain-15.2.rel1-x86_64-aarch64-none-linux-gnu /usr/local/
将工具链路径加入环境变量:
bash复制echo 'export PATH=$PATH:/usr/local/arm-gnu-toolchain-15.2.rel1-x86_64-aarch64-none-linux-gnu/bin' | sudo tee -a /etc/profile
source /etc/profile
验证安装是否成功:
bash复制aarch64-none-linux-gnu-gcc --version
3. U-Boot与内核编译
3.1 编译U-Boot引导程序
首先获取U-Boot源码和Rockchip的二进制工具:
bash复制git clone https://github.com/rockchip-linux/u-boot.git
git clone https://github.com/rockchip-linux/rkbin.git
cd u-boot
编译U-Boot:
bash复制./make.sh rk3566 CROSS_COMPILE=aarch64-linux-gnu-
ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- make u-boot.itb -j$(nproc)
编译完成后,以下两个文件需要保存备用:
- u-boot.itb:U-Boot镜像文件
- rk356x_spl_loader_v1.23.114.bin:Rockchip专用加载器
3.2 编译Linux 6.19主线内核
获取Linux主线源码:
bash复制git clone -b v6.19 https://github.com/torvalds/linux.git
cd linux
需要修改arch/arm64/Makefile文件,添加Rockchip特定的镜像生成规则:
makefile复制MAKE_MODULES ?= y
%.img:
ifeq ("$(CONFIG_MODULES)$(MAKE_MODULES)$(srctree)","yy$(objtree)")
$(Q)$(MAKE) rockchip/$*.dtb Image.lz4 modules
else
$(Q)$(MAKE) rockchip/$*.dtb Image.lz4
endif
$(Q)$(srctree)/scripts/mkimg --dtb $*.dtb
CLEAN_DIRS += out
CLEAN_FILES += boot.img kernel.img resource.img zboot.img
从官方SDK中复制必要的脚本工具:
bash复制cp -a /path/to/tspi-linux-sdk/kernel/scripts/mkimg scripts/
cp -a /path/to/tspi-linux-sdk/kernel/scripts/resource_tool scripts/
cp -a /path/to/tspi-linux-sdk/kernel/scripts/mkbootimg scripts/
chmod +x scripts/{mkimg,resource_tool,mkbootimg}
使用预定义的配置文件:
bash复制wget https://example.com/tspi_defconfig.txt
mv tspi_defconfig.txt arch/arm64/configs/tspi_defconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- tspi_defconfig
修改设备树文件arch/arm64/boot/dts/rockchip/rk3566-lckfb-tspi.dts,确保存储设备配置正确:
dts复制aliases {
mmc0 = &sdhci; //emmc
mmc1 = &sdmmc0; //sd卡
mmc2 = &sdmmc1;
};
chosen: chosen {
bootargs = "root=/dev/mmcblk0p3 rootfstype=ext4 rw rootwait console=ttyS2,1500000";
stdout-path = "serial2:1500000n8";
};
开始编译内核:
bash复制make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- menuconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- rk3566-lckfb-tspi.img -j$(nproc)
make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- modules_install INSTALL_MOD_PATH=./modules
编译完成后,boot.img和modules目录需要保存备用。
4. 构建Ubuntu 24.04 RootFS
4.1 基础系统搭建
下载Ubuntu Base镜像并解压:
bash复制wget https://cdimage.ubuntu.com/ubuntu-base/releases/24.04/release/ubuntu-base-24.04.3-base-arm64.tar.gz
sudo mkdir ubuntu2404-rootfs
sudo tar -xvpf ubuntu-base-24.04.4-base-armhf.tar.gz -C ubuntu2404-rootfs
准备chroot环境:
bash复制sudo cp /etc/resolv.conf ./ubuntu2404-rootfs/etc/resolv.conf
sudo mount -o bind /dev ./ubuntu2404-rootfs/dev
sudo mount -o bind /proc ./ubuntu2404-rootfs/proc
sudo mount -o bind /sys ./ubuntu2404-rootfs/sys
sudo mount -o bind /run ./ubuntu2404-rootfs/run
对于x86主机,需要配置qemu静态二进制支持:
bash复制sudo mount -t binfmt_misc none /proc/sys/fs/binfmt_misc
echo ':qemu-aarch64:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-aarch64-static:F' | sudo tee /proc/sys/fs/binfmt_misc/register
sudo chroot ./ubuntu2404-rootfs /bin/bash
4.2 系统基础配置
在chroot环境中执行:
bash复制apt update
apt upgrade -y
apt install -y sudo udev vim wget net-tools ethtool ifupdown iputils-ping openssh-server git
passwd root
exit
卸载挂载点:
bash复制sudo umount -l ./ubuntu2404-rootfs/run
sudo umount -l ./ubuntu2404-rootfs/sys
sudo umount -l ./ubuntu2404-rootfs/proc
sudo umount -l ./ubuntu2404-rootfs/dev
4.3 内核模块与固件部署
将编译好的内核模块复制到rootfs:
bash复制cp -r linux/modules/lib/modules/6.19.0/ ubuntu2404-rootfs/lib/modules/
配置WiFi和蓝牙固件(以Broadcom为例):
bash复制mkdir -p ubuntu2404-rootfs/lib/firmware/brcm
wget https://github.com/pathpass2/linux/raw/master/tspi_wifi_firmware/brcmfmac43455-sdio.bin -O ubuntu2404-rootfs/lib/firmware/brcm/brcmfmac43455-sdio.lckfb,tspi-rk3566.bin
wget https://github.com/pathpass2/linux/raw/master/tspi_wifi_firmware/brcmfmac43455-sdio.txt -O ubuntu2404-rootfs/lib/firmware/brcm/brcmfmac43455-sdio.lckfb,tspi-rk3566.txt
4.4 生成RootFS镜像
创建并格式化镜像文件:
bash复制sudo dd if=/dev/zero of=ubuntu2404_base.img bs=1M count=4096
sudo mkfs.ext4 -F -L rootfs ubuntu2404_base.img
mkdir -p mnt
sudo mount -o loop ubuntu2404_base.img mnt/
sudo cp -rfp ./ubuntu2404-rootfs/* mnt/
sudo umount mnt/
rm -rf mnt/
sudo e2fsck -p -f ubuntu2404_base.img
sudo resize2fs -M ubuntu2404_base.img
5. 系统烧录与启动
5.1 准备烧录文件
确保有以下文件在同一目录:
- rk356x_spl_loader_v1.23.114.bin
- u-boot.itb
- boot.img
- ubuntu2404_base.img
创建parameter.txt分区表文件:
code复制FIRMWARE_VER: 1.0
MACHINE_MODEL: RK3566
MACHINE_ID: 007
MANUFACTURER: heiyt
MAGIC: 0x5041524B
ATAG: 0x00200800
MACHINE: 0xffffffff
CHECK_MASK: 0x80
PWR_HLD: 0,0,A,0,1
TYPE: GPT
CMDLINE: mtdparts=rk29xxnand:0x00002000@0x00004000(uboot),0x00020000@0x00008000(boot),0x00c00000@0x00040000(rootfs)
uuid:rootfs=614e0000-0000-4b53-8000-1d28000054a9
5.2 使用rkdeveloptool烧录
让开发板进入Maskrom模式后执行:
bash复制rkdeveloptool ld
rkdeveloptool db rk356x_spl_loader_v1.23.114.bin
rkdeveloptool ef
rkdeveloptool gpt parameter.txt
rkdeveloptool ppt
rkdeveloptool ul rk356x_spl_loader_v1.23.114.bin
rkdeveloptool wl 0x4000 u-boot.itb
rkdeveloptool wl 0x8000 boot.img
rkdeveloptool wl 0x40000 ubuntu2404_base.img
rkdeveloptool rd
6. 常见问题与解决方案
6.1 编译阶段问题
Q1: 编译内核时报错缺少mkimg等工具
A: 确保从官方SDK中正确复制了以下脚本并设置了可执行权限:
- scripts/mkimg
- scripts/resource_tool
- scripts/mkbootimg
Q2: 设备树修改后不生效
A: 清理后重新编译:
bash复制make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- clean
make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- rk3566-lckfb-tspi.img -j$(nproc)
6.2 系统启动问题
Q3: 系统启动卡在U-Boot
A: 检查以下几点:
- 确认烧录的u-boot.itb版本与开发板匹配
- 检查parameter.txt中的分区表是否正确
- 确认boot.img和rootfs.img烧录到了正确的位置
Q4: WiFi/蓝牙无法正常工作
A: 确保:
- 正确的固件文件已放入/lib/firmware/brcm/
- 文件命名与设备树中的定义一致
- 内核配置启用了对应的驱动模块
6.3 RootFS相关问题
Q5: chroot环境无法运行
A: 对于x86主机,必须配置qemu静态二进制支持:
bash复制sudo apt install qemu-user-static
sudo cp /usr/bin/qemu-aarch64-static ./ubuntu2404-rootfs/usr/bin/
Q6: 系统启动后网络不可用
A: 在rootfs中创建/etc/network/interfaces文件:
code复制auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
整个编译过程大约需要2-3小时(取决于主机性能),建议使用多核编译(-j参数)来加快速度。遇到问题时,多查看内核启动日志(dmesg)和系统日志(journalctl -xe)能帮助快速定位问题。