3.7.5. 命令行阶段

board_init_r 函数最后进入 run_main_loop 执行 Autoboot 命令或者进入控制台。

board_init_r(); // common/board_r.c
|-> run_main_loop(); // common/board_r.c
    |-> main_loop(); // common/main.c
        |-> cli_init();    // 初始化 command line
        |   |-->u_boot_hush_start();
        |
        |-> bootdelay_process(); // common/autoboot.c
        |   | // 获取boot delay时间参数,从env中获取bootcmd参数
        |   |-> s = env_get("bootcmd");
        |           // 获取 bootcmd 的内容
        |-> cli_process_fdt(); // common/cli.c
        |   // 尝试从 DTS 中获取 bootcmd 参数,DTS 的配置优先级高于 ENV
        |-> autoboot_command(); // common/autoboot.c
            |-> abortboot();
            |   // 检查是否需要终止启动
            |
            |-> run_command_list(); // common/cli.c
                // 执行 bootcmd 的内容,一般是执行脚本

倒计时读秒

进入命令行的主循环之后,U-Boot 首先获取 boot delay 的时间设置。Boot delay 的时间 是指 U-Boot 在执行启动命令之前的倒计时读秒的时间,该时间在 ZX 平台上在环境变量 env.txt 中进行配置:

  • bootdelay=3

如果不需要倒计时读秒,可以将该设置改为 0 。

启动命令

U-Boot 检查并且默认执行 bootcmd 所指定的启动命令。该启动命令可以在两个地方设置:

  • 环境变量中设置

  • DTS 中设置

ZX 平台上通过环境变量 env.txt 设置,同行是一段启动脚本。

按键中断

进入 autoboot_command 在执行启动命令之前,U-Boot 还会检查用户是否有通过串口 按键中断启动流程。该检查无论 bootdelay 时间是否为 0 都会进行。