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
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
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
1.5 环境搭建知识体系
下面这张图把整个环境搭建的流程串起来了。你照着这个走,基本不会漏东西。
1.6 环境搭建检查清单
最后,我整理了一份检查清单。你搭完环境后,对着这个表过一遍,确保每个环节都没问题。
| 检查项 | 验证方法 | 预期结果 |
|---|---|---|
| 交叉编译器 | arm-linux-gnueabihf-gcc --version |
显示版本号,无报错 |
| 内核编译 | make -j8 |
生成 Image 和 dtb 文件 |
| NFS服务 | showmount -e localhost |
显示共享目录路径 |
| TFTP服务 | 开发板 tftp 获取文件 | 成功下载内核镜像 |
| 串口通信 | 开发板上电,串口终端 | 看到 U-Boot 启动日志 |
| ADB连接 | adb devices |
显示设备序列号 |
环境搭好了,后面写驱动、调bug才能顺手。别嫌这一步麻烦——我刚开始做RK驱动时,就是环境没配好,浪费了整整两天。你按上面的步骤来,半小时就能搞定。