第3章:Linux内核源码获取——Rockchip官方仓库与分支选择

做嵌入式Linux驱动开发,第一步就是拿到内核源码。这事听起来简单,但里面坑不少。我见过不少新手直接从github.com上随便拉一个主线内核就开始搞,结果编译出来板子起不来,折腾好几天才发现是缺了Rockchip的补丁。

说白了,Rockchip的芯片想要跑Linux,必须用他们官方维护的内核。主线内核虽然也支持一部分RK芯片,但很多驱动、设备树、硬件加速模块都没合进去。你想想看,做产品谁敢用半残的内核?

3.1 Rockchip官方内核仓库

Rockchip官方把内核源码放在两个地方:

仓库地址 说明 我个人的建议
https://github.com/rockchip-linux/kernel Rockchip官方GitHub镜像,更新及时 国内开发者首选,速度尚可
https://gitlab.com/rockchip-linux/kernel GitLab镜像,部分区域访问更快 备选,GitHub挂了再用
https://github.com/rockchip-linux/linux 旧仓库,已归档不再更新 别用了,容易混淆
注意:Rockchip官方仓库的默认分支是master,但这个分支通常指向最新的开发版本,不稳定。做产品开发一定要选稳定分支。

我记得2021年有个客户,直接从master拉代码编译,烧进去系统启动到一半就卡死了。查了两天,发现是某个驱动提交引入了bug,但还没修复。从那以后,我每次都会强调:别用master,选稳定分支。

3.2 分支选择:为什么是linux-5.10.y

Rockchip官方维护了多个内核分支,每个分支对应一个LTS(长期支持)版本。目前最推荐的是linux-5.10.y。

分支名 内核版本 状态 适用场景
linux-4.19.y 4.19 维护中,但逐渐减少更新 老旧项目、RK3288/RK3399
linux-5.10.y 5.10 活跃维护,推荐 新项目、RK356x/RK3588
linux-5.15.y 5.15 较新,部分驱动未完全适配 尝鲜、评估
linux-6.1.y 6.1 实验性支持 不适合量产

为什么我推荐5.10?原因有三:

  • 驱动覆盖全:RK356x、RK3588这些主流芯片的驱动在5.10上已经非常成熟
  • 社区支持好:遇到问题,在Rockchip的论坛或邮件列表里问,大家用的都是5.10
  • 稳定性高:这个分支已经迭代了两年多,该修的bug基本都修了
小技巧:如果你用的是RK3588,建议选linux-5.10.y分支下的rk3588子分支。这个子分支包含了RK3588特有的补丁和优化,主线分支不一定有。

3.3 git clone与同步

拿到源码的方式很简单,但有几个细节要注意。我直接上命令:

# 克隆整个仓库(完整历史,约2-3GB)
git clone https://github.com/rockchip-linux/kernel.git -b linux-5.10.y rockchip-kernel

# 如果网络不好,可以只拉最新代码(浅克隆)
git clone https://github.com/rockchip-linux/kernel.git -b linux-5.10.y --depth=1 rockchip-kernel

# 进入目录
cd rockchip-kernel

这里有个坑:浅克隆(--depth=1)虽然快,但后续如果你想切分支、看历史、做git bisect,就会很麻烦。我个人习惯是:第一次全量克隆,后面用git fetch增量更新。

全量克隆大概要多久?我实测过:

网络环境 耗时 备注
国内宽带(100M) 15-25分钟 取决于GitHub的CDN节点
公司内网(限速) 30-60分钟 建议用代理或镜像
海外服务器 3-5分钟 真羡慕

克隆完之后,怎么保持同步?Rockchip官方每周都会推送新的补丁和修复。我建议你:

# 拉取最新代码
git fetch origin

# 查看本地分支与远程的差异
git log HEAD..origin/linux-5.10.y --oneline

# 合并更新
git pull origin linux-5.10.y
警告:如果你在本地修改了内核代码(比如改了驱动或设备树),git pull可能会产生冲突。我建议先git stash暂存修改,拉完代码再git stash pop恢复。

3.4 内核源码目录结构速览

拿到源码后,别急着编译。先花5分钟看看目录结构,心里有个数。我画了一张图,帮你快速理解:

Linux内核源码目录结构(Rockchip 5.10) kernel/ 根目录 arch/ drivers/ include/ Documentation/ arm64/ arm/ gpio/ i2c/ spi/ boot/dts/rockchip/ configs/rockchip_* 说明: • arch/arm64/boot/dts/rockchip/ — 设备树文件,定义硬件资源 • drivers/ — 驱动源码,按子系统分类(gpio、i2c、spi、pinctrl等) • arch/arm64/configs/ — Rockchip默认内核配置文件(如 rockchip_linux_defconfig) • Documentation/ — 内核文档,遇到问题先翻这里

这张图里,我最想让你记住的是arch/arm64/boot/dts/rockchip/这个目录。做Rockchip开发,你几乎每天都要跟设备树打交道。每个板子对应一个.dts文件,比如rk3588-evb1.dts、rk3568-evb.dts。这些文件定义了硬件资源怎么映射到内核。

核心要点:拿到源码后,先找到对应你板子的设备树文件,看看里面定义了哪些外设。这比直接看驱动代码更高效。

3.5 避坑指南

最后,分享几个我踩过的坑:

  • 分支选错:我曾经在linux-4.19.y上折腾RK3588的MIPI DSI驱动,搞了三天发现这个分支根本不支持。换到5.10,一天搞定。
  • 浅克隆的代价:有次需要回退到某个历史版本,结果浅克隆没有完整历史,只能重新全量克隆,白白浪费一小时。
  • 忽略子模块:Rockchip内核有些依赖是子模块管理的(比如firmware),记得用git submodule update --init拉下来。