2. 开发环境搭建:交叉编译工具链、TFTP/NFS与串口终端
做 Rockchip 平台驱动开发,第一步就是把“窝”搭好。我见过不少新手,工具链版本不对、服务器没配好,折腾半天连个 hello world 都跑不起来。说白了,环境搭得顺不顺,直接决定后面调试的心情。
这一章,我带你把三样东西搞定:交叉编译工具链、TFTP/NFS 服务器、串口终端。这三样是嵌入式开发的“三件套”,缺一不可。
核心思路:在 x86 主机上编译 ARM 代码,通过网络把文件传给开发板,再用串口看输出。就这么简单。
2.1 交叉编译工具链安装
为什么需要交叉编译?因为你的开发板是 ARM 架构,而你的电脑是 x86 架构。在 x86 上编译出来的程序,ARM 芯片不认识。所以我们需要一个“翻译官”——交叉编译工具链。
我推荐用 Linaro 官方发布的 gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu。这个版本稳定,兼容性好,Rockchip 的 SDK 基本都支持它。
安装步骤
- 下载工具链:从 Linaro 官网或 ARM 官方仓库下载。
- 解压到指定目录:我个人习惯放在
/opt/toolchains/下。 - 配置环境变量:把工具链的 bin 目录加到
PATH中。 - 验证安装:运行
aarch64-none-linux-gnu-gcc --version查看版本。
# 下载(以 2019.12 版本为例)
wget https://developer.arm.com/-/media/Files/downloads/gnu-a/9.2-2019.12/binrel/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz
# 解压
sudo tar -xvf gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz -C /opt/toolchains/
# 配置环境变量(加到 ~/.bashrc 或 ~/.zshrc)
export PATH=/opt/toolchains/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/bin:$PATH
# 使生效
source ~/.bashrc
# 验证
aarch64-none-linux-gnu-gcc --version
小技巧:如果你同时做 32 位和 64 位开发,可以装两个工具链。我一般用 aarch64-none-linux-gnu- 做 64 位,arm-none-linux-gnueabihf- 做 32 位。注意别搞混了。
避坑指南:我曾经遇到过工具链版本太新,导致内核编译报错的情况。Rockchip 的 BSP 通常对工具链版本有要求,建议先用官方推荐的版本。如果非要用新版,记得先测试一下。
2.2 TFTP 服务器配置
TFTP 用来在开发板和主机之间传文件。说白了,就是 U-Boot 启动时,通过网络从主机下载内核镜像和设备树。为什么不用 U 盘?因为网络快,而且不用来回插拔。
安装与配置
# 安装 TFTP 服务器
sudo apt-get install tftpd-hpa
# 配置(编辑 /etc/default/tftpd-hpa)
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp" # 文件存放目录
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure --create"
# 创建目录并设置权限
sudo mkdir -p /srv/tftp
sudo chmod 777 /srv/tftp
# 重启服务
sudo systemctl restart tftpd-hpa
sudo systemctl enable tftpd-hpa
配置好之后,把内核镜像 Image 和设备树 .dtb 文件放到 /srv/tftp 目录下。然后在 U-Boot 里设置:
# U-Boot 命令行
setenv serverip 192.168.1.100 # 主机 IP
setenv ipaddr 192.168.1.10 # 开发板 IP
tftp 0x02080000 Image
tftp 0x08300000 rk3399-evb.dtb
注意:TFTP 没有认证和加密,只适合在局域网内使用。别在生产环境暴露出去。
2.3 NFS 服务器配置
NFS 用来挂载根文件系统。开发阶段,你肯定不想每次修改文件系统都重新烧写。用 NFS,主机上的目录直接变成开发板的根目录,改完就能用。
安装与配置
# 安装 NFS 服务器
sudo apt-get install nfs-kernel-server
# 配置(编辑 /etc/exports)
/srv/nfs/rootfs *(rw,sync,no_subtree_check,no_root_squash)
# 创建根文件系统目录
sudo mkdir -p /srv/nfs/rootfs
# 导出并重启服务
sudo exportfs -a
sudo systemctl restart nfs-kernel-server
在 U-Boot 里设置内核启动参数:
# U-Boot 命令行
setenv bootargs 'console=ttyS2,1500000 root=/dev/nfs nfsroot=192.168.1.100:/srv/nfs/rootfs rw ip=192.168.1.10'
个人经验:我习惯把根文件系统放在 /srv/nfs/rootfs 下,这样多个项目可以共用。每次编译完 busybox 或 buildroot,直接拷贝过去就行。
避坑指南:我曾经遇到过 NFS 挂载失败,原因是防火墙没关。如果你发现挂载不上,先检查 sudo ufw status,或者直接关掉防火墙试试。
2.4 串口终端使用
串口是嵌入式开发者的“眼睛”。没有显示器、没有键盘,全靠串口看输出、输命令。我推荐用 minicom(Linux 下)或 putty(Windows 下)。
minicom 配置(Linux)
# 安装 minicom
sudo apt-get install minicom
# 配置
sudo minicom -s
# 进入配置菜单后:
# 1. 选择 "Serial port setup"
# 2. 设置 A - Serial Device: /dev/ttyUSB0(根据实际设备修改)
# 3. 设置 E - Bps/Par/Bits: 1500000 8N1(Rockchip 常用波特率)
# 4. 设置 F - Hardware Flow Control: No
# 5. 设置 G - Software Flow Control: No
# 6. 保存为默认配置:Save setup as dfl
连接开发板后,上电就能看到 U-Boot 和内核的启动日志。按 Ctrl+A 然后 Z 可以查看 minicom 的帮助菜单。
putty 配置(Windows)
putty 更简单,图形化界面。关键参数:
| 参数 | 值 |
|---|---|
| Connection type | Serial |
| Serial line | COM3(根据实际端口修改) |
| Speed | 1500000 |
| Data bits | 8 |
| Stop bits | 1 |
| Parity | None |
| Flow control | None |
小技巧:如果你用 USB 转串口,Linux 下设备名通常是 /dev/ttyUSB0 或 /dev/ttyACM0。可以用 dmesg | grep tty 查看插上后的设备名。
避坑指南:我曾经遇到过串口乱码,原因是波特率没设对。Rockchip 的默认波特率是 1500000,但有些板子可能是 115200。不确定的话,看 U-Boot 源码里的 CONFIG_BAUDRATE 定义。
2.5 环境验证
搭好环境后,跑一个简单的测试,确保所有环节都通。
- 编译测试:写一个 hello.c,用交叉编译器编译。
- TFTP 测试:把编译好的文件放到
/srv/tftp,在开发板上下载。 - NFS 测试:挂载 NFS 目录,确认能读写。
- 串口测试:上电看启动日志,确认串口正常。
// hello.c
#include <stdio.h>
int main() {
printf("Hello, Rockchip!\n");
return 0;
}
// 编译
aarch64-none-linux-gnu-gcc -o hello hello.c
// 放到 TFTP 目录
cp hello /srv/tftp/
// 在开发板上(通过串口)
tftp -g -r hello 192.168.1.100
chmod +x hello
./hello
如果看到 Hello, Rockchip! 打印出来,恭喜你,环境搭好了。
总结一下:交叉编译工具链让你能在 x86 上编译 ARM 代码,TFTP/NFS 让你通过网络传文件和挂载根文件系统,串口终端让你看到开发板的输出。这三样东西配合好,开发效率能翻倍。