3、嵌入式Linux开发环境搭建:安装Ubuntu主机系统、配置交叉编译工具链(aarch64-linux-gnu-gcc)、安装必要依赖包、创建共享目录、配置TFTP/NFS服务、使用串口终端(minicom/picocom)连接开发板

RK3588的U-Boot移植与Buildroot集成,本质上是在主机端完成代码编辑、交叉编译、镜像打包,再通过串口、网络或存储介质将产物部署到目标板上的过程。因此,主机开发环境的完备程度直接决定了后续调试效率。本章将围绕Ubuntu主机系统安装、aarch64交叉编译工具链配置、依赖包安装、共享目录创建、TFTP/NFS服务搭建以及串口终端连接六个核心环节展开,帮助读者构建一套可复现、可维护的嵌入式Linux开发底座。

RK3588 U-Boot移植与Buildroot集成 — 开发环境搭建链路 Ubuntu 主机系统 Ubuntu 20.04/22.04 LTS x86_64 架构 ≥ 200GB 磁盘 / 16GB 内存 交叉编译工具链 aarch64-linux-gnu-gcc gcc-arm-10.3 / 11.2 支持 C/C++/GAS 必要依赖包 build-essential / bison / flex libssl-dev / u-boot-tools python3-dev / swig 网络服务 TFTP (U-Boot) NFS (内核/根文件) Samba (共享目录) 安装 依赖 服务 共享目录结构 ~/rk3588/{uboot, kernel, buildroot, output} ~/tftpboot / ~/nfsroot 串口终端 minicom / picocom /dev/ttyUSB0, 1500000 baud RK3588 开发板 UART0 调试串口 (GND/TX/RX) USB-C 供电 / 网口 / SD卡 开发 UART 环境验证流程 1. 安装Ubuntu 系统更新/换源 2. 安装工具链 gcc-arm-10.3 3. 安装依赖 apt install 4. 配置服务 TFTP/NFS/Samba 5. 串口验证 minicom连接 aarch64-linux-gnu-gcc -v echo $PATH ping 192.168.1.100 minicom -D /dev/ttyUSB0 验证交叉编译器版本 确认工具链路径 测试网络连通性 进入U-Boot命令行

3.1 Ubuntu主机系统安装与基础配置

RK3588的U-Boot编译对主机系统有明确要求。推荐使用Ubuntu 20.04 LTS或22.04 LTS的x86_64版本,原因在于:Rockchip官方SDK和Buildroot长期在这些版本上验证,且GCC 9/11系列交叉编译器与Ubuntu的glibc版本兼容性最佳。若使用更新的Ubuntu 24.04,虽然可以安装,但可能遇到Python版本过高导致Buildroot的某些脚本不兼容的问题。

安装Ubuntu时,建议采用最小化安装(Minimal Installation),避免预装大量无关软件包。磁盘分区时,为/home单独划分至少200GB空间,因为RK3588的完整SDK(含U-Boot、Kernel、Buildroot)解压后约需80GB,编译产物还会额外占用30-50GB。内存建议16GB起步,若使用虚拟机,需开启嵌套虚拟化并分配至少4核CPU。

系统安装完成后,第一件事是更换软件源为国内镜像(如清华、阿里云),然后执行系统更新:

sudo apt update
sudo apt upgrade -y
sudo apt install -y vim git curl wget tree htop net-tools

对于虚拟机用户,建议安装open-vm-tools或qemu-guest-agent,便于文件拖拽和剪贴板共享。同时,关闭系统的自动休眠和屏幕锁定,避免长时间编译时主机进入睡眠状态导致编译中断。

经验提醒:若使用VMware Workstation,网络适配器选择“桥接模式”(Bridged),并勾选“复制物理网络连接状态”。这样开发板与主机处于同一网段,TFTP/NFS通信无需额外路由配置。若使用VirtualBox,则选择“桥接网卡”并指定实际物理网卡。

3.2 配置aarch64交叉编译工具链

RK3588是64位ARMv8-A架构处理器,主机端必须安装aarch64交叉编译工具链,才能在x86_64主机上编译出ARM64架构的U-Boot二进制。Rockchip官方推荐使用GCC 10.3或11.2版本的aarch64工具链,这两个版本在U-Boot 2021.07及以上版本中验证充分。

安装方式有两种:通过apt直接安装(版本较旧但稳定),或从ARM官网下载预编译工具链(版本较新)。对于U-Boot移植,推荐使用apt安装的gcc-arm-linux-gnueabihf或gcc-aarch64-linux-gnu,因为其与Ubuntu的库依赖兼容性最好。

# 方式一:apt安装(推荐)
sudo apt install -y gcc-aarch64-linux-gnu

# 方式二:ARM官网下载(版本更新)
wget https://developer.arm.com/-/media/Files/downloads/gnu/11.2-2022.02/binrel/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu.tar.xz
sudo tar -xJf gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu.tar.xz -C /opt/
export PATH=/opt/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/bin:$PATH

安装完成后,必须验证工具链是否正常工作:

aarch64-linux-gnu-gcc -v
# 输出应包含 "gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2)" 或类似信息

aarch64-linux-gnu-gcc -dumpmachine
# 输出应为 aarch64-linux-gnu

还需要确认工具链的库路径是否正确。U-Boot编译时会调用aarch64-linux-gnu-ld、aarch64-linux-gnu-objcopy等工具,这些工具必须与gcc版本匹配。若出现“cannot find -lgcc”错误,说明工具链的libgcc路径未正确配置。

风险提示:不要混用不同版本的aarch64工具链。例如,使用GCC 9编译U-Boot 2021.07可能产生告警,但使用GCC 12则可能因内联汇编语法变化导致编译失败。建议在~/.bashrc中固定工具链路径,并注释掉其他版本的工具链PATH。

3.3 安装必要依赖包

U-Boot和Buildroot的编译依赖大量主机端软件包。这些依赖分为三类:基础编译工具、U-Boot特有依赖、Buildroot特有依赖。遗漏任何一个都可能导致编译中断,且错误信息往往不直观。

依赖类别 软件包名称 用途说明
基础编译 build-essential, gcc, g++, make, cmake 主机端编译器和构建工具
U-Boot特有 bison, flex, libssl-dev, u-boot-tools, device-tree-compiler 设备树编译、镜像打包、加密支持
Buildroot特有 python3-dev, python3-setuptools, swig, libncurses5-dev, file, rsync Buildroot配置界面、Python脚本支持
网络服务 tftpd-hpa, nfs-kernel-server, samba TFTP/NFS/共享目录服务
串口工具 minicom, picocom, cu 串口终端连接开发板

一次性安装所有依赖包的命令如下:

sudo apt install -y build-essential gcc g++ make cmake \
  bison flex libssl-dev u-boot-tools device-tree-compiler \
  python3-dev python3-setuptools swig libncurses5-dev file rsync \
  tftpd-hpa nfs-kernel-server samba minicom picocom

安装完成后,建议执行一次dpkg -l | grep <package-name>确认关键包已正确安装。特别要注意libssl-dev的版本,U-Boot 2021.07及以上版本需要OpenSSL 1.1.x,若系统安装了OpenSSL 3.0,需额外安装libssl1.1兼容包。

3.4 创建共享目录与配置TFTP/NFS服务

共享目录是主机与开发板之间传输文件的基础。在U-Boot移植阶段,最常用的传输方式有两种:TFTP用于U-Boot加载内核镜像(如bootm命令从网络加载),NFS用于挂载根文件系统(开发阶段避免反复烧写eMMC)。

首先创建标准目录结构:

mkdir -p ~/rk3588/{uboot,kernel,buildroot,output}
mkdir -p ~/tftpboot
mkdir -p ~/nfsroot
chmod 777 ~/tftpboot ~/nfsroot

TFTP服务配置(/etc/default/tftpd-hpa):

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/<username>/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure --create"

NFS服务配置(/etc/exports):

/home/<username>/nfsroot 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)

配置完成后重启服务并验证:

