uboot编译 uboot-spl 过程(五)

最开始编译uboot时,使用如下命令:
make O=am3517_evm CROSS_COMPILE=arm-arago-linux-gnueabi- am3517_evm
此时生成的文件被称为uboot第二阶段的代码,本节讲解如何编译uboot第一阶段(SPL)。
先来理解SOC的启动流程,针对嵌入式设备,一般上电时刻启动分为三个阶段:
BootROM中的固化程序–>> uboot 第一阶段(SPL)–>> uboot第二阶段 。
uboot spl的存在的原因是对于一些SOC来说,它的内部SRAM可能会比较小(一般小于110KB),小到无法装载下一个完整的uboot镜像(通常为几百KB),那么就需要spl,它主要负责初始化外部RAM和环境,并加载真正的uboot镜像到外部RAM中来执行。

那么怎么样编译生成 uboot spl呢?先去看看uboot的doc/RAEDME.SPL文件,有指导说明:


The building of SPL images can be with:

#define CONFIG_SPL

Because SPL images normally have a different text base, one have to be
configured by defining CONFIG_SPL_TEXT_BASE. The linker script have to be
defined with CONFIG_SPL_LDSCRIPT.

To support generic U-Boot libraries and drivers in the SPL binary one can
optionally define CONFIG_SPL_XXX_SUPPORT. Currently following options
are supported:

CONFIG_SPL_LIBCOMMON_SUPPORT (common/libcommon.o)
CONFIG_SPL_LIBDISK_SUPPORT (disk/libdisk.o)
CONFIG_SPL_I2C_SUPPORT (drivers/i2c/libi2c.o)
CONFIG_SPL_GPIO_SUPPORT (drivers/gpio/libgpio.o)
CONFIG_SPL_MMC_SUPPORT (drivers/mmc/libmmc.o)
CONFIG_SPL_SERIAL_SUPPORT (drivers/serial/libserial.o)
CONFIG_SPL_SPI_FLASH_SUPPORT (drivers/mtd/spi/libspi_flash.o)
CONFIG_SPL_SPI_SUPPORT (drivers/spi/libspi.o)
CONFIG_SPL_FAT_SUPPORT (fs/fat/libfat.o)
CONFIG_SPL_LIBGENERIC_SUPPORT (lib/libgeneric.o)

