本文主要是介绍OK6410A 开发板 (三) 8 u-boot-2021.01 boot 解析 SPL镜像运行部分,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
url : git@github.com:lisider/u-boot.git
branch : ok6410a
commit id : e63a4077ad3aea53107495b0b68b95e720fe6033
config : ok6410a_mini_defconfig
// 涉及的 .S .s .c 文件 有 67个
- 从入口出口来看
// 运行在 0x0c00 0000
reset arch/arm/cpu/arm1176/start.S 39 lowlevel_init(108) board/samsung/ok6410a/lowlevel_init.S 72_main(110) arch/arm/lib/crt0.S 91board_init_f(117) board/samsung/ok6410a/ok6410a.c 266debug_uart_init(271) include/debug_uart.h 193_debug_uart_init(196) drivers/serial/s3c64xx_serial.c 315 board_init_r(177) common/spl/spl.c 589spl_board_init(641) board/samsung/ok6410a/ok6410a.c 255spl_boot_mmc(258) board/samsung/ok6410a/bl2_mmc_copy.c 18mmc_bl2_copy(23) board/samsung/ok6410a/bl2_mmc_copy.c 7CopyMovitoMem(HSMMC_CHANNEL, MOVI_BL2_POS, MOVI_BL2_BLKCNT, bl2_base, MOVI_INIT_REQUIRED)(13) arch/arm/mach-s3c64xx/include/mach/movi.h 25bl2base(24) // 跳转到 u-boot 的u-boot镜像
spl标准流程
reset arch/arm/cpu/arm1176/start.S 39 lowlevel_init(108) board/samsung/ok6410a/lowlevel_init.S 72_main(110) arch/arm/lib/crt0.S 91board_init_f(117) board/samsung/ok6410a/ok6410a.c 266debug_uart_init(271) include/debug_uart.h 193_debug_uart_init(196) drivers/serial/s3c64xx_serial.c 315 board_init_r(177) common/spl/spl.c 589spl_board_init(641) board/samsung/ok6410a/ok6410a.c 255memset(&spl_image, '\0', sizeof(spl_image)); // u-boot.imgspl_image.boot_device = 0xdeadbeef;// 得到 u-boot.img在的 device类型board_boot_order(spl_boot_list);spl_boot_list[0] = spl_boot_device();ok6410a_get_boot_device// 通过device类型得到 loader函数// 用 loader 函数加载 u-boot.img 到 ddrboot_from_devices(&spl_image, spl_boot_list, (sizeof(spl_boot_list) / sizeof((spl_boot_list)[0])));loader = spl_ll_find_loader(spl_boot_list[i]);spl_load_image(spl_image, loader);loader->load_image/spl_mmc_load_imagespl_mmc_load...spl_parse_image_headerspl_parse_legacy_headerspl_image->load_addr = image_get_load(header);spl_image->entry_point = image_get_ep(header);spl_image->size = image_get_data_size(header);// 需要 打补丁的赶紧打补丁 // 比如说 你的 u-boot.img 有问题,解析出来的 entry_point 不对// 就需要重新为 entry_point 赋值// 一般为nullspl_perform_fixups(&spl_image);switch (spl_image.os) {case IH_OS_U_BOOT:break;}// 一般为nullspl_board_prepare_for_bootjump_to_image_no_args(&spl_image);image_entry_noargs_t image_entry = (image_entry_noargs_t)spl_image->entry_point;image_entry
这篇关于OK6410A 开发板 (三) 8 u-boot-2021.01 boot 解析 SPL镜像运行部分的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!