U-Boot Proper
│ arch/arm/mach-rockchip/board.c │
│ │
│ reset → _main → board_init_f() → relocate → │
│ board_init_r() │
│ │
│ board_init() ← Rockchip 公共实现 │
│ ├─ board_debug_uart_init() │
│ ├─ early_download() 检测下载按键 │
│ ├─ clks_probe() 时钟驱动 │
│ ├─ regulators_enable_boot_on() 电源 │
│ ├─ io_domain_init() │
│ └─ rk_board_init() ← evb_rv1106.c 没重写 │
│ │
│ board_late_init() ← 环境变量、启动参数 │
│ ├─ rockchip_set_ethaddr() MAC 地址 │
│ ├─ rockchip_set_serialno() 序列号 │
│ ├─ setup_boot_mode() 正常/恢复/下载 │
│ ├─ env_fixup() 环境变量调整 │
│ └─ rk_board_late_init() ← evb_rv1106.c 没重写 │
│ │
│ 进入命令行/bootcmd: │
│ boot_fit; boot_android ${devtype} ${devnum}; │
│ → 加载 kernel/DTB → bootm → 启动 Linux
解析
uboot核心层
- _main 函数
- board_init_f_alloc_reserve,board_init_f_init_reserve (两步)
- board_init_f 比较重要
- 省略一堆
- relocate 比较重要
- board_init_r 比较重要
板级层
uboot配置中
CONFIG_ARCH_ROCKCHIP=y
arch/arm/Makefile:80:
machine-$(CONFIG_ARCH_ROCKCHIP) += rockchip
machdirs := $(patsubst %,arch/arm/mach-%/,$(machine-y))
# → machdirs = "arch/arm/mach-rockchip/"
- RK芯片的默认入口就是这个文件
/uboot/arch/arm/mach-rockchip/board.c
- 这个文件下有很多启动时会调用的函数,一般不会在这里进行修改
board.c到vb_rv1106.c使用__weak 弱函数实现分层架构,两个 .c 文件都生成 .o,链接器按"强符号覆盖弱符号"规则决定最终用哪个函数
- 最后会走到某一个板子的目录下
/uboot/board/rockchip/evb_rv1106/evb_rv1106.c
- 一般在这个目录下做板级修改。比如开机管理等。