uboot启动阶段总结

来源:互联网 发布:企业基础数据规范标准 编辑:程序博客网 时间:2024/06/05 11:33
uboot启动主要分为两个阶段,第一个阶段由start.S引导,主要进行SoC内部器件的初始化,代码运行在SRAM中。第二阶段由start_armboot引导,主要进行板级的硬件初始化,代码运行在DRAM中。

uboot的启动过程:
  1. x210内部的iROM内的BL0代码:初始化系统时钟,特定设备(与启动介质相关)控制器并且启动设备
  2. BL0加载bootloader的前16KB到SRAM,这段bootloader就是BL1 ( uboot中的start.S 前16KB )。
  3. BL1( start.S )继续初始化SoC内部的硬件,之后初始化DRAM并重定位代码到DDR中。最后跳转到第二阶段(BL2)。
  4. BL2( start_armboot ) 初始化board内SoC外的硬件,还有一些软件的数据结构。将系统的一些数据也复制到DDR中
  5. 跳转到系统的启动地址。

start.S启动过程中主要是对SoC的内部硬件进行了初始化,包括:
  1. 构建异常向量表
  2. 设置处理器模式(SVC)
  3. 初始化cpu cache,关闭mmu
  4. 关看门狗
  5. 开发板供电置锁
  6. 恢复I/O状态
  7. 初始化时钟
  8. 初始化DDR
  9. 初始化串口并打印调试信息"OK"
  10. 重定位代码到DDR
  11. 建立虚拟地址映射物理地址的转换表并使能MMU
  12. 跳转到第二阶段
之后的代码就从 start_armboot开始执行。
在start_armboot函数中,主要就是对开发板的硬件做了初始化,还有软件的一些数据结构做了初始化。
主要的函数及功能:
init_sequence
cpu_init 空的
board_init 网卡、机器码、内存传参地址
dm9000_pre_init 网卡
gd->bd->bi_arch_number 机器码
gd->bd->bi_boot_params 内存传参地址
interrupt_init 定时器
env_init
init_baudrate gd数据结构中波特率
serial_init 空的
console_init_f 空的
display_banner 打印启动信息
print_cpuinfo 打印CPU时钟设置信息
checkboard 检验开发板名字
dram_init gd数据结构中DDR信息
display_dram_config 打印DDR配置信息表
mem_malloc_init 初始化uboot自己维护的堆管理器的内存
mmc_initialize inand/SD卡的SoC控制器和卡的初始化
env_relocate 环境变量重定位
gd->bd->bi_ip_addr gd数据结构赋值
gd->bd->bi_enetaddr gd数据结构赋值
devices_init 空的
jumptable_init 不用关注的
console_init_r 真正的控制台初始化
enable_interrupts 空的
loadaddr、bootfile 环境变量读出初始化全局变量
board_late_init 空的
eth_initialize 空的
x210_preboot_init LCD初始化和显示logo
check_menu_update_from_sd 检查自动更新
main_loop 主循环

在main_loop函数中,倒计时轮询检测定时器和按键,如果不打断就开始引导内核,打断后进入uboot的命令行。

原创粉丝点击