您的位置:首页 > 编程语言

u-boot第二阶段代码(4)

2016-09-23 13:52 357 查看
开篇:
1.第二阶段代码一开始进行各种设置和初始化,包括串口,nand,nor,网卡等,为u-boot后面提供基础
2.初始化完之后,u-boot会从环境变量中读取bootdelay的参数,然后倒数计时,假如在这期间没有空格按下,那么u-boot就会运行启动内核的命令,从而一去不复返
3.假如有空格按下,u-boot将进入死循环即串口控制台,等待用户输入命令来解析运行该命令。

u-boot第二阶段代码分析:

board.c /lib_arm:

start_armboot:

/*分配一个gd_t结构体和一个bd_t结构体初始化为0*/
gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t));
memset ((void*)gd, 0, sizeof (gd_t));
gd->bd = (bd_t*)((char*)gd - sizeof(bd_t));
memset (gd->bd, 0, sizeof (bd_t));
/*循环执行这些函数*/  //当函数指针指向NULL时退出for循环
for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
if ((*init_fnc_ptr)() != 0) {
hang ();//初始化不成功就打印错误信息
}
}

init_fnc_t *init_sequence[] = {
cpu_init,		/* basic cpu dependent setup   设置IRQ,FIQ的棧*/
board_init,		/* basic board dependent setup   设置时钟频率 */
gd->bd->bi_arch_number = MACH_TYPE_S3C2440; /* arch number of SMDK2440-Board 设置机器ID与内核交互*/
interrupt_init,		/* set up exceptions    初始化定时器*/
env_init,		/* initialize environment   检查flash中参数是否有效*/
init_baudrate,		/* initialze baudrate settings */
serial_init,		/* serial communications setup   初始化串口控制台*/
console_init_f,		/* stage 1 init of console */
display_banner,		/* say that we are here */
#if defined(CONFIG_DISPLAY_CPUINFO)
print_cpuinfo,		/* display cpu info (and speed) */
#endif
#if defined(CONFIG_DISPLAY_BOARDINFO)
checkboard,		/* display board info */
#endif
dram_init,		/* configure available RAM banks 检测系统内存映射 */
gd->bd->bi_dram[0].start = PHYS_SDRAM_1; /*记录下内存起始地址和大小,与内核交互*/
gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
display_dram_config,
NULL,
};

size = flash_init ();  //初始化norflash 使其能写能读

mem_malloc_init (_armboot_start - CFG_MALLOC_LEN); //初始化用于malloc的内存

puts ("NAND:  ");
nand_init();		/* nandflash初始化,使其能读写 */

/* initialize environment */
env_relocate (); /*将环境参数读入内存指定位置*/

gd->bd->bi_ip_addr = getenv_IPaddr ("ipaddr");/*获得IP地址*/
i = getenv_r ("ethaddr", tmp, sizeof (tmp)); /*获得MAC地址*/
cs8900_get_enetaddr (gd->bd->bi_enetaddr);  /*网卡初始化*/
for (;;) {
main_loop ();      /*进入main_loop 死循环*/
}



Main.c  /common

main_loop:

#if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0)
s = getenv ("bootdelay");    /*获得bootdelay的参数*/
bootdelay = s ? (int)simple_strtol(s, NULL, 10) : CONFIG_BOOTDELAY;     /*转化成数字*/

s = getenv ("bootcmd");
if (bootdelay >= 0 && s && !abortboot (bootdelay))  /*倒数计时如果没有按入空格健就会执行"bootcmd"命令来启动内核*/
{
printf("Booting Linux ...\n");
run_command (s, 0);
}

run_command("menu", 0);   //有空格健按下就运行菜单
/*再次进入死循环,进入u-boot控制台界面,等待命令*/
for (;;) {
len = readline (CFG_PROMPT);   //读到命令
flag = 0;	/* assume no special flags for now */
if (len > 0)
strcpy (lastcommand, console_buffer);
else if (len == 0)
flag |= CMD_FLAG_REPEAT;

rc = run_command (lastcommand, flag);  //运行命令
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: