3.6.8. 返回 BROM
在 USB 升级的应用中,主机通过 USB 下载 SPL 到 SRAM,并且由 BROM 跳转执行,SPL 代码对 DDR 初始化结束之后需要返回到 BROM 中继续执行下载其他数据的操作。
这种应用场景中,将返回 BROM 看做是从 BROM 中加载数据,因此返回 BROM 被实现为一个程序加载器。
common/spl/spl_bootrom.c 中通过注册 BOOT_DEVICE_BOOTROM 来实现。
SPL_LOAD_IMAGE_METHOD("BOOTROM", 0, BOOT_DEVICE_BOOTROM, spl_return_to_bootrom);
具体返回的函数是 board_return_to_bootrom()
。
board_init_r() // common/spl/spl.c
|-> board_boot_order()
| |-> spl_boot_device(); // arch/arm/mach-zx/spl.c
| |-> aic_get_boot_device(); // arch/arm/mach-zx/boot_param.c
| // 从 boot param 中获取启动介质信息,
| // 此处返回 BD_BOOTROM
|
|-> boot_from_devices(spl_boot_list)
|-> spl_ll_find_loader() // 根据boot device找到spl_load_image指针
| // 这里可能是各种介质的 load image 函数
| // SPL_LOAD_IMAGE_METHOD() 定义的 Loader
| // 此处找到的是 BOOT_DEVICE_BOOTROM
|
|-> spl_return_to_bootrom();// common/spl/spl_bootrom.c
|-> board_return_to_bootrom();
// arch/arm/mach-zx/lowlevel_init.S
在 启动参数 章节描述了 BROM 跳转 SPL 运行时所传递的参数,SPL 在开始运行时已经保存了
BROM 跳转时的所有重要寄存器,因此在 board_return_to_bootrom()
可以通过恢复现场,实现返回。