uboot第二阶段

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()中实现解析器、开机倒数自动执行、命令补全。

你可能感兴趣的:(uboot)