sudo systemctl restart tftpd-hpa
sudo systemctl restart nfs-kernel-server
# 验证TFTP
tftp 192.168.1.100 -c get test.txt
# 验证NFS
sudo mount -t nfs 192.168.1.100:/home/<username>/nfsroot /mnt
实战场景:在U-Boot命令行中,使用TFTP加载内核镜像的典型流程为:
setenv serverip 192.168.1.100
setenv ipaddr 192.168.1.50
tftp 0x02000000 boot.img
bootm 0x02000000
若TFTP传输失败,优先检查主机防火墙(sudo ufw disable)和开发板网络配置(ping测试)。

3.5 使用串口终端连接开发板

RK3588开发板通常提供UART0作为调试串口,通过USB转TTL模块连接主机。连接时需注意:开发板串口电平为3.3V TTL,必须使用支持3.3V电平的USB转串口模块(如CP2102、CH340),严禁直接连接RS232电平。

连接线序为:开发板GND接模块GND,开发板TX接模块RX,开发板RX接模块TX。连接完成后,在主机端确认设备节点:

ls /dev/ttyUSB*  # 或 /dev/ttyACM*
dmesg | grep tty  # 查看内核日志确认设备识别

minicom配置(推荐使用):

sudo minicom -s
# 进入配置界面,选择 Serial port setup
# 设置 Serial Device: /dev/ttyUSB0
# 设置 Bps/Par/Bits: 1500000 8N1
# 关闭 Hardware Flow Control 和 Software Flow Control
# 保存为默认配置

picocom使用(更轻量):

sudo picocom -b 1500000 /dev/ttyUSB0
# 退出:Ctrl+A Ctrl+X

RK3588的U-Boot默认波特率为1500000,这是Rockchip平台的特殊设置。若使用115200波特率,U-Boot启动日志会显示乱码。连接成功后,上电开发板应能看到U-Boot启动日志,并进入命令行提示符Rockchip>。

常见误区:很多初学者在串口连接时忽略电平匹配,直接使用RS232转USB模块,导致开发板串口芯片烧毁。务必确认模块支持3.3V TTL电平。另外,若使用虚拟机,需将USB转串口设备直通到虚拟机(VMware:可移动设备→连接;VirtualBox:USB设备→添加)。

3.6 环境验证与排障案例

搭建完环境后,必须进行端到端验证,确保每个环节都可用。以下是一个完整的验证流程,以及一个典型的排障案例。

验证流程清单:

  1. 工具链验证:aarch64-linux-gnu-gcc -v,确认版本输出正常。
  2. 编译验证:编写一个简单的hello.c,使用交叉编译器编译,通过file命令确认输出为ARM64 ELF格式。
  3. 网络验证:开发板进入U-Boot后,执行ping 192.168.1.100,确认TFTP/NFS服务可达。
  4. 串口验证:上电后观察U-Boot日志完整输出,无乱码、无丢失。
  5. 共享目录验证:在主机~/tftpboot放置文件,开发板通过TFTP下载成功。

案例:TFTP传输超时排障

某次实验中,开发板执行tftp 0x02000000 boot.img后一直卡在“T FTP from server 192.168.1.100; Trying ...”,最终超时。初步排查过程如下:

  • 检查网络连通性:开发板执行ping 192.168.1.100,结果正常,排除物理链路问题。
  • 检查TFTP服务状态:主机执行systemctl status tftpd-hpa,服务正常。
  • 检查防火墙:sudo ufw status显示防火墙开启,且未放行UDP 69端口。
  • 解决方案:执行sudo ufw allow 69/udp,并重启TFTP服务。
  • 结果:再次执行TFTP下载,成功获取boot.img。

复盘经验:TFTP使用UDP 69端口,但实际数据传输使用随机高位端口。因此,仅放行69端口可能不够,最稳妥的方式是直接关闭防火墙(开发环境)或配置完整的UDP放行规则。

总结复盘:嵌入式开发环境搭建的核心是“可复现性”。建议将上述所有安装命令和配置写入一个setup_env.sh脚本,并纳入版本管理。这样,当更换主机或团队成员加入时,只需执行一条命令即可完成环境搭建,避免重复踩坑。