3. SDK 获取与结构:Repo 工具使用、SDK 目录结构解析、核心代码仓库功能介绍

拿到一块新的瑞芯微开发板,第一件事是什么?不是急着看原理图,也不是翻芯片手册。你得先把 SDK 搞到手,并且搞清楚它里面到底装了些什么。

瑞芯微的 SDK 不是单个 Git 仓库,而是一堆仓库的集合。说白了,它是一个由几十个独立 Git 仓库组成的「仓库联邦」。要管理这种联邦,Google 的 Repo 工具就是最趁手的兵器。

3.1 Repo 工具:管理仓库联邦的瑞士军刀

Repo 本身是一个 Python 脚本,它不直接存代码,而是通过一个 manifest 清单文件来告诉你去哪里拉取哪些仓库、拉到什么分支、放到什么路径。

安装 Repo

我个人习惯把 Repo 装到 ~/bin 下,这样不影响系统全局环境:

mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
export PATH=$PATH:~/bin

记得把 export PATH 加到 ~/.bashrc 里,不然每次开终端都要手动敲一遍。

初始化 SDK

拿到瑞芯微提供的 repo 地址后,初始化命令长这样:

repo init -u https://github.com/rockchip-linux/manifests -b master -m rk3588_linux.xml

这里 -u 指定 manifest 仓库地址,-b 指定分支,-m 指定具体的 xml 文件。不同的芯片型号对应不同的 xml,比如 rk3568_linux.xml、rk3588_linux.xml。

注意: 我曾经遇到过 repo init 成功后,同步到一半网络断开的情况。别慌,重新执行 repo sync 会断点续传,不会从头开始。

同步代码

初始化完成后,执行同步命令:

repo sync -j4

-j4 表示用 4 个线程并行拉取。网络好的时候可以开到 -j8 甚至 -j16。但如果你在公司内网,带宽有限,建议用 -j2 或 -j4,免得把网关拉垮。

常用 Repo 命令速查

命令 作用 我常用的场景
repo start <分支名> --all 在所有仓库创建新分支 开始开发前,统一创建本地工作分支
repo status 查看所有仓库的修改状态 检查有没有忘记提交的代码
repo diff 显示所有仓库的未暂存改动 提交前快速过一遍改动
repo forall -c "git log --oneline -3" 对所有仓库执行同一 Git 命令 批量查看各仓库最近提交
repo upload 将代码提交到 Gerrit 审核 团队协作时提交代码审查
小技巧: 如果你只想同步某个特定仓库,可以用 repo sync <仓库路径>。比如 repo sync kernel 只同步内核仓库,省时间。

3.2 SDK 目录结构解析

同步完成后,你会看到 SDK 根目录下有一堆文件夹。第一次看到的人可能会懵——怎么这么多?别急,我帮你拆开来看。

下面这张图展示了 SDK 的核心目录结构:

瑞芯微 SDK 核心目录结构 SDK 根目录 kernel/ u-boot/ buildroot/ external/ drivers/ arch/arm64/ dts/ board/rockchip/ configs/ package/ configs/ output/ rkwifibt/ rknpu/ alsa-config/ 说明: • kernel/:Linux 内核源码,包含瑞芯微平台驱动和 DTS 文件 • u-boot/:引导加载程序,负责初始化硬件并加载内核 • buildroot/:根文件系统构建工具,生成 rootfs • external/:第三方库和瑞芯微私有组件(WiFi/BT/NPU 等)

除了图上这些,根目录下还有几个重要文件:

  • device/rockchip/:存放各芯片平台的板级配置、分区表、打包脚本。你改分区大小、调启动参数,基本都在这里。
  • rkbin/:瑞芯微的闭源二进制文件仓库。包括 DDR 初始化代码、M0 协处理器固件、HDMI 固件等。嗯,这部分你拿不到源码,只能直接用。
  • tools/:打包工具、烧录工具、签名工具。比如 mkimage、loaderimage 等。

3.3 核心代码仓库功能介绍

SDK 里仓库很多,但真正需要你深入关注的,其实就下面这几个:

仓库名称 核心功能 你需要关注什么
kernel Linux 内核,版本通常为 5.10 或 6.1 设备驱动、DTS 文件、内核配置
u-boot 引导加载程序,版本 2017.09 或更新 板级初始化、启动参数、fastboot
buildroot 构建根文件系统 软件包选择、rootfs 定制、init 系统
device/rockchip 板级配置和打包脚本 分区表、parameter.txt、打包规则
rkbin 闭源二进制固件 DDR 初始化、M0 固件、HDMI 固件
external/rkwifibt WiFi 和蓝牙驱动与固件 AP6256、AP6398 等模组支持
external/rknpu NPU 驱动和运行时库 RKNN 模型推理、NPU 工具链

我的经验: 刚接手一个项目时,我习惯先看 device/rockchip 下的 parameter.txt 和 BoardConfig.mk。这两个文件决定了分区怎么分、内核用什么配置、根文件系统用什么格式。搞清楚了它们,整个系统的构建框架就清晰了一半。

kernel 仓库 是工作量最大的地方。瑞芯微的内核在标准 Linux 主线基础上,加了很多芯片相关的驱动。你会在 drivers/ 下看到 soc/rockchip/、phy/rockchip/、gpu/drm/rockchip/ 等目录。DTS 文件放在 arch/arm64/boot/dts/rockchip/ 下,文件名通常以芯片型号开头,比如 rk3588-evb1.dts。

u-boot 仓库 负责从存储介质(eMMC、SD 卡、SPI Flash)加载内核。瑞芯微的 u-boot 加入了 rockchip 板级目录和 fastboot 支持。你调试启动问题的时候,经常要在这里加打印信息。

buildroot 仓库 用来生成根文件系统。瑞芯微提供了一套默认配置,在 configs/ 下以 rockchip_<芯片>_defconfig 命名。你可以通过 make menuconfig 增删软件包。我个人习惯把应用层程序放到 package/ 下自己的目录里,方便统一管理。

避坑指南: 我曾经在 buildroot 里加了一个新包,结果编译时报错说依赖的库版本不对。后来养成了习惯——加包之前先 make list-defconfigs 看看有没有现成的配置可以参考,省得自己从头配依赖。

rkbin 仓库 比较特殊。它里面全是 .bin 文件,没有源码。这些二进制文件在打包时会被嵌入到最终固件中。比如 rk3588_ddr_lp4_2112MHz_lp5_2400MHz_v1.08.bin 就是 DDR 初始化代码。你不需要动它,但要知道它存在,并且版本要跟芯片匹配。