2. 开发环境搭建:交叉编译工具链、TFTP/NFS与串口终端

做 Rockchip 平台驱动开发,第一步就是把“窝”搭好。我见过不少新手,工具链版本不对、服务器没配好,折腾半天连个 hello world 都跑不起来。说白了,环境搭得顺不顺,直接决定后面调试的心情。

这一章,我带你把三样东西搞定:交叉编译工具链、TFTP/NFS 服务器、串口终端。这三样是嵌入式开发的“三件套”,缺一不可。

核心思路:在 x86 主机上编译 ARM 代码,通过网络把文件传给开发板,再用串口看输出。就这么简单。

开发环境搭建核心流程 x86 主机 (Ubuntu) gcc-arm-9.2 交叉编译 TFTP 服务器 (文件传输) NFS 服务器 (根文件系统) Rockchip 开发板 U-Boot 加载内核 Linux 内核启动 NFS 挂载根文件系统 串口终端 (minicom) 调试三件套 ① 交叉编译代码 ② TFTP/NFS 传文件 ③ 串口看输出

2.1 交叉编译工具链安装

为什么需要交叉编译?因为你的开发板是 ARM 架构,而你的电脑是 x86 架构。在 x86 上编译出来的程序,ARM 芯片不认识。所以我们需要一个“翻译官”——交叉编译工具链。

我推荐用 Linaro 官方发布的 gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu。这个版本稳定,兼容性好,Rockchip 的 SDK 基本都支持它。

安装步骤

  1. 下载工具链:从 Linaro 官网或 ARM 官方仓库下载。
  2. 解压到指定目录:我个人习惯放在 /opt/toolchains/ 下。
  3. 配置环境变量:把工具链的 bin 目录加到 PATH 中。
  4. 验证安装:运行 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 环境验证

搭好环境后,跑一个简单的测试,确保所有环节都通。

  1. 编译测试:写一个 hello.c,用交叉编译器编译。
  2. TFTP 测试:把编译好的文件放到 /srv/tftp,在开发板上下载。
  3. NFS 测试:挂载 NFS 目录,确认能读写。
  4. 串口测试:上电看启动日志,确认串口正常。
// 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 让你通过网络传文件和挂载根文件系统,串口终端让你看到开发板的输出。这三样东西配合好,开发效率能翻倍。