致远i.mx287开发板u-boot移值(四)main_loop函数

    main_loop函数是u-boot各种初始化后,进入的函数, 可以理解成u-boot使命的终点,在这个循环轮询中,第一次实现了,工程师可以与目标板进行交互的接口,工程师可以通过u-boot的命令参数实现各种交互,类似于u-boot的shell终端,当然,如果这里 不想有任何交互,是可以直接进入boot 内核kernel的,一般会有个变量bootdelay,也就是在设定的倒计时时间内,如果u-boot未接收到任何动作,则自动引导kernel

main_loop()函数做的都是与具体平台无关的工作。主要包括的工作如下:

(1)初始化启动次数限制机制

(2)Modem功能

(3)设置软件版本号

(4)启动延迟

(5)读取命令,解析命令

 

去掉预编译 命令,函数分析如下:

void main_loop (void)
{

	char *s;
	int bootdelay;
	char *p;

	unsigned long bootcount = 0;   
	unsigned long bootlimit = 0;   //用于boot引导次数的限制,主要是受限重启
	char *bcs;
	char bcs_set[16];

	ulong bmp = 0;		/* default bitmap */
	extern int trab_vfd (ulong bitmap);

	if (do_mdm_init)
		bmp = 1;	/* alternate bitmap */
	trab_vfd (bmp);

    //boot引导次数限制功能函数
	bootcount = bootcount_load();
	bootcount++;
	bootcount_store (bootcount);
	sprintf (bcs_set, "%lu", bootcount);
	setenv ("bootcount", bcs_set);
	bcs = getenv ("bootlimit");
	bootlimit = bcs ? simple_strtoul (bcs, NULL, 10) : 0;

    //mdm功能,可以不要
	debug ("DEBUG: main_loop:   do_mdm_init=%d\n", do_mdm_init);
	if (do_mdm_init) {
		char *str = strdup(getenv("mdm_cmd"));
		setenv ("preboot", str);  /* set or delete definition */
		if (str != NULL)
			free (str);
		mdm_init(); /* wait for modem connection */
	}


	//版本信息
		extern char version_string[];

		setenv ("ver", version_string);  /* set version variable */

    //hush命令解析功能启动,类似于shell,是用于u-boot中的shell分析
	u_boot_hush_start ();

	hush_init_var ();
    //命令自动编译
	install_auto_complete();

    //preboot功能
	if ((p = getenv ("preboot")) != NULL) {

		int prev = disable_ctrlc(1);	/* disable Control C checking */

		run_command (p, 0);


		disable_ctrlc(prev);	/* restore Control C checking */
	}

    //boot delay功能,也就是xx秒内无动作,则自动引导kernel,否则运行u-boot的shell进行交互
	s = getenv ("bootdelay");
	bootdelay = s ? (int)simple_strtol(s, NULL, 10) : CONFIG_BOOTDELAY;

	debug ("### main_loop entered: bootdelay=%d\n\n", bootdelay);


	init_cmd_timeout ();


	if (gd->flags & GD_FLG_POSTFAIL) {
		s = getenv("failbootcmd");
	}
	else


	if (bootlimit && (bootcount > bootlimit)) {
		printf ("Warning: Bootlimit (%u) exceeded. Using altbootcmd.\n",
		        (unsigned)bootlimit);
		s = getenv ("altbootcmd");
	}
	else

		s = getenv ("bootcmd");

	debug ("### main_loop: bootcmd=\"%s\"\n", s ? s : "<UNDEFINED>");

	if (bootdelay >= 0 && s && !abortboot (bootdelay)) {
		int prev = disable_ctrlc(1);	/* disable Control C checking */

		parse_string_outer(s, FLAG_PARSE_SEMICOLON |
				    FLAG_EXIT_FROM_LOOP);

		disable_ctrlc(prev);	/* restore Control C checking */
	}

	if (menukey == CONFIG_MENUKEY) {
	    s = getenv("menucmd");
	    if (s) {

		parse_string_outer(s, FLAG_PARSE_SEMICOLON |
				    FLAG_EXIT_FROM_LOOP);
	    }
	}


	    extern void video_banner(void);
	    video_banner();

	/*
	 * Main Loop for Monitor Command Processing
	 */
    //这里才是u-boot的main_loop的实现代码所在,在这里就是用hush的命令解析,实现u-boot与工程师的
    //的交互,
	parse_file_outer();
	/* This point is never reached */
    //说的很清楚,代码不会运行到这里,到这里就宕机了
	for (;;);

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值