2. 获取内核源码:从MTK官方Git仓库克隆内核源码

好,咱们正式开始动手了。这一章我带你走一遍获取内核源码的完整流程。别小看这一步,我在项目里见过太多人因为源码版本搞错,白白浪费好几天。

2.1 找到正确的仓库地址

MTK官方Git仓库的地址,说实话不是固定的。不同项目、不同客户,仓库地址都不一样。我个人习惯先确认两个东西:

  • 你拿到的BSP包版本号
  • MTK分配的项目代号

一般MTK会给你一个类似这样的地址:

git clone ssh://git@git01.mediatek.com:29418/kernel/linux-4.19.git

嗯,这里要注意:MTK的内核仓库通常走SSH协议,需要提前配置好SSH密钥。我曾经有个同事,折腾了半天clone不下来,最后发现是密钥没配好。

⚠️ 重要提醒: 不要用HTTPS方式clone MTK的仓库,很多内部仓库只开放SSH访问。

2.2 查看分支与标签

仓库clone下来后,第一件事就是看分支。你想想看,MTK同时维护几十个芯片平台,每个平台又有多个内核版本,分支结构相当复杂。

我常用的命令:

# 查看所有远程分支
git branch -r

# 查看所有标签
git tag -l

# 查看某个标签的详细信息
git show v4.19.140-mt8678

分支命名规则,MTK一般这么搞:

分支名示例 含义
android-4.19-stable Android通用稳定分支
mtk-4.19-mt8678 MT8678平台专用分支
vendor/mediatek/4.19 MTK vendor定制分支

我个人建议:优先选择带平台代号的分支,比如 mtk-4.19-mt8678。为什么?因为这种分支已经包含了MTK对该平台的所有适配补丁,省得你后面自己打补丁。

💡 小技巧:git branch -a | grep mt8678 快速过滤出跟你的平台相关的分支。

2.3 理解内核版本号规则

内核版本号这东西,看着简单,其实门道不少。MTK的版本号格式通常是:

4.19.140-mt8678-20231201-1630

拆开来看:

  • 4.19 - 主线版本,LTS长期支持版
  • .140 - 补丁级别,数字越大补丁越多
  • mt8678 - 平台代号
  • 20231201 - 构建日期
  • 1630 - 构建序号

我记得有一次,项目组拿到的BSP包里的内核版本是 4.19.140-mt8678-20231115,但Git仓库里最新的标签是 4.19.142-mt8678-20231201。有人直接用了最新的,结果跟BSP包里的驱动不兼容,折腾了两天。

✅ 正确做法: 版本号必须跟BSP包里的完全一致,包括日期和构建序号。

2.4 验证源码完整性

源码拿到手了,怎么确认它没被篡改或者传输没出错?MTK一般会提供两种校验方式:

2.4.1 校验SHA256哈希

MTK会在发布邮件里附上源码包的SHA256值。你本地算一下:

# 对源码包计算SHA256
sha256sum linux-4.19.140-mt8678.tar.gz

# 或者对Git仓库计算
git rev-parse HEAD

然后跟邮件里的值比对。完全一致就说明没问题。

2.4.2 验证GPG签名

更严格的做法是验证GPG签名。MTK的每个发布标签都有对应的签名:

# 导入MTK官方公钥
gpg --import mediatek-public-key.asc

# 验证标签签名
git tag -v v4.19.140-mt8678

如果输出里有 gpg: Good signature,那就稳了。

⚠️ 避坑指南: 我曾经遇到过源码包下载后MD5对得上,但编译死活不过。后来发现是传输过程中有个别字节被篡改了,MD5碰撞导致的。从那以后,我坚持用SHA256或者GPG签名验证,再也不信MD5了。

2.5 实际操作的完整流程

好了,我把整个流程串起来,你照着做就行:

# 1. 克隆仓库
git clone ssh://git@git01.mediatek.com:29418/kernel/linux-4.19.git
cd linux-4.19

# 2. 查看可用分支
git branch -r | grep mt8678

# 3. 切换到目标分支
git checkout -b my-mt8678 origin/mtk-4.19-mt8678

# 4. 查看标签
git tag -l | grep mt8678

# 5. 切换到指定标签
git checkout v4.19.140-mt8678-20231201-1630

# 6. 验证完整性
git log --oneline -1
# 确认commit ID跟MTK发布的一致
💡 个人经验: 我习惯在本地创建一个以自己名字命名的分支,比如 my-mt8678,这样不会污染远程分支,也方便自己管理修改。

2.6 常见问题与解决

说几个我实际遇到过的问题:

  • clone速度慢 - MTK的海外仓库有时候很慢,可以找找有没有国内镜像
  • 权限拒绝 - 检查SSH密钥是否添加到GitLab/ Gerrit
  • 分支不存在 - 可能是项目代号搞错了,跟MTK的FAE确认一下
  • 标签对不上 - 确认BSP包版本号,有时候MTK会更新标签

嗯,这一章就到这儿。源码拿到手,咱们下一章就开始配置编译环境了。记住:版本号一定要跟BSP包一致,这是血的教训换来的经验。