原创 uboot源码分析5-main_loop函数

2013-9-6 22:19 3949 19 19 分类: MCU/ 嵌入式 文集: uboot

/*main_loop处理的是一些与平台无关的事情 基本上是一些uboot的人机交互 执行命令之类 看的不多 多多少少有些注释 只知道一些大概功能 不过一般应该用不到这些功能吧 写在这就是一个笔记 有问题还望多多指教*/

void main_loop (void)
{
#ifndef CFG_HUSH_PARSER
    static char lastcommand[CFG_CBSIZE] = { 0, };//static 静态局部全局变量(就是第二次调用函数时这个变量还是原来的值)
    //static声明的变量只能初始化一次如果不赋值 默认为0  
    //如果static声明一个全局变量 那么 这个变量只能应用在这个文件 不能被其他文件引用
    int len;
    int rc = 1;
    int flag;
#endif

#if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0)
    char *s;
    int bootdelay;
#endif
#ifdef CONFIG_PREBOOT
    char *p;
#endif
#ifdef CONFIG_BOOTCOUNT_LIMIT //这个是商业功能 如果没有license 只能用几次 。一般不用
    unsigned long bootcount = 0;
    unsigned long bootlimit = 0;
    char *bcs;
    char bcs_set[16];
#endif /* CONFIG_BOOTCOUNT_LIMIT */

#if defined(CONFIG_VFD) && defined(VFD_TEST_LOGO)
    ulong bmp = 0;        /* default bitmap */
    extern int trab_vfd (ulong bitmap);

#ifdef CONFIG_MODEM_SUPPORT //如果支持modem  modem是串口传输协议
    if (do_mdm_init)
        bmp = 1;    /* alternate bitmap */
#endif
    trab_vfd (bmp);
#endif    /* CONFIG_VFD && VFD_TEST_LOGO */

#ifdef CONFIG_BOOTCOUNT_LIMIT
    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;
#endif /* CONFIG_BOOTCOUNT_LIMIT */

#ifdef CONFIG_MODEM_SUPPORT
    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 */
    }
#endif  /* CONFIG_MODEM_SUPPORT */

#ifdef CONFIG_VERSION_VARIABLE
    {
        extern char version_string[];//这个变量在其他文件中定义为全局变量 这边要引用 所以加extern说明

        setenv ("ver", version_string);  /* 应该是把当前uboot的版本写入环境变量中去 应该不用 暂时不管set version variable */
    }
#endif /* CONFIG_VERSION_VARIABLE */

#ifdef CFG_HUSH_PARSER //是uboot查找命令的一种方法 uboot可以使用两种方式来查找用户输入的命令 一种是直接到u_boot_cmd段中一个一个找
//另外一个就是使用hush,具体怎么回事先不管 命令比较少 就用第一种就行 暂时可以不管
    u_boot_hush_start ();
#endif

#ifdef CONFIG_AUTO_COMPLETE//自动补齐命令 输入文件名的时候 按tab会自动补齐
    install_auto_complete();
#endif

#ifdef CONFIG_PREBOOT//只有定义了这个宏 才可能进入交换界面 就是输入命令的界面?????????????????
    if ((p = getenv ("preboot")) != NULL) {
# ifdef CONFIG_AUTOBOOT_KEYED
/*
    #define CONFIG_AUTOBOOT_KEYED 1
    #define CONFIG_AUTOBOOT_PROMPT "Press ESC to abort autoboot in %d seconds"
    #define CONFIG_AUTOBOOT_DELAY_STR "linux"
    #define CONFIG_AUTOBOOT_STOP_STR "\x1b"
    上面这个例子是定义esc按键为终止自动引导程序进入交互界面 1b为esc的编码
*/
        int prev = disable_ctrlc(1);    /* disable Control C checking ctrl+c 是结束当前进程,*/
# endif

# ifndef CFG_HUSH_PARSER//没有使用hush  则使用第一种方式查询命名并执行
        run_command (p, 0);
# else
        parse_string_outer(p, FLAG_PARSE_SEMICOLON |
                    FLAG_EXIT_FROM_LOOP);
# endif

# ifdef CONFIG_AUTOBOOT_KEYED
        disable_ctrlc(prev);    /* restore Control C checking */
# endif
    }
#endif /* CONFIG_PREBOOT */

#if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0)
    s = getenv ("bootdelay");
    bootdelay = s ? (int)simple_strtol(s, NULL, 10) : CONFIG_BOOTDELAY;//如果环境变量定义了倒计时的数字 就使用环境变量里面的 不然就等于代码里面定义的

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

# ifdef CONFIG_BOOT_RETRY_TIME
    init_cmd_timeout ();
# endif    /* CONFIG_BOOT_RETRY_TIME */

#ifdef CONFIG_BOOTCOUNT_LIMIT
    if (bootlimit && (bootcount > bootlimit)) {
        printf ("Warning: Bootlimit (%u) exceeded. Using altbootcmd.\n",
                (unsigned)bootlimit);
        s = getenv ("altbootcmd");
    }
    else
#endif /* CONFIG_BOOTCOUNT_LIMIT */
        s = getenv ("bootcmd");//获取启动参数

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

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

# ifndef CFG_HUSH_PARSER
        run_command (s, 0);//引导内核
# else
        parse_string_outer(s, FLAG_PARSE_SEMICOLON |
                    FLAG_EXIT_FROM_LOOP);
# endif

# ifdef CONFIG_AUTOBOOT_KEYED
        disable_ctrlc(prev);    /* restore Control C checking */
# endif
    }

# ifdef CONFIG_MENUKEY//在另外一个文件里面定义 这个menukey为空格
    if (menukey == CONFIG_MENUKEY) {
        s = getenv("menucmd");
        if (s) {
# ifndef CFG_HUSH_PARSER
        run_command (s, 0);
# else
        parse_string_outer(s, FLAG_PARSE_SEMICOLON |
                    FLAG_EXIT_FROM_LOOP);
# endif
        }
    }
#endif /* CONFIG_MENUKEY */
#endif    /* CONFIG_BOOTDELAY */

#ifdef CONFIG_AMIGAONEG3SE
    {
        extern void video_banner(void);
        video_banner();
    }
#endif

    /*
     * Main Loop for Monitor Command Processing
     */
#ifdef CFG_HUSH_PARSER
    parse_file_outer();
    /* This point is never reached */
    for (;;);
#else
//下面是一个死循环 一直到main_loop的结尾 就是读取命令 然后执行
    for (;;) {
#ifdef CONFIG_BOOT_RETRY_TIME
        if (rc >= 0) {
            /* Saw enough of a valid command to
             * restart the timeout.
             */
            reset_cmd_timeout();
        }
#endif
        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;
#ifdef CONFIG_BOOT_RETRY_TIME
        else if (len == -2) {
            /* -2 means timed out, retry autoboot
             */
            puts ("\nTimed out waiting for command\n");
# ifdef CONFIG_RESET_TO_RETRY
            /* Reinit board to run initialization code again */
            do_reset (NULL, 0, 0, NULL);
# else
            return;        /* retry autoboot */
# endif
        }
#endif

        if (len == -1)
            puts ("\n");
        else
            rc = run_command (lastcommand, flag);

        if (rc <= 0) {
            /* invalid command or not repeatable, forget it */
            lastcommand[0] = 0;
        }
    }
#endif /*CFG_HUSH_PARSER*/
}
 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
19
关闭 站长推荐上一条 /3 下一条