1. 搭建RK3399开发环境

任务说明

本案例目标是在Ubuntu主机上完成RK3399开发板的交叉编译环境搭建,并验证主机与开发板的连接。最终通过编译一个最小可执行程序并在开发板上运行来确认工具链与连接均正常。

环境与依赖

  • 主机系统:Ubuntu 18.04/20.04 x86_64
  • 开发板:RK3399(如Firefly-RK3399或友善之臂NanoPC-T4)
  • 开发板系统:Ubuntu 18.04(预装,支持adb连接)
  • 所需软件包:git, ssh, adb, repo

安装交叉编译工具链

RK3399使用64位ARM架构,需安装交叉编译器。执行以下命令:

sudo apt update
sudo apt install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
# 验证安装
aarch64-linux-gnu-gcc --version

获取SDK(仅内核与根文件系统)

完整SDK包含U-Boot、内核和根文件系统,体积较大。本案例仅需内核头文件用于编译驱动模块,因此直接克隆内核仓库并切换到与开发板系统匹配的分支:

git clone https://github.com/rockchip-linux/kernel.git -b develop-4.4-rk3399 linux-rk3399
cd linux-rk3399
make ARCH=arm64 rockchip_linux_defconfig

验证主机与开发板连接

使用Type-C数据线连接开发板与主机,开发板需处于loader模式或已启动系统并开启adb调试。执行:

lsusb  # 应看到Rockchip设备(ID 2207:0011或类似)
adb devices  # 若开发板已启动,应列出设备

若lsusb无输出,检查驱动:

sudo apt install -y linux-modules-extra-$(uname -r)
sudo modprobe rk_usb_driver 2>/dev/null || echo "使用默认usb-storage驱动即可"

最小交叉编译验证

创建测试程序并编译:

cat <<'EOF' > hello_rk3399.c
#include <stdio.h>
int main() {
    printf("RK3399 toolchain OK\n");
    return 0;
}
EOF
aarch64-linux-gnu-gcc -o hello_rk3399 hello_rk3399.c
file hello_rk3399  # 应输出 "ELF 64-bit LSB executable, ARM aarch64"

部署到开发板并运行

通过adb推送并执行(开发板需已启动并连接):

adb push hello_rk3399 /data/local/tmp/
adb shell chmod +x /data/local/tmp/hello_rk3399
adb shell /data/local/tmp/hello_rk3399

验证方法与通过标准

  1. 工具链验证:file hello_rk3399输出包含ARM aarch64,说明交叉编译成功。
  2. 连接验证:adb devices能列出设备序列号,且状态为device。
  3. 运行验证:开发板终端输出RK3399 toolchain OK,即表示工具链、连接和部署链路全部正常。

若adb无法连接,改用网络ssh方式:

# 开发板与主机同一局域网
adb connect <开发板IP>:5555
# 或直接使用ssh
scp hello_rk3399 root@<开发板IP>:/root/
ssh root@<开发板IP> "/root/hello_rk3399"

常见问题

  • adb未识别设备:检查USB线是否为数据线,尝试更换USB口;在开发板系统设置中开启“USB调试”。
  • 编译报错缺少头文件:确认已执行make ARCH=arm64 rockchip_linux_defconfig生成配置。
  • 运行段错误:确认编译时未混用宿主机gcc,使用file命令检查架构。