3. 搭建U-Boot开发环境:工具链、服务器与串口终端

做嵌入式开发,环境搭建是第一步。这一步要是没弄好,后面调试起来会非常痛苦。我个人习惯先把整个环境理清楚,再动手。说白了,就是让PC、开发板和网络之间能正常“对话”。

这一章,我们就把交叉编译工具链、TFTP/NFS服务器、串口终端和U-Boot源码全部搞定。嗯,内容有点多,但每一步都很关键。

本章核心目标: 在PC上搭建一套完整的U-Boot开发环境,确保能编译U-Boot、通过网络加载镜像、并通过串口与开发板交互。

3.1 安装交叉编译工具链(ARM GCC)

交叉编译,就是在PC上编译出能在ARM开发板上运行的程序。你想想看,PC是x86架构,开发板是ARM架构,不用交叉编译工具链,根本跑不起来。

我推荐使用Linaro提供的GCC工具链,稳定且社区支持好。当然,你也可以用ARM官方提供的GNU Arm Embedded Toolchain。

3.1.1 下载与安装

以Linaro的gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf为例,下载后解压到/opt目录:

# 下载
wget https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz

# 解压
sudo tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz -C /opt/

# 添加环境变量
export PATH=/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin:$PATH

记得把环境变量加到~/.bashrc里,不然每次开终端都要重新export。我曾经因为忘记加环境变量,编译时一直报“command not found”,排查了半天才发现是路径没配好。

3.1.2 验证安装

运行以下命令,确认工具链能正常工作:

arm-linux-gnueabihf-gcc --version

如果看到版本信息,说明安装成功。这里有个小技巧:编译U-Boot时,建议使用arm-linux-gnueabihf-前缀的工具链,因为U-Boot默认支持这个前缀。如果你用其他前缀,需要修改U-Boot的Makefile配置。

避坑指南: 我曾经用arm-none-eabi-工具链编译U-Boot,结果链接时一堆错误。后来才发现,U-Boot需要支持浮点运算的arm-linux-gnueabihf-工具链。所以,别偷懒,选对工具链很重要。

3.2 配置TFTP/NFS服务器

TFTP用于通过网络下载U-Boot镜像或内核镜像,NFS则用于挂载根文件系统。这两个服务在调试阶段几乎是必备的。

3.2.1 安装与配置TFTP服务器

以Ubuntu为例,安装tftpd-hpa:

sudo apt-get install tftpd-hpa tftp-hpa

配置文件在/etc/default/tftpd-hpa,我习惯这样设置:

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure -c -s"

创建/tftpboot目录并设置权限:

sudo mkdir /tftpboot
sudo chmod 777 /tftpboot

重启服务:

sudo systemctl restart tftpd-hpa

测试一下:在/tftpboot下放一个文件,然后在另一个终端用tftp localhost连接,能下载就说明配置成功。

3.2.2 安装与配置NFS服务器

安装nfs-kernel-server:

sudo apt-get install nfs-kernel-server

编辑/etc/exports,添加共享目录:

/nfsroot 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)

创建/nfsroot目录:

sudo mkdir /nfsroot
sudo chmod 777 /nfsroot

重启NFS服务:

sudo systemctl restart nfs-kernel-server

注意: 开发板和PC必须在同一网段。我遇到过开发板能ping通PC,但挂载NFS时一直超时。后来发现是防火墙没关。建议先关掉防火墙测试:sudo ufw disable。

3.3 搭建串口终端环境(minicom/picocom)

串口是嵌入式开发中最常用的调试接口。没有串口,你连U-Boot启动信息都看不到。我个人更喜欢用picocom,因为它轻量、配置简单。

3.3.1 安装picocom

sudo apt-get install picocom

连接开发板:

picocom -b 115200 /dev/ttyUSB0

参数说明:-b是波特率,/dev/ttyUSB0是串口设备。如果开发板用的是USB转串口,设备名通常是ttyUSB0或ttyACM0。

3.3.2 配置minicom

如果你习惯用minicom,先安装:

sudo apt-get install minicom

配置:

sudo minicom -s

进入“Serial port setup”菜单,设置:

  • Serial Device: /dev/ttyUSB0
  • Bps/Par/Bits: 115200 8N1
  • Hardware Flow Control: No
  • Software Flow Control: No

保存为默认配置,下次直接运行minicom即可。

小技巧: 如果串口没反应,先检查设备权限:sudo chmod 666 /dev/ttyUSB0。或者把用户加到dialout组:sudo usermod -a -G dialout $USER。我刚开始用的时候,总是忘记加权限,结果串口死活打不开。

3.4 获取U-Boot源码

U-Boot源码可以从官方仓库获取。我建议使用git克隆,这样方便切换分支和查看历史。

git clone https://source.denx.de/u-boot/u-boot.git

如果你想针对特定开发板,可以切换到对应的分支或标签。比如,我用的开发板是qemu_arm,可以这样:

cd u-boot
git checkout v2023.04

查看支持的开发板配置:

ls configs/ | grep qemu_arm

你会看到类似qemu_arm_defconfig的文件,这就是我们需要的默认配置。

为什么用git? 因为你可以随时回退到某个版本,或者查看代码变更。我曾经因为U-Boot新版本有bug,直接回退到旧版本,几分钟就解决了问题。如果用压缩包,还得重新下载解压,太麻烦。

3.5 本章知识体系总览

下面这张图,把本章的核心内容串起来了。你可以看到,从工具链到服务器,再到串口和源码,每一步都是环环相扣的。

U-Boot开发环境搭建知识体系 U-Boot开发环境搭建知识体系 开发环境搭建 交叉编译工具链 TFTP/NFS服务器 串口终端环境 U-Boot源码获取 Linaro GCC ARM GCC TFTP NFS picocom minicom git clone 分支切换 说明: 四个部分缺一不可。工具链负责编译,服务器负责传输,串口负责交互,源码是基础。

3.6 环境验证清单

搭建完成后,建议按下面的清单逐一验证。别嫌麻烦,这一步能帮你省下后面大量的调试时间。

验证项 命令/操作 预期结果
工具链 arm-linux-gnueabihf-gcc --version 显示版本信息
TFTP tftp localhost -c get testfile 成功下载文件
NFS sudo mount -t nfs localhost:/nfsroot /mnt 成功挂载
串口 picocom -b 115200 /dev/ttyUSB0 进入终端,能看到开发板输出
U-Boot源码 ls configs/ | grep your_board 看到对应的defconfig文件

重要提醒: 如果某个验证项失败,不要急着往下走。回头检查配置,确保每一步都正确。我曾经在TFTP上卡了一整天,最后发现是防火墙没关。嗯,这种低级错误,犯一次就够了。