2. 开发环境搭建
嵌入式Linux驱动开发,尤其是显示子系统这样与硬件紧密相关的模块,其开发环境搭建的成败直接决定了后续调试的效率。本章将手把手搭建一套完整的RK3399显示驱动开发环境,涵盖交叉编译工具链、内核源码、SDK配置以及网络启动环境,确保你能够快速进入“修改-编译-运行-验证”的高效循环。
2.1 交叉编译工具链安装
RK3399是ARMv8-A架构的SoC,而我们的开发主机通常是x86_64架构。因此,必须使用交叉编译工具链,在x86主机上编译出能在ARM目标板上运行的二进制代码。
2.1.1 工具链选择
Rockchip官方推荐使用基于GCC的交叉编译工具链,主要有以下两种选择:
| 工具链类型 | 来源 | 适用场景 | 前缀 |
|---|---|---|---|
| gcc-linaro | Linaro官方发布 | 通用Linux应用与内核模块编译 | aarch64-linux-gnu- |
| gcc-arm-10.3 | Rockchip SDK预置 | 与RK SDK深度绑定,兼容性最佳 | aarch64-rockchip-linux-gnu- |
gcc-arm-10.3 工具链,因为它已经过RK官方验证,能避免很多因工具链版本不匹配导致的编译错误。
2.1.2 安装步骤
- 下载工具链:从Rockchip官方资源或Linaro官网获取
gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz。 - 解压到指定目录:通常放置在
/opt/toolchains/下,便于管理。 - 配置环境变量:将工具链的
bin目录添加到PATH中。
# 解压
sudo mkdir -p /opt/toolchains
sudo tar -xvf gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz -C /opt/toolchains/
# 配置环境变量(建议写入 ~/.bashrc 或 /etc/profile)
export PATH=/opt/toolchains/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin:$PATH
export ARCH=arm64
export CROSS_COMPILE=aarch64-none-linux-gnu-
# 验证安装
aarch64-none-linux-gnu-gcc --version
aarch64-none-linux-gnu-gcc --version 后,应显示 gcc version 10.3.1 20210621 (GNU Toolchain for the A-profile Architecture 10.3-2021.07) 类似信息。
2.2 Linux内核源码获取
FrameBuffer驱动是内核的一部分。我们需要获取与RK3399平台匹配的Linux内核源码,并切换到正确的分支。
2.2.1 源码仓库与分支
Rockchip官方维护了一个基于LTS内核的SDK仓库,推荐使用 linux-5.10.y 分支,该分支对RK3399的显示驱动支持非常完善。
# 克隆内核源码(以RK官方仓库为例)
git clone https://github.com/rockchip-linux/kernel.git -b linux-5.10.y --depth 1 rk3399-kernel
cd rk3399-kernel
--depth 1 进行浅克隆可以大幅减少下载时间,但如果你后续需要查看完整的历史提交或进行补丁管理,建议去掉该参数进行完整克隆。
2.2.2 内核目录结构概览
理解内核源码的目录结构,有助于我们快速定位显示驱动相关的代码。
2.3 RK3399 SDK配置
SDK配置的核心是生成正确的 .config 文件,它决定了内核中哪些功能被编译、哪些驱动被加载。
2.3.1 使用默认配置
RK3399 SDK提供了多个默认配置文件,位于 arch/arm64/configs/ 目录下。对于显示驱动开发,我们通常使用 rockchip_linux_defconfig。
# 加载RK3399 Linux默认配置
make rockchip_linux_defconfig
# 使用菜单界面进行微调(可选)
make menuconfig
2.3.2 关键配置项检查
在 menuconfig 中,必须确保以下与FrameBuffer相关的选项被正确配置:
| 配置项 | 路径 | 推荐值 | 说明 |
|---|---|---|---|
CONFIG_FB |
Device Drivers → Graphics support → Frame buffer Devices | y | 启用FrameBuffer子系统核心 |
CONFIG_FB_ROCKCHIP |
Device Drivers → Graphics support → Frame buffer Devices → Rockchip | y | 启用RK平台FrameBuffer驱动 |
CONFIG_DRM |
Device Drivers → Graphics support → Direct Rendering Manager | n | 本课程聚焦FrameBuffer,建议关闭DRM以避免冲突 |
CONFIG_LOGO |
Device Drivers → Graphics support → Bootup logo | y | 启用开机Logo,可快速验证显示输出 |
CONFIG_FB_ROCKCHIP 和 CONFIG_DRM_ROCKCHIP,两者可能会争夺显示硬件资源,导致系统启动时显示异常。在纯FrameBuffer开发阶段,请务必确保DRM相关驱动为关闭状态。
2.4 TFTP/NFS网络启动环境搭建
在驱动开发过程中,频繁插拔SD卡或烧写eMMC会严重拖慢开发节奏。通过网络启动(TFTP加载内核,NFS挂载根文件系统)可以实现“编译-重启-验证”的秒级迭代。
2.4.1 网络启动架构
2.4.2 开发主机配置步骤
- 安装并配置TFTP服务器:用于提供内核镜像和设备树文件。
- 安装并配置NFS服务器:用于提供根文件系统。
- 准备根文件系统:可以使用Buildroot或Debian/Ubuntu base构建。
# === TFTP 配置 ===
sudo apt install tftpd-hpa
sudo mkdir -p /srv/tftp
sudo chmod 777 /srv/tftp
# 编辑 /etc/default/tftpd-hpa,确保 TFTP_DIRECTORY="/srv/tftp"
# === NFS 配置 ===
sudo apt install nfs-kernel-server
sudo mkdir -p /srv/nfs/rootfs
# 编辑 /etc/exports,添加以下行:
# /srv/nfs/rootfs *(rw,sync,no_subtree_check,no_root_squash)
sudo exportfs -a
sudo systemctl restart nfs-kernel-server
# === 放置启动文件 ===
# 将编译好的内核镜像复制到TFTP目录
cp arch/arm64/boot/Image /srv/tftp/
cp arch/arm64/boot/dts/rockchip/rk3399-evb.dtb /srv/tftp/
# 将根文件系统解压到NFS目录
sudo tar -xvf ubuntu-base-rootfs.tar.gz -C /srv/nfs/rootfs/
2.4.3 U-Boot启动参数设置
在目标板的U-Boot命令行中,设置以下环境变量以实现网络启动:
# 设置网络参数
setenv ipaddr 192.168.1.200
setenv serverip 192.168.1.100
setenv gatewayip 192.168.1.1
setenv netmask 255.255.255.0
# 设置TFTP和NFS启动参数
setenv bootargs 'console=ttyS2,1500000 root=/dev/nfs nfsroot=192.168.1.100:/srv/nfs/rootfs,v3,tcp rw ip=192.168.1.200:192.168.1.100:192.168.1.1:255.255.255.0::eth0:off'
# 设置启动命令
setenv bootcmd 'tftp 0x02000000 Image; tftp 0x01f00000 rk3399-evb.dtb; booti 0x02000000 - 0x01f00000'
# 保存并启动
saveenv
boot
ping 192.168.1.100 测试网络连通性。如果ping不通,请检查网线、交换机以及开发主机的防火墙设置。
2.5 环境验证
完成以上所有步骤后,进行一个简单的验证:编译内核并尝试网络启动。
# 编译内核
make Image -j$(nproc)
make dtbs
# 将新编译的内核和设备树复制到TFTP目录
cp arch/arm64/boot/Image /srv/tftp/
cp arch/arm64/boot/dts/rockchip/rk3399-evb.dtb /srv/tftp/
# 重启目标板,观察串口输出
# 如果看到类似以下信息,说明环境搭建成功:
# [ 0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd034]
# [ 0.000000] Linux version 5.10.160 ...
# [ 2.345678] VFS: Mounted root (nfs filesystem) on device 0:14.
# [ 2.456789] Freeing unused kernel memory: 1024K
# [ 2.567890] Run /sbin/init as init process