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 本章知识体系总览
下面这张图,把本章的核心内容串起来了。你可以看到,从工具链到服务器,再到串口和源码,每一步都是环环相扣的。
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上卡了一整天,最后发现是防火墙没关。嗯,这种低级错误,犯一次就够了。