lib_arm/board.c
start_armboot 是U-Boot執行的第一個C語言函數,完成系統初始化工作,進入主迴圈,處理使用者輸入的命令void start_armboot(void)<br />{<br />DECLARE_GLOBAL_DATA_PTR;<br />ulong size;<br />init_fnc_t **init_fnc_ptr;<br />char *s;<br />/* Pointer is writable since we allocated a register for it */<br />gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t));<br />/* compiler optimization barrier needed for GCC >= 3.4 */<br />__asm__ __volatile__("" : : : "memory");<br />memset((void *)gd, 0, sizeof(gd_t));<br />gd->bd = (bd_t*)((char *)gd - sizeof(bd_t));<br />memset(gd->bd, 0, sizeof(bd_t));<br />monitor_flash_len = _bss_start - _armboot_start;<br />/* 順序執行init_sequence數組中的初始化函數 */<br />for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {<br />if ((*init_fnc_ptr)() != 0)<br />hang();<br />}<br />/* 配置可用的Flash */<br />size = flash_init(0);<br />display_flash_config(size);<br />/* _armboot_start 在u-boot.lds連結指令碼中定義 */<br />mem_malloc_init(_armboot_start - CFG_MALLOC_LEN);<br />/* 配置環境變數,重新置放 */<br />env_relocate();<br />/* 從環境變數中擷取IP地址 */<br />gd->bd->bi_ip_addr = getenv_IPaddr("ipaddr");<br />/* 乙太網路介面MAC地址 */<br />...<br />devices_init(); /* 擷取列表中的裝置 */<br />jumptable_init();<br />console_init_r(); /* 完整地初始化控制台裝置 */<br />enable_interrupts(); /* 使能例外處理 */<br />/* 通過環境變數初始化 */<br />if ((s = getenv("loadaddr")) != NULL) {<br />load_addr = simple_strtoul(s, NULL, 16);<br />}<br />/* main_loop()總是試圖自動啟動,迴圈不斷執行 */<br />for (; {<br />main_loop(); /* 主迴圈函數處理執行使用者命令 -- common/main.c */<br />}<br />/* NOTREACHED - no way out of command loop except booting */<br />}