2、开发环境搭建:安装交叉编译工具链、配置TFTP/NFS服务器、搭建串口终端环境
说实话,U-Boot移植这件事,很多人一上来就啃代码,结果编译都过不了。为啥?环境没搭好。我见过太多新手卡在这一步,折腾一整天连个Hello World都跑不起来。所以咱们先把地基打牢,后面才走得顺。
本章核心目标:让你的PC能编译出目标板能跑的U-Boot,并且能通过网络和串口跟板子通信。说白了,就是打通「PC → 开发板」这条双向通道。
2.1 安装交叉编译工具链
交叉编译,顾名思义,就是在PC上编译出ARM(或其他架构)能执行的代码。你想想看,你的开发板跑不了Linux桌面,总不能在上面装个GCC吧?所以得靠PC代劳。
我个人习惯用 Linaro 提供的工具链,稳定、干净。以ARM Cortex-A7为例,我推荐 gcc-arm-linux-gnueabihf 这个版本。
安装步骤:
- 下载工具链:
wget https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz - 解压到
/opt/目录:sudo tar -xvf gcc-linaro-*.tar.xz -C /opt/ - 添加环境变量:编辑
~/.bashrc,加入export PATH=$PATH:/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin - 使生效:
source ~/.bashrc - 验证:
arm-linux-gnueabihf-gcc --version
小技巧:我曾经在某个项目里,因为工具链版本太新,导致U-Boot编译出来的镜像在旧版芯片上跑不起来。后来发现是编译器默认开启了某些新指令集。所以我的建议是:先查芯片手册,再选工具链版本,别盲目追新。
如果你用的是Ubuntu 20.04及以上,也可以直接用apt安装:
sudo apt-get install gcc-arm-linux-gnueabihf
但要注意,apt源里的版本可能比较旧。我个人更推荐手动安装,可控性更强。
2.2 配置TFTP服务器
TFTP是U-Boot最常用的文件传输方式。为什么不用FTP?因为U-Boot的协议栈很精简,TFTP刚好够用,而且实现简单。你想想看,U-Boot才几百KB,塞个完整的TCP/IP协议栈太奢侈了。
安装与配置:
- 安装tftp-hpa:
sudo apt-get install tftp-hpa tftpd-hpa - 创建TFTP根目录:
sudo mkdir -p /tftpboot - 修改权限:
sudo chmod 777 /tftpboot - 编辑配置文件
/etc/default/tftpd-hpa:
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure --create"
- 重启服务:
sudo systemctl restart tftpd-hpa - 验证:在
/tftpboot下放个测试文件,然后在另一台机器上tftp localhost -c get test.txt
避坑指南:我曾经在配置TFTP时,死活连不上,查了半天发现是防火墙把69端口封了。所以记得检查:sudo ufw status,如果防火墙开着,就加一条规则:sudo ufw allow 69/udp。另外,TFTP根目录的权限一定要给够,不然U-Boot下载文件时会报「Access violation」。
2.3 配置NFS服务器
NFS比TFTP高级一点,它能让开发板直接挂载PC上的文件系统。调试内核或应用程序时特别方便——改完代码,直接在板子上运行,不用反复烧写。
安装与配置:
- 安装nfs-kernel-server:
sudo apt-get install nfs-kernel-server - 创建共享目录:
sudo mkdir -p /srv/nfs/rootfs - 编辑
/etc/exports,添加:
/srv/nfs/rootfs *(rw,sync,no_subtree_check,no_root_squash)
- 重启NFS服务:
sudo systemctl restart nfs-kernel-server - 验证:在板子上执行
mount -t nfs -o nolock 192.168.1.100:/srv/nfs/rootfs /mnt
个人经验:我习惯把内核镜像、设备树、根文件系统都放在NFS共享目录里。调试时,U-Boot通过TFTP加载内核,然后内核通过NFS挂载根文件系统。这样改完驱动,只需重新编译内核,重启板子就能看到效果,效率极高。
这里有个细节:no_root_squash 这个选项很重要。如果不加,板子上的root用户会被映射成nobody,导致很多操作权限不足。嗯,这个坑我踩过。
2.4 搭建串口终端环境
串口是嵌入式开发的生命线。没有它,你连U-Boot的启动日志都看不到。我常用的工具有两个:minicom 和 screen。minicom功能更全,screen更轻量。
使用minicom:
- 安装:
sudo apt-get install minicom - 配置:
sudo minicom -s,进入「Serial port setup」 - 设置参数:
A - Serial Device: /dev/ttyUSB0
B - Lockfile Location: /var/lock
E - Bps/Par/Bits: 115200 8N1
F - Hardware Flow Control: No
G - Software Flow Control: No
- 保存为默认配置:选择「Save setup as dfl」
- 退出并连接:
sudo minicom
使用screen:
sudo screen /dev/ttyUSB0 115200
退出screen:按 Ctrl+A,然后按 K,再按 Y 确认。
注意:串口设备名可能不一样。插上USB转串口后,用 dmesg | grep tty 查看。我遇到过有的板子是 /dev/ttyUSB0,有的是 /dev/ttyACM0。另外,千万别用USB 3.0的接口,有些USB转串口芯片在3.0下会丢数据。这个坑我帮好几个同事填过。
2.5 环境验证:打通PC到开发板的链路
环境搭好了,怎么知道能不能用?我一般按这个顺序验证:
- 串口通:板子上电,串口终端能看到U-Boot启动信息
- 网络通:在U-Boot命令行执行
ping 192.168.1.100,能ping通PC - TFTP通:在U-Boot执行
tftp 0x82000000 u-boot.bin,能下载成功 - NFS通:在内核启动参数中指定NFS根文件系统,能正常挂载
这三条链路都通了,你的开发环境就算搭建完成了。后面移植U-Boot时,编译、下载、调试一气呵成,不会在环境问题上浪费时间。
总结一下:交叉编译工具链是「编译工具」,TFTP是「下载工具」,NFS是「调试工具」,串口是「观察工具」。四者缺一不可。我建议你把本章的配置步骤写成脚本,下次换项目时直接跑一遍,省时省力。