1. RK平台驱动开发环境搭建

做RK平台驱动开发,第一件事就是把环境搭好。我见过太多人上来就写代码,结果编译都过不了,白白浪费半天时间。说白了,环境搭建就像打地基——地基不稳,后面全是坑。

1.1 交叉编译工具链配置

RK平台用的是ARM架构,你的PC是x86架构。所以你得用交叉编译器——在PC上编译出能在ARM上跑的二进制文件。

我个人习惯用Linaro提供的GCC工具链。RK官方也推荐这个。下载后解压到 /opt 目录,然后配环境变量。

# 解压工具链
tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz -C /opt/

# 配置环境变量(加到 ~/.bashrc 里)
export PATH=/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin:$PATH
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-

# 验证
arm-linux-gnueabihf-gcc --version
注意: 我曾经遇到过工具链版本不匹配导致内核模块加载失败的问题。RK3399用7.5.0没问题,但RK3568/RK3588建议用aarch64版本。一定要确认你的芯片架构是32位还是64位。

1.2 内核源码树构建

内核源码树,说白了就是你把RK官方的内核代码下载下来,配置好,编译一遍。这样你才能编译自己的驱动模块。

我建议直接从Rockchip的GitHub仓库拉代码。别用第三方打包的,版本容易乱。

# 克隆内核源码
git clone https://github.com/rockchip-linux/kernel.git -b rk3399-android-11

# 配置内核
make ARCH=arm64 rockchip_defconfig

# 编译内核
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j8

# 编译设备树
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- dtbs

编译完成后,你会得到 arch/arm64/boot/Image 和一堆 .dtb 文件。这两个东西后面调试要用。

小技巧: 第一次编译内核时,记得加上 CONFIG_DEBUG_INFO=y。这样你调试时能看到源码行号,不然全是汇编,根本没法看。

1.3 NFS/TFTP调试环境搭建

驱动开发最烦的就是每次改代码都要重新烧写固件。太慢了。我推荐用NFS挂载根文件系统,用TFTP加载内核。这样你改完驱动,重新编译,重启开发板就能看到效果。

NFS服务器配置

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

# 创建共享目录
sudo mkdir -p /srv/nfs/rootfs

# 解压根文件系统到共享目录
sudo tar -xvf rk3399-rootfs.tar.gz -C /srv/nfs/rootfs

# 配置 /etc/exports
echo "/srv/nfs/rootfs *(rw,sync,no_root_squash,no_subtree_check)" | sudo tee -a /etc/exports

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

TFTP服务器配置

# 安装TFTP服务器
sudo apt install tftpd-hpa

# 配置 /etc/default/tftpd-hpa
TFTP_DIRECTORY="/srv/tftp"
TFTP_OPTIONS="--secure --create"

# 把内核和设备树放到TFTP目录
sudo cp arch/arm64/boot/Image /srv/tftp/
sudo cp arch/arm64/boot/dts/rockchip/rk3399-evb.dtb /srv/tftp/

# 重启TFTP服务
sudo systemctl restart tftpd-hpa
核心思路: 开发板通过TFTP从PC加载内核,通过NFS挂载根文件系统。这样你只需要在PC上修改代码,重启开发板就能验证。一次配置,后面省无数时间。

1.4 串口终端与ADB调试工具初始化

串口是驱动工程师的救命稻草。内核还没起来时,只有串口能看打印信息。ADB则是Android系统下的调试利器。

串口终端配置

RK开发板通常用UART2作为调试串口。波特率一般是1500000(1.5Mbps)。我用的是 screen 命令,轻量又好用。

# 安装screen
sudo apt install screen

# 连接串口(假设设备是 /dev/ttyUSB0)
sudo screen /dev/ttyUSB0 1500000

# 退出 screen:Ctrl+A 然后按 K

嗯,这里要注意。有些USB转串口模块不稳定,丢数据。我遇到过好几次,折腾半天发现是线的问题。建议用FT232或者CP2102的模块,别用CH340——便宜是便宜,但高速下容易丢包。

ADB调试工具初始化

ADB需要开发板端开启调试模式,PC端安装adb工具。

# 安装ADB
sudo apt install adb

# 查看设备
adb devices

# 如果设备列表为空,检查USB连接和驱动
# 进入ADB shell
adb shell

# 推送文件到开发板
adb push my_driver.ko /data/

# 加载驱动
adb shell insmod /data/my_driver.ko
踩坑提醒: 我曾经在RK3399上遇到ADB识别不到设备的问题。折腾了两天,最后发现是USB线的问题——有些线只能充电,不能传数据。换根好点的USB线就好了。另外,如果开发板是Linux系统(不是Android),ADB可能用不了,这时候只能用串口。

1.5 环境搭建知识体系

下面这张图把整个环境搭建的流程串起来了。你照着这个走,基本不会漏东西。

RK平台驱动开发环境搭建流程 RK平台驱动开发环境搭建流程 PC端开发环境 交叉编译工具链 Linaro GCC 环境变量配置 内核源码树 Git克隆 配置+编译 NFS/TFTP服务 网络启动环境 免烧写调试 调试工具 串口终端 ADB调试 开发板端运行环境 U-Boot启动 TFTP加载内核+DTB 内核启动 NFS挂载根文件系统 驱动调试 insmod/rmmod/dmesg 核心目标:PC端修改代码 → 重启开发板 → 验证效果,无需反复烧写固件 一次配置,长期受益

1.6 环境搭建检查清单

最后,我整理了一份检查清单。你搭完环境后,对着这个表过一遍,确保每个环节都没问题。

检查项 验证方法 预期结果
交叉编译器 arm-linux-gnueabihf-gcc --version 显示版本号,无报错
内核编译 make -j8 生成 Image 和 dtb 文件
NFS服务 showmount -e localhost 显示共享目录路径
TFTP服务 开发板 tftp 获取文件 成功下载内核镜像
串口通信 开发板上电,串口终端 看到 U-Boot 启动日志
ADB连接 adb devices 显示设备序列号

环境搭好了,后面写驱动、调bug才能顺手。别嫌这一步麻烦——我刚开始做RK驱动时,就是环境没配好,浪费了整整两天。你按上面的步骤来,半小时就能搞定。