main_loop函数是u-boot各种初始化后,进入的函数, 可以理解成u-boot使命的终点,在这个循环轮询中,第一次实现了,工程师可以与目标板进行交互的接口,工程师可以通过u-boot的命令参数实现各种交互,类似于u-boot的shell终端,当然,如果这里 不想有任何交互,是可以直接进入boot 内核kernel的,一般会有个变量bootdelay,也就是在设定的倒计时时间内,如果u-boot未接收到任何动作,则自动引导kernel
main_loop()函数做的都是与具体平台无关的工作。主要包括的工作如下:
去掉预编译 命令,函数分析如下:
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 (;;);
}