Rockchip Uboot 详细启动流程
- 本文主要介绍 RK Uboot 启动流程中的重要步骤。
启动流程
start.s
// 汇编环境
=> IRQ/FIQ/lowlevel/vbar/errata/cp15/gic // ARM 架构相关的 lowlevel 初始化
=> _main
=> stack // 准备好 C 环境需要的栈
// 【第一阶段】 C 环境初始化,发起一系列的函数调用
=> board_init_f: init_sequence_f[]
initf_malloc
arch_cpu_init // SoC 的 lowlevel 初始化
serial_init // 串口初始化
dram_init // 获取 ddr 容量信息
reserve_mmu // 从 ddr 末尾开始往低地址 reserve 内存
reserve_video
reserve_uboot
reserve_malloc
reserve_global_data
reserve_fdt
reserve_stacks
dram_init_banksize
sysmem_init
setup_reloc // 确定 U-Boot 自身要 reloc 的地址
// 汇编环境
=> relocate_code // 汇编实现 U-Boot 代码的 relocation
// 【第二阶段】 C 环境初始化,发起一系列的函数调用
=> board_init_r: init_sequence_r[]
initr_caches // 使能 MMU 和 I/Dcache
initr_malloc
bidram_initr
sysmem_initr
initr_of_live // 初始化of_live
initr_dm // 初始化dm框架
board_init // 平台初始化,最核心部分
board_debug_uart_init // 串口 iomux、clk 配置
init_kernel_dtb // 切到 kernel dtb
clks_probe // 初始化系统频率
regulators_enable_boot_on // 初始化系统电源
io_domain_init // io-domain 初始化
set_armclk_rate // __weak,ARM 提频(平台有需求才实现)
dvfs_init // 宽温芯片的调频调压
rk_board_init // __weak,由各个具体平台进行实现
console_init_r
board_late_init // 平台 late 初始化
rockchip_set_ethaddr // 设置 mac 地址
rockchip_set_serialno // 设置 serialno
setup_boot_mode // 解析 "reboot xxx" 命令、识别按键和 loader烧写模式、recovery
charge_display // U-Boot 充电
rockchip_show_logo // 显示开机 logo
soc_clk_dump // 打印 clk tree
rk_board_late_init // __weak,由各个具体平台进行实现
run_main_loop // 进入命令行模式,或执行启动命令