-
一、主要是start.S 里面的 board_init_f 以及 board_init_r 函数分析,MLO与 u-boot.omg 的区别就在这里
-
二、 MLO 加载完毕,他会重新回到 start.S 重新开始
-
三、 board_init_f 函数的实现在 arch/arm/lib/board.c 里面
264 void board_init_f(ulong bootflag) 265 { 266 bd_t *bd; 267 init_fnc_t **init_fnc_ptr; 268 gd_t *id; 269 ulong addr, addr_sp; 270 271 272 /* Pointer is writable since we allocated a register for it */ 273 gd = (gd_t *) ((CONFIG_SYS_INIT_SP_ADDR) & ~0x07); 274 /* compiler optimization barrier needed for GCC >= 3.4 */ 275 __asm__ __volatile__("": : :"memory"); 276 277 memset((void *)gd, 0, sizeof(gd_t)); 278 279 gd->mon_len = _bss_end_ofs; 280 // 这里有一个函数指针数组,里面包含很多初始化 281 for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) { 282 if ((*init_fnc_ptr)() != 0) { 283 hang (); 284 } 285 } // ... ... 412 gd->bd->bi_baudrate = gd->baudrate; 413 /* Ram ist board specific, so move it to board code ... */ 414 dram_init_banksize(); 415 display_dram_config(); /* and display it */ 416 417 gd->relocaddr = addr; 418 gd->start_addr_sp = addr_sp; 419 gd->reloc_off = addr - _TEXT_BASE; 420 debug("relocation Offset is: %08lx\n", gd->reloc_off); 421 memcpy(id, (void *)gd, sizeof(gd_t)); 422 423 relocate_code(addr_sp, id, addr); // 最后回到 start.S 然后又到了 board_init_r 424 425 /* NOTREACHED - relocate_code() does not return */ 426 }
-
接上函数指针数组 init_sequence
235 init_fnc_t *init_sequence[] = { 236 #if defined(CONFIG_ARCH_CPU_INIT) 237 arch_cpu_init, /* basic arch cpu dependent setup */ 238 #endif 239 #if defined(CONFIG_BOARD_EARLY_INIT_F) 240 board_early_init_f, 241 #endif 242 timer_init, /* initialize timer */ 243 #ifdef CONFIG_FSL_ESDHC 244 get_clocks, 245 #endif 246 env_init, /* initialize environment */ 247 init_baudrate, /* initialze baudrate settings */ 248 serial_init, /* serial communications setup */ 249 console_init_f, /* stage 1 init of console */ 250 display_banner, /* say that we are here */ 251 #if defined(CONFIG_DISPLAY_CPUINFO) 252 print_cpuinfo, /* display cpu info (and speed) */ 253 #endif 254 #if defined(CONFIG_DISPLAY_BOARDINFO) 255 checkboard, /* display board info */ 256 #endif 257 #if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C) 258 init_func_i2c, 259 #endif 260 dram_init, /* configure available RAM banks */ 261 NULL, 262 };
-
三、board_init_r 也在 arch/arm/lib/board.c
443 void board_init_r(gd_t *id, ulong dest_addr) 444 { 445 char *s; 446 bd_t *bd; 447 ulong malloc_start; 448 #if !defined(CONFIG_SYS_NO_FLASH) 449 ulong flash_size; 450 #endif 451 452 453 gd = id; 454 bd = gd->bd; 455 456 gd->flags |= GD_FLG_RELOC; /* tell others: relocation done */ 457 458 monitor_flash_len = _end_ofs; 459 460 /* Enable caches */ 461 enable_caches(); 462 463 debug("monitor flash len: %08lX\n", monitor_flash_len); 464 board_init(); /* Setup chipselects */ 465 466 #ifdef CONFIG_SERIAL_MULTI 467 serial_initialize(); 468 469 #endif 81 /* The Malloc area is immediately below the monitor copy in DRAM */ 482 malloc_start = dest_addr - TOTAL_MALLOC_LEN; 483 mem_malloc_init (malloc_start, TOTAL_MALLOC_LEN); 484 485 stdio_init(); /* get the devices list going. */ 486 487 puts("zengjf :\n"); 523 #if defined(CONFIG_CMD_NAND) 524 puts("NAND : "); 525 nand_init(); /* go init the NAND */ 526 #endif // ... ... 531 532 #ifdef CONFIG_GENERIC_MMC 533 puts("MMC: "); 534 mmc_initialize(bd); 535 #endif // .. ... 559 560 console_init_r(); /* fully init console as a device */ 561 566 #if defined(CONFIG_MISC_INIT_R) 567 /* miscellaneous platform dependent initialisations */ 568 misc_init_r(); 569 #endif // ... ... 649 for (;;) { 650 main_loop(); 651 } 652 653 /* NOTREACHED - no way out of command loop except booting */ 654 }
-
u-boot 加载 kernel 参考:
-
MLO 的流程参考:
原文地址:https://www.cnblogs.com/chenfulin5/p/8398816.html
时间: 2024-11-13 10:00:49