Uboot启动两级阶段
第一阶段
- 流程:
第二阶段
对开发板级别的硬件、软件数据结构进行初始化
- 代码分析1234567891011121314151617181920212223242526272829303132333435start_armboot // 开始arm的启动// Uboot启动地址0x33e00000 Uboot大小2M 堆大小912KB 栈大小512KB 存放全局数据的结构体gd_base = CFG_UBOOT_BASE + CFG_UBOOT_SIZE - CFG_MALLOC_LEN - CFG_STACK_SIZE - sizeof(gd_t);gd = (gd_t*)gd_base; // 将结构体指针gd实例化(分配空间)init_sequence();cpu_init(); // 空的,在汇编阶段已经初始化过board_init(); // 开发板dm9000_pre_init(); // 网卡初始化gd->bd->bi_arch_number = MACH_TYPE; // 机器码gd->bd->bi_boot_params = (PHYS_SDRAM_1+0x100); // 内存传参(启动参数)interrupt_init(); // 定时器4,用于计时env_init(); // 环境变量初始化init_baudrate(); // 软件层gd数据结构波特率初始化serial_init(); // 空的,在汇编阶段已经初始化过console_init_f(); // 控制台第一步初始化display_banner(); // 打印Uboot版本号print_cpuinfo(); // 打印SOC时钟频率信息checkboard(); // 检验开发板名字dram_init(); // 软件层gd数据结构DDR信息初始化display_dram_config(); // 打印板上DDR内存大小mem_malloc_init (CFG_UBOOT_BASE + CFG_UBOOT_SIZE - CFG_MALLOC_LEN - CFG_STACK_SIZE); // 初始化Uboot所维护的堆内存mmc_initialize(gd->bd); // 初始化iNand/SD卡 或 SOC上的控制器env_relocate (); // 环境变量重定位gd->bd->bi_ip_addr = getenv_IPaddr ("ipaddr"); // 初始化软件层gd数据结构IP地址gd->bd->bi_enetaddr // 初始化软件层gd数据结构以太网地址devices_init (); // 参数传递,没有实现驱动初始化jumptable_init (); // 跳转表console_init_r (); // 控制台第二步初始化enable_interrupts (); // 空的loadaddr、bootfile // 内核启动环境变量读出初始化全局变量board_late_init (); // 空的eth_initialize(gd->bd); // 空的x210_preboot_init(); // LCD初始化和显示开机logocheck_menu_update_from_sd() // 检查自动更新main_loop() // 主循环
区别 | 第一阶段 | 第二阶段 |
---|---|---|
语言 | 汇编阶段 | C阶段 |
代码所在区域 | SRAM | DRAM |
初始化 | SoC内部 | SoC外部Board内部 |