您的位置:首页 > 其它

U-Boot启动过程(2)

2010-12-14 22:58 169 查看
lib_arm/board.c

start_armboot 是U-Boot执行的第一个C语言函数,完成系统初始化工作,进入主循环,处理用户输入的命令
void start_armboot(void)
{
DECLARE_GLOBAL_DATA_PTR;
ulong size;
init_fnc_t **init_fnc_ptr;
char *s;
/* Pointer is writable since we allocated a register for it */
gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t));
/* compiler optimization barrier needed for GCC >= 3.4 */
__asm__ __volatile__("" : : : "memory");
memset((void *)gd, 0, sizeof(gd_t));
gd->bd = (bd_t*)((char *)gd - sizeof(bd_t));
memset(gd->bd, 0, sizeof(bd_t));
monitor_flash_len = _bss_start - _armboot_start;
/* 顺序执行init_sequence数组中的初始化函数 */
for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
if ((*init_fnc_ptr)() != 0)
hang();
}
/* 配置可用的Flash */
size = flash_init(0);
display_flash_config(size);
/* _armboot_start 在u-boot.lds链接脚本中定义 */
mem_malloc_init(_armboot_start - CFG_MALLOC_LEN);
/* 配置环境变量,重新定位 */
env_relocate();
/* 从环境变量中获取IP地址 */
gd->bd->bi_ip_addr = getenv_IPaddr("ipaddr");
/* 以太网接口MAC地址 */
...
devices_init();          /* 获取列表中的设备 */
jumptable_init();
console_init_r();        /* 完整地初始化控制台设备 */
enable_interrupts();     /* 使能例外处理 */
/* 通过环境变量初始化 */
if ((s = getenv("loadaddr")) != NULL) {
load_addr = simple_strtoul(s, NULL, 16);
}
/* main_loop()总是试图自动启动,循环不断执行 */
for (; ;) {
main_loop();            /* 主循环函数处理执行用户命令 -- common/main.c */
}
/* NOTREACHED - no way out of command loop except booting */
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: