2. Linux 内核源码获取与版本管理

在全志 T113 平台进行外设驱动移植时,内核源码的获取与版本管理是基础性工作。不同内核版本(如 Linux 4.9、5.4、5.10、6.1 LTS)在 API、设备树绑定、驱动框架上存在差异,因此需要一套规范的版本管理策略。本章将围绕 Git 仓库克隆、版本标签选择、分支管理策略以及补丁文件管理四个核心环节展开。

实践建议:全志 T113 官方 SDK 通常基于 Linux 4.9 或 5.4 内核。若需移植到更新的 LTS 版本(如 5.10 或 6.1),建议先通过 Git 标签(tag)定位目标版本,再基于该标签创建本地开发分支。

2.1 Git 仓库克隆与远程源配置

Linux 内核官方源码托管在 git.kernel.org 及 GitHub 镜像上。对于全志 T113 开发,通常需要同时拉取官方主线仓库和全志(或第三方 SoC 厂商)的维护仓库。

2.1.1 克隆官方主线仓库

# 克隆完整内核仓库(含全部历史,体积较大)
git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux

# 查看所有远程源
git remote -v

# 添加全志 T113 相关仓库作为第二个远程源(示例)
git remote add allwinner https://github.com/allwinner-zh/linux.git
git fetch allwinner

2.1.2 浅克隆与稀疏检出(节省空间)

若仅需特定版本或特定架构代码,可使用浅克隆(--depth)与稀疏检出(sparse-checkout)加速下载。

# 浅克隆:只获取最近 1 次提交
git clone --depth 1 --branch v5.10 https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git

# 稀疏检出:只拉取 arch/arm 和 drivers 目录
git sparse-checkout init --cone
git sparse-checkout set arch/arm drivers
关键点:全志 T113 使用 ARM Cortex-A7 架构,因此 arch/arm 目录下的 mach-sunxi 和 plat-sunxi 是平台相关代码的核心区域。

2.2 内核版本标签选择策略

Linux 内核版本号遵循 主版本.次版本.修订版 格式,LTS(长期支持)版本通常维护 2~6 年。全志 T113 驱动移植应优先选择 LTS 版本,以获得长期安全更新和社区支持。

版本标签示例 类型 全志 T113 适配建议
v4.9 LTS(已 EOL) 官方 SDK 默认版本,驱动成熟但 API 较旧
v5.4 LTS(维护中) 推荐迁移目标,设备树与驱动框架稳定
v5.10 LTS(维护中) 支持较新外设驱动,需注意 GPIO/时钟 API 变更
v6.1 LTS(最新) 社区活跃,但部分全志私有驱动需重写

2.2.1 标签查看与切换

# 列出所有可用标签(按版本排序)
git tag -l "v5.4.*" --sort=-version:refname

# 切换到指定标签(分离头指针状态)
git checkout v5.4.280

# 基于标签创建本地开发分支(推荐做法)
git checkout -b t113-v5.4-dev v5.4.280
注意:直接 git checkout 标签会进入“分离头指针”状态,在此状态下提交的修改在切换分支后可能丢失。务必先基于标签创建分支再进行开发。

2.3 分支管理策略

在驱动移植项目中,建议采用“上游跟踪 + 本地特性分支 + 补丁队列”的分支模型,避免直接修改主线分支。

2.3.1 推荐分支结构

# 创建上游跟踪分支(只读,用于同步主线更新)
git branch upstream-v5.4 v5.4.280

# 创建本地开发分支(基于上游标签)
git branch t113-spi-v5.4 v5.4.280
git branch t113-i2c-v5.4 v5.4.280

# 创建集成测试分支(合并多个驱动分支)
git branch t113-integration-v5.4 v5.4.280

2.3.2 分支管理流程

  1. 上游同步:定期从 v5.4.x 标签拉取安全更新,合并到 upstream-v5.4 分支。
  2. 驱动开发:每个外设驱动(SPI、I2C、PWM 等)在独立特性分支上开发,保持提交粒度清晰。
  3. 集成测试:将多个特性分支合并到 t113-integration 分支,解决冲突后进行全量测试。
  4. 补丁导出:从集成分支生成补丁文件,用于版本管理或提交上游。