按照上文说明,需要定义一些宏,那么就去与配置文件相关的头文件中去定义相关宏如下:(路径include/config/am3517_evm.h)在这里插入图片描述
注意,红色区需要根据具体的芯片手册来配置,这里我是直接从am335x系列uboot SPL文件配置拿过来使用的,目前只是为了理解uboot spl的编译生成过程,此处假定此参数配置都正确。黄色标记部分是根据 README.SPL定义相关宏,进行编译生成uboot spl,在此过程中会出现一些小错误,我会介绍如何解决:
在这里插入图片描述
出现错误需要查看响应编译信息,可以重定向输出到make_log文件:
在这里插入图片描述
可以看到出现了两个错误——board_mmc_init函数重复定义和 ld连接部分。
(1)board_mmc_init函数重复定义
查看两处定义如下:在这里插入图片描述在这里插入图片描述
可以看到,两个函数功能是一样的,都是关于MultiMedia卡,那么直接删掉或者屏蔽其中之一,此处选择的是删除am3517evm.c文件中的定义。
(2) arm-arago-linux-gnueagi-ld连接部分关于section `.u_boot_cmd’出现错误
看看详细信息,即make_log中去定位发生该问题的详细指令,最后一条与.u_boot_cmd先关的链接指令,稍作处理如下:在这里插入图片描述
结合 uboot源码中ELF文件u-boot的生成细节(二) 和spl/u-boot.lds中的内容不包含 section “.u_boot_cmd”,可知这里与uboot自有名部分好的函数符号是存在的。在这里插入图片描述
那么这里在链接部分就要去掉关于 section ".u_boot_cmd"部分,也就是删掉spl目录下Makefile中$UNDEF_SYM:在这里插入图片描述
红色部分是未修改之前的,黄色部分是修改部分,删除红色部分,然后重新编译,结果又出现函数未定义:在这里插入图片描述
一个一个来看,先看未定义save_boot_params:在这里插入图片描述在这里插入图片描述
查找函数定义,貌似在同目录下cpu.c文件中有定义,但是在Makefile中可以看到uboot spl是不连接cpu.o文件的:在这里插入图片描述在这里插入图片描述
这样save_boot_params就是确实没有定义,又结合am335x系列uboot源码部分,可以自己定义一个空函数。am335x uboot源码中save_boot_params的作用是在从bootRom跳转到uboot时会传递一些参数,当然是以指针的方式传递的,地址放在寄存器r0中,然后save_boot_params就从寄存器r0中拷贝相关的信息,拷贝完成之后跳转返回,模仿am335x,定义空函数如下:在这里插入图片描述
在omap-common/spl.c中的omap_boot_device 以及omap_boot_mode函数也没有定义,其功能很简单,可以先使编译通过,后续再慢慢根据作用修改,直接定义如下:在这里插入图片描述在这里插入图片描述
至此,uboot spl编译完成:在这里插入图片描述在这里插入图片描述
看到这里,uboot-spl.bin文件也只有24KB(uboot-spl.bin的生成依赖于uboot-spl),需要注意的是这个文件不是最终要进行烧录的文件,还需要添加响应的头部信息,在spl/Makefile中添加如下内容:在这里插入图片描述
编译运行最终结果如下:在这里插入图片描述在这里插入图片描述

关于以上各个文件的作用,由于时间匆忙下节再加以说明,此时已经凌晨了,刚刚愚人节过去了,也没啥有恶作剧发生。。。

### U-Boot 中 DM-SPL 的实现原理 在 U-Boot 中,`dm-spl` 配置用于指定设备模型 (Device Model, DM) 在 Secondary Program Loader (SPL) 和 U-Boot pre-relocation 阶段的应用[^1]。此配置项确保了 SPL 能够访问并初始化必要的硬件资源,在早期启动过程中提供支持。 #### 设备树节点定义 为了使能 `dm-spl` 功能,需要在设备树源文件 (.dts) 中适当位置添加如下属性: ```dts chosen { bootargs = "console=ttyS0,115200"; u-boot,dm-spl; }; ``` 上述代码片段展示了如何通过设置 `u-boot,dm-spl` 属性来启用该功能。这使得平台能够在 SPL 阶段利用完整的设备管理框架进行驱动加载和资源配置。 #### 实现机制解析 当设置了 `u-boot,dm-spl` 之后,U-Boot 将会在 SPL 初始化期间调用特定函数以构建初始环境,并完成对关键外设的支持。具体来说: - **初始化阶段**:读取存储介质中的镜像数据至内存; - **设备枚举**:依据设备树描述自动探测连接在外围总线上的组件; - **驱动绑定**:为已识别的硬件分配相应的驱动程序实例; 这些操作共同构成了一个稳健可靠的低级运行时环境,从而保障后续更高层次软件模块可以顺利接管控制权。 #### 关键代码示例 以下是部分涉及 `dm-spl` 处理逻辑的关键 C 语言代码摘录: ```c // 文件路径: drivers/core/init.c int dm_init(void) { #ifdef CONFIG_SPL_BUILD /* 如果是在编译 SPL,则仅处理标记有 'spl' 或者 'tpl' 的节点 */ if (!IS_ENABLED(CONFIG_DM_TPL)) return dm_scan_fdt_spl(gd->fdt_blob); #endif } ``` 这段代码表明,在 SPL 构建环境下 (`CONFIG_SPL_BUILD`) 并且未开启 TPL 支持的情况下,会专门扫描带有 `spl` 或 `tpl` 标记的 FDT (Flattened Device Tree) 节点来进行有限度的初始化工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值