am335x的cpu上电后,执行流程:ROM->MLO(SPL)->u-boot.img
第一级bootloader:引导加载程序,板子上电后会自动执行这些代码,如启动方式(SDcard、SPI、NOR),然后跳转至第二级bootloader。这些代码应该是存放在 176KB 的 ROM 中
第二级bootloader:MLO(SPL),用于硬件初始化,关看门狗,关中断,设置CPU时钟频率、速度、加载uboot.img、dts等操作,MLO文件应该会被映射到 64 KB的 Internal SRAM 中.
第三级bootloader:u-boot.img, C代码的入口.
这里先整体介绍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代码运行