嵌入式分享#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还有两个非常核心的环境变量,我们下期聊。

(完)

相关推荐
§ꦿCFོ༉6 小时前
嵌入式八股文—C语言入门学习(二)
c语言·学习·嵌入式·编程语言
Zwawa1 天前
两根线怎么挂住一堆设备:I2C 协议原理
c语言·单片机·嵌入式
欧西1 天前
零成本做一颗芯片:我用 OpenLane 把 SHA-256 从 Verilog 做到了 GDS
开源·嵌入式
LCG米1 天前
STM32 定时器主从模式输出精确脉冲数实测:TRGO 触发链拆解、多发一脉冲根因与干净停止时序落地
stm32·单片机·嵌入式硬件·嵌入式
anguoyang2 天前
RK3588 上模型「能跑但很慢」:逐算子查 CPU 回退的完整方法与实测
嵌入式
xbronze2 天前
STM32+RC522读取MIFARE 1K卡排坑实录
嵌入式
La Pulga2 天前
【FreeRTOS源码学习笔记】空闲任务与阻塞延时
笔记·mcu·学习·嵌入式·freertos·实时操作系统
小李不想当小白2 天前
WDG看门狗(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
La Pulga3 天前
【FreeRTOS源码学习笔记】任务切换
单片机·mcu·学习·嵌入式·freertos·实时操作系统
Sakura_j_h_3 天前
51 单片机驱动四位数码管:动态扫描、限流电阻与消影的取舍
单片机·嵌入式硬件·51单片机·嵌入式·数码管·动态扫描·限流电阻