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中添加如下内容:在这里插入图片描述
编译运行最终结果如下:在这里插入图片描述在这里插入图片描述

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

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值