泰山派RK3566开发板Linux系统SDK编译全流程详解(从环境配置到固件打包)
最近有不少朋友拿到了立创的泰山派RK3566开发板,想自己动手编译Linux系统,但面对庞大的SDK和一堆命令,感觉有点无从下手。别担心,今天我就以一位过来人的身份,手把手带你走一遍完整的编译流程。从虚拟机环境准备,到SDK解压配置,再到内核、uboot、根文件系统的编译,最后打包成能烧录的固件。我会把过程中容易踩的坑和需要注意的细节都告诉你,让你一次成功。
1. 编译前的准备工作
工欲善其事,必先利其器。编译Linux系统虽然对电脑要求不像Android那么夸张,但一个稳定、纯净的编译环境至关重要。我强烈建议你在虚拟机里操作,这样即使搞乱了也能快速恢复。
1.1 搭建Ubuntu编译环境
官方推荐使用Ubuntu 18.04.6 LTS版本。这个版本经过验证,与瑞芯微的编译工具链兼容性最好,能避免很多稀奇古怪的依赖问题。你可以去Ubuntu官网下载这个版本的镜像,在VMware或VirtualBox里新建一个虚拟机。
注意:虚拟机的硬盘空间一定要给足!整个SDK解压后,加上编译过程中的中间文件,最终会占用接近80GB的空间。所以建议给虚拟机分配至少120GB的硬盘空间,编译目录的路径也千万不要包含中文。
安装好Ubuntu系统后,第一件事就是更新软件源并安装编译所需的依赖库。打开终端,依次执行以下命令:
sudo apt-get update sudo apt-get upgrade更新系统后,安装编译SDK必需的软件包。这一长串命令看起来多,但都是编译内核、uboot、根文件系统所必需的基础库和工具。
sudo apt-get install git ssh make gcc libssl-dev liblz4-tool expect \ g++ patchelf chrpath gawk texinfo chrpath diffstat binfmt-support \ qemu-user-static live-build bison flex fakeroot cmake gcc-multilib \ g++-multilib unzip device-tree-compiler ncurses-dev一条命令粘贴进去,回车,等待安装完成即可。如果你的网络环境特殊,可能会遇到个别包下载失败,多试几次或者换个软件源一般就能解决。
1.2 获取并解压SDK源码
泰山派的Linux SDK存放在立创官方提供的网盘里。你需要去立创开发板官网的“下载中心”,找到百度网盘链接,在第05章.【立创·泰山派】系统SDK->【SDK】Linux目录下,找到名为tspi_linux_sdk_xxxxxxxx.tar.gz的文件(xxxxxxxx是日期,如20230916),把它下载下来。
接下来,把这个巨大的压缩包上传到你的Ubuntu虚拟机里。可以用SFTP、共享文件夹或者直接拖拽(如果虚拟机工具支持)。假设我放到了用户主目录下的tspi文件夹里。
进入该目录,执行解压命令:
cd ~/tspi tar -zxvf tspi_linux_sdk_20230916.tar.gz这个解压过程会比较久,因为文件很大。解压完成后,你会得到一个同名的目录tspi_linux_sdk_20230916,这就是我们所有工作的根目录。
1.3 认识SDK目录结构
进入SDK根目录,用ls命令看看里面都有什么:
cd tspi_linux_sdk_20230916 ls你会看到一堆文件夹,我来给你简单介绍一下它们都是干嘛用的,这样后面操作时心里有数:
device/rockchip/:这是板级配置的核心目录!里面存放着不同芯片和开发板的配置文件。我们泰山派RK3566的配置文件BoardConfig-rk3566-tspi-v10.mk就在这里的rk356x/子目录下。kernel/:Linux内核的源代码,基于 kernel 4.4 或 4.19。u-boot/:U-Boot引导程序的源代码。buildroot/:一种轻量级的根文件系统构建工具,我们默认用它来制作根文件系统。debian/和yocto/:另外两种根文件系统选项,供高级用户选择。rockdev/:编译成功后,所有打包好的固件镜像(如update.img)都会输出到这个目录。prebuilts/:存放着交叉编译工具链,编译时自动调用。build.sh:最重要的编译脚本,我们后面绝大部分操作都靠它。mkfirmware.sh:固件打包脚本,将编译好的各部分打包成完整镜像。
了解完目录结构,我们就可以开始配置和编译了。
2. 配置与编译Buildroot系统
泰山派SDK支持多种根文件系统,最常用、最方便的是Buildroot。我们就从它开始。
2.1 设置板级配置
在编译之前,必须告诉SDK:“我要编译的是泰山派RK3566开发板的系统”。这步叫做板级配置。SDK提供了两种方法,任选其一即可。
方法一:直接指定配置文件(推荐)在SDK根目录下,运行以下命令,直接指向泰山派的配置文件:
./build.sh device/rockchip/rk356x/BoardConfig-rk3566-tspi-v10.mk方法二:使用菜单选择运行以下命令,会弹出一个交互式菜单:
./build.sh lunch你会看到一系列板级配置选项,找到对应BoardConfig-rk3566-tspi-v10.mk的序号(比如可能是3),输入序号并按回车。
配置完成后,怎么验证是否生效呢?可以运行一个查看内核编译帮助的命令:
./build.sh -h kernel如果输出的信息中包含了“tspi”相关的字样,就说明板级配置已经成功加载了。
2.2 选择根文件系统类型
接下来,我们需要设置环境变量,告诉SDK我们使用Buildroot来构建根文件系统。在终端中执行:
export RK_ROOTFS_SYSTEM=buildroot这个命令只在当前终端会话中有效。如果你关闭了终端,下次编译前需要重新执行一次。你也可以把它写到~/.bashrc文件末尾,让它永久生效。
2.3 执行全自动编译
最激动人心的时刻来了——开始编译!SDK提供了一个非常方便的全编译命令:
./build.sh all这个命令会按照顺序,自动编译U-Boot、Linux内核和Buildroot根文件系统。这是第一次编译的标准流程。
提示:第一次运行
./build.sh all时,脚本可能会让你选择电源管理芯片的型号。请根据你的泰山派开发板硬件版本,选择正确的选项(通常教程或板子丝印上会有说明)。如果选错,可能导致板子无法正常开机。
编译过程非常漫长,取决于你的电脑性能,可能需要一两个小时甚至更久。期间终端会滚动大量的编译信息,只要没有出现红色的error提示,就耐心等待。编译成功最后会看到相关的成功提示。
2.4 固件打包
./build.sh all命令完成后,只是生成了各个独立的组件(如u-boot.img,boot.img等)。我们还需要把它们打包成一个可以在rockdev目录下找到的完整固件集。执行打包命令:
./mkfirmware.sh打包速度很快。完成后,进入rockdev目录查看成果:
cd rockdev ls -l你应该能看到如下这些重要的镜像文件:
| 文件名称 | 说明 |
|---|---|
MiniLoaderAll.bin | 瑞芯微芯片的一级引导程序 |
uboot.img | U-Boot引导程序镜像 |
boot.img | 包含内核和设备树的启动镜像 |
rootfs.img | Buildroot根文件系统镜像 |
misc.img,oem.img,userdata.img | 其他分区镜像 |
parameter.txt | 分区表文件 |
update.img | 所有镜像打包而成的完整升级固件 |
其中,update.img就是我们可以直接使用瑞芯微工具(RKDevTool)进行“一键烧录”的完整包。
2.5 如何单独编译某个模块
在后续开发中,如果你只修改了内核某个驱动,或者只改了U-Boot,不需要每次都执行耗时的./build.sh all。SDK支持模块化单独编译。
单独编译U-Boot:
./build.sh uboot单独编译Linux内核:
./build.sh kernel单独编译Buildroot根文件系统:
./build.sh rootfs单独编译Recovery(恢复模式,非必需):
./build.sh recovery每次单独编译某个模块后,都必须重新执行./mkfirmware.sh来打包,新的改动才会整合到rockdev目录下的镜像文件中。
3. 编译Debian系统
如果你更喜欢使用Debian这种更接近桌面版Linux的发行版作为根文件系统,泰山派SDK也提供了支持。切换起来非常简单。
3.1 切换系统类型并编译
首先,将环境变量改为debian:
export RK_ROOTFS_SYSTEM=debian然后,同样执行全自动编译和打包命令:
./build.sh all ./mkfirmware.sh流程和编译Buildroot完全一样。编译完成后,rockdev/rootfs.img就变成了Debian系统的镜像,update.img也相应更新了。
4. 制作自定义Ubuntu根文件系统
有时候,Buildroot或Debian预置的软件不能满足你的需求,你可能想从头制作一个更精简或更个性化的Ubuntu根文件系统。这里我介绍手动制作Ubuntu 18.04根文件系统的方法。
4.1 准备工作
首先,在你的Ubuntu编译机上安装模拟器工具:
sudo apt-get install qemu-user-static然后,下载Ubuntu Base的最小根文件系统:
wget http://cdimage.ubuntu.com/ubuntu-base/releases/18.04/release/ubuntu-base-18.04.5-base-arm64.tar.gz创建一个工作目录并解压:
mkdir ubuntu_rootfs && cd ubuntu_rootfs mkdir temp sudo tar -xpf ../ubuntu-base-18.04.5-base-arm64.tar.gz -C temp/4.2 使用chroot进入“目标系统”
为了能在这个为ARM架构准备的根文件系统里安装软件,我们需要用chroot命令“切换”进去,并用qemu-aarch64-static来模拟ARM环境。
复制必要的文件:
sudo cp -b /etc/resolv.conf temp/etc/resolv.conf # 复制网络配置 sudo cp /usr/bin/qemu-aarch64-static temp/usr/bin/ # 复制模拟器为了方便地挂载和卸载,我们创建一个脚本ch-mount.sh:
#!/bin/bash function mnt() { echo "MOUNTING" sudo mount -t proc /proc ${2}/proc sudo mount -t sysfs /sys ${2}/sys sudo mount -o bind /dev ${2}/dev sudo chroot ${2} } function umnt() { echo "UNMOUNTING" sudo umount ${2}/proc sudo umount ${2}/sys sudo umount ${2}/dev } if [ "$1" == "-m" ] && [ -n "$2" ] ; then mnt $1 $2 elif [ "$1" == "-u" ] && [ -n "$2" ]; then umnt $1 $2 else echo "Usage: $0 -m /path/to/rootfs OR $0 -u /path/to/rootfs" fi给脚本添加执行权限并进入chroot环境:
sudo chmod +x ch-mount.sh sudo ./ch-mount.sh -m temp执行完最后一条命令,你的终端提示符就变成了root@hostname:/#,这意味着你已经“进入”了那个ARM的根文件系统。
4.3 定制你的Ubuntu系统
现在,你可以像在普通的Ubuntu系统里一样操作了。首先更新软件源并升级:
apt-get update apt-get upgrade然后,安装你需要的任何软件包。例如,安装一些基础工具和桌面环境:
# 基础工具 apt-get install vim git ssh net-tools iputils-ping # 如果你需要图形界面(注意:这会显著增加镜像大小) apt-get install xubuntu-desktop你还可以创建新用户、设置密码、配置网络等。完成所有定制后,输入exit退出chroot环境,然后卸载虚拟文件系统:
exit sudo ./ch-mount.sh -u temp4.4 生成镜像文件
最后,将我们定制好的temp目录制作成.img镜像文件。首先查看定制后系统的大小:
sudo du -sh temp假设大小是3.5G,我们创建一个稍大一点的空白镜像文件,格式化为ext4,再将文件复制进去:
# 创建一个6GB的空白镜像 (bs=1M count=6000) dd if=/dev/zero of=linuxroot.img bs=1M count=6000 # 格式化为ext4文件系统 mkfs.ext4 linuxroot.img # 挂载并复制文件 mkdir rootfs sudo mount linuxroot.img rootfs/ sudo cp -rfp temp/* rootfs/ sudo umount rootfs/ # 检查并压缩镜像到实际大小 e2fsck -p -f linuxroot.img resize2fs -M linuxroot.img现在得到的linuxroot.img就是你自定义的Ubuntu根文件系统镜像了。
5. 烧录与下载
编译和制作好各种镜像后,最后一步就是烧录到开发板。
5.1 烧录分散镜像
如果你使用rockdev目录下的单个镜像文件(如uboot.img,boot.img,rootfs.img)进行烧录,需要使用瑞芯微的RKDevTool工具。
你需要从立创官网下载中心获取泰山派对应的配置文件Tspi_Linux_config.cfg。在RKDevTool中导入这个配置文件,然后将工具中每个分区镜像的路径,修改为你本地rockdev目录下对应文件的绝对路径。
特别注意:如果你使用了自制的Ubuntu根文件系统(
linuxroot.img),在配置RKDevTool时,需要将rootfs分区对应的路径指向你制作的linuxroot.img文件,而不是SDK编译生成的rootfs.img。
5.2 烧录统一固件
如果你希望烧录过程更简单,可以使用打包好的update.img。这个文件包含了所有分区。你只需要在RKDevTool中选择“升级固件”模式,然后加载这一个update.img文件即可。
如果在rockdev目录下没有找到update.img,或者你单独编译模块后需要更新它,可以在SDK根目录运行:
./build.sh updateimg这个命令会基于rockdev目录下最新的各个镜像,重新生成一个完整的update.img文件。
好了,以上就是从零开始编译泰山派RK3566开发板Linux系统的完整流程。看起来步骤不少,但实际操作一遍后就会发现,主线流程(准备环境 -> 配置 ->./build.sh all->./mkfirmware.sh)非常清晰。遇到问题别慌,多看看终端输出的错误信息,大部分都是依赖库缺失或者路径问题。祝你编译顺利!