2. 开发环境搭建:交叉编译工具链安装、TFTP/NFS服务器配置、串口与ADB调试环境配置

做嵌入式开发,环境搭建是绕不开的第一道坎。很多新手上来就急着写代码,结果编译报错、烧录失败、串口没输出,折腾半天才发现是工具链没装对。我刚开始搞RK平台时也踩过这些坑,后来慢慢总结出一套相对稳妥的流程。这一章,我就把交叉编译、TFTP/NFS、串口和ADB这几个核心环节的搭建方法,掰开了讲清楚。

本章核心目标:在Ubuntu主机上搭建一套完整的RK平台开发环境,实现从源码编译到板端运行、调试的闭环。

2.1 交叉编译工具链安装

交叉编译,说白了就是在你的x86电脑上编译出能在ARM芯片上跑的程序。RK平台官方推荐使用Linaro GCC工具链,当然你也可以用Buildroot或Yocto自己构建,但说实话,对大多数场景来说,直接用官方预编译好的工具链最省事。

2.1.1 下载与解压

我习惯把工具链统一放在 /opt/toolchains/ 目录下,方便管理。RK3399、RK3568这类Cortex-A72/A53核的芯片,用 gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu 这个版本比较稳。

# 创建工具链目录
sudo mkdir -p /opt/toolchains
cd /opt/toolchains

# 下载(以aarch64为例)
wget https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz

# 解压
sudo tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz

# 添加环境变量(写入 ~/.bashrc)
export PATH=/opt/toolchains/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin:$PATH
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-

# 使生效
source ~/.bashrc

2.1.2 验证安装

装完别急着走,先验证一下。我见过有人路径配错了,编译时还在用系统自带的gcc,结果链接器报一堆莫名其妙的错误。

# 查看版本
aarch64-linux-gnu-gcc --version

# 编译一个简单测试程序
echo 'int main(){ return 0; }' > test.c
aarch64-linux-gnu-gcc -o test test.c
file test
# 输出应包含 "ELF 64-bit LSB executable, ARM aarch64"

小技巧:如果你同时维护多个RK平台(比如RK3288是32位,RK3399是64位),建议在 ~/.bashrc 里写个函数,一键切换工具链。我个人习惯用 alias rk32='export CROSS_COMPILE=arm-linux-gnueabihf-' 这种方式。

2.2 TFTP/NFS服务器配置

调试阶段,你肯定不想每次改个驱动都要重新烧录整个固件。TFTP用来快速下载内核和设备树,NFS用来挂载根文件系统,这两个服务配好了,开发效率能翻一倍。

2.2.1 TFTP服务器

TFTP是个轻量级的文件传输协议,UDP端口69。U-Boot里直接 tftp 0x02000000 kernel.img 就能把文件拉到内存里,非常方便。

# 安装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="-l -c -s -v"

# 创建目录并设置权限
sudo mkdir -p /srv/tftp
sudo chmod 777 /srv/tftp

# 重启服务
sudo systemctl restart tftpd-hpa
sudo systemctl enable tftpd-hpa

我曾经遇到过一个问题:U-Boot里tftp下载到一半就卡住,最后发现是防火墙把UDP 69端口给拦了。排查了半天,其实一条命令就能解决:

# 开放防火墙端口
sudo ufw allow 69/udp

2.2.2 NFS服务器

NFS比TFTP复杂一点,但好处是板子可以直接把远程目录当本地文件系统用。调试驱动时,我经常在主机上改代码,板子上直接运行,省去了反复拷贝的麻烦。

# 安装NFS服务器
sudo apt-get install nfs-kernel-server

# 配置(编辑 /etc/exports)
# 格式:共享目录 客户端IP(选项)
/home/rk3568/rootfs 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)

# 创建导出目录
sudo mkdir -p /home/rk3568/rootfs

# 重启服务
sudo systemctl restart nfs-kernel-server
sudo exportfs -av

注意:no_root_squash 这个选项很关键。不加的话,板子上的root用户会被映射成nobody,写文件时会报权限错误。我刚开始搞NFS时就被这个坑过,折腾了一下午才发现是权限映射的问题。

板端U-Boot启动参数示例(以RK3568为例):

