1.start.S
初始化 icache
看门狗
时钟
DDR
设置栈
初始化串口,并打印 OK
以上完成 lowlevel_init
-----------------------------------------
重定位
开启MMU
清BSS
远跳转到 _start_armboot
2.start_armboot
|
|------------init_sequence
| |---------------------cpu_init 空
| |---------------------board_init 初始化网卡设置 arch_number boot_params 基地址
| |---------------------interrupt_init 初始化定时器
| |---------------------env_init 获得合法的环境变量的基地址
| |-------------------- init_baudrate 取得波特率值
| |--------------------- serial_init 初始化串口
| |--------------------- console_init_f 控制台的首次初始化
| |---------------------display_banner 打印uboot version 等信息
| |---------------------printcpuinfo 打印cpu时钟频率
| |---------------------checkboard 打印板子版本信息
| |---------------------init_func_i2c 初始化i2c
| |---------------------- dram_init 记录DDR地址信息
| |--------------------- display_dram_config 打印DDR地址信息
|
|------------------------------ 初始化堆空间
|------------------------------ 根据soc不同,初始化flash
|------------------------------ 开启异常中断处理
|------------------------------ main_loop
环境变量:如果没有合法的环境变量,uboot会使用程序内嵌的默认环境变量。
需要注意的是 arch_number, uboot的 arch_number将作为参数传给kernel,kernel有自己的arch_number,两者必须一样,kernel才能继续执行。
重要的还有内存地址,uboot初始化DDR设置的地址表,必须和kernel 使用的地址表相同
可以看出 start.S 阶段是初始化Soc内部,start_armboot 是初始化Soc外部并准备启动参数。