第4章 U-Boot源码获取与版本选择
做嵌入式开发这么多年,我见过不少新手一上来就跑去官网下载最新版U-Boot,然后开始移植。结果呢?折腾两周发现某个驱动死活编不过,查了半天才知道——这个版本压根不支持他的芯片。嗯,今天我们就聊聊怎么选版本、怎么拿源码。
4.1 官方源码仓库
U-Boot的官方源码托管在Denx的Git服务器上。我个人习惯直接拉Git仓库,而不是下载压缩包。为什么?因为Git能让你随时切换分支、查看历史、打补丁,这些在移植过程中太常用了。
主仓库地址:
git clone https://gitlab.denx.de/u-boot/u-boot.git
如果你在墙内访问慢,可以用镜像:
git clone https://github.com/u-boot/u-boot.git
--depth=1 参数只拉最新提交,省时间。等需要切分支时再 git fetch --unshallow 补全历史。
4.2 版本命名规则
U-Boot的版本号其实有规律。你看一眼就能知道这个版本大概什么时候发布的、是稳定版还是开发版。
| 版本示例 | 含义 | 适用场景 |
|---|---|---|
| v2023.04 | 2023年4月发布的稳定版 | 产品开发首选 |
| v2023.07-rc1 | 2023年7月版本的第一个候选发布版 | 尝鲜、测试新功能 |
| next | 开发分支,每天都有新提交 | 仅用于贡献代码或跟踪最新特性 |
说白了,偶数年份的版本通常更稳定。比如v2022.10、v2020.04这些,社区维护时间长,bug少。奇数年份的版本有时候会引入一些激进改动,我踩过坑。
4.3 如何选择适合项目的版本
这个问题没有标准答案,但我总结了一套判断方法,你可以照着做:
- 先看芯片支持情况——去
arch/arm/mach-xxx或board/目录下找你的SoC有没有现成的板级文件。 - 再看驱动成熟度——比如你要用NAND Flash,就去
drivers/mtd/nand/raw/看看对应控制器驱动是否完善。 - 最后看社区活跃度——去邮件列表搜一下这个版本有没有人报过严重bug。
我的经验法则:
- 新产品开发:选最近两个稳定版中的较新那个
- 老产品维护:用产品最初移植时的版本,不要轻易升级
- 学习研究:随便选,推荐v2023.04或v2024.01
4.4 版本选择决策流程
下面这张图是我自己画的一个决策流程,每次接新项目我都会走一遍:
4.5 获取源码的几种方式
拿到版本号之后,怎么把源码弄到手?我一般用这三种方式:
- Git clone 指定分支——最推荐的方式,方便后续更新和打补丁
- 下载 release tarball——如果只是看看代码,不打算改,直接下压缩包更快
- 从厂商BSP中提取——有些芯片厂商会基于某个U-Boot版本做定制,然后发布自己的补丁包
举个例子,我要用v2023.04版本:
git clone https://gitlab.denx.de/u-boot/u-boot.git
cd u-boot
git checkout v2023.04
master 或 next 分支开始做产品移植。我曾经有个同事图省事,直接拉了 next 分支开始干活,结果做到一半发现某个关键API被重构了,所有代码都得重写。嗯,那个项目延期了两周。
4.6 版本兼容性速查表
下面这张表是我根据多年经验整理的,不同硬件平台建议的U-Boot版本范围:
| 硬件平台 | 推荐版本范围 | 注意事项 |
|---|---|---|
| ARM Cortex-A7/A9 | v2020.01 ~ 最新 | 老版本对设备树支持不够好 |
| ARM Cortex-A53/A72 | v2021.07 ~ 最新 | 需要支持ARMv8的ATF交互 |
| RISC-V 64位 | v2022.01 ~ 最新 | 早期版本RISC-V支持不完整 |
| MIPS | v2019.04 ~ v2023.04 | 新版本对MIPS支持在弱化 |
| Xilinx Zynq | v2020.10 ~ v2023.10 | Xilinx有自己的维护分支 |
4.7 避坑指南
最后分享几个我踩过的坑,你遇到了可以少走弯路:
我曾经... 选了一个刚发布两周的版本做项目,结果发现NAND驱动有bug,一写数据就丢页。后来查邮件列表才知道,那个版本发布后第三天就有人报了这个问题,但修复补丁还在review中。从那以后,我养成了一个习惯:等一个版本发布至少一个月后再用,让社区先踩踩坑。
还有一点:不要盲目追求最新版。U-Boot不是越新越好,稳定才是王道。你想想看,你的产品要跑三五年,选一个经过时间验证的版本,比追新版本划算得多。
嗯,关于源码获取和版本选择,今天就聊这么多。记住一句话:版本选对了,移植就成功了一半。