嵌入式分享#34:浅谈U-Boot (1)

除了芯片原厂以及少数方案厂商,目前大部分的产品开发几乎都不需要修改或移植U-Boot 源码,但是了解U-Boot对我们深刻理解Linux知识体系以及系统级问题排查都有极大的帮助。

1 初识 U-Boot

U-Boot(Universal Bootloader,通用引导程序)是嵌入式系统领域应用最广泛的开源引导程序,主要作用是在硬件上电后完成初始化并引导加载Linux内核。

U-Boot本质其实就是一个裸机代码。

我们可以在U-Boot 官网下载到"原汁原味"的U-Boot 源码,但实际工作中我们通常用不上,因为这是U-Boot官方为芯片原厂提供的,除非你是芯片原厂的BSP工程师。

text 复制代码
U-Boot 官网下载:https://ftp.denx.de/pub/u-boot/

芯片原厂下载U-Boot 源码后,针对自家芯片专门进行移植适配,并对外发布维护一份U-Boot 源码。开发板/方案厂商又会在芯片原厂提供的U-Boot 源码基础上加入了针对自家开发板/核心板的支持。因此,U-Boot通常有如下3种:

  1. U-Boot官方发布并维护的U-Boot 源码;

  2. 芯片原厂发布并维护的U-Boot 源码;

  3. 开发板/方案厂商发布并维护的U-Boot 源码。

我们平时做产品开发基本上使用的都是2或3。还有些开发板或方案厂商U-Boot 源码直接不开源,目的是防止他们的系统跑在别的硬件上。

2 U-Boot 配置与编译

我们编译U-Boot 源码时,通常会执行make xxx_defconfig和make这两个命令,那么它们的主要作用是什么呢?下面我们来大致了解一下这过程。

make xxx_defconfig和make是编译u-boot的两个核心步骤,分别对应 "配置" 和 "编译" 两个阶段。

make xxx_defconfig配置阶段

make xxx_defconfig:用于配置U-Boot,最主要的目的就是生成.config文件,指定硬件平台特性。

根据预设的板级配置文件(比如:rk3576_defconfig),生成 U-Boot 的核心.config配置文件,告诉编译器 "要为哪个硬件平台编译 U-Boot,需要启用哪些功能"。具体说明如下:

U-Boot 源码中包含大量针对不同硬件平台的默认配置,存储在configs/目录下。

文件名格式通常为<平台名>_defconfig。例如rk3576_defconfig对应瑞芯微RK3576开发板。

执行make rk3576_defconfig时,会将configs/rk3576_defconfig文件中的配置项(如 CPU 型号、支持的外设、功能开关等)复制到U-Boot根目录的.config文件中。

bash 复制代码
make rk3576_defconfig  # 为 RK3576开发板生成配置文件

为什么需要make xxx_defconfig?

由于U-Boot 支持数千种硬件平台,通过defconfig文件可以快速指定目标平台,可以避免我们手动一个个配置海量参数(如是否支持 SPI Flash、网卡型号等)。

make 编译阶段

make:根据.config配置文件编译源码,生成可执行镜像。编译器读取.config文件中的配置,决定哪些源码文件需要编译(如支持 SD 卡的驱动会被包含,不支持的功能模块会被忽略)。最终生成可烧录到硬件的U-Boot镜像(如u-boot.bin、u-boot.img、u-boot-spl.bin等)。

镜像说明:

u-boot.bin:原始二进制镜像,可直接烧录到启动介质(如 SPI Flash)。

u-boot.img:带有头部信息的镜像(包含加载地址、校验值等),适合某些 bootrom 加载。

u-boot-spl.bin:SPL(Secondary Program Loader,二级引导程序),用于初始化内存等硬件,再加载主U-Boot(部分平台需要)。

特别说明:

  • 必须先执行make xxx_defconfig生成.config,才能执行make编译 ------ 否则编译器不知道要为哪个平台编译,会报错。
  • 若需要调整功能(如新增对某外设的支持),可在make xxx_defconfig后执行make menuconfig(图形化配置界面)修改.config,再执行make重新编译。
  • 若更换目标平台(如从 RK3576 切换到全志T527),需先执行make distclean清除旧配置和编译产物,再重新执行make <新平台>_defconfig和make。

总的来说,make xxx_defconfig像是在"定规矩"------ 告诉编译器 "为哪个硬件编译,包含哪些功能",生成配置文件。make则是"按规矩做事"------ 根据配置文件编译源码,生成最终可运行的U-Boot镜像。

3 哪些情况需做 U-Boot 移植?

在嵌入式领域,U-Boot移植(即针对特定硬件平台适配U-Boot)通常发生在硬件方案全新设计或重大变更的场景下。当现有U-Boot版本无法直接支持新硬件的核心功能时,就需要通过移植使其适配目标平台。

简单来说:只要硬件的核心架构、关键组件或启动需求与现有U-Boot不兼容,就需要移植。这通常是芯片原厂BSP工程师的活,一般不需要芯片使用者太操心,有个了解即可。

U-Boot还有两个非常核心的环境变量,我们下期聊。

(完)

相关推荐
LCG米3 小时前
STM32 HardFault故障定位实测:压栈帧寄存器解析、CFSR故障源判读与出错地址回溯
前端·javascript·stm32·单片机·嵌入式
不会C语言的男孩1 天前
libxml2 源码编译与 XML 读取验证(x86 / ARM)
xml·c语言·嵌入式
Zwawa2 天前
先把轮子转稳,才不会烧心:编码器速度环 PID 怎么接回 PWM
c语言·单片机·嵌入式
云中双月2 天前
瑞芯微rv1106进入Loader模式转储emmc数据
linux·嵌入式·uboot·u-boot·emmc·rockchip·烧录·rv1106·瑞芯微
Zwawa2 天前
黑盒与白盒:人是怎么把世界装进口袋的
人工智能·嵌入式
blueSatchel2 天前
关于dev下节点的创建
linux·嵌入式
我是海飞3 天前
使用杰理 AC7925B 实现 Windows电脑 USB 副屏
windows·单片机·电脑·嵌入式·杰理
Zwawa3 天前
PID 的三个参数之外:位置式、增量式和反馈控制
c语言·单片机·嵌入式
一直C3 天前
嵌入式 Linux 驱动开发学习笔记(三)设备树、GPIO子系统、中断与外设驱动实战
驱动开发·单片机·嵌入式硬件·嵌入式·arm·imx6ull