一、uboot 启动流程
启动入口 arch/arm/cpu/armv7/start.S
1.汇编阶段
(1)异常向量表
(2)初始化基本CPU 协处理器等
cpu_init_cp15: 初始化 L1缓存 、 关闭mmu 、 关闭看门狗 、 单纯化,
执行完cpu_init_cp15后,跳转到cpu_init_crit执行。
(3)运行地址检查
1)如果运行在 flash上
初始化内存 初始化时钟
b relocate_code 代码自搬移
将 在 flash/SD卡 中的 uboot代码 复制到 RAM 重启uboot 在RAM中
2)运行在RAM上
板载设备初始化 进入 board_init_f
2.C阶段
arch/arm/lib/board.c:277 board_init_f
核心代码:
for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
if ((*init_fnc_ptr)() != 0) {
hang ();
}
}
其他更多设备的初始化 定时器 串口 终端 ...
board_init_r: 中断初始化
for (;;) {
main_loop(); // 交互模式 主循环
}
二、uboot 命令了解
uboot常用命令:
1.help: 查看uboot支持的命令
2.printenv: 查看环境变量
3.set 环境变量名 参数值 // 设置环境变量
4.save 保存环境变量
5.bootargs : 引导Linux内核时 传递给内核的参数
6.bootcmd : 自启动模式下 uboot 会自动执行该参数给定的 命令表
7.bootdelay=3 : 进入自启动模式的 延时时间 单位S
8.tftp 通过tftp客户端 向服务器下载数据
tftp 内存地址 文件名
9.boom 引导Linux内核
boom 内核的位置 根文件系统位置 设备树的位置
10.loadb 通过串口下载文件
11.go 跳转指定内存地址 执行程序
12.系统固化到flash中 会用到的命令
movi read u-boot/kernel addr
movi write u-boot/kernel addr
movi read rootfs addr size
movi write rootfs addr size