setenv serverip 192.168.1.100    # 主机IP
setenv ipaddr 192.168.1.200     # 板子IP
setenv bootargs 'console=ttyS2,1500000 root=/dev/nfs nfsroot=192.168.1.100:/home/rk3568/rootfs,v3,tcp rw ip=192.168.1.200:192.168.1.100:192.168.1.1:255.255.255.0::eth0:off'
tftp 0x02000000 boot.img
bootm 0x02000000

2.3 串口与ADB调试环境配置

串口是嵌入式调试的底线——内核panic了、网络没起来,只要串口线还连着,你就能看到最后一口气。ADB则是Android或AOSP系统下的调试利器,效率比串口高得多。

2.3.1 串口调试环境

RK平台通常用UART2作为调试串口,波特率一般是1500000(1.5Mbps)。你需要一根USB转TTL线,注意电平匹配——RK芯片是1.8V或3.3V,别直接插5V的线,会烧芯片。

# 安装串口工具
sudo apt-get install minicom picocom

# 查看串口设备
ls /dev/ttyUSB*   # 或 /dev/ttyACM*

# 使用picocom连接(推荐,比minicom简单)
sudo picocom -b 1500000 /dev/ttyUSB0

# 退出:Ctrl+A, Ctrl+X

我个人更习惯用 screen,因为它不需要额外配置,一条命令搞定:

sudo screen /dev/ttyUSB0 1500000

避坑指南:我曾经遇到过串口输出乱码,排查了半天,最后发现是USB转TTL线的地线没接好。串口通信的地线必须和板子共地,否则电平参考点不对,数据全是错的。另外,如果板子启动时串口没输出,先检查波特率对不对——RK平台默认1500000,但有些旧版U-Boot可能是115200。

2.3.2 ADB调试环境

ADB(Android Debug Bridge)是Android系统的调试利器。如果你的RK平台跑的是Android或AOSP,ADB比串口好用太多——可以传文件、跑shell、抓日志、甚至安装APK。

# 安装ADB
sudo apt-get install adb

# 查看设备
adb devices
# 输出示例:
# List of devices attached
# 0123456789ABCDEF    device

# 进入shell
adb shell

# 传输文件
adb push local_file /data/remote_file
adb pull /data/remote_file local_file

# 抓取内核日志
adb shell dmesg -w

# 重启到U-Boot
adb reboot bootloader

如果 adb devices 找不到设备,多半是USB驱动或权限问题。RK平台的USB VID/PID通常是 2207:0010 或 2207:0006,需要添加udev规则:

# 创建规则文件
sudo vim /etc/udev/rules.d/51-android.rules

# 添加内容
SUBSYSTEM=="usb", ATTR{idVendor}=="2207", MODE="0666", GROUP="plugdev"

# 重载规则
sudo udevadm control --reload-rules
sudo udevadm trigger

2.4 本章知识体系总览

下面这张图把本章的核心内容串起来了。你可以把它当作环境搭建的检查清单,每配完一项就打个勾。

RK平台开发环境搭建知识体系 RK平台开发环境搭建知识体系 Ubuntu 主机开发环境 交叉编译工具链 网络调试服务 调试接口 Linaro GCC 环境变量 验证编译 TFTP服务 NFS服务 U-Boot启动参数 串口(UART) ADB 波特率/udev规则 核心原则:先配工具链 → 再搭网络服务 → 最后调通调试接口 每完成一项,用最小测试验证(编译hello world / tftp下载 / 串口输出) 开发环境就绪 ✓

2.5 常见问题速查表

环境搭建过程中,有几个问题几乎每个人都会遇到。我把它们整理成了一张表,方便你快速定位。

问题现象 可能原因 快速解决
交叉编译报 command not found 环境变量未生效或路径错误 检查 export PATH 是否写入 ~/.bashrc,重新 source
TFTP下载卡住或超时 防火墙拦截UDP 69端口 sudo ufw allow 69/udp
NFS挂载报 permission denied 缺少 no_root_squash 选项 在 /etc/exports 中添加该选项并重启服务
串口输出乱码 波特率不匹配或地线未接 确认波特率(RK默认1500000),检查USB转TTL线地线
adb devices 找不到设备 缺少udev规则或USB驱动 添加 51-android.rules,重载udev规则

最后提醒一句:环境搭建别图快。每配完一个服务,都花30秒做个最小验证。比如装完TFTP,就在板子上 tftp 0x02000000 test.txt 试一下;配完NFS,先手动 mount 看看能不能挂上。这些验证花不了几分钟,但能帮你省下后面排查问题的几个小时。