(am335x) u-boot启动过程分析之概述

芯片到uboot启动流程 :ROM → MLO(SPL)→ uboot.img

第一级bootloader:引导加载程序,板子上电后会自动执行这些代码,如启动方式(SDcard、SPI、NOR),为启动介质加载驱动,加载第二级bootloader到 ISRAM,然后跳转至第二级bootloader。这些代码存放在 176KB 的 ROM 中.

 

 

第二级bootloader:MLO(SPL),主要是cpu相关的初始化,关看门狗,关中断,设置CPU时钟频率、速度、加载uboot.img、dts等操作,然后会跳转到第三级bootloader。MLO文件应该会被映射到 64 KB的 Internal SRAM 中.

 

第三级bootloader:u-boot.img, C代码的入口. 板级相关的初始化:uart,网卡,中断,gpio引脚等,加载内核和设备树到ddr,并跳转到内核入口。

 

其中第一级 bootloader 是板子固化的,第二级和第三级是通过编译 uboot 所得的。

这里先整体介绍u-boot的整体功能,接下来再具体展开分析。
执行流程如下:

SPL(MLO):

  • 1. reset; (@arch/arm/cpu/armv7/start.s)
    • -> @ disable interrupts (FIQ and IRQ);
    • -> @ set the cpu to SVC32 mode;
  • 2. cpu_init_cp15: (@arch/arm/cpu/armv7/start.s)
    • -> @ setup CP15 registers (cache, MMU, TLBs);
    • -> @ Invalidate L1 I/D;
    • -> @ disable MMU stuff and caches
  • 3. cpu_init_crit: (@arch/arm/cpu/armv7/start.s)
    • -> go setup pll,mux,memory;
    • -> lowlevel_init: (@arch/arm/cpu/armv7/lowlevel_init.s)
    • ----> @ Setup a temporary stack
    • ----> @ Set up global data
    • ----> s_init: (@arch/arm/cpu/armv7/am33xx/board.c)
    • -------> watchdog_disable
    • -------> timer_init
    • -------> set_uart_mux_conf
    • -------> setup_clocks_for_console
    • -------> uart_soft_reset
    • -------> preloader_console_init
    • -------> rtc32k_enable
    • -------> prcm_init
    • -------> sdram_init
  • 4. _main: (@arch/arm/lib/crt0.s)
    • -> @ Set up initial C runtime environment and call board_init_f;
    • -> board_init_f:(@arch/arm/lib/spl.c)
    • ----> @ call board_init_r;
    • ----> board_init_r:(@common/spl/spl.c)
    • -------> spl_xxx_load_image :根据不同的启动方式加载 u-boot 镜像
    • -------> jump_to_image_no_args:进入u-boot代码运行

U-BOOT:

  • 1. reset; (@arch/arm/cpu/armv7/start.s)
    • -> @ set SVC mode;
    • -> @ disable FIQ and IRQ;
  • 2. _main: (@arch/arm/lib/crt0.s)
    • -> @ Set up initial C runtime environment and call board_init_f;
    • -> board_init_f:(@arch/arm/lib/board.c)
    • ----> init_sequence:(@arch/arm/lib/board.c);
    • -> relocate_code:(@arch/arm/lib/relocate.S)
    • ----> @ 代码重定位;
    • -> board_init_r:(@arch/arm/lib/board.c)
    • ----> enable_caches;
    • ----> board_init:(@board/ti/am335x/board.c);
    • -------> @ 根据配置初始化各种外设;
    • ----> main_loop:(@common/main.c);



转自:https://www.jianshu.com/p/6c85f3c05b95
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值