Skip to content

LV005-U-Boot简介

一、uboot 简介

Linux 系统要启动就必须需要一个 bootloader 程序,也就说芯片上电以后先运行一段 bootloader 程序。这段 bootloader 程序会先初始化 DDR 等外设,然后将 Linux 内核从 flash(NAND、NOR FLASH、SD、MMC 等)拷贝到 DDR 中,最后启动 Linux 内核。

bootloader 的实际工作要复杂的多,但是它最主要的工作就是启动 Linux 内核, bootloader 和 Linux 内核的关系就像是 PC 上的 BIOS 和 Windows 的关系一样, bootloader 就相当于 BIOS。

目前有很多现成的 bootloader 软件可以使用,比如 U-Boot、 vivi、 RedBoot 等等,其中以 U-Boot 使用最为广泛,为了方便书写,后边的笔记会将 U-Boot 写为 uboot,毕竟是笔记,能理解就可以啦。

uboot 的全称是 Universal Boot Loader, 它是一个遵循 GPL 协议的开源软件, 是一个裸机代码,我们可以将它看作是一个裸机综合例程。现在的 uboot 已经支持液晶屏、网络、 USB 等高级功能。

Tips:总的来说 uboot 的目的是为了正确引导内核的启动,它分为两个阶段,即 boot + loader,boot 阶段启动系统,初始化硬件设备,建立内存空间映射图,将系统的软硬件带到一个合适的状态,loader 阶段将操作系统内核文件加载至内存,之后跳转到内核所在地址运行。

二、uboot 源码

1. uboot 官网

uboot 的官网在这里:U-Boot | DENX,我们打开这个网页,如下图所示:

image-20221012163419784

我们点击框选出来连接便会跳转到 uboot 的官方文档页面。

2. 获取原版 uboot

2.1 官网获取

我们点击 uboot 官方文档中的 【Build U-Boot】→【Obtaining the source】,便会看到 uboot 的下载方式:

image-20221012164001519

其实我们也可以直接到这里选择相应的版本下载:Tags · U-Boot / U-Boot · GitLab (denx.de) 或者 Tags · u-boot/u-boot (github.com)

2.2 ftp 下载

我们还可以通过这里下载相应版本的 uboot:Index of /pub/u-boot/ (denx.de)

3. 不同的 uboot 代码

一般来讲,我们不会直接用 uboot 官方的源码的。 uboot 官方的 uboot 源码是给半导体厂商准备的,半导体厂商会下载 uboot 官方的 uboot 源码,然后将自家相应的芯片移植进去。也就是说半导体厂商会自己维护一个版本的 uboot,这个版本的 uboot 相当于是他们定制的。既然是定制的,那么肯定对自家的芯片支持会很全,虽然 uboot 官网的源码中一般也会支持他们的芯片,但是绝对是没有半导体厂商自己维护的 uboot 全面。而芯片的使用者,在这里就是开发板的厂家,他们会根据自己的需要来设计外设,这个时候可能需要在uboot中适配自己的开发板,这个开发板厂家也会维护自己的uboot代码。于是,就涉及到下面三种版本的代码:

uboot 代码种类描述
uboot 官方的 uboot 代码由 uboot 官方维护开发的 uboot 版本,版本更新快,基本包含所有常用的芯片。
半导体厂商的 uboot 代码半导体厂商维护的一个 uboot,专门针对自家的芯片,在对自家芯片支持上要比 uboot 官方的好。
开发板厂商的 uboot 代码开发板厂商在半导体厂商提供的 uboot 基础上加入了对自家开发板的支持

比如,NXP 是生产芯片的,以 I.MX6ULL 为例,NXP 会从 U-Boot 官网获取一个源码版本,在这个源码中 NXP 会进行修改添加自己的 I.MX6ULL 芯片并进行维护,保证这款芯片的 USB、串口等一些基本外设可以正常使用,这就是半导体厂商的 uboot。正点原子使用 I.MX6ULL 做了 ALPHA-I.MX6ULL 开发板,这个时候正点原子以 NXP 维护的 uboot 源码基础上在进行开发,适配开发板使用的网口、EMMC、DDR 等等基础外设,这就得到了开发板厂商的 uboot 代码。

在 ALPHA-I.MX6ULL 开发板的 uboot 资源中,正点原子使用的 NXP uboot 是 rel_imx_4.1.15_2.1.0_ga · nxp-imx/uboot-imx · GitHub 这个版本。NXP 维护的这个 uboot 基本支持了 NXP 当前所有可以跑 Linux 的芯片,而且支持各种启动方式,比如 EMMC、NAND、 NOR FLASH 等等,这些都是 uboot 官方所不支持的。

Tips:但是我们要是不使用开发板,而是自己去做产品,那么我们就要直接从芯片原厂这里获取uboot源码进行修改和维护,适配自己的产品。

4. uboot 的维护

正常来说,我们要是自己想做一款开发板的话,我们需要去要使用的芯片厂家哪里获取芯片原厂维护的 uboot,然后在这个 uboot 上做修改,适配自己的开发板。在真正的生产环境中,uboot 是芯片原厂已经做好的,只是根据需要修改一下 uboot,像 USB、串口这些,基本都还是和原厂保持一致,而不会去大改 uboot 的源码。

从头开始适配自己的板子没有必要也没有意义,因为 uboot 就是为了引导内核启动的,启动后 uboot 就没有什么作用了,与其将 uboot 改得乱七八糟还不如花时间去维护内核的稳定性。