分支命名规范:平台-驱动名-内核版本,例如 t113-spi-v5.4、t113-mmc-v6.1。避免使用无意义名称如 dev1、test。

2.4 补丁文件管理

在全志 T113 驱动移植中,补丁文件(patch)是跨版本迁移的核心载体。通过 git format-patch 生成补丁,使用 git am 或 patch 命令应用补丁。

2.4.1 生成补丁

# 基于当前分支与基准标签的差异生成补丁
git format-patch v5.4.280 --stdout > t113-spi-v5.4.patch

# 按提交粒度生成多个补丁文件
git format-patch v5.4.280 -o patches/spi/

2.4.2 应用补丁

# 使用 git am 应用补丁(保留提交信息)
git checkout v5.10.200
git am < t113-spi-v5.4.patch

# 使用 patch 命令直接应用(不保留提交信息)
patch -p1 < t113-spi-v5.4.patch

2.4.3 补丁冲突处理

当补丁在新内核版本上应用失败时,需手动解决冲突。常见冲突原因包括:

  • API 变更:如 gpio_request 改为 gpiod_get,需重写驱动调用逻辑。
  • 设备树绑定变化:如 compatible 字符串格式调整,需同步修改 DTS 文件。
  • 头文件路径迁移:如 #include <linux/gpio.h> 改为 #include <linux/gpio/consumer.h>。
冲突解决技巧:使用 git mergetool 可视化解决冲突;或手动编辑冲突文件后执行 git add + git am --continue。

2.5 内核版本管理流程总览

内核版本管理流程 1. 获取源码 git clone / fetch 2. 选择标签 v5.4 / v5.10 / v6.1 3. 创建分支 t113-spi-v5.4 4. 驱动开发 特性分支提交 5. 集成测试 合并 + 冲突解决 6. 生成补丁 format-patch 7. 应用补丁到新内核版本 git am / patch -p1 → 解决冲突 → 验证

2.6 补丁文件组织规范

为便于跨版本管理和团队协作,建议按以下目录结构组织补丁文件:

patches/
├── t113-spi/
│   ├── 0001-add-spi-dts-binding.patch
│   ├── 0002-fix-spi-clock-divider.patch
│   └── README.md
├── t113-i2c/
│   ├── 0001-add-i2c-controller.patch
│   └── README.md
├── t113-pwm/
│   └── 0001-add-pwm-fan-support.patch
└── series.conf          # 补丁应用顺序配置文件
补丁命名规范:使用 序号-简短描述.patch 格式,序号保证应用顺序。在 series.conf 中按行列出补丁文件名,便于自动化工具(如 quilt)批量应用。

2.7 常见问题与避坑指南

问题场景 原因 解决方案
补丁应用后编译报错 内核 API 在新版本中已删除或重命名 查阅内核 Documentation/process/deprecated.rst,替换为新 API
设备树节点不匹配 新内核修改了 compatible 字符串或属性名 对比 Documentation/devicetree/bindings/ 中的绑定文档
Git 冲突标记残留 手动解决冲突后未清理 <<<<<<< 标记 使用 grep -r "<<<<<<<" . 全局搜索并修复
补丁顺序错误 依赖补丁未先应用 在 series.conf 中按拓扑排序,先基础后特性
重要提醒:在全志 T113 平台,部分外设驱动依赖全志私有头文件(如 include/linux/sunxi/)。在迁移到主线内核时,这些头文件可能不存在,需要将私有定义迁移到驱动自身或使用主线通用接口替代。

2.8 本章小结

本章系统介绍了全志 T113 驱动移植中的内核源码获取与版本管理方法:

  • Git 仓库克隆:掌握浅克隆、稀疏检出、多远程源配置,提升源码管理效率。
  • 版本标签选择:优先选择 LTS 版本(5.4/5.10/6.1),基于标签创建开发分支。
  • 分支管理策略:采用“上游跟踪 + 特性分支 + 集成分支”模型,保持提交历史清晰。
  • 补丁文件管理:使用 format-patch 生成补丁,通过 series.conf 组织应用顺序,解决跨版本冲突。