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 本章知识体系总览
下面这张图把本章的核心内容串起来了。你可以把它当作环境搭建的检查清单,每配完一项就打个勾。
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 看看能不能挂上。这些验证花不了几分钟,但能帮你省下后面排查问题的几个小时。