之前文章了解了 uboot的命令格式组成。本文简单分析下 cmd_process函数对 uboot命令的处理过程。
本文继上一篇文章的学习,地址如下:
uboot启动流程-run_main_loop 到 cmd_process处理说明二-CSDN博客
这里主要分析一下 uboot 的命令行处理过程。
通过分析可知, cli_loop 函数通过一系列调用,最终调用 cmd_process函数处理命令。调用关系如下:
- enum command_ret_t cmd_process(int flag, int argc, char * const argv[],
- int *repeatable, ulong *ticks)
- {
- enum command_ret_t rc = CMD_RET_SUCCESS;
- cmd_tbl_t *cmdtp;
-
- /* Look up command in command table */
- cmdtp = find_cmd(argv[0]);
- if (cmdtp == NULL) {
- printf("Unknown command '%s' - try 'help'\n", argv[0]);
- return 1;
- }
-
- /* found - check max args */
- if (argc > cmdtp->maxargs)
- rc = CMD_RET_USAGE;
-
- #if defined(CONFIG_CMD_BOOTD)
- /* avoid "bootd" recursion */
- else if (cmdtp->cmd == do_bootd) {
- if (flag & CMD_FLAG_BOOTD) {
- puts("'bootd' recursion detected\n");
- rc = CMD_RET_FAILURE;
- } else {
- flag |= CMD_FLAG_BOOTD;
- }
- }
- #endif
-
- /* If OK so far, then do the command */
- if (!rc) {
- if (ticks)
- *ticks = get_timer(0);
- rc = cmd_call(cmdtp, flag, argc, argv);
- if (ticks)
- *ticks = get_timer(*ticks);
- *repeatable &= cmdtp->repeatable;
- }
- if (rc == CMD_RET_USAGE)
- rc = cmd_usage(cmdtp);
- return rc;
- }
- cmd_tbl_t *find_cmd(const char *cmd)
- {
- cmd_tbl_t *start = ll_entry_start(cmd_tbl_t, cmd);
- const int len = ll_entry_count(cmd_tbl_t, cmd);
- return find_cmd_tbl(cmd, start, len);
- }
- static int cmd_call(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
- {
- int result;
-
- result = (cmdtp->cmd)(cmdtp, flag, argc, argv);
- if (result)
- debug("Command failed, result=%d\n", result);
- return result;
- }