第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 |
旧仓库,已归档不再更新 | 别用了,容易混淆 |
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基本都修了
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分钟看看目录结构,心里有个数。我画了一张图,帮你快速理解:
这张图里,我最想让你记住的是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拉下来。