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 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 的核心目录结构:
除了图上这些,根目录下还有几个重要文件:
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/ 下自己的目录里,方便统一管理。
make list-defconfigs 看看有没有现成的配置可以参考,省得自己从头配依赖。
rkbin 仓库 比较特殊。它里面全是 .bin 文件,没有源码。这些二进制文件在打包时会被嵌入到最终固件中。比如 rk3588_ddr_lp4_2112MHz_lp5_2400MHz_v1.08.bin 就是 DDR 初始化代码。你不需要动它,但要知道它存在,并且版本要跟芯片匹配。