这只是博主的个人见解,如有错误之处,还望指出,一起交流学习!!
uboot启动第二阶段,其实也就是lib_arm/board.c里面的start_armboot函数:
0---比较重要的几个基础数据结构有全局数据结构gd_t、板级信息结构bd_t
1---分配内存,也就是计算gd在内存DDR中的起始地址
2---分配gd_t、bd_t空间,并清零
3---init_sequence,一个很重要的初始化函数,同时其也是一个函数数组指针,下面列举几个比较重要的初始化函数
---cpu_init 主要是cpu内部的初始化
---reloc_init 重定位的初始化
---board_init, 板级硬件初始化
---dm9000_pre_init 网卡初始化
--- gd->bd->bi_arch_number 开发板的机器码,很重要的一个参数,事关能否启动内核
--- gd->bd->bi_boot_params uboot给linux kernel启动时的传参的内存地址
---interrupt_init, 中断初始化,其实追进去发现主要是初始化Timer4,将其做为计时用,也就是bootdelay
---env_init, 环境变量初始化,看板子是从哪里获取env的,对于x210就是env_movi.c
---init_baudrate, 波特率初始化,初始化波特率为115200
---serial_init, 串口初始化
---console_init_f, 控制台第一次初始化(可从_f看出为第一次,后面有以_r结尾的为第二次初始化)
---gd->have_console
---display_banner, 打印uboot版本信息
---version_string U_BOOT_VERSION mekefile编译生成的,__DATE__ 日期 __TIME__ 时间
---print_cpuinfo, 打印cpu信息及各总线频率
---checkboard, 打印板级信息
---init_func_i2c, 初始化i2c
---dram_init, dram初始化,这是软件架构层次的初始化
---gd->bd->bi_dram[0].start // 第一片内存的起始地址
---gd->bd->bi_dram[0].size // 第一片内存的大小
---display_dram_config 打印内存(dram)区配置信息
4---mem_malloc_init 初始化堆管理器
5---mmc_initialize 针对特定开发板的mmc初始化
---board_mmc_init
---mmc_init
6---env_relocate 环境变量的重定位
7---gd->bd->bi_ip_addr gd->bd->bi_enetaddr 确定板子的ip地址和mac地址
8---devices_init 设备初始化
9---jumptable_init jumptable跳转表,本身是一个函数指针数组
10--console_init_r 控制台的第二阶段初始化
11--enable_interrupts CPSR中总中断标志位的使能
12--getenv ("loadaddr") getenv ("bootfile") 这两个环境变量都是内核启动有关的
13--board_late_init 开发板级别的一些初始化
14--eth_initialize 网卡相关的初始化,芯片本身的初始化
15--x210_preboot_init 启动时的lcd和logo显示相关的
16--check_menu_update_from_sd 自动更新的功能
17--main_loop 进入死循环,接收命令、解析命令、执行命令