运行流程:U-Boot SPL运行在片上SRAM中,负责初始化DDR,然后从第一个(裸)分区中加载U-Boot镜像到DDR。U-Boot会从boot分区中读取opensbi镜像、Linux镜像、Linux设备树镜像、(如果需要的话)initramfs,分别加载到DDR的特定位置,然后从openSBI开始运行。(强调“Linux”设备树是因为该设备树只是给openSBI和Linux使用,U-Boot及...
(3)由u-boot-spl生成u-boot-spl-nodtb.bin Created with Raphaël 2.1.0u-boot-splobjcopy动作去掉符号信息表u-boot-spl-nodtb.bin 对应二、2(3)的实现 (4)由u-boot-spl-nodtb.bin生成u-boot-spl.bin,也就是spl的bin文件 Created with Raphaël 2.1.0u-boot-spl-nodtb.bin在不需要dtb的情况下,...
void board_init_r(gd_t *dummy1, ulong dummy2) { u32 spl_boot_list[] = { BOOT_DEVICE_NONE, BOOT_DEVICE_NONE, BOOT_DEVICE_NONE, BOOT_DEVICE_NONE, BOOT_DEVICE_NONE, }; struct spl_image_info spl_image; int ret; debug(">>" SPL_TPL_PROMPT "board_init_r()\n"); //gd->bd= ...
1、uboot-spl入口说明 通过uboot-spl编译脚本project-X/u-boot/arch/arm/cpu/u-boot-spl.lds ENTRY(_start) 所以uboot-spl的代码入口函数是_start 对应于路径project-X/u-boot/arch/arm/lib/vector.S的_start,后续就是从这个函数开始分析。 2、CONFIG_SPL_BUILD说明 前面说过,在编译SPL的时候,编译参数会...
1、uboot-spl入口说明 通过uboot-spl编译脚本project-X/u-boot/arch/arm/cpu/u-boot-spl.lds AI检测代码解析 ENTRY(_start) 1. 所以uboot-spl的代码入口函数是_start 对应于路径project-X/u-boot/arch/arm/lib/vector.S的_start,后续就是从这个函数开始分析。
u/armv7/start.S>中的save_boot_params.其不做任何事情,直接返回。116~138: 看注释即可明白。141: 因为SPL主要是对SoC进行初始化,所以不会定义CONfig_SKIP_LOWLEVE_INIT, 即142,143行得以执行。142: cpu_init_cpu15, 主要作用invalidate L1 I/D cache, disable MMU. 检查是否需要workaround....
u-boot,spl-boot-order = &sdhci, &sdmmc0, &nandc0, &spi_nand, &spi_nor; }; 1. 2. 3. 4. 重新编译 u-boot 及 u-boot spl,使用 u-boot 下的./ --spl可以更新新的u-boot spl,这样启动信息中发现,优先从 MMC1 启动,不再打印 MMC2 的报错信息。
SPL是uboot第一阶段执行的代码。 主要负责搬移uboot第二阶段的代码到内存中运行。 SPL是由固化在芯片内部的ROM引导的。 我们知道很多芯片厂商固化的ROM支持从nandflash, SDCARD等外部介质启动。
下面的步骤只有在non-SPL下才可用。 (这里我觉得其实对于我们实验室使用了安全启动的系统是不具备SPL的。因为加载uboot的东西是其他的image) 3)创建一个中间的环境: 栈和GD都在系统RAM中由board_init_f()函数分配,但是BSS和已初始化的非常量数据仍然不可用。 4)调用relocate_code()。 该函数将U-Boot从当前的...
从前面分析的u-boot-spl.lds链接文件可知,启动代码就是arch/arm/cpu/armv7/start.S。start.S主要做的事情就是初始化系统的各个方面。 从大的方面分,可以分成这几个部分: 1)设置CPU模式。 2)关闭看门狗。 3)关闭中断。 4)设置堆栈sp指针。 5)清除bss段。 6)异常中断处理。 /* * armboot - Startup Cod...