4. 开发环境搭建:SDK获取、交叉编译工具链、内核配置、设备树编译

在开始 RK3588 MIPI DSI 显示驱动移植之前,必须搭建一套完整、可复现的开发环境。本章将引导你完成 SDK 获取、交叉编译工具链安装、内核配置以及设备树编译的全流程。环境搭建的规范性直接影响后续调试效率,请务必按步骤操作。

环境概览: 本课程基于 Ubuntu 22.04 LTS(x86_64)宿主机,目标平台为 RK3588 EVB 或自研板卡。所有操作均在非 root 用户下执行,必要时使用 sudo 提权。

4.1 SDK 获取与目录结构

Rockchip 官方提供基于 repo 工具的 SDK 管理方式。SDK 包含 U-Boot、Linux 内核、设备树、根文件系统及工具链等全部源码。

4.1.1 获取 SDK

  1. 安装 repo 工具:
mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
export PATH=~/bin:$PATH
  1. 初始化 SDK 仓库:
mkdir rk3588_sdk && cd rk3588_sdk
repo init -u https://github.com/rockchip-linux/manifests -b master -m rk3588_linux_release.xml
repo sync -c --no-tags -j4
网络提示: 国内开发者建议使用 Gitee 镜像加速,将 manifest 仓库地址替换为 https://gitee.com/rockchip-linux/manifests。同步过程可能耗时 30-60 分钟,请保持网络稳定。

4.1.2 SDK 目录结构

同步完成后,SDK 根目录结构如下表所示:

目录/文件 说明
kernel/ Linux 内核源码(5.10 / 6.1 LTS)
u-boot/ U-Boot 引导程序源码
device/rockchip/ 板级设备树(.dts / .dtsi)及配置文件
external/ 第三方库与工具(如 rkbin、drm 库)
buildroot/ Buildroot 根文件系统构建框架
prebuilts/ 预编译工具链与二进制工具
rkbin/ Rockchip 闭源固件(ATF、DDR 初始化)
RK3588 SDK 核心目录结构 rk3588_sdk/ kernel/ u-boot/ device/rockchip/ prebuilts/ 说明 • kernel/ 和 u-boot/ 是显示驱动移植的主要工作目录 • device/rockchip/ 存放板级设备树,MIPI DSI 配置在此修改 • prebuilts/ 提供预编译交叉工具链,无需手动编译 GCC

4.2 交叉编译工具链配置

RK3588 基于 ARMv8.2-A 架构,必须使用 aarch64 交叉编译工具链。SDK 的 prebuilts/ 目录已提供预编译版本,推荐直接使用以避免版本兼容问题。

4.2.1 工具链路径设置

将工具链添加到 PATH 环境变量,建议写入 ~/.bashrc 以持久化:

export RK_TOOLCHAIN=~/rk3588_sdk/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu
export PATH=$RK_TOOLCHAIN/bin:$PATH
export CROSS_COMPILE=aarch64-none-linux-gnu-
export ARCH=arm64

验证工具链是否生效:

aarch64-none-linux-gnu-gcc --version
# 输出示例:aarch64-none-linux-gnu-gcc (GCC) 10.3.1 20210621

4.2.2 工具链参数说明

环境变量 值示例 作用
CROSS_COMPILE aarch64-none-linux-gnu- 指定交叉编译前缀,内核构建系统自动追加 gcc、ld 等
ARCH arm64 指定目标 CPU 架构,影响内核 Kconfig 和 Makefile 行为
CC ${CROSS_COMPILE}gcc 显式指定 C 编译器(通常由 CROSS_COMPILE 推导)
避坑指南: 不要使用 Ubuntu 软件源中的 gcc-aarch64-linux-gnu 包(版本通常为 9.x),它与 Rockchip 内核的某些内联汇编和头文件不兼容,会导致编译失败或运行时异常。

4.3 内核配置

内核配置是启用 MIPI DSI 显示驱动的关键步骤。RK3588 使用 defconfig 加 fragment 的方式管理配置,避免直接修改默认配置。

4.3.1 加载基础配置

cd ~/rk3588_sdk/kernel
make ARCH=arm64 rockchip_linux_defconfig

该命令会生成 .config 文件,包含 RK3588 平台的基础支持(如 PCIe、USB、GMAC 等),但显示相关驱动默认未全部开启。

4.3.2 启用 MIPI DSI 相关配置

使用 menuconfig 图形界面或直接编辑 .config 添加以下关键选项:

# 进入图形配置界面
make ARCH=arm64 menuconfig

