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() 可以通过恢复现场,实现返回。