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

开篇:
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);  //运行命令
		}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

10000ask

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值