# 以下为必须启用的配置项(路径与选项名)
# Device Drivers --->
#   Graphics support --->
#     <*> Rockchip DRM driver
#     [*]   Rockchip VOP2 support
#     <*>   Rockchip MIPI DSI controller driver
#     <*>   DRM panel driver for MIPI DSI panels
#     <*>   Backlight & LCD device support

也可通过脚本批量验证:

grep -E "CONFIG_DRM_ROCKCHIP|CONFIG_ROCKCHIP_VOP2|CONFIG_DRM_ROCKCHIP_MIPI_DSI|CONFIG_DRM_PANEL" .config

预期输出应包含以下内容:

CONFIG_DRM_ROCKCHIP=y
CONFIG_ROCKCHIP_VOP2=y
CONFIG_DRM_ROCKCHIP_MIPI_DSI=y
CONFIG_DRM_PANEL_SIMPLE=y

4.3.3 保存配置

make ARCH=arm64 savedefconfig
cp defconfig arch/arm64/configs/rockchip_linux_defconfig
最佳实践: 建议将显示相关配置单独保存为 display.fragment 文件,后续通过 scripts/kconfig/merge_config.sh 合并,便于版本管理和复用。
MIPI DSI 内核配置流程 rockchip_linux_defconfig menuconfig 交互配置 .config 生成 grep 验证关键配置 savedefconfig 保存 关键配置项 CONFIG_DRM_ROCKCHIP=y CONFIG_ROCKCHIP_VOP2=y CONFIG_DRM_ROCKCHIP_MIPI_DSI=y CONFIG_DRM_PANEL_SIMPLE=y

4.4 设备树编译

设备树(Device Tree)是描述硬件拓扑和资源配置的核心文件。RK3588 的 MIPI DSI 接口、背光、面板时序等参数均在 .dts / .dtsi 文件中定义。

4.4.1 设备树文件位置

RK3588 相关设备树位于:

~/rk3588_sdk/kernel/arch/arm64/boot/dts/rockchip/
├── rk3588.dtsi          # SoC 级通用定义(DSI 控制器、VOP、GRF 等)
├── rk3588-evb1.dtsi     # EVB 板级外设定义
├── rk3588-evb1-lp4.dts  # EVB 最终设备树(包含面板节点)
└── rk3588s.dtsi         # RK3588S 精简版 SoC 定义

4.4.2 编译设备树

在 SDK 内核目录下执行:

cd ~/rk3588_sdk/kernel
make ARCH=arm64 dtbs

编译生成的 .dtb 文件位于:

arch/arm64/boot/dts/rockchip/rk3588-evb1-lp4.dtb

验证设备树是否包含 MIPI DSI 节点:

fdtdump arch/arm64/boot/dts/rockchip/rk3588-evb1-lp4.dtb | grep -i dsi
# 应输出类似:
# dsi@fde20000 { ... };
# dsi@fde30000 { ... };

4.4.3 常见编译错误与解决

错误信息 原因 解决方案
DTC: dts->dtb on file "xxx.dts" 后跟语法错误 设备树语法错误(缺少分号、括号不匹配) 检查 dts 文件,使用 dtc -I dts -O dtb xxx.dts 单独调试
label 'dsi0' not found 引用了未定义的 label 确认 rk3588.dtsi 中已定义 dsi0: dsi@...,检查 include 路径
clock-names mismatch panel 节点中 clock 名称与驱动不匹配 对照 panel 驱动源码(如 panel-simple.c)修正 clock-names
重要: 每次修改设备树后,必须重新执行 make dtbs 并确认新生成的 .dtb 已更新。建议在编译脚本中加入 md5sum 校验,避免烧录旧版本。
设备树编译与验证流程 修改 .dts/.dtsi make dtbs 生成 .dtb fdtdump 验证 编译错误?检查语法/引用 验证命令 fdtdump xxx.dtb | grep dsi dtc -I dtb -O dts xxx.dtb | head -50

4.5 环境验证清单

完成上述步骤后,建议执行以下验证清单,确保环境就绪:

  • 工具链验证: aarch64-none-linux-gnu-gcc -v 输出版本号,无报错。
  • 内核配置验证: grep CONFIG_DRM_ROCKCHIP .config 返回 y 或 m。
  • 设备树编译验证: ls -l arch/arm64/boot/dts/rockchip/*.dtb 文件存在且时间戳为最新。
  • SDK 完整性验证: ls ~/rk3588_sdk/kernel/include/dt-bindings/ 包含 clock、power、display 等子目录。
推荐: 将上述验证步骤写入 env_check.sh 脚本,每次进入开发环境时执行一次,可快速定位环境漂移问题。