1---定义了两个结构体指针类型的全局变量gd和bd并绑定指针(全局变量分配内存),结构体中存储uboot用到的全局变量;定义了一个二重函数指针
init_fnc_ptr,用来指向函数指针数组init_sequence;
①gd中相对重要的变量有baudrate、env_addr(环境变量数组首地址)、env_valid(flash中env是否有效标志);
②bd中相对重要的变量有bi_ip_addr、bi_enetaddr[6](MAC地址)、bi_arch_number(机器码)、bi_boot_params(uboot传给kernel启动所需参数的内存地址)、bi_dram[](内存片数、起始地址和大小);
小技巧:串口控制台中输入命令bdinfo,可打印出bd中记录的所有全局变量的值;
2---
for循环中遍历函数指针数组init_sequence(第二种方法遍历 : 末尾放置结束标志NULL);
①cpu_init,为空,CPU级别的初始化已在start.S中完成;
②board_init,初始化网卡,bd所指结构体中填充MAC地址和uboot给内核所传参数的存放地址(0x30000100);
③interrupt_init,初始化定时器timer 4,定时10ms;
④env_init,判定env_valid是否有效(此时未完成env从SD卡到DDR中的重定位);
⑤init_baudrate,初始化串口波特率,从环境变量中获取;
⑥serial_init,串口初始化,第一阶段lowlevel_init中最后一步已初始化过;
⑦console_init_f ,控制台第一阶段初始化,仅将gd->have_console置1;
⑧display_banner,串口打印uboot版本信息;其中
“for x210”字样由x210_sd.h中的CONFIG_IDENT_STRING宏决定;
⑨
print_cpuinfo,打印CPU时钟配置信息;
⑩check_board,串口输出“Board: x210”字样;
⑪init_func_i2c,未遍历(条件宏未定义),硬件添加I2C功能需放开x210_sd.h中相应的宏,放开后串口输出“ready”;
⑫dram_init,填充bi指向的结构体中的bi_dram[]结构体数组,传递内存片数、起始地址和单片大小信息(x210_sd.h配置);
⑬display_dram_config,串口打印dram配置信息,输出“DRAM: 512 MB”字样;
完成遍历
3---串口输出“Flash: 8 MB”字样,可以辅助阶段性调试(此处刚好遍历完init_sequence,结合板子上无norflash,可以在源码中将输出信息改为Traversal completed);
4---初始化堆管理器(指定堆管理器管理的内存起始地址和大小);
5---串口打印“SD/MMC...”字样;
6---env_valid不等于0时,
env_relocate_spec函数调用movi_read_env实现环境变量的重定位;
env_valid等于0时,
set_default_env函数调用memcpy函数从
default_environment数组中拷贝env;
7---填充bd指向的结构体中的 bi_ip_addr 变量,从环境变量中获取;
填充bd指向的结构体中的bi_enetaddr变量,从环境变量中获取;
8---console_init_r控制台第二阶段初始化,串口输出“In/Out/Err serial”字样,
9---x210_preboot_init,LCD相关初始化和屏幕上logo显示;
10---
check_menu_update_from_sd,
升级标志“LEFT按键”实现镜像自动更新功能,LEFT按键未按下正常启动;
11---死循环main_loop()中实现解析器、开机倒数自动执行、命令补全。